/* ==========================================================================
   exp33 . HDR AS AN EVENT
   Driver: the HDR module at the foot of assets/herograph.js
   Assets: assets/hdr/pq-term-*.png, assets/hdr/mark-dot-*.png
   Load LAST, after assets/hero-v2.css.

   THE RULE THIS FILE IMPLEMENTS (founder, binding)
     HDR is not a colour palette. HDR is an event.
     Super-luminant phosphor represents active computation, propagation and
     successful verification. Everything else stays inside the SDR palette.
     dim green = knowledge . HDR green = computation / verification happening.
     Luminance itself becomes a state channel.

   SO EVERY *STATE* IS AN EVENT. Every rule in sections 1-6 is behind an
   `html.hx-*` class that the driver adds for the length of one event window and
   removes again, which is also what makes the claim checkable: outside the
   window the computed background-image of every eligible element is `none`, not
   a url. (The prefix is hx-, not ev-: `ev-` is assets/evidence.css's component
   prefix, and `.ev-head span{font-size:.68rem}` matches every span on the page
   the moment such a class lands on <html>.)

   THREE EXCEPTIONS, AND THEY ARE THE FOUNDER'S, NAMED IN ONE SENTENCE
   The instruction, twice given and preserved verbatim below at section 7:
     "blinking cursor does not have any HDR, same as request demo and the proof
      logo -- I want it to use it by default"
   and, later and shorter, "blinking cursor should use hdr all the time like
   before."

   An earlier pass gave those three CHROME carriers a RESTING tier on the tube.
   A later pass withdrew all three, citing the brief's flat acceptance criterion
   -- "Nothing is HDR at rest. Screenshot the resting frame and confirm no HDR
   asset is visible." That withdrawal is overruled. The founder wrote the brief
   AND the instruction, and he has now said the second thing twice; where the
   two disagree the named instruction wins, on exactly the three elements it
   names and on nothing beside them:

     the blinking hero cursor    -- the page's one continuously live element
     the `Request demo` frame    -- "request demo", by its label
     the wordmark period         -- "the proof logo"

   WHAT IS DELIBERATELY NOT ON THAT LIST, EVEN THOUGH IT SITS BESIDE SOMETHING
   THAT IS. The hero ACTION brackets (7.2b) are the same `[ ]` furniture as the
   header CTA but they wrap `Open SYS-REQ-009`, a link into a requirement -- dim
   green is knowledge, and a permanent emitter there would claim computation for
   a document. The tube's own h1::after (7.1) sits on nine pages with no graph,
   no driver and no verification beat, so lighting it would represent no
   computation at all -- which is the case the brief's rule genuinely exists for.
   Both are one selector away from the restored rules and both stay dark.

   A FOURTH, RULED LATER AND NARROWER: THE MARK INSIDE THE SENTENCE
     "in hero can you highlight word 'proof' in copy as our logo, and with hdr?"
   The first word of the hero subhead is the product's name, so it is set as the
   wordmark and it carries the wordmark's emission. It is the same brand asset
   as the period and it shares the period's declaration block outright -- see
   section 7.5. It differs from the three above in one way that matters and one
   that does not: it is inside READING TEXT, which the brief's forbidden list
   names ("HDR body text"), and it takes the RESTING tier ONLY, never the event
   tier, so the decade above the floor is still spent on nothing but computation
   and verification. 7.5 records the objection in full rather than burying it.

   THE INVARIANT, RESTATED SO IT STAYS MACHINE-CHECKABLE
   Every background-image that resolves to hdr/ is behind an hx-/hb- class,
   EXCEPT these four, which carry --pq-rest with no class, by ruling:
     .hero33 .hero-copy h1 .h1-em::after
     .site-header .nav > .btn-primary::before / ::after
     .wordmark .dot
     .hero33 .hero-sub .hero-wm
   That is the entire exception list. A walk of every element and both pseudo-
   elements across all ten pages returns those carriers and no others.

   THE TWO TIERS ARE A FACTOR OF TEN APART, WHICH IS WHAT KEEPS THE EVENT AN
   EVENT. pq-term-rest.png is 1000 nits nominal; pq-term-flat.png is 10000, at
   the same chromaticity. At the strike the cursor swaps one raster for the
   other, so the same pixels go up a decade; the blink stops in the same instant,
   so the duty cycle goes from a half to one; and the bloom and the width go with
   them. A lit cursor is the FLOOR the flash is measured from, never the flash.

   AND THE SDR PAGE DOES NOT MOVE ONE PIXEL, EITHER DIRECTION
   The resting tile was calibrated to decode to #2BFF6F EXACTLY (dE2000 0.000),
   and it lies over a background-color of that same green -- so in SDR the block
   renders as flat rgb(43,255,111) whether the raster is present or absent. What
   the ruling puts back is luminance headroom on an HDR panel: the only part the
   argument was ever about, and the one part no SDR screenshot could ever show.

   ELIGIBLE ELEMENTS, AND NOTHING ELSE. ALL BUT THREE ARE BEHIND A CLASS.
     the block cursor after the headline          .hero33 h1 .h1-em::after
       -- resting carrier: --pq-rest with no class, plus the EVENT tier on
          hb-wake / hx-wake / hx-cursor / hb-tail, see s35-herocopy.css
     the Request demo frame                       .site-header .nav > .btn-primary
       -- resting carrier, section 7.2; EVENT tier on hx-mark
     the wordmark period                          .wordmark .dot
       -- resting carrier, section 7.3; EVENT tier on hx-mark
     the mark inside the subhead                  .hero33 .hero-sub .hero-wm
       -- resting carrier, sections 7.3 + 7.5. NO event tier, by design
     the tube's own H1 cursor on every other page  html[data-theme=terminal] h1::after
       -- event only, section 7.1; hx-cursor peaks it where a graph drives one
     the `>` prompt glyph                        html[data-theme=terminal] h1::before
     the active node in the graph                #hg-hdr .hg-hpip
     the pulse travelling an edge                #hg-hdr .hg-hpulse
     `✓ VERIFIED` as it resolves                 #hg-hdr-tick + #hg-hdr-trail
     the status lamp on WATCH PROOF WORK         .pctl-lamp > .pctl-hdr
     the wordmark period                         .wordmark .dot (glyph, sect 7.3)
       -- event only, on hx-mark; .dot::after blooms on the same beat
     the REQUEST A DEMO brackets                 .btn-primary / .hero-act ::before
       -- event only, section 7.2, on hx-mark             ::after
     the headline, ONE 120 ms flash on the state transition   .h1-em
   Forbidden, and absent from this file: a permanently HDR headline, HDR body
   text, HDR borders or rules, HDR backgrounds, HDR on ANYTHING at rest.

   THREE TIERS OF PROOF GREEN  (terminal's --pass / --signal #2BFF6F)
     SDR sRGB      #2BFF6F                     the fallback, and it is the
                                               theme's own shipped green, so it
                                               already looks like the product
     P3            color(display-p3 .144 1 .174)
                                               same OkLCh lightness (L .8756)
                                               and hue (h 147.97 deg, held to
                                               within 2 deg), chroma +12% at the
                                               Display P3 boundary. The naive
                                               "reuse the sRGB coordinates"
                                               value would have rotated the hue
                                               by 3.55 deg and shipped a second
                                               green.
     HDR emissive  assets/hdr/pq-term-*.png    16-bit RGBA, tagged BT.2100 PQ.
       EVENT tier                              Source triple (58741, 65535,
                                               55440)/65535 -- peak channel at
                                               full scale = maximum PQ signal,
                                               10000 nits nominal. Measured
                                               Chromium SDR decode (44,255,111):
                                               one unit of red off #2BFF6F.
       REST tier   assets/hdr/pq-term-rest.png IN SERVICE (--pq-rest), on the
                                               four ruled carriers and nothing
                                               else: blinking cursor, Request
                                               demo frame, wordmark period, and
                                               the mark inside the subhead.
                                               Same chromaticity at one tenth
                                               the luminance -- (42430, 49271,
                                               39184)/65535, 1000 nits nominal,
                                               SDR decode (43,255,111), EXACTLY
                                               #2BFF6F at dE2000 0.000. That
                                               measured decode is why the tier
                                               can come and go without moving an
                                               SDR pixel: the CSS colour beneath
                                               it is the colour it decodes to.
                                               The decade between this tile and
                                               the event tile is the whole
                                               separation between lit and struck.

   WHY 16-BIT, AND WHY THE VALUE IS MEASURED
     A naive tag of #2BFF6F as PQ decodes to pure (0,255,0) -- a second, clashing
     green (measured). Solving for the source whose decode lands on #2BFF6F is
     therefore mandatory. At 8 bits it cannot land: in the red row of
     Rec.2020 -> sRGB the result is a difference of two large numbers, so ONE
     8-bit PQ code step moves the decoded red by ~17 sRGB units (codes 228/229/230
     decode to red 28/51/68). The best 8-bit point is (229,255,216) -> (51,255,112),
     dE2000 0.19 -- imperceptible, but seven units of red. 16 bits makes the
     lattice 257x finer and the browser probe lands it at one unit.

   WHY THE RETIRED RESTING TIER SAT AT 1000 NITS  (hdrev/mintrest.py, probeRest)
     Kept because it is the measurement that proves the withdrawal costs nothing
     in SDR, and because it is the number a future resting tier would have to
     beat if one were ever re-argued.
     Two tiers of PQ media were needed because the event tier has no headroom left
     above it -- its green channel is already at full scale -- so a persistent
     emission painted from it could never be peaked. Chromium renormalises PQ for
     an SDR composite, but not perfectly: the probe over ten luminance levels of
     the same chromaticity read back
        100 nits (15,141,55)   350 (32,226,93)   600 (36,247,103)
       1000 nits (39,255,110) 2500 (43,255,111) 10000 (44,255,111)
     -- so below ~1000 nits the SDR decode genuinely darkens (600 nits is dE2000
     1.69 off #2BFF6F, which is visible), and above it the decode is level-
     independent to within a few units of LUT jitter. 1000 nits is therefore the
     LOWEST resting level that costs nothing in SDR, and it leaves a 10x
     luminance step for the event. A fine red-row sweep at that level (one 100-
     code step moves the decoded red by ~7 units) landed (42430, 49271, 39184) on
     #2BFF6F exactly. On a panel whose peak is under ~950 nits both tiers roll
     off to the panel peak and the resolve reads through area, duty and bloom
     instead; that degradation is deliberate, and it is why every event still
     carries its own SDR tell.

   GRACEFUL DEGRADATION IS THE POINT
     HDR is never load-bearing. With the assets suppressed (html[data-hdr="off"],
     or an SDR display, or a browser that ignores the profile) every event still
     fires: the same elements still brighten, bloom, scale and decay, because the
     SDR tier of each event is a separate declaration in the same rule. Nothing
     structural is lost -- `✓ VERIFIED` still reads as verified.
     Section 7's carriers degrade to nothing at all, because their resting state
     no longer contains an HDR layer to lose: on a plain monitor and on an HDR
     one they rest at the identical rgb(43,255,111), and only the event differs.

   BUDGET, MEASURED
     Every carrier repainted magenta over a black page and the magenta counted,
     weighted by coverage (hdrev/budget.js), at 1440x900:
       t 8.0  REST               0.000%  <- THE RESTING FLOOR IS ZERO
       t 16.7 cursor strike      0.213%
       t 17.8 pulse travelling   0.328%
       t 18.6 pulses             0.360%
       t 19.55 RESOLVE           1.284%  <- the peak: the 120 ms headline flash
       t 19.65 mark + frames     0.228%
       t 19.7 decay              0.209%
       t 20.0 tail               0.185%
     The old persistent floor was 0.184% with the cursor lit and 0.006% with it
     dark; section 7's withdrawal takes both to zero. Ceiling is ~3% and the
     120 ms peak is well under a half of it.
   ========================================================================== */

/* ==========================================================================
   0. THE TIERS AS TOKENS
   --pq-green is the SDR tier and the P3 tier. --pq-src is the HDR EVENT tier.
   --pq-rest is the HDR RESTING tier, and its legal consumers are a CLOSED LIST
   OF FOUR, one per element the founder named:

     1. the blinking hero cursor   .hero33 .hero-copy h1 .h1-em::after
                                   (assets/s35-herocopy.css section 4.1)
     2. the Request demo frame     .site-header .nav > .btn-primary::before/after
                                   (section 7.2 below)
     3. the proof logo's period    .wordmark .dot          (section 7.3 below)
     4. the proof logo in the copy .hero33 .hero-sub .hero-wm
                                   (sections 7.3 + 7.5 below; the fourth was
                                   ruled separately -- "highlight word 'proof'
                                   in copy as our logo, and with hdr" -- and it
                                   is the only one of the four that is not
                                   chrome. It shares 3's declaration block, so
                                   it is one carrier's paint on two elements,
                                   not a fourth recipe.)

   THE LIST IS THE POINT. A previous pass deleted this token on the argument that
   a token named for a resting HDR tier is an invitation to paint one. The
   argument is sound, and the answer is to enumerate the consumers rather than to
   leave the tier nameless. Anything else that wants a resting green wants
   --pq-green / --pq-green-rgb, which is what this tile decodes to anyway.
   A FIFTH READER OF --pq-rest IS A REGRESSION, not a feature -- specifically
   the hero ACTION brackets (7.2b) and the tube's own h1::after (7.1), both of
   which sit next to a carrier on this list and are deliberately not on it.
   (This paragraph said THIRD, then FOURTH. Each time the number moved it moved
   because the founder named the element, never because a rule wanted a green.
   That is the only reason it may ever move again.)
   ========================================================================== */
html[data-theme="terminal"]{
  --pq-green:#2BFF6F;
  --pq-green-rgb:43,255,111;
  --pq-src:url("hdr/pq-term-flat.png");
  /* REST tier: 1000 nits nominal, SDR decode (43,255,111) = #2BFF6F, dE2000
     0.000. One tenth of --pq-src at the same chromaticity. ONE consumer:
     s35-herocopy.css, .hero33 .hero-copy h1 .h1-em::after. */
  --pq-rest:url("hdr/pq-term-rest.png");
  --pq-disc:url("hdr/pq-term-disc.png");
}
@media (color-gamut: p3){
  html[data-theme="terminal"]{
    /* PROOF GREEN / P3. Same L and h as #2BFF6F, chroma out to the P3 boundary.
       This is the tier that buys saturation; it cannot buy luminance -- no CSS
       colour can exceed SDR white, which is why the third tier is media. */
    --pq-green:color(display-p3 .144 1 .174);
  }
}

/* the event channels. Declared at :root so a pseudo-element can read them and
   so every calc() has a value before the driver ever writes one. */
:root{
  --hx-cursor:0; --hx-prompt:0; --hx-head:0; --hx-lamp:0; --hx-mark:0; --hx-resolve:0;
}

/* Full headroom where the platform lets us ask for it. Feature-detected, never
   required: without it the compositor's own default applies and the event still
   emits, just clamped to whatever headroom the page is granted. */
@supports (dynamic-range-limit: no-limit){
  /* THE FOUR CLASSLESS SELECTORS IN THIS BLOCK, and they are the ruling's.
     A resting carrier has to be able to ASK for headroom, or the tier it now
     holds is a raster the compositor is free to clamp to SDR white and the
     restoration is decorative. Each is scoped to the terminal theme and to the
     exact element the founder named -- the blinking cursor, the Request demo
     frame, the proof logo's period, and the logo where the copy says the name
     -- and to nothing beside them. The fourth is here for the same reason as
     the other three and for one more: it is the largest of the four by ink
     area, so it is the one whose emission would be most obviously fake if the
     compositor were left free to clamp it. If the word is ever judged too hot
     on a real HDR panel, THIS is the line to pull first -- it drops the word to
     whatever headroom the page is granted without touching one SDR pixel. */
  html[data-theme="terminal"] .hero33 .hero-copy h1 .h1-em::after,
  html[data-theme="terminal"] .site-header .nav > .btn-primary::before,
  html[data-theme="terminal"] .site-header .nav > .btn-primary::after,
  html[data-theme="terminal"] .wordmark .dot,
  html[data-theme="terminal"] .hero33 .hero-sub .hero-wm,
  html.hx-cursor .hero33 .hero-copy h1 .h1-em::after,
  html.hb-wake .hero33 .hero-copy h1 .h1-em::after,
  html.hx-wake .hero33 .hero-copy h1 .h1-em::after,
  html.hb-tail .hero33 .hero-copy h1 .h1-em::after,
  html.hx-head .hero33 .hero-copy h1 .h1-em,
  html.hx-prompt .hero33 .hero-copy h1::before,
  html.hx-mark .wordmark .dot::after,
  html.hx-lamp .pctl-lamp .pctl-hdr,
  .hg-hdr{dynamic-range-limit:no-limit;}
  /* EVERY OTHER SELECTOR HERE CARRIES AN hx-/hb- CLASS. That is the invariant:
     this block asks the compositor for headroom, so a classless selector is
     asking for headroom at rest -- which only the four named carriers above may
     do. Note what is NOT in that list and must never be added to it: the hero
     ACTION brackets (7.2b) and the tube's own h1::after on the nine pages with
     no graph (7.1). A fifth classless line here is a regression. */
  html.hx-cursor[data-theme="terminal"] h1::after,
  html.hx-mark[data-theme="terminal"] .wordmark .dot,
  html.hx-mark[data-theme="terminal"] .site-header .nav > .btn-primary::before,
  html.hx-mark[data-theme="terminal"] .site-header .nav > .btn-primary::after,
  html.hx-mark[data-theme="terminal"] .hero33 .cta-row .hero-act::before,
  html.hx-mark[data-theme="terminal"] .hero33 .cta-row .hero-act::after{dynamic-range-limit:no-limit;}
}

/* the kill switch. One attribute suppresses every HDR asset on the page, which
   is how the SDR fallback is verified (hdrev-fallback.png) and how a future
   "reduce luminance" preference would be honoured.
   IT MUST ALSO PUT THE TEXT FILL BACK. Caught on the first fallback screenshot:
   suppressing the raster alone left `-webkit-text-fill-color:transparent` in
   place on the headline and the prompt, so the second headline line vanished and
   left only its glow -- HDR load-bearing, which is the one thing this whole
   exercise forbids.
   SINCE SECTION 7 WITHDREW THE PERSISTENT TIER, `off` IS A NO-OP AT REST, and
   that is now the property to preserve rather than a coincidence: with the
   attribute set and with it unset the resting page is the same pixels, because
   the resting page contains no HDR to remove. `off` therefore has exactly one
   job -- collapse every EVENT to its own SDR tell.
   THE FILL LIST IS SHORTER THAN IT WAS, ON PURPOSE. Only the headline and the
   two prompts need currentColor put back, because only they are real reading
   text painted through a transparent-ish fill. The command brackets and the
   wordmark period are NOT in the list any more: section 7 leaves an SDR
   background-colour under their clip in every state, so killing the image alone
   already lands them on their resting colour, and forcing a fill on top of that
   would repaint the glyph a different number of times than the resting rule
   does -- a change of weight, in the one code path whose whole purpose is to
   change nothing but luminance. */
html[data-hdr="off"] .hero33 .hero-copy h1 .h1-em::after,
html[data-hdr="off"] .hero33 .hero-copy h1 .h1-em,
html[data-hdr="off"] .hero33 .hero-copy h1::before,
html[data-hdr="off"] h1::before,
html[data-hdr="off"] h1::after,
html[data-hdr="off"] .wordmark .dot,
html[data-hdr="off"] .wordmark .dot::after,
/* the mark inside the subhead (7.5). It is NOT in the text-fill list below, for
   the same reason the period is not: 7.3 leaves an SDR background-colour of the
   identical green under the clip in every state, so killing the image alone
   already lands the glyph on its resting colour. Forcing a fill on top would
   repaint the letterforms a different number of times than the resting rule
   does, and this switch's one job is to change luminance and nothing else. */
html[data-hdr="off"] .hero33 .hero-sub .hero-wm,
html[data-hdr="off"] .site-header .nav > .btn-primary::before,
html[data-hdr="off"] .site-header .nav > .btn-primary::after,
html[data-hdr="off"] .hero33 .cta-row .hero-act::before,
html[data-hdr="off"] .hero33 .cta-row .hero-act::after,
html[data-hdr="off"] .pctl-lamp .pctl-hdr{background-image:none !important;}
html[data-hdr="off"] .hero33 .hero-copy h1 .h1-em,
html[data-hdr="off"] .hero33 .hero-copy h1::before,
html[data-hdr="off"] h1::before{-webkit-text-fill-color:currentColor !important;}
html[data-hdr="off"] .hg-hdr image{visibility:hidden;}

/* ==========================================================================
   1. THE BLOCK CURSOR . the beat that starts everything
   The cursor emits at the RESTING tier through every blink (--pq-rest, painted
   in assets/s35-herocopy.css section 4.1) and goes to the EVENT tier for 180 ms
   at 16.60. At that instant verification begins.
   SDR tier: the blink is suspended, the block goes to full opacity, blooms and
   widens a little. HDR tier: the EVENT raster replaces the resting one, so the
   same pixels go from 1000 to 10000 nits nominal -- and because the blink stops,
   the duty cycle goes from a half to one at the same moment. On an SDR display
   the two rasters are the same green and only the bloom, the width and the
   steadiness change.
   ========================================================================== */
html.hx-cursor[data-theme="terminal"] .hero33 .hero-copy h1 .h1-em::after{
  animation:none;
  opacity:1;
  background-image:var(--pq-src);
  background-size:100% 100%;
  /* the SDR tell. Static while the class is on, so no property animates per
     frame: the event is two class toggles, not a keyframe track. */
  box-shadow:0 0 20px 5px rgba(var(--pq-green-rgb),.85),0 0 46px 12px rgba(var(--pq-green-rgb),.4);
  /* SCALE ONLY. This rule used to read `translateY(.1em) scaleX(1.14)`, from the
     geometry hero-v2.css has since replaced: the block is baseline-aligned by
     construction now, so a .1em translate would drop it 7.36px off the baseline
     at the exact instant a visitor is looking at it. s35-herocopy.css overrides
     this rule anyway, which made the translate invisible AND load-bearing on
     stylesheet order. Deleted rather than left as a trap. */
  transform:scaleX(1.14);
}
/* the tube's own H1 cursor (every other page) follows the same rule */
html.hx-cursor[data-theme="terminal"] h1::after{
  animation:none;opacity:1;
  background-image:var(--pq-src);background-size:100% 100%;
  box-shadow:0 0 20px 5px rgba(var(--pq-green-rgb),.85);
}

/* ==========================================================================
   2. THE `>` PROMPT . lit while the machine is working
   One rise, one hold, one fall per loop -- not a repeating pulse. The glyph
   itself is painted from the PQ raster with background-clip:text, so the HDR is
   exactly the shape of the character and nothing around it emits.
   ========================================================================== */
html.hx-prompt[data-theme="terminal"] .hero33 .hero-copy h1::before,
html.hx-prompt[data-theme="terminal"] h1::before{
  background-image:var(--pq-src);
  background-size:100% 100%;
  background-repeat:no-repeat;
  -webkit-background-clip:text;background-clip:text;
  /* the SDR tier: the glyph goes from .62 alpha to full and blooms. Painted with
     a colour, so if background-clip:text is unsupported the glyph is still lit. */
  color:rgba(var(--pq-green-rgb),calc(.62 + .38 * var(--hx-prompt)));
  /* NOT `transparent`. A fully transparent fill makes the raster load-bearing:
     if the image 404s, or the profile is ignored and the layer is dropped, the
     glyph disappears. A .34 fill of the glyph's own green keeps the character
     legible on its own and still lets ~two thirds of the raster's headroom
     through, and because the raster's SDR decode IS this green the composite is
     visually identical in SDR -- no dip at the start of the flash. */
  -webkit-text-fill-color:rgba(var(--pq-green-rgb),.34);
  text-shadow:0 0 calc(10px * var(--hx-prompt)) rgba(var(--pq-green-rgb),.8);
}
/* no HDR without the clip: fill stays the lit colour rather than transparent */
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  html.hx-prompt[data-theme="terminal"] .hero33 .hero-copy h1::before,
  html.hx-prompt[data-theme="terminal"] h1::before{
    background-image:none;-webkit-text-fill-color:currentColor;
  }
}

/* ==========================================================================
   3. THE HEADLINE . one 120 ms flash on the state transition, never continuous
   This is the only rule in the file that touches the headline, and it is the
   one the founder called out: a permanently HDR headline becomes neon signage.
   ========================================================================== */
html.hx-head[data-theme="terminal"] .hero33 .hero-copy h1 .h1-em{
  background-image:var(--pq-src);
  background-size:100% 100%;
  background-repeat:no-repeat;
  -webkit-background-clip:text;background-clip:text;
  /* .34, not transparent -- see the prompt above. The headline must survive a
     missing raster; it is the one element on the page that absolutely cannot
     blink out of existence for 120 ms. */
  -webkit-text-fill-color:rgba(var(--pq-green-rgb),.34);
  /* SDR tier: the existing 14px glow opens up for the length of the flash */
  text-shadow:0 0 30px rgba(var(--pq-green-rgb),calc(.55 * var(--hx-head)));
}
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  html.hx-head[data-theme="terminal"] .hero33 .hero-copy h1 .h1-em{
    background-image:none;-webkit-text-fill-color:currentColor;
  }
}

/* ==========================================================================
   4. THE STATUS LAMP on [>] WATCH PROOF WORK
   One heartbeat per loop, on the beat the graph resolves. The flare is a child
   element the driver injects (the lamp's own ::before / ::after are the two
   hairline ticks that wire it into the page), so its opacity can decay freely
   without touching the lamp itself.
   ========================================================================== */
.pctl-lamp{position:relative;}
.pctl-hdr{
  position:absolute;left:50%;top:50%;
  width:240%;height:240%;
  transform:translate(-50%,-50%);
  pointer-events:none;
  opacity:0;
  /* NO border-radius. MEASURED CHROMIUM BUG: a border-radius on an element whose
     background is a PQ-tagged image makes the rounded clip drop the colour and
     the element paints pure white (255,255,255) instead of the decoded green.
     Every HDR carrier in this file is therefore square-boxed and gets its shape
     from the asset's own alpha channel, which the discs already carry. */
}
html.hx-lamp .pctl-lamp .pctl-hdr{
  background:url("hdr/mark-dot-terminal.png") center/contain no-repeat;
  opacity:var(--hx-lamp);
}
/* every theme's lamp flares in its own ink */
html.hx-lamp[data-theme="paper"] .pctl-hdr,
html.hx-lamp:not([data-theme]) .pctl-hdr{background-image:url("hdr/mark-dot-paper.png");}
html.hx-lamp[data-theme="riso"] .pctl-hdr{background-image:url("hdr/mark-dot-riso.png");}
html.hx-lamp[data-theme="brutal"] .pctl-hdr{background-image:url("hdr/mark-dot-brutal.png");}
html.hx-lamp[data-theme="acid"] .pctl-hdr{background-image:url("hdr/mark-dot-acid.png");}
html.hx-lamp[data-theme="olo"] .pctl-hdr{background-image:url("hdr/mark-dot-olo.png");}
html.hx-lamp[data-theme="night"] .pctl-hdr{background-image:url("hdr/mark-dot-night.png");}
html.hx-lamp[data-theme="verified"] .pctl-hdr{background-image:url("hdr/mark-dot-verified.png");}

/* ==========================================================================
   5. THE GRAPH OVERLAY
   A second svg over .hg-svg with the SAME viewBox and the same
   preserveAspectRatio, so graph coordinates land on graph geometry with no
   measurement. It is deliberately OUTSIDE .hg-svg: that element carries the
   --hg-op envelope (.30 on the tube) and the top-third mask, and an event that
   means "this is happening right now" must not be dimmed to 30%.
   Terminal only -- the mechanism is theme-neutral, the licence is not.
   ========================================================================== */
.hg-hdr{
  position:absolute;inset:0;width:100%;height:100%;
  pointer-events:none;
  display:none;                          /* terminal opts in, below */
}
html[data-theme="terminal"] .hg.is-in .hg-hdr{display:block;}
/* the clip text must resolve to the same metrics as the tick it clips */
.hg-hdr text{
  font-family:var(--mono);font-size:10.5px;font-weight:500;letter-spacing:.1em;
}
/* NO blend mode on these images. A screen or plus-lighter blend pushes Chromium
   into an SDR blend space and the headroom is lost; on a near-black ground plain
   source-over already reads as emission. */

/* ==========================================================================
   6. THE WORDMARK PERIOD . the mark participates in the machine
   The period's own GLYPH emits persistently on the tube -- section 7.3. This
   section is the BLOOM on top of it: a soft disc that opens once per loop, on
   the beat the graph resolves, and decays. Every other theme's period rests
   dark and only blooms here. On a page with no hero graph the driver never
   runs, so the bloom never opens and the mark rests at its own tier.
   ========================================================================== */
/* the bloom layer -- transparent, no image -- is declared in hdr-logo.css, so
   the mark rests correctly on the pages this file does not load onto. */
html.hx-mark .wordmark .dot::after{
  opacity:var(--hx-mark);
  transform:translateX(-50%) scale(calc(.72 + .30 * var(--hx-mark)));
  background-image:url("hdr/mark-dot-paper.png");
}
html.hx-mark[data-theme="riso"] .wordmark .dot::after{background-image:url("hdr/mark-dot-riso.png");}
html.hx-mark[data-theme="terminal"] .wordmark .dot::after{background-image:url("hdr/mark-dot-terminal.png");}
html.hx-mark[data-theme="brutal"] .wordmark .dot::after{background-image:url("hdr/mark-dot-brutal.png");}
html.hx-mark[data-theme="acid"] .wordmark .dot::after{background-image:url("hdr/mark-dot-acid.png");}
html.hx-mark[data-theme="olo"] .wordmark .dot::after{background-image:url("hdr/mark-dot-olo.png");}
html.hx-mark[data-theme="night"] .wordmark .dot::after{background-image:url("hdr/mark-dot-night.png");}
html.hx-mark[data-theme="verified"] .wordmark .dot::after{background-image:url("hdr/mark-dot-verified.png");}

/* ==========================================================================
   7. THE CHROME CARRIERS . TERMINAL ONLY . TWO OF THE THREE ARE RESTORED
   Founder, on the tube's furniture: "blinking cursor does not have any HDR,
   same as request demo and the proof logo. I want it to use it by default even
   when this option is turned off -- in terminal theme."

   ONE CLAUSE OF THAT SENTENCE IS NOT ACTED ON, AND IT IS FLAGGED RATHER THAN
   INTERPRETED. "even when this option is turned off" reads, literally, as a
   request that the resting emission survive data-hdr="off". That is the one
   thing the brief makes a hard requirement in the other direction: the switch
   exists so that a display, a preference or a reviewer can remove every HDR
   asset on the page and see what is left. Disabling a kill switch on an
   ambiguous clause is not a call this file makes. So `off` stays COMPLETE --
   80 page loads, ten pages by eight themes, zero residual hdr/ references -- and
   the clause is standing open for an explicit ruling. If the ruling comes down
   the other way, the change is to lift these three selectors out of the
   `off` list below, and nothing else.

   HOW THE REST OF THE SENTENCE WAS READ, AND WHY THE READING WAS OVERRULED
   An earlier pass took it as a licence for three carriers -- the block cursor,
   the REQUEST A DEMO brackets and the wordmark period -- to paint from a PQ
   RESTING raster around the clock, on the argument that a cursor is a phosphor
   artifact and a mark and a command frame are furniture, not verdicts. The
   argument is a good one and it is still beside the point. The brief's own
   acceptance criterion does not distinguish states from furniture:

       "Nothing is HDR at rest. Screenshot the resting frame and confirm no HDR
        asset is visible."

   A rule that answers no class and no clock holds with the graph paused, the
   tab in the background and the hero never scrolled to -- which is to say it
   holds at rest, which is the one thing that criterion forbids -- and that is
   the reading the founder overruled. His instruction names three carriers by
   name, so two of the three in THIS section get their resting tier back (7.2
   the Request demo frame, 7.3 the wordmark period) and the two that are NOT
   named keep the withdrawal (7.2b the hero action brackets, 7.1 the tube's own
   h1 cursor). The invariant a machine can check is therefore three lines long
   rather than none: EVERY background-image that resolves to hdr/ is behind an
   hx- or hb- class, EXCEPT .hero33 .hero-copy h1 .h1-em::after,
   .site-header .nav > .btn-primary::before/::after, and .wordmark .dot.
   Verified by walking the computed styles of every element and both its
   pseudo-elements on all ten pages at rest -- see the note under 7.4.

   WHAT THE FOUNDER ASKED FOR SURVIVES INTACT, AND THIS IS NOT A CONSOLATION
   The retired tile pq-term-rest.png was solved so that its Chromium SDR decode
   is (43,255,111) -- #2BFF6F, dE2000 0.000 -- and every carrier composited it
   under a partial fill of that same colour. So in SDR the three already painted
   flat rgb(43,255,111), and they still do, from CSS. On an ordinary monitor
   nothing whatsoever changes: same colour, same shape, same position, same
   subpixel coverage. The cursor is still lit by default, the frames are still
   full-strength signal green rather than the theme's .55, the period is still
   signed. What leaves is luminance headroom on an HDR panel -- the only thing
   the founder's sentence and the brief's rule actually disagree about, and the
   brief is the one with an acceptance criterion.

   HOW THE EVENT LEAVES WITHOUT A CUT, WITH NO DRIVER CHANGE  (7.2 and 7.3)
   background-image is not an interpolable value: between `none` and a url there
   is no midpoint, so a raster that is still emitting when its class drops ends
   on a hard cut -- the exact failure the phosphor-decay note in the brief is
   about. s35-herocopy.css solves it for the hero cursor by holding the raster
   through a timed tail class. The carriers here solve it a second way, which
   needs nothing from assets/herograph.js:

       the raster stays put and an SDR LID CLOSES OVER IT.

   The glyph is painted from the event raster through background-clip:text, and
   the text fill on top of it is rgba(green, 1 - .38 * var(--hx-mark)). At the
   peak the fill is .62 and 38% of the raster's headroom is showing; as the mark
   envelope decays the fill closes to fully opaque, so by the time the class
   drops the HDR layer is completely covered and its removal changes nothing.
   The driver quantises a channel to zero below .004 and toggles the class in the
   same write, so the last value seen before the class leaves is <= .004 -- a lid
   at 99.85% opacity. In SDR the fill and the raster's decode are the same colour
   at every point of the ramp, so the composite is constant rgb(43,255,111) and
   the SDR event is carried by the halo, exactly as it was before.
   The failure direction is safe too: if --hx-mark were ever missing while the
   class was on, :root's own 0 makes the lid opaque and the carrier simply looks
   like it does at rest.

   NO ELEMENT HERE HAS A border-radius. Measured Chromium bug: a rounded clip
   over a PQ-tagged background drops the colour and paints the box pure white.
   The period's bloom is a square box and takes its shape from the disc's own
   alpha, exactly as the lamp flare does in section 4.
   ========================================================================== */

/* ---- 7.1 the block cursor ------------------------------------------------
   The hero's block (.hero33 .hero-copy h1 .h1-em::after) is NOT handled here:
   hero-v2.css owns its geometry and its resting SDR halo, and s35-herocopy.css
   owns its resting raster -- restored there, by ruling -- and its wake / strike
   / tail choreography. This rule is the tube's OWN H1 cursor, the one themes.css
   draws after every h1 on the nine pages that are not the home page.
   IT DOES NOT INHERIT THE RULING, and the distinction is not a technicality.
   The ruling is about the blinking cursor in the hero: the thing that reads as
   the machine sitting at a prompt with the page's whole claim behind it. This
   caret sits after an h1 on a page with no graph, no driver and no verification
   beat -- nothing publishes hx-cursor there. Lighting it at the resting tier
   would put a permanent emitter on nine pages to represent no computation at
   all, which is the failure mode the brief's rule exists for. It rested on the
   PQ tile before, and it stays off it. Its background-color is --signal, the identical #2BFF6F the tile
   decoded to, so the block is the block. Declared rather than deleted, so the
   retirement survives a reorder of the stylesheets and reads at the point of the
   rule.
   THE ONE PLACE ANY SDR PIXEL MOVED, AND IT IS THIS ONE. The 8x8 tile was
   stretched over the block with background-size:100% 100%, and the resampler
   put a half-strength blend on the outermost texel row top and bottom. Injected
   A/B in one page load at dsf 4: 240 differing subpixels out of 5858688, all of
   them on device rows 600 and 808 -- the block's first and last row, 120 wide,
   max delta 50 of 255. That is a quarter of one CSS pixel of softness at the top
   and bottom edge of the caret, and losing it is a correction: themes.css draws
   this block with hard edges and it has hard edges on the other seven themes.
   Reproducing the blend would have meant shipping an SDR raster to imitate a
   scaling artefact, which is a strange thing to do to avoid fixing one.
   THE STRIKE IS UNCHANGED. Section 1 still lights this cursor from --pq-src on
   hx-cursor, hard on and hard off, because the cursor channel is a square window
   by design -- "a cursor blinks in steps; a ramp would read as a fade rather
   than as a strike". Nothing publishes hx-cursor on those nine pages today
   (assets/herograph.js loads on the home page only), so in this build the tube's
   H1 cursor is SDR at every instant; the rule is the contract for the day one of
   them grows a graph. */
html[data-theme="terminal"] h1::after{
  background-image:none;
}

/* ---- 7.2 REQUEST A DEMO . the brackets, not the words --------------------
   WHAT CARRIES THE EMISSION, AND WHY IT IS NOT THE LABEL
   Both actions read `[ REQUEST A DEMO -> ]` on the tube: themes.css draws every
   .btn as a bracketed command. Only the brackets emit.
     1 AREA. The label is 15 caps glyphs at .16em tracking, twice over. The two
       bracket pseudo-elements are 1 and 3 glyphs. Emitting both labels would
       roughly quadruple the event's budget for no gain in meaning.
     2 MEANING. dim green = knowledge, HDR green = the machine working. The words
       are the knowledge -- what the visitor reads -- and the theme already paints
       them in pale phosphor --ink, not in signal green. The brackets are the
       machine's own frame, already drawn in signal green. Lighting the frame and
       leaving the words is the same distinction the `>` prompt makes in section 2.
     3 SAFETY. A pseudo-element cannot be selected, cannot be read by a screen
       reader and is not part of the accessible name, so this treatment cannot
       touch the label, the destination, the hit area, the focus ring or
       ::selection. Painting the label itself would have meant
       -webkit-text-fill-color on real text, and that overrides ::selection's own
       colour -- the tube's selection is #2BFF6F on #050807 and must stay so.
   The header's arrow travels with its closing bracket because hero-v2.css fuses
   them into the one pseudo-element the tube leaves free (`-> ]`); the hero
   action's arrow is a character inside the label text, so it stays with the
   label. Both actions therefore show a lit frame around unlit words.

   AT REST THE RASTER IS GONE AND EVERY OTHER LAYER STAYS EXACTLY WHERE IT WAS.
   background-clip:text clips the background COLOUR as well as the image, so the
   resting frame is now an SDR colour poured through the same clip the raster
   used to come through, under the same .62 fill. That is deliberate, and it is
   the difference between "looks the same" and "is the same":
     WHY NOT JUST SET AN OPAQUE FILL AND DROP THE CLIP. Because a glyph painted
     once is not the glyph painted twice. Measured, same page load, injected
     A/B at dsf 4: collapsing the two layers into one opaque fill moved 430 of
     the header action's 38304 subpixels, 84 of them by 80-95 counts of 255, all
     of them in the antialiased fringe of the four bracket glyphs -- the double
     paint fills the fringe further than a single paint does, so the frames came
     out a hair lighter. Nobody would ever see it; it is still a change, and the
     rule this section answers is about luminance, not about weight. Keeping the
     paint chain intact and swapping only the source tier makes the withdrawal
     provably invisible instead of arguably invisible: 0 differing bytes.
     WHY rgb(var(--pq-green-rgb)) AND NOT var(--pq-green). The latter resolves to
     color(display-p3 ...) on a wide-gamut panel, which is a more saturated green
     than the tile ever decoded to. The promise is that no display sees the
     resting frames move, and P3 is a display.
   The theme's own .55 / .62 fills are still underneath all of this, so with this
   file deleted the frames are the theme's dimmer brackets and nothing breaks. */
html[data-theme="terminal"] .site-header .nav > .btn-primary::before,
html[data-theme="terminal"] .site-header .nav > .btn-primary::after,
html[data-theme="terminal"] .hero33 .cta-row .hero-act::before,
html[data-theme="terminal"] .hero33 .cta-row .hero-act::after{
  background-image:none;
  background-color:rgb(var(--pq-green-rgb));
  background-size:100% 100%;
  background-repeat:no-repeat;
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:rgba(var(--pq-green-rgb),.62);
}
/* THE RESTING TIER, ON `Request demo` ONLY. The founder's instruction names
   this control by its label -- "same as request demo and the proof logo" -- so
   the raster goes back on the HEADER command frame and NOT on the hero actions
   below it, which under the founder's CTA ruling are a film control and a link
   to the public portal, not the demo CTA. See 7.2b for why that asymmetry is
   the right reading of the rule rather than an oversight.
   The colour underneath does not move: the raster is opaque and decodes to the
   same rgb(43,255,111) the background-colour above already paints, and the .62
   fill on top is the aperture -- 38% of the tile's headroom reaches the glyph,
   at rest, which is precisely the fraction the event decays back down to. */
html[data-theme="terminal"] .site-header .nav > .btn-primary::before,
html[data-theme="terminal"] .site-header .nav > .btn-primary::after{
  background-image:var(--pq-rest);
}
/* no clip means the background-colour would paint a green rectangle behind the
   glyph, so it and the raster come off and the frame keeps the colour the theme
   gave it */
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  html[data-theme="terminal"] .site-header .nav > .btn-primary::before,
  html[data-theme="terminal"] .site-header .nav > .btn-primary::after,
  html[data-theme="terminal"] .hero33 .cta-row .hero-act::before,
  html[data-theme="terminal"] .hero33 .cta-row .hero-act::after{
    background-image:none;background-color:transparent;-webkit-text-fill-color:currentColor;
  }
}
/* hover still means something: the frame goes to the theme's own signal colour
   at the full P3 chroma and blooms. Unchanged from the theme's intent.

   THE OPAQUE FILL IS RIGHT FOR THE HERO ACTION AND WRONG FOR `Request demo`,
   which is why the next rule exists. The aperture IS the fill alpha: an opaque
   fill on a carrier with a resting raster under it means the frame STOPS
   emitting the moment the pointer lands on it. Hover is the one moment the
   control is most active, so it is the last moment the emission may die -- the
   rule inverts both the founder's instruction and this file's own channel. The
   hero action has no resting raster to occlude, so for it the opaque fill is
   simply the theme's brighter hover and it keeps it. */
html[data-theme="terminal"] .site-header .nav > .btn-primary:hover::before,
html[data-theme="terminal"] .site-header .nav > .btn-primary:hover::after,
html[data-theme="terminal"] .hero33 .cta-row .hero-act:hover::before,
html[data-theme="terminal"] .hero33 .cta-row .hero-act:hover::after{
  -webkit-text-fill-color:var(--pq-green);
}
/* HOVER KEEPS THE APERTURE OPEN ON `Request demo`. One declaration, and it is
   the resting value: the frame goes on emitting at .38 x 1000 while the pointer
   is on it instead of dropping to nothing. Nothing is lost in SDR -- the raster
   decodes to the same rgb(43,255,111) the opaque fill painted, and hover's own
   tell was never this fill but the theme's glow and background tint, both
   untouched. Measured at dsf 4: the hover state against the same state with the
   raster suppressed is byte-identical, so this holds the SDR promise in the
   hover state as well as at rest. */
html[data-theme="terminal"] .site-header .nav > .btn-primary:hover::before,
html[data-theme="terminal"] .site-header .nav > .btn-primary:hover::after{
  -webkit-text-fill-color:rgba(var(--pq-green-rgb),.62);
}
/* THE EVENT. The chrome answers the resolve on the wordmark's own beat -- so
   the mark, the lamp and the two command frames beat together as the graph
   verifies. Sampled off the live clock at 40 ms, seeking the graph frame by
   frame, the whole window is 480 ms:
     19.70 - 19.82  hx-mark on, envelope held at 1.000, raster PQ, fill .62,
                    bloom disc at opacity 1 and scale 1.00, halo 9px at .72
     19.86  .645 / fill .753     19.90  .317 / .880     19.94  .156 / .940
     19.98  .076 / .973          20.02  .037 / .984     20.06  .018 / .992
     20.10  .009 / .996          20.14  .004 / FILL FULLY OPAQUE (hero action)
                                          .004 / .9606        (Request demo)
     20.18  class off, back to the resting .62 -- over the resting raster on
            Request demo, over bare colour on the hero action
   -- the last frame the raster is painted in is the frame the lid is opaque in,
   which is the property the whole mechanism exists for. The
   channel is hx-mark and not hx-resolve on purpose: theme-verified.js also fires
   hx-resolve when a static receipt scrolls into view, and the header CTA must not
   flash because the reader went past a receipt.
   ONE DECLARATION CHANGES THE TIER AND TWO CHANGE THE INTENSITY. The resting
   background-colour stays exactly where it is, under the raster: it is what
   holds the SDR composite at the resting green for the whole window (the raster
   is opaque, so the colour shows only where the image is missing), and it is
   what the lid closes onto as the fill goes opaque. The fill is NEVER
   transparent: if the raster 404s or the profile is ignored, the bracket is
   still a bracket in the right colour and only the halo says anything happened.

   THE LID NOW CLOSES TO TWO DIFFERENT PLACES, AND THAT IS THE WHOLE OF THE
   RULING'S ARITHMETIC.
   Emission above SDR through a clip is (1 - fill alpha) x tier. So:
       hero action, no resting tier   lid closes to 1.000 -> 0 x 10000 = 0
       Request demo, resting tier     lid closes to  .962 -> .038 x 10000 = 380
   and the resting frame it hands over to is .38 x 1000 = 380. The two sides of
   the class boundary are the same emission, so the handover is not a step -- the
   raster swaps 10000 -> 1000 in the same frame the aperture opens .038 -> .38,
   and the product does not move. Measured by driving --hx-mark and reading the
   computed fill back, in nits nominal above SDR:

     v      1     .645   .317   .156   .076   .037   .018   .009   .004   OFF
     demo  3800   2600   1450    900    630    500    430    400    400    380
     mark  3800   2600   1450    900    630    500    430    400    400    380
     hero  3800   2470   1200    600    270    160     80     40      0      0

   -- the two restored carriers decay onto their own floor and hand over there;
   the hero action decays to zero and hands over to nothing, which is what a
   carrier with no floor has to do. The 400 against 380 at the seam is Chromium
   serialising the computed alpha to two decimals (.9606 -> .96); it is a 5%
   overshoot in the safe direction -- the frame steps very slightly DOWN into
   rest rather than up, so nothing pops.
   (Second-order residual: the SDR pedestal under the aperture is .96 x white
   against .62 x white, worth under 1% of the composite on a 200-nit reference,
   below anything a panel resolves. Not worth a third constant.)
   The hero action keeps the old lid because it has no floor to land on: closing
   to anything but fully opaque would leave it emitting at the instant its class
   drops, which IS a hard cut. */
html.hx-mark[data-theme="terminal"] .site-header .nav > .btn-primary::before,
html.hx-mark[data-theme="terminal"] .site-header .nav > .btn-primary::after,
html.hx-mark[data-theme="terminal"] .hero33 .cta-row .hero-act::before,
html.hx-mark[data-theme="terminal"] .hero33 .cta-row .hero-act::after{
  background-image:var(--pq-src);
  -webkit-text-fill-color:rgba(var(--pq-green-rgb),calc(1 - .38 * var(--hx-mark)));
  text-shadow:0 0 calc(9px * var(--hx-mark)) rgba(var(--pq-green-rgb),calc(.72 * var(--hx-mark)));
}
/* the lid that lands on the resting tier instead of on nothing. Request demo only. */
html.hx-mark[data-theme="terminal"] .site-header .nav > .btn-primary::before,
html.hx-mark[data-theme="terminal"] .site-header .nav > .btn-primary::after{
  -webkit-text-fill-color:rgba(var(--pq-green-rgb),calc(.962 - .342 * var(--hx-mark)));
}
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  html.hx-mark[data-theme="terminal"] .site-header .nav > .btn-primary::before,
  html.hx-mark[data-theme="terminal"] .site-header .nav > .btn-primary::after,
  html.hx-mark[data-theme="terminal"] .hero33 .cta-row .hero-act::before,
  html.hx-mark[data-theme="terminal"] .hero33 .cta-row .hero-act::after{
    background-image:none;-webkit-text-fill-color:currentColor;
  }
}

/* ---- 7.2b THE HERO ACTION BRACKETS, AND WHY THEY STAY DARK ---------------
   They are the same `[ ]` furniture as the header CTA, drawn by the same rules
   two selectors above, and they sit in the hero where a visitor sees them
   first. The obvious move is to light them with the header frame. They are not
   lit, and this is the argument, so nobody has to reconstruct it:

   THE FOUNDER NAMED CONTROLS, NOT SHAPES. "same as request demo and the proof
   logo" names two things by what they ARE -- the demo CTA and the mark. The
   hero actions are neither. Under the founder's CTA ruling they are
   `[ > WATCH PROOF WORK ]` and `EXPLORE PUBLIC PROOF ->`: one opens a recorded
   session, one opens the public portal. Under this file's own semantic channel
   -- dim green is knowledge, HDR green is computation and verification -- a
   permanent emitter on a control that plays a film or opens a page claims that
   watching and reading are computation. That is the exact confusion the rule
   exists to prevent, and it would be worse in the hero than anywhere else on
   the site.

   THE RULING CHANGED THE LABELS AND DID NOT CHANGE THIS ARGUMENT. The primary
   used to be `Open SYS-REQ-009`, a deep link into a requirement, and the
   reasoning above was written against that label. It survives the swap intact,
   because it never turned on the destination: a control that STARTS something
   the visitor watches is no more computation than a control that opens a
   document. What did change is that the primary now has a live emitter of its
   own in the right channel -- section 4's status lamp beats once per loop on
   the beat the graph resolves. The control emits when the machine is working
   and stays dark when it is not, which is the rule stated exactly.

   AND THEY ARE NOT SIDE BY SIDE. The header CTA lives in the fixed chrome at
   the top; the hero actions live in the hero's own cta-row. They are never
   within a few hundred pixels of each other at any width, so the lit-vs-unlit
   comparison a reader could actually make is one hero action against the other
   beside it -- and those two are consistent, because neither is lit.

   ONE NOTE ON THE SHAPE, so the next reader is not looking for something that
   is not painted. The hero's secondary is a plain underlined link, not a `.btn`,
   so themes.css draws no brackets around it: the `.hero-act::before/::after`
   rules below are the theme's own resting frame treatment and currently have no
   bracket glyphs to clip. The primary is a `.pctl` machine control with a real
   1px border rather than bracket pseudo-elements. Neither is an HDR carrier,
   which is what this section is about.

   They keep the full EVENT treatment on hx-mark: they beat with the mark as the
   graph verifies, which is what a bracket around an action should do. What they
   do not do is emit while nothing is happening.
   IF THIS IS EVER REVERSED, the lid on their event rule has to move from 1.000
   to .962 as well -- see the arithmetic in 7.2 -- or the frame will step down to
   nothing at the end of its own decay before popping back to the resting tier. */

/* ---- 7.3 the wordmark period -------------------------------------------
   assets/hdr-logo.css retired the wordmark's rasters outright: the mark is live
   text in all eight themes and the period rests in its own theme ink. That
   retirement is now COMPLETE -- terminal no longer paints the period's glyph
   from a resting tile either. site.css gives .dot color:var(--signal), and on
   the tube --signal is #2BFF6F, the exact colour the withdrawn tile decoded to,
   so the resting period is the same green whichever way it is painted. It keeps
   the clipped background-colour and the .62 fill for the reason 7.2 gives: the
   paint chain, not just the colour, is what the SDR page is promised. Measured
   the same way, dsf 4, injected A/B in one page load: 0 differing bytes.
   WHAT MUST NOT COME BACK. The retirement removed a raster OVERLAY sized in em
   and positioned by hand -- a .34em box over a 5.27px glyph, so the mark's ink
   ran 3-5 px right and low, its box grew, and `color:transparent !important`
   made one 404 enough to delete the logo. The event below is not that: it paints
   the period's OWN GLYPH through background-clip:text from a flat 8x8 tile, so
   the emitting pixels ARE the outline -- correct at 1440, at 390, at 200% zoom
   and at any dpr by construction, with no box to misplace, nothing that can
   overflow the period's own box, nothing that can go stale, and a partial green
   fill underneath so the glyph survives a missing raster. */
/* THE RESTING TIER, RESTORED. "same as request demo and the proof logo -- I
   want it to use it by default." The period is the proof logo's dot: the mark's
   own signature, the one glyph on the page that says the thing above it is
   signed. It carries the 1000-nit tile at rest through the same .62 aperture as
   the command frame, and the event tile is a decade above it. */
/* THE FOURTH CARRIER SHARES THIS BLOCK, IT DOES NOT COPY IT. See 7.5. The
   subhead's inline wordmark is the same brand asset as the period, so it takes
   the same tier, the same aperture, the same stretched-not-tiled raster and the
   same fallback by being the same rule -- one selector list, one declaration
   block. There is no second treatment to drift. */
html[data-theme="terminal"] .wordmark .dot,
html[data-theme="terminal"] .hero33 .hero-sub .hero-wm{
  background-image:var(--pq-rest);
  background-color:rgb(var(--pq-green-rgb));
  background-size:100% 100%;
  background-repeat:no-repeat;
  -webkit-background-clip:text;background-clip:text;
  -webkit-text-fill-color:rgba(var(--pq-green-rgb),.62);
}
/* THE EVENT. The glyph steps to the event tier on the graph's resolve beat, so
   the period does not just grow a halo -- it gets ten times brighter underneath
   it -- and 7.2's lid closes over the raster as the envelope decays. It closes
   to .962, not to opaque: the period now has a resting tier to land on, and
   .038 x 10000 is the same emission as .38 x 1000, so the class boundary is not
   a step. Same arithmetic as Request demo, written out in 7.2. */
html.hx-mark[data-theme="terminal"] .wordmark .dot{
  background-image:var(--pq-src);
  -webkit-text-fill-color:rgba(var(--pq-green-rgb),calc(.962 - .342 * var(--hx-mark)));
}
/* the period is the one place the mark signs its own claim, so it may not turn
   into a green rectangle on a browser with no text clip, and it may not vanish
   either: the colour comes off, the fill goes back to the theme's ink. */
@supports not ((-webkit-background-clip:text) or (background-clip:text)){
  html[data-theme="terminal"] .wordmark .dot,
  html.hx-mark[data-theme="terminal"] .wordmark .dot,
  html[data-theme="terminal"] .hero33 .hero-sub .hero-wm{
    background-image:none;background-color:transparent;
    -webkit-text-fill-color:currentColor;
  }
}
/* the bloom, measured onto the ink rather than guessed at. hdrev/ink33.js
   screenshots the .dot box at dsf 8 and reports where the green actually is: at
   any size the period's ink is .1709em wide and its centre sits .3604em above
   the bottom of a .2871em-wide box. So the bloom is .28em -- the widest square
   that still fits INSIDE that box -- centred on the ink, and it peaks at scale
   1.0, never larger than the box. (The shared rule in section 6 is .34em at up
   to 1.02, which would spill ~0.6px each side of the tube's own period.)
   The bloom LAYER itself was already event-only in every theme: hdr-logo.css
   rests it at opacity 0 with no background-image, and section 6 is behind
   hx-mark. Only its geometry is retuned here. */
html[data-theme="terminal"] .wordmark .dot::after{
  width:.28em;height:.28em;
  margin-left:0;
  bottom:.2204em;                        /* .3604em ink centre - .14em radius */
}
html.hx-mark[data-theme="terminal"] .wordmark .dot::after{
  transform:translateX(-50%) scale(calc(.62 + .38 * var(--hx-mark)));
}

/* ---- 7.5 the mark inside the sentence -----------------------------------
   "in hero can you highlight word 'proof' in copy as our logo, and with hdr?"
   The first word of the hero subhead is the product's name, so it is set as the
   WORDMARK -- assets/s35-herocopy.css section 1b gives it the header mark's
   face, weight, case and tracking -- and the emission it carries is the one the
   mark already had: the period's. It is in 7.3's own selector list above, three
   lines up, which is the whole design of this section. Same 1000-nit raster,
   same .62 aperture, same background-color underneath so a missing asset costs
   nothing, same behaviour under data-hdr="off".

   IT RESTS. IT NEVER FLARES, AND THAT IS DELIBERATE. The hx-mark rule below the
   resting block names only `.wordmark .dot`. A period is 5 px of ink in a
   header and can take a decade of luminance for 150 ms without a reader
   noticing anything but a signature being signed; a five-letter word inside a
   paragraph a visitor is READING cannot. An event peak there would be worse
   than the resting emission, not better: it would pull the eye off the sentence
   mid-clause, twice a minute, for nothing the sentence is saying. So this
   carrier is identity only -- it emits, it does not perform.

   WHAT IT COSTS THE BUDGET. Ink area, not box area: background-clip:text means
   the emitting pixels ARE the five letterforms. Measured the way hdrev/budget.js
   measures -- black the page, repaint the carriers in flat magenta, count the
   magenta weighted by coverage so an antialiased edge counts as the fraction it
   received -- at 1440x900: 283.1 px, 0.0218% of the viewport. The three chrome
   carriers at rest are 1390 px / 0.1073% with the cursor in the lit half of its
   blink and 48.3 px / 0.0037% in the dark half, so the resting total becomes
   0.1291% lit and 0.0256% dark. The ceiling for any instant is ~3%: this is a
   twenty-third of it. And because the word never steps to the event tier, the
   peak of the choreography moves by exactly this constant and by nothing else.

   THE HONEST OBJECTION, RECORDED WHERE THE NEXT READER WILL SEE IT. Section 0's
   rule -- luminance is a state channel, dim green is knowledge and HDR green is
   verification happening -- is weakened by every resting carrier, and this is
   the fourth. The three before it are chrome: a cursor, a command frame, a
   signature. This one is inside reading text, which is the one place the brief
   names outright ("HDR body text" is on the forbidden list). It is here because
   the founder ruled it here, and the ruling is narrower than it could have
   been: the word emits at the RESTING tier, never the event tier, so the
   channel's loud half -- the decade above -- is still spent only on computation
   and verification. If the channel is ever judged to have been spent, the two
   lines to delete are the selector added to 7.3 and the one added to the
   dynamic-range-limit block in section 0; the word then keeps the mark's
   letterforms in the theme's own green and loses nothing structural. */
/* ---- 7.4 the invariant, and how it is checked --------------------------
   Walk every element and both pseudo-elements on a resting page and collect any
   computed background-image matching hdr/. The list must be empty, or contain
   only elements whose own or whose ancestor's computed display is none.
   Measured on all ten pages of exp35 in the terminal theme at 1440x900 after
   this section: the only match left anywhere is div.colony-hdr, which
   themes.css declares display:none and which colony-hdr.js reveals only for a
   visitor who has played the field. Before this section the same walk returned
   the wordmark period, four command brackets and the tube's H1 cursor on every
   page, with no class on <html> and no graph running. */

/* ==========================================================================
   8. REDUCED MOTION
   The graph driver holds one still frame and never starts the loop, so no
   channel is ever written and no event asset is ever painted. Said out loud so a
   future edit cannot introduce one.
   Section 7's carriers have nothing left to suppress: since the resting tier was
   withdrawn they paint no HDR unless a class arrives, and under this query no
   class ever does. Their SDR appearance is unaffected, which is right -- a
   visitor who asks for less motion did not ask for a dimmer wordmark. The
   cursor's blink is themes.css's own animation and themes.css already stops it
   under this query, which leaves a steady lit block -- correct, and quieter than
   the blink it replaces.
   ========================================================================== */
@media (prefers-reduced-motion: reduce){
  html .hg-hdr{display:none !important;}
  html .wordmark .dot::after{opacity:0 !important;background-image:none !important;}
  html .pctl-hdr{opacity:0 !important;background-image:none !important;}
}
