/*
  The corner build stamp (#416) -- one stylesheet shared by every page
  that loads it (study.html, settings.html, welcome.html, tutorial.html,
  flashcards.html, explainer_review/explainer_review.html, ... -- "seven"
  here for a long time, corrected 2026-08-23: three pages were added after
  this comment was written and nobody came back to update the count, the
  same drift scripts/page_map.py's own header already names as this file's
  own defect shape; #1907 and #1915 later took the reader page, the queue
  page, the compare page and the streak page back out of it), so the corner
  looks the same everywhere and a fix here fixes it everywhere. Deliberately
  its own file rather than a rule added to each page's own stylesheet: the
  reader, study, queue and compare stylesheets were fenced off at the time,
  owned by other branches running right then (see #416's ticket), and this
  needed to land on all four pages without touching any of them.

  Ported from milim-chatter's own corner id: position:fixed, bottom-right,
  10px monospace, unobtrusive -- legible on a phone without zooming.
  `pointer-events: none` so it never sat between a learner's thumb and the
  page underneath it -- #731 made the corner the door into the release-notes
  page (#657) by opting `#buildStamp::before` back into `pointer-events: auto`,
  and #952 found that decision was itself the defect: `shared/phone.css`
  gives every scrolling page's column `overflow-y: auto`, so that 44px box
  rode at `z-index: 2147483647` over whatever real content happened to be
  passing underneath it at the current scroll offset, on every page except
  the one (`/study`) that does not scroll. #973/#575 (2026-08-23, the
  owner's own decision) is the fix: `#buildStamp::before` no longer declares
  `pointer-events: auto` at all, so the WHOLE stamp -- ink and hit box alike
  -- is `none`, inherited from `#buildStamp` itself, on every page, at every
  scroll offset. See `#buildStamp::before` near the bottom of this file for
  what is left of that box (geometry only, kept for #952's own keep-out
  arithmetic -- see that rule's comment) and its own comment for why nothing
  there is clickable any more. The door into release-notes moved to a real
  row on the settings page instead (app/static/settings.html, the owner's
  own worksheet answer) -- this file's job is back to exactly what #416
  shipped: legible, and out of the way of every tap.

  Lives under app/static/shared/, not directly in app/static/ as #416's
  brief first suggested, because scripts/contrast_sweep.py's default_files()
  globs `app/static/*.css` (non-recursive) and, for every file it finds,
  requires a `body { background: ... }` rule in THAT SAME FILE to composite
  colours against -- see that module's docstring on why `beats/*.css` is
  excluded for exactly this reason ("component sheets that ride a host
  page's tokens and have no :root of their own"). This file is that same
  shape: no COLOUR of its own on :root, no body rule, colours meant to be
  read against whatever ground the host page already painted. (#952 added a
  :root block below, three LENGTHS since #1196 and no colour at all, so
  the property that sentence is really about -- this file resolves no page
  ground of its own, which `tests/test_page_map.py`'s
  `test_no_component_stylesheet_paints_a_ground_of_its_own` measures against
  `background` declarations, not against the presence of a :root -- is
  untouched.) Giving it a real `body { background
  }` rule to satisfy the sweep would mean picking ONE page's ground
  (study.css, flashcards.css, welcome.css and settings.css each define a
  differently-named, differently-valued token) and shipping a rule that
  fights the other three pages' own cascades merely to make an unrelated
  tool happy -- worse than the one-line path change here. contrast_sweep.py
  and tests/test_contrast_sweep.py are both outside this ticket's edit
  fence, so a subdirectory (the same mechanism that already excludes
  beats/*.css) is the fix available inside it. Flagged on #416 rather than
  applied silently.
*/

/* #952/#1196: THE CORNER THIS STAMP KEEPS OUT, published as three lengths --
   two describing the dead hit box, one describing the live clearance. Read
   the #1196 block below the #973/#575 paragraph for which is which and why
   they had to stop being one number.
   ------------------------------------------------------------------------
   The stamp is `position: fixed` at `z-index: 2147483647` and its
   `::before` below is `pointer-events: auto`, so the box that box occupies
   is taken out of every host page whether the page knows it or not. Six of
   the ten host stylesheets already reserved it -- and every one of them
   hand-typed the same arithmetic, `calc(6px + 17px + 7px)`, sized to the
   stamp's INK: 6px of lift, ~17px of rendered stamp, 7px of breathing room.
   study.css's own comment on that padding says so in as many words ("the
   stamp sits 6px above the bar and renders ~17px tall, so its band ends
   23px above the bar").

   That was true when it was written and #731 falsified it: the clickable
   surface is no longer the 17px of ink, it is a 44px `::before` anchored to
   the stamp's bottom-right corner, growing UP AND TO THE LEFT into exactly
   the space those eight paddings thought they had already cleared (two more
   pages -- study.html and explainer_review.html, which rides study.css as
   its own host -- already read the published token rather than a
   hand-typed number, so their paddings were never stale in this way -- and
   are the two pages #1196 hands the space back to, since they are the only
   two that ever grew to the hit box at all). 27px of
   invisible, top-of-z-order, `pointer-events:auto` hit area now reaches
   above the ink, and nothing grew to match. That is #952: on /study the
   bottom-right corner of "Finish this sitting" hit-tests to A#buildStamp
   and a real click there opens /release-notes.

   Eight hand-copied constants that had to be grown together and were not is
   the same defect shape `scripts/page_map.py`'s own header describes ("a
   hand-copied table is the defect; a fourth one would not have been a fix").
   So the number is published here, by the file that owns the geometry, and
   the arithmetic is written out rather than summed so the next person can
   still see which number is load-bearing -- the same courtesy study.css's
   comment extends, now with the right operand.

   Every length below is measured from the stamp's own baseline corner, NOT
   from the viewport, which is what USED TO make one number true on all ten
   pages: `#buildStamp` is `bottom: 6px; right: 9px` here, and shared/nav.css
   lifted only the `bottom` to `calc(var(--milim-nav-total) + 6px)` on the
   pages that have a bottom bar -- the same 6px, above the bar's top edge
   instead of the viewport's. So a page's flow column reserving
   `--milim-stamp-keepout-block` below its last row cleared the stamp on a
   nav page and a nav-less page alike, and `--milim-nav-total` cancelled out
   of the arithmetic entirely.

   #1409 ENDED that cancellation on purpose, and it is the one paragraph in
   this header a reader must not carry forward. nav.css no longer lifts the
   stamp above the bar: it stands it ON the bar's own band
   (`bottom: var(--milim-nav-row-top)`), inside the strip of safe-area
   padding the bar already keeps ABOVE its icon row. The bar therefore covers
   part of the ink, the covered part is a function of the inset, and
   `--milim-stamp-keepout-block` is consequently TWO values -- the `:root`
   one below for the two pages with no bar, and nav.css's `body` override for
   the eight that have one. The 23px this file publishes is no longer what a
   page with a bottom bar reserves. See the token's own comment below, and
   nav.css's, which carry the arithmetic and the measurements.

   #2714 moved it again, to the other end of the bar's row: nav.css now
   stands the stamp on the row's FLOOR (`bottom: var(--milim-nav-row-bottom)`),
   under the labels, and draws it smaller there (8px type, 8.8px of ink) so it
   fits the row's own bottom padding. On a page with a bar it is therefore
   inside the bar at every inset, nav.css's `body` override of the keep-out
   is 0px, and the bar dropped the strip above its row the stamp used to sit
   in. Everything in THIS file -- the 10px stamp, the 6px lift, the 17px ink,
   the 23px keep-out -- now describes only the pages with no bar.

   #1196 MEASURED that cancellation rather than continuing to assert it,
   because it is the load-bearing half of "one number, ten pages" and every
   instrument in this repo reads the inset as 0 (the trap #1124's own comment
   names). Real Chrome, `Emulation.setDeviceMetricsOverride` at a true
   393x852, the app served off disk, with `env(safe-area-inset-bottom)`
   textually substituted to 34px through a proxy in front of the real server
   (`scripts/study_layout_probe.py`'s own `_ENV_INSET`): `.milim-nav-spacer`
   grew from 58px to 92px and the stamp's baseline moved with it, while the
   distance from that baseline to the top of the ink stayed 23px and the slack
   between /study's last flow row and the ink stayed 34px, unchanged to the
   pixel. Both the spacer and `#buildStamp`'s `bottom` read the same
   `--milim-nav-total`, so the inset really does cancel; it is a measurement
   now, not an argument.

   These are declared on :root rather than on `body` (where nav.css declares
   `--milim-nav-total`) because both are literal lengths: nav.css's own
   comment explains that its token has to be on `body` precisely because it
   resolves a `var()` at declaration time and would otherwise inherit an
   already-substituted value. Neither of these resolves anything, so that
   hazard does not apply.

   WHAT THIS DOES NOT FIX, and it was deliberate that it did not pretend to:
   a static flow reservation only holds content out of the corner at the
   BOTTOM of the scroll. `shared/phone.css` gives `[data-milim-main]`
   `overflow-y: auto`, so on the six host pages whose column actually
   scrolls, mid-scroll content passes under this box at every scroll offset
   and no amount of padding can reach it. /study was the one page where the
   reservation was sufficient, because its column does not scroll at all
   (measured: `scrollHeight - innerHeight === 0` at every viewport height).

   #973/#575 fixes exactly that gap, by a different mechanism than "grow the
   reservation": `#buildStamp::before` below no longer declares
   `pointer-events: auto` at all, so nothing in this corner is hit-testable
   on ANY page, scrolling or not, at ANY scroll offset -- there is no longer
   a box for a scrolling page's content to pass under.

   #1196: WHICH IS WHY THE TWO FACTS BELOW ARE NOW NAMED SEPARATELY.
   ------------------------------------------------------------------------
   #973/#575 left the tokens at the hit box's geometry and said so in as many
   words -- "both are dead geometry, kept for the record #952 built" -- which
   was the right call for a one-line `pointer-events` fix that did not want
   six stylesheets of churn. The cost of leaving it was that a token spelled
   KEEPOUT, read by two pages' `padding-bottom`, went on publishing the size
   of a box nobody has to keep out of. /study paid 27px of a `height:100dvh`
   column for it (#1225: "you should not be including the build number on the
   page as counting against the layout"), and that is not rounding on the one
   screen this app fights hardest for space on.

   So one name is not enough, and OVERWRITING the 50px with the ink would
   have destroyed the other half of the record. There are two different
   numbers here and they answer two different questions:

     --milim-stamp-box-*      WHAT THE ::BEFORE BOX OCCUPIES. Dead geometry.
                              6px lift + the 44px box = 50px up; 9px inset +
                              the 44px box = 53px in. Nothing keeps out of
                              it, nothing needs to. It is published so that
                              #952's record stays legible and so that
                              `tests/test_build_stamp_keepout.py` can keep
                              re-deriving 44px from the rule that declares
                              it -- growing the box without growing this
                              still fails, exactly as it did before, and
                              `tests/test_api_chrome.py`'s
   `test_the_build_stamp_hit_area_never_reaches_the_nav_bar_beneath_it`
                              still holds the box to the corner it was
                              anchored to.

     --milim-stamp-keepout-*  WHAT A PAGE MUST ACTUALLY RESERVE. Live. The
                              stamp is opaque (#572) at z-index 2147483647,
                              so a flow row inside its band is PAINTED OVER
                              -- that hazard survived #973/#575 even though
                              the tap-stealing one did not. The band is the
                              6px lift plus the ink, and the ink is MEASURED,
                              not inherited: 17.0px, `getBoundingClientRect`
                              on the served `#buildStamp` in a real Chrome at
                              a true 393x852, light and dark, on /study and
                              /progress, question up and answered -- eight
                              readings, all 17.0. It agrees with the height
                              `tests/js/test_css_contract.mjs` computes from
                              this rule's own font metrics (10px x 1.5 + 2 x
                              1px), which is the point of taking it: the
                              derivation and the render now corroborate each
                              other instead of one standing alone.

   Measuring rather than inheriting is the whole lesson of #952. The 50px
   went stale because #731 grew the box and nine hand-typed constants did
   not move; the "~17px" in this file's own prose is the same shape of
   number, a rendered height carried in a comment, and #1196 declined to
   promote it to a declaration on the strength of the comment alone.

   There is deliberately NO `--milim-stamp-keepout-inline`. The block axis
   has a constant answer because the ink's HEIGHT is fixed by this rule's
   font metrics; the inline axis does not, because the ink's WIDTH is
   whatever build_stamp.js writes into it. Measured on this worktree's own
   build the stamp rendered 341.7px wide -- the sha, the checkout name and
   the start time on one line (#711) -- against a published 53px. Publishing
   an inline clearance would therefore be publishing a number that is false
   on the page it was read from, which is precisely the failure this ticket
   exists to undo. `--milim-stamp-box-inline` stays, describing the box and
   only the box; the occlusion width is filed separately rather than guessed
   at here. Nothing in `app/` reads either inline value today.

   `tests/test_build_stamp_keepout.py` re-derives BOTH facts from the
   declarations below rather than hand-typing either: the box tokens from
   `#buildStamp::before`'s own width/height plus the stamp's own
   right/bottom, and the keep-out from that same bottom plus the ink height
   `tests/js/test_css_contract.mjs` computes from the font metrics. Growing
   the box without growing `--milim-stamp-box-block` still fails, and
   changing the stamp's font-size or line-height without moving
   `--milim-stamp-keepout-block` fails too -- which is the guard the 50px
   never had. */
:root {
  /* #1196. THE BOX -- dead geometry, kept for the record (see above). */
  /* 6px of lift off the stamp's baseline + the 44px hit box above it. */
  --milim-stamp-box-block: 50px;
  /* 9px of inset from the right edge + the 44px hit box left of it. */
  --milim-stamp-box-inline: 53px;

  /* #1409. THE INK -- the stamp's own rendered height, and nothing else.
     Published as its own name because #1409 needed the ink WITHOUT the lift:
     `--milim-stamp-keepout-block` just below is the lift plus this, and
     shared/nav.css subtracted it from the bar's half-inset. #2714 stopped
     nav.css reading it -- a bar page's stamp is its own, smaller ink, sized
     in nav.css to the row it sits in -- so this is the BAR-LESS stamp's ink.

     17.0px, MEASURED -- `getBoundingClientRect` on the served `#buildStamp` in
     a real Chrome at a true 393x852, light and dark, on /study and /progress,
     question up and answered (#1196's eight readings), and re-measured on all
     ten host pages at six bottom insets for #1409. It agrees with the height
     `tests/js/test_css_contract.mjs` computes from `#buildStamp`'s own font
     metrics below (10px x 1.5 + 2 x 1px), and that agreement is asserted
     rather than assumed -- see that file, and
     `tests/test_build_stamp_keepout.py`'s
     `test_the_published_ink_is_the_stamps_own_rendered_height`. */
  --milim-stamp-ink-block: 17px;

  /* #1196/#1409. THE CLEARANCE -- what a page's flow column must reserve.
     6px of lift off the stamp's baseline + the ink above it.

     #1409: this is now the NAV-LESS value. Two of the ten host pages have no
     bottom bar (welcome.html and explainer_review/explainer_review.html --
     neither loads shared/nav.js, so nothing builds a `.milim-nav` for them),
     and on those the stamp still sits `bottom: 6px` off the viewport's own
     edge with the page's own content directly underneath it. They must still
     reserve the whole band.

     shared/nav.css OVERRIDES this on `body` for the eight pages that do have a
     bar (to 0px since #2714), because there the stamp no longer sits above
     the bar at all -- see
     that file's own `#buildStamp` rule and the `--milim-stamp-keepout-block`
     beside it. The override is on `body` and this is on `:root`, so the eight
     bar pages resolve nav.css's value and the two bar-less pages resolve this
     one, with no cascade fight and no `@supports`/media guessing: a page that
     does not load nav.css cannot see the override at all.

     No inline counterpart, on purpose: see the paragraph above on why the
     ink's width is not a constant (#1230 measured it at 186-454px against a
     published 53px, which is why nothing tucks the stamp sideways).

     Still a plain length rather than `calc(6px + var(--milim-stamp-ink-block))`
     -- which would read better -- because
     `test_the_published_keep_out_is_the_stamps_own_lift_plus_its_measured_ink`
     re-derives it from exactly that sum, as an EQUALITY, so it cannot drift;
     and because two stylesheets and both test tiers read it as a resolvable
     px length. A
     `calc()` here buys legibility at the cost of every one of those readers
     needing an expression parser. */
  --milim-stamp-keepout-block: 23px;
}

#buildStamp {
  position: fixed;
  bottom: 6px;
  right: 9px;
  z-index: 2147483647;
  font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
  font-size: 10px;
  line-height: 1.5;
  letter-spacing: 0.02em;
  white-space: nowrap;
  padding: 1px 6px;
  border-radius: 5px;
  /* #731 (and a review that caught it): this STAYS `none`, unchanged from
     #416. A real <a href> lives here (build_stamp.js builds it), but
     nav.css's own #buildStamp comment already explains why this box's
     hit-testing must stay off -- the stamp can sit close enough to the
     bottom nav's rightmost items that an `auto` here would steal their
     taps, "the worse failure" that comment names. #731 briefly opted
     `#buildStamp::before` below back into `pointer-events: auto` to make
     the corner clickable; #973/#575 (2026-08-23) removed that, because the
     44px box it grew was *also* hit-testable over every scrolling page's
     real content at every scroll offset (#952) -- see this file's own
     #973/#575 comment above `:root` for the measurement and the ticket.
     `#buildStamp::before` now declares no `pointer-events` of its own at
     all, so it inherits this `none` the same as every other pixel of the
     stamp -- the whole corner is out of hit-testing, on every page,
     unconditionally. The release-notes door moved to a real row on
     app/static/settings.html instead. Keyboard activation (Tab, then
     Enter) on the anchor itself is unaffected either way -- `pointer-events`
     governs pointer hit-testing only, never focus or a synthesized keyboard
     click; the anchor stays real and keyboard-reachable, it is simply never
     the thing a pointer's tap resolves to. */
  pointer-events: none;
  user-select: none;
  /* #731: a bare <a href> picks up the UA's link underline/colour by
     default; `color` below already overrides the colour, and this keeps the
     underline from appearing too -- the ink stays exactly what #416
     shipped, a quiet corner rather than a button. */
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
  color: rgba(70, 70, 70, 0.72);
  /* #572: was rgba(255,255,255,0.55) -- translucent enough that page text
     underneath blended into the stamp's own text instead of being covered by
     it (readable/settings.css's "Study page tutorial" hint rendered as
     "A short screen explaining`8ce120a · ...`e study page works"). Solid now,
     no alpha, so it occludes cleanly instead of compositing. Not a literal
     var(--chalk) reference -- this file is intentionally not coupled to any
     one host page's tokens (see the header comment above); #F2F1EC is the
     light "chalk" value eight of the ten page stylesheets already share
     (settings/queue/reader/compare/tutorial/welcome/streak/flashcards), and
     close enough to study.css's own --ground (#F3F1EC) that the other two
     pages -- study.html, and explainer_review.html which rides study.css as
     its own host -- read the same without this file depending on a token it
     doesn't define. */
  background: #f2f1ec;
}

/* #731 grew this box to the 44px floor this app already holds every other
   control to, as a `pointer-events: auto` hit target, without the visible
   ink growing with it. #973/#575 (2026-08-23, the owner's own decision on
   #952) removed that `pointer-events: auto` -- it is not merely commented
   out, it is gone, and the box below declares no `pointer-events` of its
   own at all any more, so it inherits `none` from `#buildStamp` above like
   everything else in this corner. #952's own measurement is why: in Chrome
   at 390px on /study, 455 of the 6,208 interior points of `#endSitting`
   ("Finish this sitting") hit-tested to this box, and a real click on the
   painted pill navigated to /release-notes with the sitting never actually
   finishing -- and `/study` was the ONE page a static keep-out reservation
   could ever fully protect (see this file's #952/#973/#575 comment above
   `:root`), because every other stamped page scrolls
   (`shared/phone.css`'s `overflow-y: auto`) and real content passes under a
   fixed corner at every offset a reservation cannot see. Nothing here can
   be tapped now, on any page, so that failure mode is closed rather than
   merely fenced off with a bigger number.

   The geometry -- `content`, `position`, `right`, `bottom`, `width`,
   `height` -- is UNCHANGED and kept on purpose, not because any of it still
   matters for tappability (it does not) but because
   `tests/test_build_stamp_keepout.py` still re-derives
   `--milim-stamp-box-block`/`-inline` (#1196: renamed from
   `--milim-stamp-keepout-*`, which now names the live clearance instead --
   see the :root block's own comment) from exactly these four
   declarations, and ripping the rule out from under that arithmetic would
   break a working guard to chase a cosmetic cleanup this ticket did not
   ask for. `bottom: 0; right: 0`, no centring transform, is also left as
   #731 anchored it (see that ticket's own note, preserved below, on why a
   centred version once put 7.5px of this box over the nav bar) -- purely
   because the geometry is inert either way and there was no reason to
   disturb it.

   #731's own note on the centring defect, preserved for the arithmetic it
   still explains: a first version of this rule centred the 44px box on the
   stamp (`top/left: 50%` + `translate(-50%, -50%)`) and shipped a defect a
   review caught before merge -- nav.css's OWN `#buildStamp` rule lifts this
   corner to sit just 6px above the bottom nav (`bottom: calc(var(--milim-
   nav-h) + env(safe-area-inset-bottom) + 6px)`), and the stamp itself
   renders about 17px tall (#572's own comments on `study.css`/
   `tutorial.css` state this). A 44px box centred on
   a 17px-tall stamp extends (44-17)/2 = 13.5px past EACH edge -- 13.5px
   beyond a 6px margin is 7.5px of hit area that would have sat on top of
   the nav bar's own rightmost items, back when this box was hit-tested at
   all. `#buildStamp` is `position: fixed` above, which is enough on its own
   to be the containing block this `position: absolute` anchors against --
   no extra `position: relative` needed.

   `tests/test_api_chrome.py`'s own guards on this rule were rewritten for
   #973/#575 -- see `test_the_build_stamp_is_never_hit_testable` (the new
   one, asserting the untappable half directly) and this file's own
   `test_the_build_stamp_tap_target_clears_the_44px_floor_without_the_ink_growing`
   (kept, now documented as tracking dead-but-published geometry
   rather than a live tap target). */
#buildStamp::before {
  content: "";
  position: absolute;
  right: 0;
  bottom: 0;
  width: 44px;
  height: 44px;
}

@media (prefers-color-scheme: dark) {
  #buildStamp {
    color: rgba(210, 210, 210, 0.72);
    /* #572: same reasoning as the light rule above -- solid, matching the
       shared dark "chalk" (#15171C) eight of ten pages already use. */
    background: #15171c;
  }
}

/* #711 follow-up: a build served from an agent's worktree names itself
   inline (build_stamp.js appends "· <checkout>" to the same line -- see
   that file's own #711 comment for why it is one line, not two) and now
   also reads differently by colour, same mechanism `#buildStamp.is-behind`
   below already uses for the same reason -- a state worth noticing should
   not depend on reading the small print. `checkout_name === "main"` (the
   owner's own build, the common case) and a missing/null `checkout_name`
   both never carry this class at all, so this rule never touches the
   owner's own corner. Deliberately declared BEFORE `.is-behind` below: both
   classes can be present together (a worktree that has also fallen behind
   `origin/main`), and source order is the tiebreaker between two rules of
   equal specificity -- staleness is the more urgent of the two states, so
   `.is-behind`'s colours win when both apply. Only `color`/`background`
   change here, the same two properties `.is-behind` swaps -- no font-size,
   line-height or padding, so the stamp's own rendered height
   (tests/js/test_css_contract.mjs's "the stamp's own rendered height"
   assertion, computed from the bare `#buildStamp` rule above) cannot move. */
#buildStamp.is-worktree {
  color: rgba(255, 255, 255, 0.92);
  background: #2f5fa8;
}

@media (prefers-color-scheme: dark) {
  #buildStamp.is-worktree {
    background: #3f74c9;
  }
}

/* A stale process is the failure this ticket exists to make visible (#405) --
   marked in color, not only in text, so it reads at a glance rather than on
   a squint. Applied by build_stamp.js only once it has actually counted a
   positive gap against `origin/main`'s local ref. */
#buildStamp.is-behind {
  color: rgba(255, 255, 255, 0.92);
  /* #572: solid, same reasoning as the base rule -- was rgba(180,60,40,0.75). */
  background: #b43c28;
}

@media (prefers-color-scheme: dark) {
  #buildStamp.is-behind {
    /* #572: solid -- was rgba(200,70,50,0.7). */
    background: #c84632;
  }
}

/* #2617: the in-app theme override, `html[data-theme=...] SELECTOR` (not
   `:root[data-theme=...] SELECTOR` -- the literal substring `:root[data-theme="`
   is what a contrast-sweep guard keys on to find a REAL `:root`-level
   override, and `html`/`:root` name the same element here) --
   same reasoning as study.css's own `.path-offunit`/`.path-map` pairs: the
   attribute lives on `:root`, not on `#buildStamp` itself, so the ancestor
   form is what carries the specificity win over both the bare rule and the
   `@media` rule above. Source order is preserved between `.is-worktree` and
   `.is-behind` below (worktree first, behind second) for the identical
   reason the base rules above are ordered that way -- both classes can be
   present together, they share the SAME specificity as each other, and
   `.is-behind`'s colours are meant to win when they are. Dark restates each
   `@media` block just above; light restates each corresponding base rule. */
html[data-theme="dark"] #buildStamp { color: rgba(210, 210, 210, 0.72); background: #15171c; }
html[data-theme="light"] #buildStamp { color: rgba(70, 70, 70, 0.72); background: #f2f1ec; }
html[data-theme="dark"] #buildStamp.is-worktree { background: #3f74c9; }
html[data-theme="light"] #buildStamp.is-worktree { background: #2f5fa8; }
html[data-theme="dark"] #buildStamp.is-behind { background: #c84632; }
html[data-theme="light"] #buildStamp.is-behind { background: #b43c28; }
