/* ═══ §2 · SHARED · TAP TARGETS ═══════════════════════════════════════════════════════
   Every DISCRETE control answers to at least 44×44 CSS px — the finger, not the ink. The
   control keeps the size it is drawn at; a transparent ::after grows only the HIT box around
   its centre, so nothing on screen moves.

   NOT in this list, deliberately: LIST ROWS (.race-bar · .home-portfolio-row ·
   .home-signal-row · .sfti-grid-row · .scanner-modal-row · .replay-row). A row's hit area is
   bounded by the row above and below it — growing one steals the next, and a list that fires
   the wrong row is worse than a short one.

   PACKED GROUPS (.council-chip · .replay-pill · .replay-speed · .tf-btn) cannot take an
   invisible overlay either — their neighbours are 4–6px away, so the overlay would sit on the
   chip beside them. They take the 44 FOR REAL, in flow. Form controls render no
   pseudo-element, so they take it for real too. */

/* ★ THE HEADER'S FINGER BUDGET IS A TRACK PROBLEM, NOT A TOTAL-WIDTH ONE.
   This rule centres a 44px box on each listed control, so two whose CENTRES are closer than 44px
   have OVERLAPPING boxes and the later element in the DOM wins — the tap fires the WRONG control.
   shell.css §4.1 gives the two sides EQUAL grid tracks (that is what centres the SFTi mark), each
   ~148px of a 358px content box at 390px. Three items at 44px centres span ~111px and fit; FOUR
   need ~170px and cannot. So the ceiling is 3 + mark + 3 = SEVEN promised controls, and an eighth
   forces an overlap somewhere however the gaps are tuned.
   ★ THAT IS WHY THE TWO STRIPS ARE NOT LISTED HERE. They are AMBIENT INDICATORS — you watch them;
   the tap and the tooltip are a bonus, not a 44px promise this bar can keep. A promise that cannot
   be kept is worse than an honest small target, because it silently steals a neighbour's taps.
   ⚠ Adding a header control, or widening one, must be RE-MEASURED at 390px, never assumed. */
.race-why-btn, .race-rewind-btn, .statik-chat-trigger, .status-brand, #header-regime,
.status-session, #header-saw, #header-frac, #header-engram,
.modal-close, .modal-grabber, .toggle-track,
.composite-modal-close, .council-close,
.theater-fs-btn, .log-det-refresh-btn, .holo-btn {
  position: relative;
  touch-action: manipulation;
}
.race-why-btn::after, .race-rewind-btn::after, .statik-chat-trigger::after,
.status-brand::after, #header-regime::after,
.status-session::after, #header-saw::after, #header-frac::after, #header-engram::after,
.modal-close::after, .modal-grabber::after, .toggle-track::after,
.composite-modal-close::after, .council-close::after,
.theater-fs-btn::after, .log-det-refresh-btn::after, .holo-btn::after {
  content: '';
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: max(100%, 44px);
  height: max(100%, 44px);
  /* purely a hit box — it never paints. Where two overlays touch, the later element in the DOM
     wins the hit test, which is why the modal header sits after the grabber. */
  background: none;
  pointer-events: auto;
}
/* ★ THE LAST CONTROL IN A ROW GROWS INTO THE MARGIN, NOT INTO ITS NEIGHBOUR.
   The rule above CENTRES a 44px box — right in open space, wrong at a frame edge. The regime chip's
   centre sits 39.0px from STATIK's (measured 2026-08-11 at 390px), so a centred box overlaps the
   brain by 5px and, being later in the DOM, STEALS its taps. It cannot be tuned out: the right track
   carries 130px of ink in 148px, an 18px gap budget, and this pair alone wants 10 of it.
   So this box is anchored to the chip's own left edge and extends RIGHT into the frame padding —
   space no control owns. It lands ~38px wide rather than 44. That is a smaller target and an HONEST
   one: nothing is taken from the brain, and a 44px promise that eats a neighbour is worse than a
   38px box that does not. If the bar ever gains width, delete this block and let the base rule win. */
#header-regime::after {
  left: 0;
  right: -14px;
  width: auto;
  transform: translateY(-50%);
}
/* The LEFT edge is the same pair mirrored: engram->session measures 33.4px of centre gap, so a
   centred box would overlap the session glyph by 10.6px and — being earlier in the DOM — LOSE its
   own taps to it. Same remedy, opposite direction: anchored to the chip's RIGHT edge, growing LEFT
   into the frame padding. */
#header-engram::after {
  left: -14px;
  right: 0;
  width: auto;
  transform: translateY(-50%);
}
/* ★ AND THE GLYPH BETWEEN THEM CANNOT TAKE 44 EITHER. Measured by HIT TEST, not by arithmetic:
   with a centred 44px box the session glyph answered at the engram chip's own right-edge pixel —
   it was eating its neighbour by ~2px. It is the one control with a promised chip on one side and
   an ambient strip on the other, so it has to stop short in BOTH directions or it steals from one.
   38px, inset symmetrically. Smaller than the floor and honest about it: nothing else loses a tap,
   which is the property that actually matters.
   ⚠ PROVE THIS WITH THE HIT TEST, NEVER WITH CENTRE GAPS. Two of these boxes are edge-anchored, so
   "centres closer than 44px" no longer implies an overlap and reports failures that do not exist —
   scratchpad/probe-press.js asks the browser which element answers on each control's own ink. */
#session-glyph::after {
  left: -8px;
  right: -8px;
  width: auto;
  transform: translateY(-50%);
}

.modal-btn, .settings-btn, .search-input {
  min-height: 44px;
  touch-action: manipulation;
}
.council-chip, .replay-pill, .replay-speed, .tf-btn { touch-action: manipulation; }

