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:
+26
-25
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user