chore(comments): drop epic, sprint and review-round ids from the code

The code cited its plan instead of saying why: `E28 review J4`, `(R6 S3b)`, `S1 justified…`,
`deep-review round 5`. That plan lives in the private ops repo, so for every reader of this one the
citation was noise, and a sentence whose subject was the plan step ("round 2 showed…") hid its
lesson behind an id. Each one is gone and the "why" kept: a bare citation is deleted, a sentence
carrying a lesson is reworded around it ("a later attempt showed…").

Measured (`scripts/audit_metrics.py`, product code): 652 lines in 270 files carried an epic code by
the definition the next commit holds (507 / 241 by the old, two-digit-only one) -> 0. Across all
code, tests, scripts and configs: ~1100 epic-code lines plus ~320 sprint/round ids.

Behaviour unchanged, checked mechanically: every changed .py file has the same AST once docstrings
are blanked; css/sh/toml/yml/json files are identical once comments are stripped; the only
non-comment changes in TS/JS are test titles, one description string in a contract table, and five
ESLint messages, whose text is all the gates snapshot diff holds. Not touched: Markdown (docs and
the changelog keep their history), Alembic migrations, TV episode notation (`S2 · E5`), DESIGN.md
ids (`C1`, `B4`, `S3h`), tracker ids (`SEC-16`, `DX-17`).

One stale claim fixed on the way: test_hls_reaper's docstring said the player checkpoints "every
10 s whether or not it is playing", which plex/stream.py calls wrong; it now says what the code does.
This commit is contained in:
2026-10-05 00:19:39 +02:00
parent c73d8be094
commit 4aaaaa7860
669 changed files with 1831 additions and 1904 deletions
+26 -25
View File
@@ -75,14 +75,14 @@
--text-3xs: 0.625rem; /* 10px @ base */
}
/* ===== E28 tokens as utilities (docs/DESIGN.md) — the ONE source the ui/ primitives and the design
/* ===== Tokens as utilities (docs/DESIGN.md) — the ONE source the ui/ primitives and the design
lab both read, so a decided value is never restated as an arbitrary class. ===== */
/* B3: `act:` — a hover or press that answers only a control that can act: not a disabled one, not a busy
one (FocusSafeButton's aria-disabled). `:disabled` never matches an <a>, so one variant serves a
button and a link alike. A literal variant, never a prefix glued on at runtime: Tailwind emits CSS
only for a class it finds WHOLE in the source, and the `${ACT}hover:…` the primitives used to build
shipped with no rule at all (E28 audit; ui/tailwindScan.contract.test.ts). */
shipped with no rule at all (ui/tailwindScan.contract.test.ts). */
@custom-variant act (&:not(:disabled, [aria-disabled="true"]));
/* B3: a transparent control's hover / pressed layer. The layer answers only a control that can act:
@@ -96,9 +96,9 @@
background-color: var(--press);
}
}
/* A3: the coarse-pointer target (the why is at the E10 S1c note below). A caller's own `min-h-6` /
/* A3: the coarse-pointer target (the why is in the tablet note below). A caller's own `min-h-6` /
`min-w-6` (the mouse's 24 floor, B1) is a utility too and sorted after this one, so every control
that carried both stayed 24 on a tablet (E28 audit, measured): on a coarse pointer the target wins,
that carried both stayed 24 on a tablet (measured): on a coarse pointer the target wins,
hence `!important`. (It would lower a caller's LARGER minimum; no control pairs it with one.) */
@utility touch-target {
@media (pointer: coarse) {
@@ -144,7 +144,7 @@
/* The reading measure for prose (a synopsis, a biography, a channel's description): ~65 characters
a line, inside the 45–75 a reader follows back to the next line's start. A full-width page ran
one to 110 (owner, E28 S3h: "shorter lines are easier to follow"). Only where the container can
one to 110 (owner: "shorter lines are easier to follow"). Only where the container can
be wider than that; a narrow panel or popover is its own measure. */
@utility measure {
max-width: 65ch;
@@ -154,7 +154,7 @@
dissolves as it slides under (the reference is DataTable's sticky header). The host is positioned. */
/* A STICKY header's fade (a table head, the server log's toolbar), inside the scroller it sticks in.
It shows only once content has slid under it: at rest it lay over the first row's top 16 px,
dimming it and hiding the top edge of its keyboard ring (E28, seen live). It fades in over the
dimming it and hiding the top edge of its keyboard ring (seen live). It fades in over the
first 1rem of scroll by a scroll-driven animation; an engine without one draws no fade rather than
a fade over the resting first row. */
@keyframes fade-edge-in {
@@ -271,17 +271,17 @@
}
}
/* R9 focus foundation: one accent focus ring for keyboard users on every interactive element that
/* Focus foundation: one accent focus ring for keyboard users on every interactive element that
doesn't define its own. In @layer base so any component/utility focus style (.selectable, an input's
focus:ring, a menu item's data-active highlight + outline-hidden) overrides it. Non-input controls
app-wide had no visible keyboard focus before R9; this is the single biggest a11y win. */
app-wide had no visible keyboard focus before this; this is the single biggest a11y win. */
@layer base {
button:focus-visible,
a:focus-visible,
[role="button"]:focus-visible,
[role="tab"]:focus-visible,
summary:focus-visible {
/* Solid accent (E11 D2 = B): the 60% mix of R9 all but vanished on the dark glass. */
/* Solid accent: the earlier 60% mix all but vanished on the dark glass. */
outline: 2px solid var(--accent);
outline-offset: 2px;
}
@@ -547,7 +547,7 @@ body {
/* ===== Liquid-glass surface system (theme-aware, GPU-light) ===== */
/* In @layer components so the recipe classes below (.selectable) compose with utilities instead of
silently beating them the way these rules did while unlayered. (The ~9 dead `shadow-*` that used to
sit on glass surfaces were REMOVED in R9, not activated: the tuned glass box-shadow — including its
sit on glass surfaces were REMOVED, not activated: the tuned glass box-shadow — including its
inset top-edge highlight — is the intended depth, and a shadow-* utility would atomically replace it
and drop that highlight.) The perf-mode and :hover overrides below stay UNLAYERED on purpose. */
@layer components {
@@ -614,7 +614,7 @@ body {
box-shadow: var(--shadow-float);
}
/* R9: standard interactive-row recipe. The hover tint menu/list rows already use, PLUS the
/* Standard interactive-row recipe. The hover tint menu/list rows already use, PLUS the
app-wide focus-visible ring that was missing on non-input controls (buttons, rows, menu items) —
the biggest single a11y win. In @layer components so a consumer's own utilities still win; the
accent ring renders correctly under v4 (color-mix), matching the input ring in ui/form.tsx. */
@@ -633,8 +633,8 @@ body {
outline-offset: -2px;
}
/* E11 S4 · a list/grid item the keyboard landed on (`lib/listNav`): the SAME solid ring, around the
whole card rather than one control inside it (D2 = B). It is focus-visible only, so a mouse click
/* A list/grid item the keyboard landed on (`lib/listNav`): the SAME solid ring, around the
whole card rather than one control inside it. It is focus-visible only, so a mouse click
never paints it, and it is a ring rather than a fill, so it never reads like the hover tint. The
scroll margins are what `scrollIntoView({block:"nearest"})` honours: they keep a card stepped to
from sliding under the floating header (`--hdr-h`) or flush against the bottom edge. */
@@ -670,7 +670,7 @@ body {
outline-offset: -2px;
}
/* ===== R10 S4 · Selection-paint recipes =====
/* ===== Selection-paint recipes =====
The ~14 hand-rolled "this is the selected / current / active one" idioms all painted the SAME
bg-accent fill via an inline ternary (`sel ? "bg-accent text-accent-fg border-accent" : "…"`),
which drifted over time. These recipes OWN that paint, keyed on the semantic ARIA the control
@@ -678,7 +678,7 @@ body {
ui/Tabs) or `aria-current` (the single current item) and the CSS paints, so one control's selected look can never diverge from
the next's. Geometry (padding / radius / border-width / font) stays a per-site utility since it
legitimately varies. NO focus-visible here on purpose: the `@layer base` rule above already rings
every button/a/[role]; re-adding it would duplicate that (an R9 review finding). Because these sit
every button/a/[role]; re-adding it would duplicate that (a review finding). Because these sit
in @layer components, a site's own utility still wins — so a MIGRATED site must DROP its bg/text/
border-color utilities (else a utility-layer `bg-*` beats the recipe's pressed fill). Add
data-soft="true" for the subtle tint some surfaces use instead of the solid fill. */
@@ -704,7 +704,7 @@ body {
border-color: color-mix(in srgb, var(--accent) 55%, transparent);
}
/* selected — SOLID accent fill (the dominant idiom). (The nav rail's "you are here" is ui/NavRail's
tint + edge bar since E28 S3d; its old `.is-current` recipe is gone.) */
tint + edge bar now; its old `.is-current` recipe is gone.) */
.pill[aria-pressed="true"],
.pill[role="tab"][aria-selected="true"] {
background-color: var(--accent);
@@ -740,7 +740,7 @@ body {
color: var(--accent-fg);
border-color: var(--accent);
}
/* ===== E10 S1c · the minimum-target half of the tablet comfort contract (docs/DESIGN.md) =====
/* ===== The minimum-target half of the tablet comfort contract (docs/DESIGN.md) =====
A 32px icon button is fine with a mouse (a precise pointer plus hover to confirm the aim) and
not fine with a thumb. So the minimum grows ONLY where there is no precise pointer, which on
this app's real second device — a tablet — is exactly where it is needed.
@@ -755,7 +755,7 @@ body {
would be the one control that ignores the user's text-size setting.
(The rule itself is the `touch-target` utility near the top of this file.) */
/* ===== E10 S2 · rows that answer a right-click / long-press (useContextMenu) =====
/* ===== Rows that answer a right-click / long-press (useContextMenu) =====
The long-press path competes with two browser behaviours that fire at the same gesture:
iOS Safari's own callout (Copy / Share over a link or image) and the text-selection handles.
Both would appear ON TOP of our menu, so the attribute the hook stamps on the row turns them
@@ -772,8 +772,8 @@ body {
}
}
/* `:not(:disabled)` for the same reason ui/Button prefixes every variant hover with `enabled:` — a
disabled control must not advertise a click that does nothing. The Tailwind half was gated in E10
review round 1 and this half was missed, so a disabled glass button still lifted (round 2).
disabled control must not advertise a click that does nothing. The Tailwind half was gated first
and this half was missed, so a disabled glass button still lifted.
`:not([aria-disabled="true"])` too: a FocusSafeButton that holds the focus is disabled by
aria-disabled, not the native attribute (debt burn 2026-09), and lifted again until this. */
.glass-hover:not(:disabled):not([aria-disabled="true"]):hover {
@@ -801,7 +801,8 @@ body {
}
/* The mirror of `.reveal-hover`: a control that exists ONLY on touch, because a mouse reaches the
same action another way — a video or Plex card's "…" beside the title, whose mouse twin sits
in the hover row on the picture (E28 C1, `ui/reveal.ts`). `display: none`, so it is no Tab stop either. */
in the hover row on the picture (DESIGN.md C1, `ui/reveal.ts`). `display: none`, so it is no
Tab stop either. */
.touch-only {
display: none;
}
@@ -997,7 +998,7 @@ html[data-scheme="midnight"][data-theme="light"] {
--accent-fg: #ffffff;
}
/* Forest — dark green-slate with a cyan accent (E28 B2: teal read as success) */
/* Forest — dark green-slate with a cyan accent (DESIGN.md B2: teal read as success) */
html[data-scheme="forest"][data-theme="dark"] {
--bg: #0a1512;
--surface: #0f1f1a;
@@ -1019,7 +1020,7 @@ html[data-scheme="forest"][data-theme="light"] {
--accent-fg: #ffffff;
}
/* Slate — neutral grey with a fuchsia accent (E28 B2: orange read as warn) */
/* Slate — neutral grey with a fuchsia accent (DESIGN.md B2: orange read as warn) */
html[data-scheme="slate"][data-theme="dark"] {
--bg: #15171c;
--surface: #1b1e25;
@@ -1041,7 +1042,7 @@ html[data-scheme="slate"][data-theme="light"] {
--accent-fg: #ffffff;
}
/* Matrix — near-black with a lime accent (E28 B2: the terminal green read as success) */
/* Matrix — near-black with a lime accent (DESIGN.md B2: the terminal green read as success) */
/* Matrix is moss, not neon (owner, 2026-09-24): the accent sits at Midnight's lightness (OKLCH L 0.67)
with half the old lime's chroma, and the neutrals are barely tinted, so the page doesn't glow green. */
html[data-scheme="matrix"][data-theme="dark"] {
@@ -1181,7 +1182,7 @@ html[data-theme="light"] {
z-index: var(--z-index-rail);
}
/* …and it only fills the viewport while no ancestor has a filter: a `backdrop-filter` makes that
ancestor the fixed stage's containing block. The modal's card is a blurred `.glass` panel (E28 S3d1),
ancestor the fixed stage's containing block. The modal's card is a blurred `.glass` panel,
so while the stage is maximised the card drops its blur — the stage covers the card anyway. `html `
outranks `html[data-theme="dark"] .glass`, which sets the blur again (lib/playerStage.contract.test.ts). */
html .glass:has(> .player-stage--max) {