/* ============================================================ LITON:One UI — tokens + components v1.0 · 2026-08-28 · extracted from the Sales CRM design mockup Source of truth for values: Liton Design System Package v1.0 (file 03 / shared.css) + the mockup's deviation log DV-01/02/06. API — set attributes on : data-theme : (unset = follow OS) | "light" | "dark" data-contrast : (unset = normal) | "low" | "high" data-density : (unset = standard) | "compact" | "comfortable" Rules of the road: · Zero border-radius (50% dots only) · zero box-shadows · flat surfaces + 1px hairlines · amber earned, never decorates. · Inter Tight = display + body. JetBrains Mono = eyebrows, labels, chips, IDs, numbers. The two never swap roles. · Every color flows through a token. No literals in components except on committed navy surfaces (cover/chrome). ============================================================ */ /* ---------- 1 · BASE — light · normal · standard ---------- */ :root{ /* surfaces */ --bg:#ffffff; --bg-2:#f7f7f7; --bg-3:#ececec; --card:#ffffff; /* inks */ --ink:#00274a; --ink-2:#01426a; --ink-3:#5f6672; --charcoal:#222222; /* hairlines */ --line:#c8c8c8; --line-2:#e8e8e8; /* amber — #FBB715 is constant across every mode; it is fill/ring, never body text. --accent-text is the DV-06 text-role variant. */ --accent:#fbb715; --accent-text:#9a6700; --accent-tint:#fff1cf; --accent-tint-line:#e5c785; /* status — one meaning per color, everywhere */ --ok:#1f7a4d; --ok-bg:#e8f3ec; --warn:#a34a05; --warn-bg:#fff1cf; --bad:#8a1c1c; --bad-bg:#fbeaea; --future:#5f6672; --future-bg:#f7f7f7; /* committed navy set — identical in every theme */ --navy-fixed:#00274a; --navy-mut:#9fb1c4; --navy-line:#103a5e; --navy-ok:#4fb27e; /* app chrome (top bar) */ --chrome-bg:#ffffff; --chrome-ink:#00274a; --chrome-line:#c8c8c8; --chrome-mut:#5f6672; /* heat ramp — exactly four stops */ --heat-1:#fff1cf; --heat-2:#fbd76a; --heat-3:#fbb715; --heat-4:#d99500; /* selection + focus */ --sel-bg:#fff8e6; --focus:#00274a; --focus-w:2px; /* type */ --font-d:"Inter Tight",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; --font-m:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace; /* density — standard */ --d-cell-y:13px; /* row vertical padding (queue rows, feed items) */ --d-cell-x:16px; /* row horizontal padding */ --d-card:16px; /* card body padding */ --d-gap:18px; /* grid gaps between cards */ --d-ctl-y:12px; --d-ctl-x:20px; /* CTA padding */ --d-act-y:6px; --d-act-x:10px; /* action-chip padding */ --d-table-y:12px; --d-table-x:14px; /* table cell padding */ --d-kpi:18px; /* KPI tile padding */ --d-strip-y:14px; --d-strip-x:16px; /* count-strip cell padding */ --d-topbar:56px; /* app top bar height */ --d-nav-y:9px; /* surface-nav item vertical padding */ } /* ---------- 2 · DARK (DV-02 proposed set) ---------- */ /* System-dark: applies when the OS is dark and no explicit light choice */ @media (prefers-color-scheme: dark){ :root:not([data-theme="light"]){ --bg:#0e1622; --bg-2:#151f2d; --bg-3:#1c283a; --card:#151f2d; --ink:#e7edf4; --ink-2:#c2ccd8; --ink-3:#8a97a8; --charcoal:#e7edf4; --line:#2d3b4e; --line-2:#243142; --accent:#fbb715; --accent-text:#f2c766; --accent-tint:#3a2d09; --accent-tint-line:#6b5210; --ok:#9bddb5; --ok-bg:#173a29; --warn:#f5d07a; --warn-bg:#4a3606; --bad:#f3a3a3; --bad-bg:#4a1c1c; --future:#8a97a8; --future-bg:#1c283a; --chrome-bg:#00274a; --chrome-ink:#ffffff; --chrome-line:#103a5e; --chrome-mut:#9fb1c4; --heat-1:#3a2d09; --heat-2:#8a6a10; --heat-3:#fbb715; --heat-4:#f2c766; --sel-bg:#2a2410; --focus:#fbb715; } } /* Explicit dark: the toggle wins in both directions */ :root[data-theme="dark"]{ --bg:#0e1622; --bg-2:#151f2d; --bg-3:#1c283a; --card:#151f2d; --ink:#e7edf4; --ink-2:#c2ccd8; --ink-3:#8a97a8; --charcoal:#e7edf4; --line:#2d3b4e; --line-2:#243142; --accent:#fbb715; --accent-text:#f2c766; --accent-tint:#3a2d09; --accent-tint-line:#6b5210; --ok:#9bddb5; --ok-bg:#173a29; --warn:#f5d07a; --warn-bg:#4a3606; --bad:#f3a3a3; --bad-bg:#4a1c1c; --future:#8a97a8; --future-bg:#1c283a; --chrome-bg:#00274a; --chrome-ink:#ffffff; --chrome-line:#103a5e; --chrome-mut:#9fb1c4; --heat-1:#3a2d09; --heat-2:#8a6a10; --heat-3:#fbb715; --heat-4:#f2c766; --sel-bg:#2a2410; --focus:#fbb715; } /* ---------- 3 · CONTRAST — low ("calm") ---------- */ /* Softens hairlines and secondary ink for long reading sessions. Body text stays AA on white/card; micro-labels on tinted surfaces may ride ~4.2:1 — calm is not for vision-critical contexts. */ :root[data-contrast="low"]{ --ink-3:#6e7783; --line:#d6dade; --line-2:#f0f1f2; --future:#6e7783; } :root[data-theme="dark"][data-contrast="low"]{ --ink-3:#798696; --line:#26313f; --line-2:#1e2836; --future:#798696; } @media (prefers-color-scheme: dark){ :root:not([data-theme="light"])[data-contrast="low"]{ --ink-3:#798696; --line:#26313f; --line-2:#1e2836; --future:#798696; } } /* ---------- 4 · CONTRAST — high ---------- */ /* Pushes body toward AAA, strengthens boundaries and focus. */ :root[data-contrast="high"]{ --ink-2:#00365c; --ink-3:#454d57; --line:#8a9099; --line-2:#c4c9ce; --accent-text:#7a5200; --ok:#175f3c; --warn:#8a3f04; --bad:#7a1717; --future:#454d57; --focus-w:3px; } :root[data-theme="dark"][data-contrast="high"]{ --ink:#f4f8fc; --ink-2:#dde5ee; --ink-3:#a7b2c2; --line:#46586e; --line-2:#37475a; --accent-text:#f7d78a; --ok:#b5e8ca; --warn:#f8dc96; --bad:#f7bcbc; --future:#a7b2c2; --focus-w:3px; } @media (prefers-color-scheme: dark){ :root:not([data-theme="light"])[data-contrast="high"]{ --ink:#f4f8fc; --ink-2:#dde5ee; --ink-3:#a7b2c2; --line:#46586e; --line-2:#37475a; --accent-text:#f7d78a; --ok:#b5e8ca; --warn:#f8dc96; --bad:#f7bcbc; --future:#a7b2c2; --focus-w:3px; } } /* ---------- 4b · HIGH-CONTRAST READABILITY ---------- */ /* High contrast is also a low-strain mode: bolder weights, fine print stepped up, body at the SOP's 14.5px floor, tracking relaxed to 0. Applies with either theme; density is untouched. */ :root[data-contrast="high"] body{font-size:14.5px;font-weight:500;letter-spacing:0} :root[data-contrast="high"] :is(h1,h2,h3,h4){font-weight:600} :root[data-contrast="high"] :is(.eyebrow,.t-eyebrow,.t-label,.card-h,.kpi .k,.strip .l,.kv .k,.fld label,.stg,.pill,.sla,.act-b,.chip,.snav .grp,.topbar .mod,.topbar .me,table.lt th,.brow .bn,.fstage .fl,.qrow .id small,.tev .tb .tm){font-weight:600} :root[data-contrast="high"] :is(.pill,.sla,.act-b,.stg,.kpi .k,.card-h,.fld label,.kv .k,table.lt th,.strip .l){font-size:10.5px} :root[data-contrast="high"] .chip{font-size:11px} :root[data-contrast="high"] :is(.qrow .why .m,.brow .bn,.tev .tb .tm){font-size:11px} :root[data-contrast="high"] :is(.qrow .id,.kv .v.mono,table.lt td.mono,table.lt td.num,.brow .bv,.fstage .fv){font-size:12px} :root[data-contrast="high"] .qrow .why .r{font-size:14px} :root[data-contrast="high"] table.lt{font-size:13.5px} :root[data-contrast="high"] :is(.kpi .t,.snav .pin){font-size:11.5px} :root[data-contrast="high"] .snav .nv{font-weight:600} :root[data-contrast="high"] .article p,:root[data-contrast="high"] .article li{font-size:14.5px} :root[data-contrast="high"] :is(.article-head .meta,.article-head .crumb,.term .t){font-weight:600} :root[data-contrast="high"] .term p{font-size:13px} /* ---------- 5 · DENSITY ---------- */ :root[data-density="compact"]{ --d-cell-y:8px; --d-cell-x:12px; --d-card:12px; --d-gap:12px; --d-ctl-y:8px; --d-ctl-x:14px; --d-act-y:4px; --d-act-x:8px; --d-table-y:8px; --d-table-x:12px; --d-kpi:12px; --d-strip-y:10px; --d-strip-x:12px; --d-topbar:48px; --d-nav-y:6px; } :root[data-density="comfortable"]{ --d-cell-y:18px; --d-cell-x:20px; --d-card:24px; --d-gap:24px; --d-ctl-y:14px; --d-ctl-x:24px; --d-act-y:8px; --d-act-x:14px; --d-table-y:16px; --d-table-x:18px; --d-kpi:24px; --d-strip-y:18px; --d-strip-x:20px; --d-topbar:64px; --d-nav-y:12px; } /* ============================================================ COMPONENTS ============================================================ */ *{box-sizing:border-box} body{ margin:0;background:var(--bg);color:var(--ink); font-family:var(--font-d);font-size:14px;line-height:1.55;letter-spacing:-0.005em; -webkit-font-smoothing:antialiased; } h1,h2,h3,h4{margin:0;font-weight:500;letter-spacing:-0.025em;text-wrap:balance} a{color:var(--ink-2)} button{font:inherit;color:inherit;background:none;border:none;padding:0;cursor:pointer} button:focus-visible,a:focus-visible,input:focus-visible,[tabindex]:focus-visible{ outline:var(--focus-w) solid var(--focus);outline-offset:2px} .mono{font-family:var(--font-m)} .num{font-variant-numeric:tabular-nums} .eyebrow{font-family:var(--font-m);font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--ink-3);font-weight:500} .scroll-x{overflow-x:auto} /* --- type scale (from Design System file 03 — 12 tokens) --- */ .t-display-1{font-size:96px;line-height:.92;letter-spacing:-.045em;font-weight:500} .t-display-2{font-size:72px;line-height:.94;letter-spacing:-.04em;font-weight:500} .t-display-3{font-size:56px;line-height:.98;letter-spacing:-.035em;font-weight:500} .t-h1{font-size:40px;line-height:1.02;letter-spacing:-.03em;font-weight:500} .t-h2{font-size:28px;line-height:1.05;letter-spacing:-.025em;font-weight:500} .t-h3{font-size:22px;line-height:1.1;letter-spacing:-.02em;font-weight:500} .t-body-l{font-size:17px;line-height:1.65;letter-spacing:-.005em} .t-body-m{font-size:14px;line-height:1.65;letter-spacing:-.005em} .t-body-s{font-size:12px;line-height:1.6} .t-eyebrow{font-family:var(--font-m);font-size:11px;line-height:1;letter-spacing:.22em;text-transform:uppercase;font-weight:500} .t-label{font-family:var(--font-m);font-size:10px;line-height:1;letter-spacing:.14em;text-transform:uppercase;font-weight:500} .t-mono-l{font-family:var(--font-m);font-size:14px;line-height:1.5;letter-spacing:-.005em;font-weight:500} /* one italic word per headline — amber as type only via --accent-text */ em.am,.am{font-style:italic;color:var(--accent-text)} /* --- CTAs — three tiers, never four --- */ .cta{display:inline-flex;align-items:center;gap:10px;padding:var(--d-ctl-y) var(--d-ctl-x); font-family:var(--font-d);font-weight:500;font-size:14px;letter-spacing:-0.005em; border:1px solid transparent;cursor:pointer;transition:background 120ms ease,color 120ms ease} .cta .arr{font-family:var(--font-m)} .cta.primary{background:var(--accent);color:var(--navy-fixed)} .cta.primary:hover{background:var(--navy-fixed);color:#ffffff} .cta.secondary{background:transparent;color:var(--ink);border-color:var(--ink)} .cta.secondary:hover{background:var(--ink);color:var(--bg)} .cta.tertiary{background:transparent;color:var(--ink);padding:6px 0} .cta.tertiary:hover{color:var(--ink);text-decoration:underline} .cta.sm{padding:8px 14px;font-size:12.5px} .cta[disabled]{opacity:.4;cursor:not-allowed} /* --- action chip — the chip pattern doing row work (DV-03) --- */ .act-b{background:transparent;color:var(--ink-3);border:1px solid var(--line-2); font-family:var(--font-m);font-size:10px;letter-spacing:.14em;text-transform:uppercase; padding:var(--d-act-y) var(--d-act-x);cursor:pointer; transition:border-color 120ms ease,color 120ms ease} .act-b:hover{border-color:var(--ink);color:var(--ink)} /* --- filter / view chips --- */ .chip{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-m); font-size:10.5px;letter-spacing:.14em;text-transform:uppercase; padding:5px 10px;border:1px solid var(--line);background:var(--card);color:var(--ink); cursor:pointer;transition:background 120ms ease,color 120ms ease,border-color 120ms ease} .chip:hover{background:var(--bg-2)} .chip.on,.chip[aria-pressed="true"]{background:var(--ink);color:var(--bg);border-color:var(--ink)} .chip .ct{font-weight:600} .chip.amber{background:var(--accent-tint);border-color:var(--accent-tint-line)} /* --- status pills — color only inside the pill, never row shading --- */ .pill{display:inline-flex;align-items:center;gap:6px;padding:4px 8px; font-family:var(--font-m);font-size:10px;letter-spacing:.14em;text-transform:uppercase;white-space:nowrap} .pill .dot{width:6px;height:6px;border-radius:50%;flex:none} .pill.ok{background:var(--ok-bg);color:var(--ok)} .pill.ok .dot{background:var(--ok)} .pill.warn{background:var(--warn-bg);color:var(--warn)} .pill.warn .dot{background:var(--warn)} .pill.bad{background:var(--bad-bg);color:var(--bad)} .pill.bad .dot{background:var(--bad)} .pill.future{background:var(--future-bg);color:var(--future);border:1px dashed var(--line)} .pill.future .dot{background:var(--future)} .pill.stage{background:var(--bg-2);color:var(--ink-3);border:1px solid var(--line-2)} .pill.stage .dot{background:var(--ink-3)} :root[data-contrast="high"] .pill{border:1px solid currentColor} /* --- cards --- */ .card{background:var(--card);border:1px solid var(--line)} .card-h{display:flex;align-items:center;justify-content:space-between;gap:14px; padding:11px var(--d-cell-x);border-bottom:1px solid var(--line-2); font-family:var(--font-m);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)} .card-h b{color:var(--ink);font-weight:500} .card-b{padding:var(--d-card)} /* --- KPI tile — one number, one label, one trend; ≤1 amber per board --- */ .kpi{background:var(--card);border:1px solid var(--line);padding:var(--d-kpi); display:flex;flex-direction:column;gap:8px;text-align:left;cursor:pointer; transition:border-color 120ms ease} .kpi:hover{border-color:var(--ink)} .kpi .k{font-family:var(--font-m);font-size:10px;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-3)} .kpi .v{font-size:40px;letter-spacing:-.035em;line-height:1;font-weight:500;color:var(--ink);font-variant-numeric:tabular-nums} .kpi .t{font-family:var(--font-m);font-size:11px} .kpi .t.up{color:var(--ok)} .kpi .t.down{color:var(--bad)} .kpi .t.flat{color:var(--ink-3)} .kpi.hot{background:var(--accent);border-color:var(--accent)} .kpi.hot .k,.kpi.hot .t{color:#01426a} .kpi.hot .v{color:var(--navy-fixed)} /* --- count strip — every number is a door --- */ .strip{display:flex;flex-wrap:wrap;gap:1px;background:var(--line-2);border:1px solid var(--line-2)} .strip button{flex:1 1 150px;background:var(--card);padding:var(--d-strip-y) var(--d-strip-x); text-align:left;display:flex;flex-direction:column;gap:4px;transition:background 120ms ease} .strip button:hover{background:var(--sel-bg)} .strip .n{font-size:26px;font-weight:500;letter-spacing:-.03em;line-height:1;font-variant-numeric:tabular-nums;color:var(--ink)} .strip .n.warn{color:var(--warn)} .strip .n.bad{color:var(--bad)} .strip .l{font-family:var(--font-m);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3)} /* --- queue row — the reason it is here + the clock, always --- */ .qrow{display:grid;grid-template-columns:96px 1fr auto;gap:16px;align-items:center; padding:var(--d-cell-y) var(--d-cell-x);border-bottom:1px solid var(--line-2); background:var(--card);transition:background 120ms ease} .qrow:hover{background:var(--bg-2)} .qrow .id{font-family:var(--font-m);font-size:11.5px;font-weight:500;color:var(--ink)} .qrow .id small{display:block;font-size:9px;color:var(--ink-3);letter-spacing:.12em;text-transform:uppercase;margin-top:3px;font-weight:400} .qrow .why{min-width:0} .qrow .why .r{font-size:13.5px;color:var(--ink);font-weight:500;letter-spacing:-.01em} .qrow .why .m{font-family:var(--font-m);font-size:10.5px;color:var(--ink-3);margin-top:3px;display:flex;flex-wrap:wrap;gap:4px 12px} .qrow .why .m b{color:var(--ink-2);font-weight:500} .qrow .act{display:flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:end} .qrow.leaving{animation:lto-leave .28s ease forwards} /* --- SLA chip --- */ .sla{font-family:var(--font-m);font-size:10px;letter-spacing:.1em;padding:3px 7px;white-space:nowrap} .sla.over{background:var(--bad-bg);color:var(--bad)} .sla.near{background:var(--warn-bg);color:var(--warn)} .sla.okc{background:var(--ok-bg);color:var(--ok)} /* --- list table — first column is a business number --- */ table.lt{width:100%;border-collapse:collapse;font-size:13px;background:var(--card)} table.lt th{font-family:var(--font-m);font-size:9.5px;letter-spacing:.18em;text-transform:uppercase; color:var(--ink-3);font-weight:500;text-align:left; padding:10px var(--d-table-x);border-bottom:1px solid var(--ink);white-space:nowrap} table.lt td{padding:var(--d-table-y) var(--d-table-x);border-bottom:1px solid var(--line-2);vertical-align:middle} table.lt td.mono,table.lt td.num{font-family:var(--font-m);font-size:11.5px} table.lt td.num{text-align:right;font-variant-numeric:tabular-nums} table.lt tr{transition:background 120ms ease} table.lt tbody tr:hover{background:var(--bg-2)} .tr-up{color:var(--ok);font-family:var(--font-m)} .tr-dn{color:var(--bad);font-family:var(--font-m)} .tr-fl{color:var(--ink-3);font-family:var(--font-m)} /* --- key-value grid --- */ .kv{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--line);background:var(--card)} .kv>div{padding:11px var(--d-cell-x);border-bottom:1px solid var(--line-2)} .kv .k{font-family:var(--font-m);font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)} .kv .v{font-size:13px;color:var(--ink);border-left:1px solid var(--line-2);font-weight:500} .kv .v.mono{font-family:var(--font-m);font-size:11.5px} /* --- horizontal bars — sorted, one amber, start at zero --- */ .brow{display:grid;grid-template-columns:170px 1fr 80px;gap:14px;align-items:center; padding:8px 0;border-bottom:1px solid var(--line-2)} .brow .bn{font-family:var(--font-m);font-size:10.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .brow .btr{height:14px;background:var(--bg-2)} .brow .bf{height:100%;background:var(--ink);width:0;transition:width .5s ease} .brow .bf.amber{background:var(--accent)} .brow .bv{font-family:var(--font-m);font-size:11.5px;text-align:right;font-variant-numeric:tabular-nums} /* --- funnel — true scale; min-width keeps tiny values visible --- */ .fstage{display:grid;grid-template-columns:130px 1fr 150px;gap:14px;align-items:center} .fstage .fl{font-family:var(--font-m);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3)} .fstage .ftr{height:26px;background:var(--bg-2)} .fstage .ff{height:100%;background:var(--ink-2);width:0;min-width:2px;transition:width .6s ease} .fstage .fv{font-family:var(--font-m);font-size:11.5px;font-variant-numeric:tabular-nums} /* --- stage strip — legal moves visible before the click --- */ .stages{display:flex;gap:1px;background:var(--line-2);border:1px solid var(--line-2);flex-wrap:wrap} .stg{flex:1 1 90px;background:var(--card);padding:10px 12px;text-align:center;position:relative; font-family:var(--font-m);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3)} .stg .bar{position:absolute;left:0;bottom:0;height:3px;width:0;background:var(--accent)} .stg.done{color:var(--ink)} .stg.done .bar{width:100%;background:var(--ink-3)} .stg.now{color:var(--navy-fixed);background:var(--accent);font-weight:600} .stg.won{color:var(--bg);background:var(--ok);font-weight:600} .stg.anim .bar{animation:lto-fill .2s ease forwards} /* --- trail — append-only, actor + timestamp, changed-from → changed-to --- */ .tev{display:grid;grid-template-columns:14px 1fr;gap:14px;position:relative;padding:0 0 var(--d-gap)} .tev::before{content:"";position:absolute;left:6px;top:14px;bottom:0;width:1px;background:var(--line-2)} .tev:last-child::before{display:none} .tev .td{width:9px;height:9px;border:2px solid var(--ink-3);background:var(--card);border-radius:50%;margin-top:3px} .tev.hot .td{border-color:var(--accent);background:var(--accent)} .tev .tb .tt{font-size:13px;color:var(--ink);font-weight:500} .tev .tb .tt .fromto{font-family:var(--font-m);font-size:10.5px;color:var(--ink-3);font-weight:400} .tev .tb .tm{font-family:var(--font-m);font-size:10px;color:var(--ink-3);margin-top:3px;letter-spacing:.06em} .tev.new{animation:lto-rise .4s ease} /* --- form input — mono label above, 1px line, navy focus stroke --- */ .fld label{display:block;font-family:var(--font-m);font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-3);margin-bottom:6px} .fld input,.fld select,.fld textarea{width:100%;border:1px solid var(--line);background:var(--bg);color:var(--ink); font-family:var(--font-d);font-size:14px;padding:var(--d-act-y) 14px;min-height:38px;border-radius:0} .fld input:focus,.fld select:focus,.fld textarea:focus{outline:none;border-color:var(--ink)} /* --- callout note — amber-tint, one per surface at most --- */ .note{border-left:2px solid var(--accent);background:var(--accent-tint);padding:12px var(--d-cell-x); font-size:12.5px;color:var(--ink);line-height:1.6} .note b{font-weight:600} /* --- article — the Learn / Know page (surface #6) --- */ /* One reading column, verb-led title, owner on every article, "flag as outdated" raises a Handoff to that owner. */ .article{max-width:68ch} .article-head{border-bottom:1px solid var(--line);padding-bottom:16px;margin-bottom:24px} .article-head .crumb{font-family:var(--font-m);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);margin-bottom:14px;display:flex;gap:8px;flex-wrap:wrap} .article-head .crumb b{color:var(--ink);font-weight:500} .article-head h1{font-size:28px;letter-spacing:-.025em;line-height:1.1;font-weight:500} .article-head .lede{font-size:15.5px;line-height:1.65;color:var(--ink-2);margin:12px 0 0} .article-head .meta{display:flex;flex-wrap:wrap;gap:6px 18px;margin-top:14px;font-family:var(--font-m);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3)} .article-head .meta b{color:var(--ink);font-weight:500} .article p{font-size:14px;line-height:1.7;color:var(--ink-2);margin:0 0 14px} .article h2{font-size:22px;letter-spacing:-.02em;font-weight:500;border-top:1px solid var(--line-2);padding-top:20px;margin:28px 0 12px} .article h3{font-size:16px;letter-spacing:-.015em;font-weight:600;margin:22px 0 8px} .article a{color:var(--ink-2);text-decoration:underline;text-underline-offset:2px} .article ul,.article ol{margin:0 0 14px;padding-left:22px;color:var(--ink-2);line-height:1.7} .article li{margin:4px 0} .steps{list-style:none;counter-reset:step;padding:0;margin:0 0 14px} .steps li{counter-increment:step;display:grid;grid-template-columns:30px 1fr;gap:12px;padding:10px 0;border-bottom:1px solid var(--line-2);color:var(--ink-2);line-height:1.65} .steps li::before{content:counter(step,decimal-leading-zero);font-family:var(--font-m);font-size:10px;letter-spacing:.1em;color:var(--accent-text);padding-top:4px} .term{border:1px solid var(--line);background:var(--card);padding:12px 16px;margin:0 0 10px} .term .t{font-family:var(--font-m);font-size:10.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink)} .term p{margin:4px 0 0;font-size:12.5px;color:var(--ink-3)} .article .foot-acts{display:flex;gap:10px;flex-wrap:wrap;align-items:center;border-top:1px solid var(--line);padding-top:16px;margin-top:26px} /* --- app frame — the menu: top bar + surface nav --- */ /* Rules: seven surfaces, fixed order, on every module; empty slots ship as stubs. Universal search on every page, never only on Find. The Plus compose icon is always top-right. The pin rail rides every page. In dark theme the chrome commits to navy so the white logo merges. */ .topbar{position:sticky;top:0;z-index:60;background:var(--chrome-bg);color:var(--chrome-ink); border-bottom:1px solid var(--chrome-line);display:flex;align-items:center;gap:18px; padding:0 20px;height:var(--d-topbar)} .topbar .logo-l,.topbar .logo-d{height:24px;display:block} /* 24px = logo digital minimum */ .topbar .logo-d{display:none} :root[data-theme="dark"] .topbar .logo-l{display:none} :root[data-theme="dark"] .topbar .logo-d{display:block} @media (prefers-color-scheme: dark){ :root:not([data-theme="light"]) .topbar .logo-l{display:none} :root:not([data-theme="light"]) .topbar .logo-d{display:block} } .topbar .div{width:1px;height:22px;background:var(--chrome-line)} .topbar .mod{font-family:var(--font-m);font-size:10.5px;letter-spacing:.22em;text-transform:uppercase;color:var(--chrome-mut);white-space:nowrap} .topbar .search{flex:1;max-width:520px;display:flex;align-items:center;gap:10px; border:1px solid var(--chrome-line);padding:7px 12px;color:var(--chrome-mut); cursor:text;background:transparent;font-size:12.5px;transition:border-color 120ms ease} .topbar .search:hover{border-color:var(--accent)} .topbar .search .hint{font-family:var(--font-m);font-size:10px;letter-spacing:.1em;margin-left:auto;border:1px solid var(--chrome-line);padding:2px 6px} .topbar .grow{flex:1} .topbar .plus{width:34px;height:34px;border:1px solid var(--chrome-line);display:grid;place-items:center; font-size:19px;color:var(--chrome-ink);transition:background 120ms ease,color 120ms ease,border-color 120ms ease} .topbar .plus:hover{background:var(--accent);color:var(--navy-fixed);border-color:var(--accent)} .topbar .me{font-family:var(--font-m);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--chrome-mut);border:1px solid var(--chrome-line);padding:7px 10px;white-space:nowrap} .snav{width:212px;border-right:1px solid var(--line-2);background:var(--bg); padding:18px 0 28px;display:flex;flex-direction:column} .snav .grp{font-family:var(--font-m);font-size:9.5px;letter-spacing:.2em;text-transform:uppercase;color:var(--ink-3);padding:14px 18px 8px} .snav .nv{display:flex;align-items:center;gap:10px;width:100%;text-align:left; padding:var(--d-nav-y) 18px;font-size:13.5px;font-weight:500;letter-spacing:-.01em;color:var(--ink-2); border-left:2px solid transparent; transition:background 120ms ease,border-color 120ms ease,color 120ms ease} .snav .nv .ix{font-family:var(--font-m);font-size:9.5px;color:var(--ink-3);width:14px;flex:none} .snav .nv .bdg{margin-left:auto;font-family:var(--font-m);font-size:10px;color:var(--navy-fixed);background:var(--accent);padding:1px 6px;font-weight:600} .snav .nv:hover{background:var(--bg-2)} .snav .nv.on,.snav .nv[aria-current="page"]{border-left-color:var(--accent);background:var(--bg-2);color:var(--ink)} .snav .rail{margin-top:auto;border-top:1px solid var(--line-2);padding-top:10px} .snav .pin{display:flex;align-items:center;gap:8px;padding:6px 18px; font-family:var(--font-m);font-size:10.5px;color:var(--ink-2);letter-spacing:.02em; width:100%;text-align:left;transition:background 120ms ease} .snav .pin:hover{background:var(--bg-2)} .snav .pin .pd{width:5px;height:5px;background:var(--ink-3);border-radius:50%;flex:none} .snav .pin.stale .pd{background:var(--warn);animation:lto-pulse 2s ease-in-out infinite} /* mobile: the nav becomes a horizontal scroll strip; active = amber underline; groups and the pin rail hide (pins remain reachable from My Admin) */ @media (max-width:980px){ .snav{width:auto;flex-direction:row;overflow-x:auto;border-right:none;border-bottom:1px solid var(--line-2);padding:0} .snav .grp,.snav .rail{display:none} .snav .nv{width:auto;border-left:none;border-bottom:2px solid transparent;white-space:nowrap} .snav .nv.on,.snav .nv[aria-current="page"]{border-bottom-color:var(--accent)} } /* --- heat cells --- */ .heat{display:inline-block;width:16px;height:16px} .heat.h0{background:var(--line-2)} .heat.h1{background:var(--heat-1)} .heat.h2{background:var(--heat-2)} .heat.h3{background:var(--heat-3)} .heat.h4{background:var(--heat-4)} .heat.hf{background:var(--future-bg);border:1px dashed var(--line)} /* ============================================================ MOTION VOCABULARY (DV-01) — three moves, nothing else · 120ms ease — hover / selection · 0.2s fill — state change (stage bars, progress) · 2s ring — staleness pulse (flat outline, no shadows) ============================================================ */ @keyframes lto-fill{from{width:0}to{width:100%}} @keyframes lto-rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}} @keyframes lto-leave{to{opacity:0;transform:translateX(24px)}} @keyframes lto-pulse{0%,100%{outline:1px solid var(--warn);outline-offset:0}50%{outline:1px solid transparent;outline-offset:4px}} .pulse-stale{animation:lto-pulse 2s ease-in-out infinite} @media (prefers-reduced-motion: reduce){ *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important} }