/* ============================================================================
   exotic — app design language v3 · MERIDIAN (see docs/DESIGN.md)
   ----------------------------------------------------------------------------
   Cool daylight surfaces, Schibsted Grotesk + Geist Mono, and the meridian
   ramp used ONLY as light — hairlines, focus, the mark, glows. Direction
   color is data. Requires tokens.css first (ramp + semantic tokens).
   ========================================================================== */
:root{
  /* Neutral surfaces, elevation, radii, spacing and motion tokens all live in
     tokens/*.css — the single source (round-2 audit, D01/D07/D23). Only
     exotic-specific derivations remain here. */

  /* the meridian, as a wash — used SPARINGLY, blurred, at low opacity */
  --grad-warm:var(--grad);

  --scene-min:calc(100svh - var(--topbar)); --dock-rest:300px; /* ≈ resting ⌘K dock height; pages reserve this so it never covers content */
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--font-display);font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
a{color:inherit;text-decoration:none}
/* native controls inherit the product voice — no UA Arial close buttons (FX02) */
button,input,select,textarea{font:inherit;color:inherit}
/* even a text selection is daylight (FX20) */
::selection{background:color-mix(in oklab,var(--g3) 30%,transparent)}
.num{font-family:var(--font-num);font-variant-numeric:tabular-nums;letter-spacing:-0.01em}
.up{color:var(--up)} .down{color:var(--down)}
.full{padding-left:var(--gut);padding-right:var(--gut)}
.eyebrow{font-family:var(--font-num);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}

/* (the meridian's base style lives in css/kit/motion.css — the sheet loaded by
   every page motion.js injects it into, INCLUDING the landing) */

/* every control answers touch the same way: a firm, quick press —
   the press lands fast (70ms), the release relaxes at the normal pace */
.btn-grad:active,.btn-line:active,.md-cta:active:not(:disabled),
.seg button:active,.nav-it:active,.hx-btn:active,.td-x:active,.bk-toggle:active,
.wa-btn:active,.lb-tabs button:active,.dt-tabs button:active,.mp-mode .cell:active,
.mkt-chips button:active,.md-chips button:active,.pcf-chips button:active,
.act-filters button:active,.tm-view button:active{transform:scale(.97);transition-duration:var(--t-press,.07s)}

/* ---- expansions (.xp wraps one child) — kept in the DOM so open and close
   travel the same path, interruptible mid-flight; the ancestor's state class
   (.open / .edit) or the wrapper's own .on drives it ---- */
.xp{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--t3) var(--ease-emph)}
.xp>*{min-height:0;overflow:hidden;visibility:hidden;opacity:0;transform:translateY(-4px);
  transition:opacity var(--t2) var(--ease),transform var(--t2) var(--ease),visibility 0s linear var(--t3)}
.open>.xp,.edit>.xp,.xp.on{grid-template-rows:1fr}
.open>.xp>*,.edit>.xp>*,.xp.on>*{visibility:visible;opacity:1;transform:none;
  transition:opacity var(--t2) var(--ease) .05s,transform var(--t3) var(--ease-emph) .05s,visibility 0s}
@media (prefers-reduced-motion:reduce){
  .xp{transition:none}
  .xp>*{transform:none;transition:opacity .15s linear,visibility 0s linear .15s}
  .open>.xp>*,.edit>.xp>*,.xp.on>*{transition:opacity .15s linear,visibility 0s}
}

/* the day changing should dawn, not slam — js adds this for the moment of a
   light↔dark switch only (stays on under reduced motion: it SOFTENS a jump) */
.theme-easing,.theme-easing *{
  transition:background-color .6s var(--ease),color .6s var(--ease),
    border-color .6s var(--ease),fill .6s var(--ease),stroke .6s var(--ease) !important}

/* focus is light — the meridian ring */
:where(button,a,input,select,textarea,[tabindex]):focus-visible{
  outline:none;box-shadow:var(--focus-ring,0 0 0 2px color-mix(in oklab,var(--g3) 65%,transparent))}
/* composite fields: the FIELD wears the ring, never the raw input inside it
   (an inner ring draws a broken rectangle across the pill) */
:where(.tin,.tw-field,.md-field,.lev-edit,.ck-bar,.tw-slider) input:focus-visible{box-shadow:none;outline:none}
:where(.tin,.tw-field,.md-field):focus-within{
  border-color:color-mix(in oklab,var(--g3) 55%,var(--hairline));box-shadow:var(--focus-ring)}


/* mark — lines/gradient state toggle (matches /components) */
.markbox{position:relative}
.markbox .mark{display:block;width:100%;height:100%}
.markbox .mk-grad{opacity:0;transition:opacity .9s ease}
.markbox .mk-lines{opacity:1;transition:opacity .9s ease}
.markbox[data-state="gradient"] .mk-grad{opacity:1}
.markbox[data-state="gradient"] .mk-lines{opacity:0}

/* ambient: faint grid + one very soft, low-opacity warm wash */
.ambient{position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden;background:var(--bg)}
.ambient .grid{position:absolute;inset:0;opacity:.7;
  background-image:radial-gradient(var(--hairline) 1.3px,transparent 1.4px);background-size:24px 24px;background-position:12px 12px;
  -webkit-mask-image:linear-gradient(180deg,#000,transparent 80%);mask-image:linear-gradient(180deg,#000,transparent 80%)}
.ambient .wash{position:absolute;top:-34%;right:-20%;width:78vw;height:64vh;background:var(--grad-warm);filter:blur(130px) saturate(.7);opacity:.07;transform:rotate(-8deg);border-radius:48% 52% 60% 40%}

/* external logos in our language: the REAL, recognizable company mark on a uniform
   brand chip (white field, hairline, crisp shadow) — the chip is the branding, the
   logo stays itself. `.tint` opts into the prism-silhouette treatment for purely
   decorative clusters; `.mono` is the gradient-monogram fallback (privates / 404). */
.logo{position:relative;isolation:isolate;display:inline-flex;align-items:center;justify-content:center;background:var(--surface);border:1px solid var(--hairline-2);border-radius:var(--rad-1);overflow:hidden;box-shadow:var(--crisp);flex:0 0 auto}
.logo img{width:100%;height:100%;object-fit:contain;padding:18%}
.logo.tint img{filter:brightness(0)}
.logo.tint::after{content:"";position:absolute;inset:0;background:var(--grad-warm);mix-blend-mode:screen;pointer-events:none}
.logo.mono{font-family:var(--font-display);font-weight:600;background:var(--surface)}
.logo.mono::after{content:attr(data-mono);position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:.62em;letter-spacing:-.02em;
  background:var(--grad-warm);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;color:transparent}
/* `.inv` — white-on-transparent marks (NAURA, Leeno, Harmonic Drive) live on an
   ink chip so they read on the light theme; stays an ink chip in dark theme too */
.logo.inv{background:#1c1c20;border-color:#1c1c20}
body.theme-dark .logo.inv{background:var(--surface-2,#26262b)}

/* ============================================================================
   Shell
   ========================================================================== */
.topbar{position:sticky;top:0;z-index:50;height:var(--topbar);background:var(--glass-2);backdrop-filter:var(--mat-regular);-webkit-backdrop-filter:var(--mat-regular);border-bottom:1px solid var(--hairline)}
.topbar-in{height:100%;padding:0 var(--gut);display:flex;align-items:center;gap:var(--s5)}
.brandlogo{display:flex;align-items:center;gap:10px}
.brandlogo .markbox{width:28px;height:28px;flex:0 0 auto}
.brandlogo .wm{font-size:20px;font-weight:600;letter-spacing:-0.035em;text-transform:lowercase}
.topbar .right{margin-left:auto;display:flex;align-items:center;gap:var(--s4)}
.kbd-hint{display:inline-flex;align-items:center;gap:10px;font-size:13.5px;color:var(--ink-2);border:1px solid var(--hairline);background:var(--surface);border-radius:var(--rad-pill);padding:8px 8px 8px 16px;cursor:pointer;box-shadow:var(--crisp);transition:box-shadow var(--t1),transform var(--t1)}
.kbd-hint:hover{transform:translateY(-1px);box-shadow:var(--elev-1)}
.kbd{font-family:var(--font-num);font-size:11px;color:var(--ink-2);border:1px solid var(--hairline);border-radius:6px;padding:3px 7px;background:var(--bg)}
.avatar{width:32px;height:32px;border-radius:var(--rad-pill);background:var(--surface-2);border:1px solid var(--hairline);box-shadow:var(--crisp);display:flex;align-items:center;justify-content:center;font-family:var(--font-num);font-size:12px;color:var(--ink-2)}

/* primitives */
.btn{font-family:var(--font-display);font-weight:500;font-size:14px;border:1px solid var(--hairline);background:var(--surface);color:var(--ink);border-radius:var(--rad-2);padding:10px 16px;cursor:pointer;display:inline-flex;align-items:center;gap:8px;box-shadow:var(--crisp);transition:transform var(--t1),box-shadow var(--t1),border-color var(--t1)}
.btn:hover{box-shadow:var(--elev-1);transform:translateY(-1px)}
.btn.dark{background:var(--ink);color:var(--bg);border-color:var(--ink)}
.btn.sm{padding:7px 12px;font-size:13px;border-radius:var(--rad-1)}
.btn.ghost{background:transparent;border-color:transparent;color:var(--muted);box-shadow:none}
.btn.ghost:hover{color:var(--ink);background:var(--surface-2);box-shadow:none;transform:none}
.pill{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-num);font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-2);background:var(--surface);border:1px solid var(--hairline-2);border-radius:var(--rad-pill);padding:5px 11px;box-shadow:var(--crisp)}
.delta{font-family:var(--font-num);font-variant-numeric:tabular-nums;font-weight:500}
.chip-up{color:var(--up);background:var(--up-bg)} .chip-down{color:var(--down);background:var(--down-bg)}


/* ---- inputs · the standard field pill (orders modify, widget edit) ---- */
.tin{display:flex;align-items:center;gap:8px;border:1px solid var(--hairline);border-radius:var(--rad-2);background:var(--bg-sunken);padding:2px 6px 2px 12px}
.tin input{flex:1;border:0;background:transparent;outline:none;font-family:var(--font-num);font-variant-numeric:tabular-nums;font-size:15px;color:var(--ink);padding:8px 0}
.tin .sfx{font-family:var(--font-num);font-size:12px;color:var(--muted);white-space:nowrap}

/* ============================================================================
   The pre-rework surfaces that used to live below — old Home deck, hook/flow,
   the ⌘K dock + power terminal, thesis research pages, trade ticket — were
   dead code (zero live references) and were excised in the round-2 audit
   (FX04). Four of their selectors (.hrow, .sec-head, .cmdk, .flow) collided
   with live components; app/lobby.css is the single owner now. History lives in
   git (pre design/language-cleanup).
   ========================================================================== */

/* touch has no hover: transform lifts would stick after a tap — rest them
   (the press law is the feedback there) (D26/F-EM-7) */
@media (hover:none){
  .btn-grad:hover,.btn-line:hover,.md-cta:hover{transform:none;filter:none}
}

@media (prefers-reduced-transparency:reduce){
  .topbar{background:var(--bg);backdrop-filter:none;-webkit-backdrop-filter:none}
}
