/* Dark theme is the default (on :root); [data-theme="light"] overrides it. The
   theme attribute is set on <html> by an inline script in index.html before first
   paint, so there is no flash of the wrong theme. */
:root {
	font-family: system-ui, sans-serif;
	color-scheme: dark;
	--bg: #16181c;
	--text: #e4e6eb;
	--surface: #1e2228;
	--border: #2c3038;
	--muted: #9aa0aa;
	--input-bg: #14161a;
	--input-border: #3a3f48;
	--ac-hover: #2a3343;
	--accent: #3b82f6;
	--accent-hover: #2f6feb;
	--on-accent: #fff;
	--row-border: #2a2e36;
	--pin: #e2b53c;
	--pinned-bg: #332b10;
	--pin-pass-bg: #16351b;
	--pin-fail-bg: #3a1620;
	--pin-na-bg: #23262d;
	--range-fg: #6ee7a0;
	--range-bg: #15361f;
	--out-fg: #f1a7a0;
	--out-bg: #3a1c1a;
	--fast-fg: #8fbce6;
	--fast-bg: #1c2a3a;
	--slow-fg: #e6c98f;
	--slow-bg: #3a311c;
	/* Stats chip: offensive = purple, defensive = teal — a distinct pair from the amber/blue
	   (physical/special) and red/green (exclude/only) already in use. */
	--offense-fg: #c4b5fd;
	--offense-bg: #2a2342;
	--defense-fg: #2dd4bf;
	--defense-bg: #0e3a35;
	--shadow: rgba(0, 0, 0, 0.5);
}
:root[data-theme="light"] {
	color-scheme: light;
	--bg: #f5f6f8;
	--text: #1c1d20;
	--surface: #fff;
	--border: #e2e4e8;
	--muted: #5a5d63;
	--input-bg: #fff;
	--input-border: #cfd2d8;
	--ac-hover: #eef2fb;
	--accent: #2f6feb;
	--accent-hover: #275ec9;
	--on-accent: #fff;
	--row-border: #eef0f3;
	--pin: #c9a227;
	--pinned-bg: #fffbe6;
	--pin-pass-bg: #e7f7ea;
	--pin-fail-bg: #fdeaee;
	--pin-na-bg: #eceef1;
	--range-fg: #126b2c;
	--range-bg: #e7f6ec;
	--out-fg: #b42318;
	--out-bg: #fdeceb;
	--fast-fg: #1d4ed8;
	--fast-bg: #e8f0fb;
	--slow-fg: #b45309;
	--slow-bg: #fdf6e8;
	--offense-fg: #6d28d9;
	--offense-bg: #f2ecfe;
	--defense-fg: #0e7490;
	--defense-bg: #e0f4f7;
	--shadow: rgba(0, 0, 0, 0.1);
}
body { margin: 0; background: var(--bg); color: var(--text); }
main { max-width: 1400px; margin: 0 auto; padding: 24px 16px 64px; }
h1 { font-size: 22px; font-weight: 600; text-align: center; }
form { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 16px; display: grid; gap: 12px; max-width: 720px; margin: 0 auto; }
label { display: grid; gap: 4px; font-size: 13px; color: var(--muted); }
/* Caption for a chip group — same look as a label, but not a <label> so its
   button chips don't get auto-associated (hovering/clicking one chip must not
   toggle the group's first button). */
.chip-label { display: grid; gap: 4px; font-size: 13px; color: var(--muted); }
.row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
/* Single-column row: a lone field (Types) fills the full width instead of sitting at half. */
.row-full { grid-template-columns: 1fr; }
.row-top { align-items: start; }
fieldset { border: 1px solid var(--border); border-radius: 8px; padding: 12px; margin: 0; display: grid; gap: 12px; }
legend { font-size: 13px; color: var(--muted); }
select, input[type=number], input[type=text] { width: 100%; box-sizing: border-box; height: 34px; padding: 0 8px; border: 1px solid var(--input-border); border-radius: 8px; font-size: 14px; background: var(--input-bg); color: var(--text); }
input.contradict { border-color: var(--out-fg); background: var(--out-bg); color: var(--out-fg); }
/* Field tints act as a legend for the only-faster/only-slower cell colors. */
input.field-fast { border-color: var(--fast-fg); background: var(--fast-bg); color: var(--fast-fg); }
input.field-slow { border-color: var(--slow-fg); background: var(--slow-bg); color: var(--slow-fg); }
.ac { position: relative; }
.ac-list { position: absolute; left: 0; right: 0; top: 100%; z-index: 10; margin: 2px 0 0; padding: 0; list-style: none; background: var(--surface); border: 1px solid var(--input-border); border-radius: 8px; max-height: 220px; overflow-y: auto; box-shadow: 0 4px 12px var(--shadow); }
/* Explicit muted color so every dropdown matches, regardless of whether the field is wrapped in a
   <label> (color: var(--muted)) or a <fieldset> (no color → inherited var(--text)). Without this,
   the fieldset-wrapped fields (Learns / Learnable by / Effective-against) rendered full-contrast
   while the label-wrapped ones were muted. */
.ac-list li { padding: 6px 10px; font-size: 14px; cursor: pointer; color: var(--muted); }
.ac-list li:hover, .ac-list li.active { background: var(--ac-hover); }
.floor { display: flex; gap: 16px; align-items: center; height: 34px; }
.floor label { flex-direction: row; align-items: center; gap: 6px; }
button { height: 38px; border: 1px solid var(--accent); background: var(--accent); color: var(--on-accent); border-radius: 8px; font-size: 15px; cursor: pointer; }
button:hover { background: var(--accent-hover); }
.form-actions { display: flex; gap: 12px; }
.form-actions > button[type="submit"] { flex: 1; box-sizing: border-box; padding: 0 12px; }
/* "Find Pokémon that Learn Pinned Moves" — centered under the move results, shown only
   when moves are pinned. The [hidden] rule is explicit because the flex display would
   otherwise override the attribute's default display:none. */
#move-to-pokemon-actions { display: flex; justify-content: center; margin-top: 12px; }
#move-to-pokemon-actions[hidden] { display: none; }
#move-find-pokemon { padding: 0 18px; }
/* Reset is a secondary action, so use a plain surface button instead of the
   accent-filled primary so it doesn't compete with Search. */
button.secondary { background: var(--surface); border-color: var(--input-border); color: var(--text); }
button.secondary:hover { background: var(--ac-hover); border-color: var(--accent); }
#status, #move-status { color: var(--muted); font-size: 14px; }
table { width: 100%; border-collapse: collapse; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; overflow: hidden; }
th, td { text-align: left; padding: 8px 10px; font-size: 13px; border-top: 1px solid var(--row-border); }
.num-col { text-align: center; padding-left: 6px; padding-right: 6px; }
.pin-col { width: 22px; }
td.pin-cell { cursor: pointer; text-align: center; color: var(--pin); user-select: none; font-size: 15px; }
#pin-all, #move-pin-all { cursor: pointer; color: var(--pin); user-select: none; font-size: 15px; }
#pin-all.pin-all-green, #move-pin-all.pin-all-green { color: var(--range-fg); }
tr.pinned-row td { background: var(--pinned-bg); }
tr.pin-pass td { background: var(--pin-pass-bg); }
tr.pin-fail td { background: var(--pin-fail-bg); }
/* Refine "not applicable": pin is illegal in the selected format, so it was never judged
   against the criteria. Neutral grey + dimmed so it reads as excluded, not as a pass/fail. */
tr.pin-na td { background: var(--pin-na-bg); }
tr.pin-na { opacity: 0.72; }
/* The refine button ("Search among Pinned Pokémon/Moves") shares the flex:1 of the Search
   button beside it AND matches its padding, so whenever pins unhide it the two primary actions
   are always EQUAL width — equal flex (1 1 0) + equal padding ⇒ identical width. The padding
   must MATCH, not just box-sizing: a flex-basis:0 border-box item clamps UP to its own
   padding+border, so a wider padding here (12px vs Search's UA 6px) would leave the two ~12px
   apart; giving Search the same 12px removes that. Reset stays at its content width. min-width:0
   lets the button shrink below its label, and the nowrap+ellipsis truncates "Search Pinned
   Pokémon" to "Search Pinned…" on a narrow phone instead of wrapping to clipped lines or
   dropping to its own row. The fuller "Search among Pinned…" phrasing stays in the title. */
#search-pinned, #search-pinned-moves { flex: 1; min-width: 0; box-sizing: border-box; padding: 0 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.table-wrap { overflow-x: auto; }
thead th { border-top: none; color: var(--muted); }
/* Top-align each group in the row so an empty field stays put while the other grows
   chips downward (which pushes the Faster/Slower row below), instead of the shorter
   group centering in the stretched grid cell. Single column now — the neutral control
   moved from a side checkbox into the semode-row as a chip, so the input is full-width. */
.stab-group { display: grid; align-self: start; gap: 8px; }
/* Added STAB targets, each a removable pill. Spans all grid columns so chips wrap
   onto their own full-width row under the field's input. */
.entry-chips { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 6px; }
.entry-chips:empty { display: none; }
.entry-chip { display: inline-flex; align-items: center; gap: 4px; padding: 3px 4px 3px 10px; font-size: 13px; line-height: 1.2; border-radius: 999px; border: 1px solid var(--accent); background: var(--ac-hover); color: var(--text); }
.entry-chip .entry-x { width: 18px; height: 18px; min-width: 18px; padding: 0; display: inline-flex; align-items: center; justify-content: center; font-size: 14px; line-height: 1; border: none; border-radius: 999px; background: transparent; color: var(--muted); cursor: pointer; }
.entry-chip .entry-x:hover { color: var(--out-fg); background: transparent; }
.entry-chip-na { opacity: 0.5; border-style: dashed; color: var(--muted); }
/* Per-field "Clear all entries" button; subtle so it doesn't read as a primary action. */
.entry-clear { height: auto; padding: 3px 10px; font-size: 12px; line-height: 1.2; border-radius: 999px; border: 1px dashed var(--input-border); background: transparent; color: var(--muted); cursor: pointer; }
.entry-clear:hover { color: var(--text); border-color: var(--accent); background: transparent; }
/* Tri-state category chips: any (default), only (green, "＋" prefix), exclude
   (red, "－" prefix). State is held in data-state and set by app.js on click. */
.chips { display: flex; flex-wrap: wrap; gap: 8px; }
.chip { width: auto; height: auto; padding: 5px 12px; font-size: 13px; line-height: 1.2; border-radius: 999px; border: 1px solid var(--input-border); background: var(--input-bg); color: var(--text); cursor: pointer; user-select: none; }
.chip:hover { border-color: var(--accent); }
.chip[data-state="only"] { color: var(--range-fg); background: var(--range-bg); border-color: var(--range-fg); font-weight: 500; }
.chip[data-state="only"]::before { content: "⦾ "; }
.chip[data-state="exclude"] { color: var(--out-fg); background: var(--out-bg); border-color: var(--out-fg); font-weight: 500; }
.chip[data-state="exclude"]::before { content: "－ "; }
/* Role chips (Attacker/Defender): physical = warm, special = cool tint. */
.role-chip[data-kind="physical"] { color: var(--slow-fg); background: var(--slow-bg); border-color: var(--slow-fg); font-weight: 500; }
.role-chip[data-kind="special"] { color: var(--fast-fg); background: var(--fast-bg); border-color: var(--fast-fg); font-weight: 500; }
/* Stats chip: offensive = purple, defensive = teal — a THIRD distinct pair, kept clear of the
   Attacker/Defender amber/blue AND of the red/green already meaning exclude/only on the category
   chips, so a coloured Stats chip never reads as an excluded/only chip or a physical/special one. */
.role-chip[data-kind="offensive"] { color: var(--offense-fg); background: var(--offense-bg); border-color: var(--offense-fg); font-weight: 500; }
.role-chip[data-kind="defensive"] { color: var(--defense-fg); background: var(--defense-bg); border-color: var(--defense-fg); font-weight: 500; }
/* Special-categories chips: a flexbox whose items are each sized to exactly one of 4 equal columns
   (calc(container − gaps ÷ columns)), so every chip is the SAME size and a state change (the ⦾/－
   prefix, bolding, or an Any→Physical / Any→Offensive role-label swap) can never resize or move a
   neighbour — the width is fixed and `nowrap` keeps every label on one line (verified: the longest,
   "Restricted Legendary" active, fits a 4-col cell at the 720px form width; 5 wide would wrap 8).
   `justify-content: center` is a no-op on the FULL rows (4 items fill 100% edge-to-edge, zero free
   space) but centres the final PARTIAL row: the leftover chip(s) sit on the SAME row as Reset,
   centred, instead of Reset spanning a row of its own. box-sizing: border-box because the base .chip
   carries a 1px border + padding the width must absorb (grid's stretch ignored `width`; flex honours
   it). 3 columns on tablets, 2 on phones. Scoped to #category-chips (id beats the `.chips` flex) so
   the move-tab `.chips` containers keep flex-wrap. */
#category-chips { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
#category-chips .chip, #category-chips #category-reset { box-sizing: border-box; width: calc((100% - 24px) / 4); flex: 0 0 auto; padding: 5px 8px; text-align: center; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#category-chips #category-reset { font-size: 13px; }
@media (max-width: 700px) { #category-chips .chip, #category-chips #category-reset { width: calc((100% - 16px) / 3); } }
/* Phone: 2 columns. Drop the chip font to 12px so the longest label in its widest active state
   ("⦾ Restricted Legendary", bold) still fits a ~149px cell without clipping. */
@media (max-width: 440px) { #category-chips .chip, #category-chips #category-reset { width: calc((100% - 8px) / 2); font-size: 12px; } }
.chip-hint { margin: 4px 0 0; font-size: 12px; color: var(--muted); }
.chip-key { white-space: nowrap; }
.chip-key.only { color: var(--range-fg); }
.chip-key.exclude { color: var(--out-fg); }
th.sortable { cursor: pointer; user-select: none; white-space: nowrap; }
th.sortable:hover { color: var(--text); }
th.sorted { color: var(--text); }
.arrow { display: inline-block; min-width: 1em; margin-left: 2px; text-align: center; color: var(--accent); }
/* Stacked-sort markers: primary keeps the full arrow; tie-breaker columns get a dim, smaller
   arrow and a rank number (¹ ² ³ …) shown only once a tie-break chain exists. */
th.sorted-secondary .arrow { opacity: 0.5; font-size: 0.85em; }
.sortrank { font-size: 0.7em; opacity: 0.8; margin-left: 1px; }
th.speed-col { cursor: pointer; user-select: none; white-space: nowrap; }
th.speed-col:hover { color: var(--text); }
th.filtering { color: var(--range-fg); }
.fil { display: inline-block; width: 1em; margin-left: 2px; text-align: center; color: var(--range-fg); }
td.in-range { color: var(--range-fg); background: var(--range-bg); font-weight: 500; }
td.out-range { color: var(--out-fg); background: var(--out-bg); font-weight: 500; }
/* Both targets set, but the trainable range can satisfy only one of them. */
td.only-faster { color: var(--fast-fg); background: var(--fast-bg); font-weight: 500; }
td.only-slower { color: var(--slow-fg); background: var(--slow-bg); font-weight: 500; }
/* Fixed theme toggle, top-right corner. Square icon button, not the accent-filled
   form button, so it doesn't read as a primary action. */
#theme-toggle {
	position: fixed;
	top: 16px;
	right: 16px;
	width: 38px;
	height: 38px;
	padding: 0;
	display: flex;
	align-items: center;
	justify-content: center;
	font-size: 18px;
	line-height: 1;
	background: var(--surface);
	border: 1px solid var(--border);
	color: var(--text);
	z-index: 20;
}
#theme-toggle:hover { background: var(--ac-hover); }
/* In light mode the button offers dark mode, so give it a dark background so the
   moon icon reads clearly instead of sitting on a near-white surface. */
:root[data-theme="light"] #theme-toggle { background: #1e2228; border-color: #3a3f48; }
:root[data-theme="light"] #theme-toggle:hover { background: #2a3343; }

/* Tabs */
.tabs { display: flex; justify-content: center; gap: 0.5rem; margin: 0 auto 1rem; max-width: 360px; border-bottom: 1px solid var(--border); }
/* Equal-width tabs: flex:1 gives each tab the same share, so width is independent of label
   length and of the bold active state (no jiggle on switch). Adapts to any number of tabs. */
.tab { flex: 1; text-align: center; background: none; border: none; padding: 0.6rem 1rem; cursor: pointer; color: inherit; font: inherit; border-bottom: 2px solid transparent; }
.tab.active { border-bottom-color: var(--accent); font-weight: 600; }
.panel[hidden] { display: none; }

/* OR chips (buckets / category / power class) reuse .chip; selected state */
.orchip.selected { background: var(--accent); color: var(--on-accent); }

/* Super-effective controls */
.se-controls { margin-top: 0.5rem; display: flex; flex-direction: column; gap: 0.4rem; }
.semode-row { display: flex; align-items: center; gap: 0.5rem; font-size: 13px; color: var(--muted); }
/* Cycling mode chips reserve their widest label's width so toggling state
   doesn't resize the chip. For the chips with trailing text ("of:", "from",
   "against") this also keeps that text from shifting left/right; the Types chip
   has no trailing text but stays a stable box as it cycles. Widths cover the
   widest label plus a font-variance cushion; labels stay centred in place. */
.mode-chip { min-width: 56px; text-align: center; }
.mode-chip-neutral { min-width: 136px; }
.mode-chip-types { min-width: 96px; }
.op-row { display: flex; gap: 8px; }
.op-row select { flex: 1; }

/* Target checklist: sectioned checkbox list */
.target-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px 16px; }
/* Explicit-column variant (e.g. Flags and Effects): groups stack top-to-bottom within a fixed
   column instead of the grid's row-major auto-placement. */
.target-list.target-columns { display: flex; gap: 16px; }
.target-col { display: flex; flex-direction: column; gap: 6px; flex: 1; min-width: 0; }
.target-section { display: flex; flex-direction: column; gap: 2px; }
.target-section-head { display: flex; align-items: center; gap: 6px; font-weight: 600; font-size: 13px; color: var(--text); }
.target-opt { display: flex; align-items: center; gap: 6px; font-size: 13px; color: var(--muted); padding-left: 18px; cursor: pointer; }
.target-list input[type=checkbox] { width: auto; height: auto; margin: 0; cursor: pointer; }
.checklist-filter { margin-bottom: 8px; }
/* The filter hides non-matching rows via the `hidden` attribute; .target-section /
   .target-opt set `display:flex`, which would otherwise override [hidden]'s display:none. */
.target-section[hidden], .target-opt[hidden] { display: none; }

/* Tri-state control (Target / Flags and Effects dropdowns): Any / Has (blue ✓) / Not-Have (red ✕). */
.tri {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 15px;
	height: 15px;
	border: 1px solid var(--muted);
	border-radius: 3px;
	font-size: 11px;
	line-height: 1;
	cursor: pointer;
	user-select: none;
	color: #fff;
	flex: none;
}
.tri:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.tri[data-state="any"] { background: transparent; }
.tri[data-state="has"] { background: var(--accent); border-color: var(--accent); }
.tri[data-state="has"]::before { content: "✓"; }
.tri[data-state="not"] { background: #c0392b; border-color: #c0392b; }
.tri[data-state="not"]::before { content: "✕"; }
.tri[data-state="mixed"] { background: var(--muted); border-color: var(--muted); }
.tri[data-state="mixed"]::before { content: "–"; }

.checklist-head { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.modechip { padding: 2px 8px; font-size: 12px; font-weight: 500; }
.modechip::before { font-weight: 700; margin-right: 3px; }
.modechip.mode-has::before { content: "✓"; color: var(--accent); }
.modechip.mode-not::before { content: "✕"; color: #c0392b; }

/* Target dropdown: a select-styled button that reveals the grouped checklist. */
.dropdown { position: relative; }
.select-like { width: 100%; height: 34px; padding: 0 28px 0 8px; text-align: left; border: 1px solid var(--input-border); border-radius: 8px; background: var(--input-bg); color: var(--text); font-size: 14px; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.select-like::after { content: "▾"; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); color: var(--muted); pointer-events: none; }
.dropdown-panel { position: absolute; left: 0; right: 0; top: 100%; z-index: 10; margin-top: 2px; padding: 10px; background: var(--surface); border: 1px solid var(--input-border); border-radius: 8px; box-shadow: 0 4px 12px var(--shadow); }
.dropdown-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 8px; }
.dropdown-foot .chip-hint { margin: 0; }

/* Hide the effectiveness column when no SE filter is active */
#move-results.eff-off .eff-col { display: none; }
/* Hide the "Learned by" column when no learnable-by filter is active */
#move-results.learn-off .learn-col { display: none; }
.learn-col .learn-yes { color: var(--accent); font-weight: 600; }
.learn-col .learn-no  { color: var(--muted); }
/* "Moveset" link in the Pokémon results — jumps to the Move tab filtered to this species. */
.moves-link { color: var(--accent); cursor: pointer; white-space: nowrap; }
.moves-link:hover { text-decoration: underline; }
.moves-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }

/* Mobile / narrow-screen layout. The base layout is desktop-first: multi-field rows are a
   fixed two-column grid (.row) that never wraps, so on a phone the second column overflows off
   the right edge. Below this breakpoint, collapse those rows to a single column and let the wide
   mode-chip rows reflow. Both tabs share these classes, so this one block fixes both. */
@media (max-width: 640px) {
	/* Reclaim horizontal space. */
	main { padding: 16px 12px 48px; }
	/* Core fix: stack every field pair instead of cramming two into the width. .row-full is
	   already single-column and unaffected. */
	.row { grid-template-columns: 1fr; }
	/* The "Excluding neutral … from … All … of:" chip rows are a non-wrapping flex whose neutral
	   chip is 136px wide; let them reflow so they don't overflow a narrow single column. */
	.semode-row { flex-wrap: wrap; }
	/* 16px avoids iOS Safari auto-zooming the page when an input is focused. */
	select, input[type=number], input[type=text] { font-size: 16px; }
	/* Target dropdown checklist: one column at phone width. This has never reached the Flags and
	   Effects list despite the class matching — .target-columns makes that one a FLEX container,
	   and grid-template-columns is inert on flex. Left as-is rather than "fixed", because two
	   columns there are deliberate: 188 members in one column is a punishing scroll. */
	.target-list { grid-template-columns: 1fr; }
	/* So Flags and Effects needs its own phone treatment, in three parts.
	   1. Stop inheriting the form field's width. At a 390px viewport the field is 317px, which
	      gives 140px columns — and 29 of the 188 labels overflow them, by up to 46px. The panel
	      is absolutely positioned with left:0/right:0 inside .dropdown, so dropping `right`
	      un-pins it. The two magic numbers both derive from `main`'s 12px phone padding and the
	      field's 29px left inset: -17px pulls the panel from the field's edge out to the page's
	      (29 - 12), and 24px leaves that same 12px as a margin on each side. box-sizing matters
	      here — the panel is content-box by default, so its 10px padding lands OUTSIDE the
	      declared width and a naive calc() sits ~1px past the viewport edge. Re-derive both if
	      `main`'s padding changes.
	   2. Let labels wrap. Widening alone is NOT enough and cannot be: even edge-to-edge, two
	      columns at 390px give ~177px, and the longest label (24 chars at 7.37px/char) is 177px
	      — zero margin. Underscores are not break opportunities, so without this a long label
	      spills silently sideways instead of wrapping. This is the actual guarantee; the
	      widening is what keeps it from triggering often. Costs variable row heights on phones,
	      which makes the `columns` line-count balance in moves.js approximate here — desktop is
	      unaffected, since nothing wraps at full width.
	   3. Reclaim the width the row itself wastes. Measured at a 386px viewport, wrapping labels:
	      29 at the inherited defaults, 22 with the gap halved, 14 also trimming the 18px indent,
	      6 also at 12px. Font is the strongest lever and is applied last, since it costs the most
	      legibility; 11px would reach 3 but is too small to read on a phone. All three are scoped
	      to this list so the Target dropdown — single column, short labels — is untouched. */
	#move-effects-panel { right: auto; left: -17px; box-sizing: border-box; width: calc(100vw - 24px); }
	#move-effects-list { gap: 8px; }
	#move-effects-list .target-opt { overflow-wrap: anywhere; padding-left: 10px; font-size: 12px; }
	/* Pull the fixed theme toggle in so it can't overlap the centered heading / tabs. */
	#theme-toggle { top: 8px; right: 8px; }
}
