/* ice.css V1.3 - 2026-10-03, Nolan. `.ice-attrib` moved to components.css (loaded by the member app and ice.html alike). */
/* ice.css V1.2 */
/* V1.2 - 2026-09-19, Jackie. `SYS-29` - 1 raw corner -> `var(--r-*)`.
   Of them: 1 moved 1px.
   The map in `tools/css-radius.mjs` is now EMPTY, so a new raw corner here is
   no longer a number to raise - it is an unrecorded file. Mapped by that
   tool's own SCALE/NEAREST tables, never by eye; measured before and after on
   every visible element of all 26 pages. */
/* — PUBLIC ICE / RINKS.
   V1.1 — 2026-09-04, Vera. 6 raw colours -> 0.
   · --ice-tag-ink / --ice-tag-wash MOVED to tokens.css with their whole
     rationale. A correct per-theme decision at the wrong address: declared
     here, a new style could only reach the teal by overriding a COMPONENT
     selector. tests/icefeed.test.mjs was repointed (where it reads, never what
     it asserts) under a narrow authorisation.
   · Two dead `var(--warn, #E5A400)` fallbacks removed: --warn is declared in
     both themes so the fallback could never fire, and #E5A400 was neither
     theme's value.
   ============================================================================
   A NEW FILE, and that is the point: `assets/css/` is on the manifest's
   shared-file list (four seats, one Mac, three lost-work incidents on 08-18),
   so this seat adds a file rather than editing components.css or hub.css.

   It is also SHORT on purpose. Every card, button, input, segment and empty
   state on the public-ice surface is a T-002 component reused verbatim —
   .h-scard, .h-seg, .h-input, .h-btn, .h-label, .h-empty. What is here is only
   what genuinely did not exist: the two-line day heading, the rink row in the
   directory, and the attribution block.

   Every colour is a token. Nothing in this file knows what dark mode is,
   because tokens.css already does.
   ========================================================================== */

.ice-tabs { margin-bottom: 14px; }

.ice-controls { margin-bottom: 14px; }
.ice-controls .h-input[type="search"] { margin-bottom: 10px; }

/* Two columns on anything wider than a phone: four stacked selects push the
   first result off the screen, and this surface is one people scan. */
.ice-selects { display: grid; grid-template-columns: 1fr; gap: 4px 12px; }
.ice-selects .h-label { margin-top: 6px; }
@media (min-width: 560px) {
  .ice-selects { grid-template-columns: auto 1fr auto 1fr; align-items: center; }
  .ice-selects .h-label { margin-top: 0; white-space: nowrap; }
}

.ice-count { font-size: 11.5px; color: var(--muted); margin: 2px 0 10px; }

/* The day heading. Matches the schedule's own `.h-sch__day` rhythm so the two
   surfaces read as one product; it is a separate class because that one lives
   in hub.css, which is shared. */
.ice-day {
  font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  color: var(--muted); margin: 16px 0 8px;
}
.ice-day:first-child { margin-top: 4px; }

/* --------------------------------------------------------------------------
   THE PUBLIC ICE TAG. Two inks, one identity, and the second ink is a bug fix.

   The hue is the schedule's fifth calendar (SCHEDULE_SOURCES, lib/spaces.js:
   colour '#3DB8B0'), repeated here because a stylesheet cannot import a JS
   constant, and asserted equal in tests/icefeed.test.mjs so the two cannot
   drift.

   IT SHIPPED AT 2.12:1 IN LIGHT MODE. Meryl measured it, 08-21. #3DB8B0 on a
   16% wash of itself is 5.88:1 over the dark panel and 2.12:1 over the white
   one — the same two lines, one readable and one not, and only ever visible to
   somebody who had switched themes. Small bold text needs 4.5.

   NO SINGLE INK CLEARS BOTH, which is not a failure of imagination: a 16% tint
   over #141414 and over #FFFFFF are 200 luminance points apart. That is exactly
   why tokens.css defines its colours per theme (--green is #07F708 dark and
   #6B3AF5 light — a different colour, not a shade). So this follows the house
   pattern instead of fighting it: the wash keeps the teal identity in both, and
   the ink is the one that moves.

     dark   #3DB8B0 on 16% over #141414 = 5.88:1
     light  #0B4F4B on 18% over #FFFFFF = 8.06:1

   Both computed, both asserted, and the assertion recomputes from these very
   declarations rather than trusting the numbers in this comment.
   ----------------------------------------------------------------------- */
.ice-tag {
  background: var(--ice-tag-wash); color: var(--ice-tag-ink); align-self: center;
}
/* THE TWO TOKENS AND THE `[data-theme="light"] .ice-tag` BLOCK MOVED TO
   tokens.css (Vera, 2026-09-04, authorised by the Orchestrator). The values and
   the whole comment above them went across unchanged; only the address moved.
   Declared here, a new style could reach the teal only by overriding a
   COMPONENT selector, which is not what "a theme is a token swap" means. */

.ice-rink {
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 12px 13px; margin-bottom: var(--sp-3);
}
.ice-rink__name { font-weight: 700; font-size: 14px; }
.ice-rink__meta { color: var(--faint); font-size: 11.5px; margin-top: 2px; }
.ice-rink__next { color: var(--muted); font-size: 12px; margin-top: 6px; }
.ice-rink__acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }

/* --------------------------------------------------------------------------
   THE ATTRIBUTION BLOCK.

   Quiet, but never hidden: no `display:none` path, no truncation, no
   `max-height` that could clip it, and a contrast that passes on both themes.
   The licence says the text must be DISPLAYED where the data is used, and a
   line styled to be unreadable is not displayed. tests/icefeed.test.mjs asserts
   this rule has no `display:none` and that the colour token used here is one
   of the readable ones.
   ----------------------------------------------------------------------- */
/* `.ice-attrib` lives in components.css since 2026-10-03: the member app never loads this file, so on Discover the credit rendered unstyled at 15px. */

/* THE `--warn` FALLBACKS WENT (Vera, 2026-09-04). Both rules read
   `var(--warn, #E5A400)`. A fallback is a deliberate statement that the token
   MAY BE ABSENT, which is why `tools/css-tokens.mjs` never reports one --- but
   `--warn` is declared in `tokens.css` in both themes, so this one could not
   fire, and the colour it named is neither theme value. It was a third amber
   that would have been wrong in dark AND light on the one day it rendered.
   A dead fallback is still a place a new theme cannot reach. */
.ice-stale {
  background: var(--panel2); border: 1px solid var(--line2); border-left: 3px solid var(--warn);
  border-radius: var(--r-md); padding: 10px 12px; margin-bottom: 12px;
  font-size: 12px; color: var(--muted);
}

/* --------------------------------------------------------------------------
   THE OPERATOR STRIP. Staff only, and it renders because the SERVER said so.

   Every colour is a token, so it inherits both themes rather than needing a
   second set of values the way `.ice-tag` did. Measured on `--panel2`:
   `--ink` is 14.95:1 dark and 17.37:1 light, `--muted` is 6.13:1 and 6.06:1 —
   all clear of 4.5 without a per-theme override, which is what using the
   tokens buys.

   Deliberately NOT styled as an alert. A refused run is the fail-safe having
   worked, and painting it red would teach an operator to panic at the thing
   that just protected the listings. The refusal line gets a left rule and the
   warm token, the same weight the schedule uses for "worth reading", not for
   "something is broken".
   ----------------------------------------------------------------------- */
.ice-op {
  background: var(--panel2); border: 1px solid var(--line2);
  border-radius: var(--r-md); padding: 12px 13px; margin-bottom: 14px;
}
.ice-op__head {
  font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink); display: flex; align-items: center; gap: 8px;
}
.ice-op__who {
  font-size: 9.5px; font-weight: 700; letter-spacing: .04em;
  color: var(--muted); border: 1px solid var(--line); border-radius: var(--r-pill);
  padding: 1px 7px; text-transform: none;
}
.ice-op__line { font-size: 12px; color: var(--muted); margin-top: 6px; }
.ice-op__refused {
  font-size: 12px; color: var(--muted); margin-top: 8px; padding-left: 10px;
  border-left: 3px solid var(--warn); line-height: 1.5;
}
.ice-op__refused strong { color: var(--ink); }
.ice-op__note { font-size: 12px; color: var(--ink); margin-top: 8px; }

/* THE UNRECOGNISED NAMES. Deliberately NOT the `--warn` rule above: a refused
   run is the fail-safe firing and wants an eyebrow, while an unknown name is
   usually a real sport we do not carry. Painting information as an alarm is
   how an operator learns to ignore the panel. Tokens only, both themes — the
   lesson `.ice-tag` cost me when I hard-coded a colour and shipped 2.12:1 in
   light mode. `--muted` on `--panel2` measures 6.13:1 dark / 6.06:1 light. */
.ice-op__unknown {
  font-size: 12px; color: var(--muted); margin-top: 8px; padding-left: 10px;
  border-left: 3px solid var(--line); line-height: 1.6;
}
.ice-op__unknown strong { color: var(--ink); }
.ice-op__term {
  display: inline-block; font-size: 11px; color: var(--ink);
  background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--r-pill); padding: 1px 8px; margin: 2px 2px 0 0;
  white-space: nowrap;
}
.ice-op .h-btn { margin-top: 10px; }
