/* ══════════════════════════════════════════════════════════════════════════
   Meredith's List — design system
   Extracted from the MER-80 mockups (docs/design/mockups/mer-80-shell.css).
   Framework-free and self-contained: no build step, no bundler.
   ══════════════════════════════════════════════════════════════════════════ */

/* ── Type ──────────────────────────────────────────────────────────────────
   Self-hosted, subset, variable. Not a CDN: a third-party request on the
   critical path means losing the typography on a weak signal in the valley,
   and handing every visitor's IP to Google. Regenerate with
   scripts/subset_fonts.sh — the .woff2 files are committed assets. */
@font-face{
  font-family:"Fraunces";
  src:url("/static/fonts/fraunces-var.woff2") format("woff2-variations"),
      url("/static/fonts/fraunces-var.woff2") format("woff2");
  font-weight:300 700;
  font-stretch:100%;
  font-style:normal;
  font-display:swap;
}
@font-face{
  font-family:"Plus Jakarta Sans";
  src:url("/static/fonts/jakarta-var.woff2") format("woff2-variations"),
      url("/static/fonts/jakarta-var.woff2") format("woff2");
  font-weight:400 700;
  font-style:normal;
  font-display:swap;
}

*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}

/* Any author-level `display` (flex/grid/block) outranks the UA [hidden] rule, so
   a component with display:flex stays visible when hidden. Restore the intent
   once, globally, rather than patching each component. */
[hidden]{display:none !important}

:root{
  --font:"Plus Jakarta Sans",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --serif:"Fraunces",Georgia,"Iowan Old Style","Times New Roman",serif;
  --mono:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,monospace;

  /* Squircle scale. --shell and --core are concentric on purpose: the inner
     radius is the outer minus the 6px tray, so the two curves stay parallel
     instead of pinching at the corners. Change one, change both. */
  --r-xs:8px; --r-sm:12px; --r-md:18px; --r-lg:26px; --r-xl:32px;
  --shell:32px; --core:26px;

  /* top:22 + the pill's tallest state. It is 61px wide-screen and 62px below
     860px, where the links and burger go to 40px for touch — so the band is
     sized against 84, not against what a 1440px window happens to show. */
  --island-band:88px;
  /* The utility bar's unwrapped height: a 33.6px input inside 9px of padding,
     rounded up. It is the *fallback* for the sticky offset of anything that
     must clear that bar — stickBelow() overwrites it with a real measurement
     as soon as one exists, which matters only when the bar wraps. Defined
     once here so the bar's min-height and the offset cannot drift apart. */
  --utilbar-h:52px;
  /* The sticky offset anything below that bar must clear. Declared here as the
     bar's own height so the stylesheet is self-contained and readable on its
     own; stickBelow() overrides it on the scroller — where it inherits down to
     the column row — once the bar has a measured height that differs, which
     happens when it wraps. */
  --util-h:var(--utilbar-h);
  --swing:cubic-bezier(.32,.72,0,1);
  --ease:var(--swing);
}

/* color-scheme follows the chosen theme, not the OS. The <meta> declares both
   are supported, which leaves `color-scheme:normal` computed — so a user on a
   light-OS machine who picks dark in-app kept UA-painted chrome in light: the
   <select> popup in the import wizard, the caret, autofill, spellcheck
   underlines and the native scrollbar corners. */
html[data-theme="light"]{
  color-scheme:light;
  --bg:#faf6ee; --surface:#fffdf8; --surface-2:#f4efe6; --surface-3:#ebe4d7;
  --tray:rgba(36,28,22,.045); --hair:rgba(36,28,22,.10);
  --hair-soft:rgba(36,28,22,.06); --gloss:rgba(255,255,255,.85);
  --on-accent-soft:rgba(255,253,248,.13); --on-accent-soft-hi:rgba(255,253,248,.22);
  --border:rgba(36,28,22,.08); --border-2:rgba(36,28,22,.16);
  --text:#241c16; --text-2:#5c5147; --muted:#8d8175;
  --accent:#241c16; --accent-2:#5d7259;
  --accent-soft:rgba(36,28,22,.05); --accent-line:rgba(36,28,22,.13);
  --on-accent:#fffdf8;
  --hot:#8e2f24; --nurture:#5d7259; --longhold:#9c7a34; --annual:#3f5d6e;
  --tint-hot:rgba(142,47,36,.10); --tint-nur:rgba(93,114,89,.10);
  --tint-lon:rgba(156,122,52,.12); --tint-ann:rgba(63,93,110,.11);
  --in-bg:#f1ebe0; --out-bg:#241c16; --out-fg:#fffdf8;
  --lift:0 1px 1px rgba(60,44,30,.03), 0 12px 28px -12px rgba(60,44,30,.16),
         0 40px 70px -50px rgba(60,44,30,.5);
  --lift-hi:0 1px 1px rgba(60,44,30,.04), 0 22px 44px -16px rgba(60,44,30,.2),
            0 60px 90px -60px rgba(60,44,30,.55);
  --shadow:var(--lift); --shadow-md:var(--lift); --shadow-lg:var(--lift-hi);
  --glass:rgba(255,253,248,.72); --scrim:rgba(36,28,22,.42);
  --grain:.032; --grain-blend:multiply;
}

/* The same world after dusk, not an inversion: the sage brightens, the oxblood
   warms toward ember, and the gloss becomes light-from-above rather than a
   white edge. --accent flips to cream, which is why --on-accent exists. */
html[data-theme="dark"]{
  color-scheme:dark;
  --bg:#161210; --surface:#211b16; --surface-2:#1a1512; --surface-3:#2a221c;
  --tray:rgba(243,235,221,.045); --hair:rgba(243,235,221,.11);
  --hair-soft:rgba(243,235,221,.06); --gloss:rgba(255,247,232,.10);
  --on-accent-soft:rgba(22,18,16,.14); --on-accent-soft-hi:rgba(22,18,16,.24);
  --border:rgba(243,235,221,.08); --border-2:rgba(243,235,221,.17);
  --text:#f3ebdd; --text-2:#bcaf9d; --muted:#8b8072;
  --accent:#f3ebdd; --accent-2:#93ad8c;
  --accent-soft:rgba(243,235,221,.07); --accent-line:rgba(243,235,221,.15);
  --on-accent:#161210;
  --hot:#d1705a; --nurture:#93ad8c; --longhold:#cea75f; --annual:#7fa3b8;
  --tint-hot:rgba(209,112,90,.14); --tint-nur:rgba(147,173,140,.12);
  --tint-lon:rgba(206,167,95,.14); --tint-ann:rgba(127,163,184,.13);
  --in-bg:#272019; --out-bg:#f3ebdd; --out-fg:#161210;
  --lift:0 1px 1px rgba(0,0,0,.3), 0 12px 28px -12px rgba(0,0,0,.6),
         0 40px 70px -50px rgba(0,0,0,.9);
  --lift-hi:0 1px 1px rgba(0,0,0,.35), 0 22px 44px -16px rgba(0,0,0,.65),
            0 60px 90px -60px rgba(0,0,0,.95);
  --shadow:var(--lift); --shadow-md:var(--lift); --shadow-lg:var(--lift-hi);
  --glass:rgba(33,27,22,.72); --scrim:rgba(0,0,0,.62);
  --grain:.055; --grain-blend:overlay;
}

/* 16px/1.6, the design's base. The app shipped 13.5px with no line-height at
   all, so everything without an explicit size sat ~16% small on a ~1.2 line —
   which is most of why the built screens read a notch under the mockup even
   where every explicit value already matched. */
body{font-family:var(--font);background:var(--bg);color:var(--text);
  font-size:16px;line-height:1.6;
  -webkit-font-smoothing:antialiased;height:100vh;overflow:hidden}

/* Display type is set to balance rather than to fill: at 88px a one-word widow
   is the difference between a headline and an accident. */
h1,h2,h3,h4{text-wrap:balance;font-weight:400}

/* The UA focus ring is a saturated blue rectangle on cream — the only
   non-system hue on the screen — and it draws square corners around 999px
   pills. Sage at the system's own offset instead. */
:focus-visible{outline:2px solid var(--accent-2);outline-offset:4px;border-radius:6px}

/* ── Ambient paper ─────────────────────────────────────────────────────────
   Two fixed layers under everything: a warm wash (sage above, brass below)
   and a film grain. Both are `position:fixed` and pointer-events:none, so
   neither is attached to a scroller and neither repaints as the pane scrolls
   — which is what makes them affordable under the app-shell scroll model.

   Without these the palette is correct and the surface is still dead flat;
   they are most of why the cream reads as paper rather than as #faf6ee. */
body::before{
  content:"";position:fixed;inset:0;z-index:0;pointer-events:none;
  background:
    radial-gradient(58vw 42vw at 76% -6%, var(--tint-nur), transparent 68%),
    radial-gradient(50vw 40vw at 8% 96%, var(--tint-lon), transparent 70%);
}
.grain{
  position:fixed;inset:0;z-index:2;pointer-events:none;
  opacity:var(--grain);mix-blend-mode:var(--grain-blend);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* ── Island navigation ─────────────────────────────────────────────────────
   One control at every width. The rail/tabbar split is what allowed the
   sign-out link to exist on desktop only for a whole release; a single
   control cannot diverge from itself.

   Pipeline, Import and Settings sit one click further away in the menu. That
   is deliberate: the four on the island are the four opened daily. */
.island{position:fixed;top:22px;left:50%;transform:translateX(-50%);z-index:45;
  width:max-content;max-width:calc(100vw - 32px)}
.island .bezel{border-radius:999px;padding:5px}
.island .core{display:flex;align-items:center;gap:4px;padding:6px 7px;
  border-radius:999px;background:var(--glass);
  -webkit-backdrop-filter:blur(28px) saturate(1.5);
  backdrop-filter:blur(28px) saturate(1.5)}
.island .mark{display:flex;align-items:center;gap:9px;padding:6px 13px 6px 8px;
  text-decoration:none;color:var(--text)}
.island .sig{width:27px;height:27px;border-radius:50%;display:grid;
  place-items:center;background:var(--accent);color:var(--on-accent);
  font-family:var(--serif);font-size:14px;line-height:1;flex-shrink:0;
  padding-bottom:1px}
.island .mark b{font-family:var(--serif);font-size:15px;font-weight:500;
  letter-spacing:-.01em;white-space:nowrap}
.isnav{display:flex;gap:2px}
.isnav a{display:flex;align-items:center;gap:7px;text-decoration:none;
  color:var(--text-2);font-size:13px;font-weight:500;padding:8px 14px;min-height:36px;
  border-radius:999px;white-space:nowrap;position:relative;
  transition:color .7s var(--swing),background-color .7s var(--swing)}
.isnav a:hover{color:var(--text);background:var(--tray)}
.isnav a.on{color:var(--on-accent);background:var(--accent)}
.isnav svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.1;
  stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
.isnav .bdg{min-width:16px;height:16px;border-radius:8px;background:var(--hot);
  color:var(--surface);font-size:9.5px;font-weight:700;display:grid;
  place-items:center;padding:0 4px}

.burger{width:36px;height:36px;border:0;background:transparent;cursor:pointer;
  border-radius:50%;display:grid;place-content:center;gap:5px;margin-left:2px;
  transition:background-color .7s var(--swing)}
.burger:hover{background:var(--tray)}
.burger span{display:block;width:15px;height:1.5px;background:var(--text-2);
  border-radius:2px;transition:transform .7s var(--swing)}
.burger[aria-expanded="true"] span:first-child{transform:translateY(3.25px) rotate(45deg)}
.burger[aria-expanded="true"] span:last-child{transform:translateY(-3.25px) rotate(-45deg)}

/* Icons only below 860px. The links keep their names in aria-label — the svg
   is aria-hidden, so dropping the visible text would otherwise leave them
   with no accessible name at all. Height is held at 40px: a 32px target is
   under the 44px this app already honours on .lacts .btn. */
@media (max-width:860px){
  .island .lbl{display:none}
  .isnav a{padding:9px 11px;min-height:40px;justify-content:center}
  .burger{width:40px;height:40px}
}
@media (max-width:560px){
  .island .mark b{display:none}
  .isnav a:not([data-route="today"]){display:none}
}

/* The menu. Fixed, so the blur repaints once rather than every scroll frame. */
/* The menu scrolls, and it centres with `margin:auto` rather than with
   `place-items:center`.

   Both halves are load-bearing. It used to be a grid with centred items and
   `overflow:visible`, holding 575px of fixed content — so on any viewport
   shorter than that, the items past the fold were simply unreachable: the
   overlay does not scroll and D4's `body{overflow:hidden}` means nothing
   behind it scrolls either. On a 375x553 phone that stranded Switch theme,
   Settings and *Sign out*, and the second sign-out copy in Settings did not
   save it, because below 560px Settings is only reachable through this very
   menu. A signed-in phone had no way out — §10's named risk, arriving through
   a door the contract test does not cover.

   `place-items:center` would strand the overflow even with `overflow-y:auto`:
   centred grid content that exceeds its container overflows in *both*
   directions and the top becomes unscrollable. `margin:auto` on a flex child
   centres when there is room and collapses to zero when there is not, which
   is the only version of this that degrades correctly. */
.navmenu{position:fixed;inset:0;z-index:44;outline:none;background:var(--scrim);
  -webkit-backdrop-filter:blur(32px);backdrop-filter:blur(32px);
  display:flex;justify-content:center;padding:0 24px;
  overflow-y:auto;overscroll-behavior:contain}
.navmenu[hidden]{display:none !important}
.navmenu-in{width:100%;max-width:340px;display:flex;flex-direction:column;gap:2px;
  margin:auto;padding:96px 0 40px}
.railgrp{font-family:var(--mono);font-size:10px;font-weight:500;
  letter-spacing:.2em;text-transform:uppercase;color:var(--muted);
  padding:20px 4px 8px}
.mic{font-family:var(--serif);font-size:27px;font-weight:400;letter-spacing:-.025em;
  color:var(--text);text-decoration:none;padding:6px 4px;border:0;background:none;
  text-align:left;cursor:pointer;line-height:1.25;
  opacity:0;transform:translateY(24px);
  transition:opacity .6s var(--swing),transform .6s var(--swing),color .3s var(--swing)}
.navmenu.open .mic{opacity:1;transform:none}
.mic:hover{color:var(--accent-2)}
.mic.on{color:var(--accent-2)}
/* The stagger is set per item in initNav(). As :nth-of-type it counted by
   element name, and the theme control is the only <button> among eight <a>s,
   so it matched :nth-of-type(1) and arrived with "Today". */
@media (prefers-reduced-motion:reduce){
  .mic{opacity:1;transform:none;transition:none}
}

/* ── Layout primitives ─────────────────────────────────────────────────── */
.app{display:flex;height:100vh}
/* The island is fixed at top:22px and 61px tall, so every route has to keep
   its top band clear. Reserved here rather than per screen: when the rail was
   retired only Today was given the offset, and the pill then floated over
   Conversations' thread header (the lead's own name) and permanently over two
   of Leads' sticky column labels, at every scroll position. One number, one
   place — a new screen inherits the clearance instead of rediscovering it. */
.pane{display:flex;flex-direction:column;min-width:0;min-height:0;flex:1;
  height:100%;padding-top:var(--island-band)}
.scroll{flex:1;overflow-y:auto}
.wrap{max-width:1180px;margin:0 auto;padding:62px 28px 120px}

/* ── The page title ───────────────────────────────────────────────────────
   Rendered inside the screen's own column, never above it. `paneHeader()` was
   a full-bleed slab outside the scroller, so its left edge and the column's
   were two unrelated numbers whose difference is half the leftover window —
   321px on Settings at 1316px, 623px at 1920px. Mirroring the column's width
   onto the slab lands 5px off, because .wrap centres inside .scroll and takes
   the scrollbar out of its content box while the slab does not. There is no
   arithmetic here to get wrong: the title is in the column. See spec §11.

   No horizontal padding: .wrap already supplies the 28px gutter. Leads has no
   .wrap and overrides this with a gutter of its own. */
.ptitle{padding:52px 0 30px}
/* Denser on a reference surface. Spec §8 exempts Leads and Pipeline from the
   airy treatment — "they keep their density" — and the full title block cost
   237px, taking the first screenful from eleven rows to five. */
.leadsurface > .ptitle,.pane > .ptitle{padding:34px 0 20px}
.leadsurface > .ptitle h1,.pane > .ptitle h1{font-size:clamp(27px,3vw,34px)}
.leadsurface > .ptitle .sub,.pane > .ptitle .sub{margin-top:9px;font-size:13.5px}
/* Inside the h1, not beside it. The eyebrow carries the screen's *name*
   ("Settings") while the h1 line carries its editorial title ("Who your
   messages actually reach"), so a heading list built from h1s disagreed with
   the navigation label. Nesting it makes the heading read "Settings — Who your
   messages actually reach" to a screen reader and changes nothing visually. */
.ptitle h1 .eyebrow{display:flex;width:max-content;margin-bottom:18px}
.ptitle h1{font-family:var(--serif);font-size:clamp(32px,4.2vw,46px);font-weight:300;
  letter-spacing:-.03em;line-height:1.06}
.ptitle .sub{margin-top:12px;font-size:14.5px;line-height:1.6;color:var(--text-2);
  max-width:52ch}
.ptitle .slot{margin-top:22px;display:flex;gap:10px;align-items:center;flex-wrap:wrap}

/* ── The utility bar ──────────────────────────────────────────────────────
   A named exception to "no slab", and the only one. A page title scrolls away
   with its column, which is right everywhere except a screen carrying a
   control that must survive the scroll: on Leads, search eighty-nine rows
   deep. The bar holds that control and nothing else, and the table's column
   row sticks beneath it.

   `min-height`, not `height`: the count and the input wrap at narrow widths,
   and a fixed box with centred content overflows *upward* into the island's
   band — the failure `.thread-hd` had between 768 and 861px.

   --util-h is written by stickBelow() from the bar's measured height rather
   than hardcoded here, because a wrapped bar is taller than this rule says and
   the column row would then sit underneath it instead of below it. */
.utilbar{position:sticky;top:0;z-index:5;background:var(--surface);
  box-shadow:inset 0 -1px 0 var(--hair);display:flex;align-items:center;
  padding:9px 0;min-height:var(--utilbar-h);width:100%}
.utilbar-in{position:sticky;left:20px;width:max-content;display:flex;
  align-items:center;gap:12px;flex-wrap:wrap;padding-right:20px}
.utilbar .n{font-size:12.5px;color:var(--muted);font-variant-numeric:tabular-nums;
  white-space:nowrap}

/* ── Why Leads needs a surface of its own ─────────────────────────────────
   `.tblwrap` scrolls on *both* axes: the table has nine `white-space:nowrap`
   columns and a min-content width of ~1010px, so anything narrower scrolls
   sideways. A plain block child of that scroller is only as wide as the
   scroller's *client* box, and `position:sticky;top:0` pins nothing
   horizontally — so the bar slid away with the columns. Measured before this
   rule: at a 768px pane the 180px search input showed 18px of itself, and at
   505px and below the bar was gone entirely, with table rows scrolling
   visibly through the 52px band where it should have been. That is the very
   capability the bar exists to provide, lost at every width a laptop or
   tablet actually has.

   Two halves fix it, and both are needed. The surface is `width:max-content`,
   so it is as wide as the table rather than as wide as the viewport, and the
   bar stretched across it covers the whole scroll extent — no rows show
   through. Then `.utilbar-in` is `position:sticky;left:20px`, which has room
   to travel *because* its containing block is now the full 1010px, so the
   count and the search field stay on screen while the columns move under
   them. `min-width:100%` keeps the surface filling the viewport when the
   table is narrower than it. */
.leadsurface{width:max-content;min-width:100%}

/* Leads has no .wrap, so its title supplies its own gutter — and the table's
   outer columns take the same one, or the title sits 8px left of the column it
   heads: the same bug in miniature. The title is pinned horizontally for the
   same reason the bar's contents are: it would otherwise slide off the left
   edge whenever the columns are scrolled. */
.leadsurface > .ptitle{padding-left:20px;padding-right:20px;
  position:sticky;left:0;width:max-content}
table.leads th:first-child,table.leads td:first-child{padding-left:20px}
table.leads th:last-child,table.leads td:last-child{padding-right:20px}

/* ── Buttons / chips ───────────────────────────────────────────────────── */
.btn{border:1px solid var(--border-2);background:var(--surface);color:var(--text-2);font:inherit;
  font-size:12.5px;font-weight:600;padding:7px 13px;border-radius:var(--r-sm);cursor:pointer;
  display:inline-flex;align-items:center;gap:7px;transition:.13s var(--ease)}
.btn:hover{border-color:var(--accent);color:var(--accent)}
.btn.pri{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
.btn.pri:hover{filter:brightness(1.09);color:var(--on-accent)}
.btn.danger{color:var(--hot);border-color:var(--border-2)}
.btn.danger:hover{border-color:var(--hot);color:var(--hot)}
.btn.lg{font-size:13.5px;padding:10px 18px;border-radius:var(--r-md)}
.btn kbd{font-family:var(--mono);font-size:10px;background:var(--accent-soft);
  border-radius:3px;padding:1px 4px}
.btn:not(.pri) kbd{background:var(--surface-3);border:1px solid var(--border-2);color:var(--muted)}

.chip{font-size:11.5px;font-weight:600;padding:4px 10px;border-radius:999px;border:1px solid var(--border-2);
  display:inline-flex;align-items:center;gap:6px;
  background:var(--surface-2);color:var(--text-2);cursor:pointer;transition:.13s var(--ease)}
.chip svg{width:13px;height:13px}
.chip.on{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}

/* An eyebrow: the small uppercase line that names what a section is before
   the display type says it properly. */
.eyebrow{display:inline-flex;align-items:center;gap:8px;border-radius:999px;
  padding:5px 13px;font-family:var(--mono);font-size:10px;font-weight:500;
  letter-spacing:.2em;text-transform:uppercase;color:var(--text-2);
  background:var(--tray);box-shadow:0 0 0 1px var(--hair)}

/* ── The double bezel ──────────────────────────────────────────────────────
   Every container in this system is two nested elements: an outer tray holding
   an inner core whose radius is concentric with it. Nothing sits flat on the
   ground and nothing draws a solid border — the hairline is a box-shadow ring
   so it lives inside the radius instead of fighting it.

   Do not nest these two deep. A bezel inside a bezel reads as noise, not depth;
   rows, chips and buttons sit directly on a .core. */
/* Both rings are --hair-soft, not --hair. The tray ring and the core ring sit
   6px apart, so a heavier hairline is doubled at the seam and the container
   stops reading as one machined part — the exact quality spec §2 says is the
   most recognisable thing about this look and the easiest to lose. Note the
   spec's §5 code block writes var(--hair) here and the approved mockup writes
   var(--hair-soft); the mockup wins, because it is the artefact that was
   looked at and signed off. */
.bezel{background:var(--tray);padding:6px;border-radius:var(--shell);
  box-shadow:0 0 0 1px var(--hair-soft), var(--lift);
  transition:box-shadow .7s var(--swing), transform .7s var(--swing)}
.core{background:var(--surface);border-radius:var(--core);
  box-shadow:inset 0 1px 0 var(--gloss), 0 0 0 1px var(--hair-soft);
  position:relative;overflow:hidden}
/* A core clips to keep its inner radius, which is right — until it contains a
   deferred-capability tooltip, whose entire contract is that it says *why*.
   `.core{overflow:hidden}` is new on this branch and it cut 57% off the hero's
   delivery explanation and 16% off the trust strip's. Scoped with :has() so
   the next .unavailable dropped into a bezel is covered without anyone
   remembering this. */
.core:has(.unavailable){overflow:visible}

/* ── Deferred capability ───────────────────────────────────────────────────
   Visible but inert, and it must say why. Never hide an unbuilt feature and
   never let it look usable. The `data-why` string is required. */
.unavailable{opacity:.45;cursor:not-allowed !important;position:relative;
  border-style:dashed !important;background:var(--surface-2) !important;
  color:var(--muted) !important;pointer-events:auto}
.unavailable:hover{opacity:.62}
/* One node on `body`, not a pseudo-element on the trigger — see armWhyTips()
   in core.js for why. `position:fixed` so no ancestor's `overflow` can reach
   it, and a z-index above the modal and above the focus run's 50. */
.whytip{position:fixed;left:0;top:0;z-index:120;opacity:0;pointer-events:none;
  background:var(--text);color:var(--surface);
  font-family:var(--font);font-size:11.5px;font-weight:500;line-height:1.45;
  text-transform:none;letter-spacing:normal;text-align:left;
  padding:7px 10px;border-radius:var(--r-sm);width:max-content;max-width:270px;
  white-space:normal;box-shadow:var(--shadow-md);
  transition:opacity .13s var(--ease)}
.whytip.on{opacity:1}
.deferred-badge{font-size:9.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  padding:1px 6px;border-radius:999px;background:var(--surface-3);color:var(--muted);
  border:1px dashed var(--border-2)}

.tag{font-size:10px;font-weight:700;padding:2px 7px;border-radius:999px;white-space:nowrap;
  display:inline-flex;align-items:center;gap:4px}
.tag svg{width:11px;height:11px}
/* The tile badge: mono, uppercase, tinted ground with an inset ring. The
   older .tag is a bold sans pill and stays for the table screens. */
.badge{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;
  text-transform:uppercase;padding:4px 10px;border-radius:999px;white-space:nowrap}
/* The ring is the tier hue at a higher alpha than the fill. Derived from
   currentColor so one rule serves all four tiers — an inset ring painted in
   the fill's own value is invisible, which is what it was. */
.badge{box-shadow:inset 0 0 0 1px color-mix(in srgb, currentColor 18%, transparent)}
.badge.t-hot{color:var(--hot);background:var(--tint-hot)}
.badge.t-nur{color:var(--nurture);background:var(--tint-nur)}
.badge.t-lon{color:var(--longhold);background:var(--tint-lon)}
.badge.t-ann{color:var(--annual);background:var(--tint-ann)}
.badge.t-mut{color:var(--muted);background:var(--tray)}
.dot-sep{width:3px;height:3px;border-radius:50%;background:var(--muted);opacity:.5}
.t-hot{background:var(--tint-hot);color:var(--hot)}
.t-nur{background:var(--tint-nur);color:var(--nurture)}
.t-lon{background:var(--tint-lon);color:var(--longhold)}
.t-ann{background:var(--tint-ann);color:var(--annual)}
.t-mut{background:var(--surface-3);color:var(--text-2)}

kbd{font-family:var(--mono);font-size:10.5px;background:var(--surface-3);border:1px solid var(--border-2);
  border-bottom-width:2px;border-radius:4px;padding:1px 5px;color:var(--text-2)}

/* Same story as .note: the ring was an Indigo amber literal. */
.modechip{font-family:var(--mono);font-size:10px;font-weight:500;padding:4px 10px;
  border-radius:999px;letter-spacing:.14em;text-transform:uppercase;
  display:inline-flex;align-items:center;gap:7px;
  background:var(--tint-lon);color:var(--longhold);
  box-shadow:inset 0 0 0 1px color-mix(in srgb, currentColor 24%, transparent)}
/* The status dot is drawn, not typed. loadMode() rewrites the chip's
   textContent, which would delete any child node put here — so it is a
   pseudo-element, and it inherits the hue the chip sets for a misconfigured
   send mode. */
.modechip::before{content:"";width:6px;height:6px;border-radius:50%;
  background:currentColor;flex-shrink:0}

/* ── Cards / panels ────────────────────────────────────────────────────── */
.panel{background:var(--surface);border-radius:var(--core);
  box-shadow:inset 0 1px 0 var(--gloss), 0 0 0 1px var(--hair), var(--lift);
  overflow:hidden}
.panel > h3{font-size:12.5px;font-weight:700;padding:13px 16px;
  box-shadow:inset 0 -1px 0 var(--hair);display:flex;align-items:center;gap:8px}
.panel > h3 .n{margin-left:auto;font-size:11px;font-weight:600;color:var(--muted)}
/* Editorial rhythm. The mockup runs 96px of padding on each section, so
   adjacent blocks sit 192px apart — that air is the design, not slack in it,
   and transcribing it as a 26px margin was what made the built screen read
   as a dashboard next to the mockup. Expressed here as margins on Today's
   own blocks, since this shell has no <section> wrapper per block. */
.sec-hd{display:flex;align-items:flex-end;gap:22px;flex-wrap:wrap;
  margin:192px 2px 32px}
.sec-hd h2{font-family:var(--serif);font-size:clamp(28px,4vw,42px);font-weight:300;
  letter-spacing:-.03em;line-height:1.05}
.sec-hd .n{font-size:14.5px;color:var(--muted);margin-left:auto;max-width:34ch;
  text-align:right}
/* A trailing note under a strip is a footnote to the block above it, not a new
   section, so it keeps the 32px and not the 192px. Scoped to `.note` rather
   than to `.ledger + .sec-hd`: written as a sibling selector it also caught
   "The rest of the queue", collapsing one genuine seam to 32px in a page whose
   every other seam is 192px — which reads as a bug, not as tightening. */
.sec-hd.note{margin-top:32px}
.trust-strip{display:block;margin-top:192px}
@media (max-width:767px){
  .sec-hd{margin-top:128px}
  .sec-hd .n{margin-left:0;text-align:left}
  .trust-strip{margin-top:128px}
}
.sec-hd .link{margin-left:auto;font-size:12.5px;color:var(--accent);font-weight:600;cursor:pointer}

/* ── Tables (Attio-density) ────────────────────────────────────────────── */
table.dt{width:100%;border-collapse:collapse;font-size:12.5px}
table.dt th{text-align:left;font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muted);padding:9px 16px;border-bottom:1px solid var(--border);
  background:var(--surface-2);position:sticky;top:0}
table.dt td{padding:10px 16px;border-bottom:1px solid var(--border);color:var(--text-2);vertical-align:middle}
table.dt tr:last-child td{border-bottom:0}
table.dt tbody tr{transition:background .1s}
table.dt tbody tr:hover{background:var(--surface-2)}
table.dt td b{color:var(--text);font-weight:600}
table.dt td.num{font-variant-numeric:tabular-nums;text-align:right}
.mono{font-family:var(--mono);font-size:11.5px}

/* ── Forms ─────────────────────────────────────────────────────────────── */
.field{margin-bottom:18px}
.field label{display:block;font-size:12.5px;font-weight:650;color:var(--text);margin-bottom:5px}
.field .hint{font-size:11.5px;color:var(--muted);line-height:1.5;margin-bottom:8px}
/* Types are listed rather than using a bare `input` so checkboxes and radios
   keep their native rendering. Add new text-ish types here — a type that is
   missing falls back to the browser default and looks broken beside the rest. */
.field input[type=text],.field input[type=email],.field input[type=password],
.field input[type=tel],.field input[type=url],.field input[type=number],
.field input[type=search],.field input:not([type]),.field select,.field textarea,.input{
  width:100%;font:inherit;font-size:13px;color:var(--text);background:var(--surface-2);
  border:1px solid var(--border-2);border-radius:var(--r-sm);padding:9px 11px;outline:none;
  -webkit-appearance:none;appearance:none;
  transition:border-color .13s,box-shadow .13s}
/* `appearance:none` takes the UA caret off, and a select with no caret has no
   affordance at all — so one is drawn here. Inline, because a strict CSP and
   no build step make an external asset neither cheap nor obviously worth a
   request. A data URI cannot read a custom property, so the stroke is
   `--muted` written out, and the whole declaration is repeated for each theme
   state rather than the colour being swapped. */
.field select,select.input{padding-right:34px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238d8175' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9.5l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 11px center;
  background-size:15px 15px}
:root[data-theme="dark"] .field select,:root[data-theme="dark"] select.input{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238b8072' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9.5l6 6 6-6'/%3E%3C/svg%3E")}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]) .field select,
  :root:not([data-theme="light"]) select.input{
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238b8072' stroke-width='1.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9.5l6 6 6-6'/%3E%3C/svg%3E")}
}

.field input:focus,.field select:focus,.field textarea:focus,.input:focus{
  border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.radio-row{display:grid;gap:8px}
/* The file input's own button is a raw OS control — grey, square, system
   font. It was inconspicuous against Indigo's cool greys and is the most
   out-of-place element on Import against warm cream, so it takes the same
   hairline pill every other control in the system wears. */
input[type=file]{padding:9px 11px;cursor:pointer}
input[type=file]::file-selector-button{font-family:var(--font);font-size:13px;
  font-weight:600;color:var(--text-2);background:transparent;border:0;
  box-shadow:inset 0 0 0 1px var(--hair);border-radius:999px;
  padding:7px 15px;margin-right:12px;cursor:pointer;
  transition:box-shadow .7s var(--swing),color .7s var(--swing)}
input[type=file]::file-selector-button:hover{color:var(--text);
  box-shadow:inset 0 0 0 1px var(--muted)}

.radio{display:flex;gap:11px;align-items:flex-start;padding:12px 13px;border:1px solid var(--border-2);
  border-radius:var(--r-md);cursor:pointer;background:var(--surface-2);transition:.13s var(--ease)}
.radio:hover{border-color:var(--accent-line)}
.radio.on{border-color:var(--accent);background:var(--accent-soft);box-shadow:0 0 0 1px var(--accent)}
.radio .dot{width:16px;height:16px;border-radius:50%;border:2px solid var(--border-2);flex-shrink:0;margin-top:1px}
.radio.on .dot{border-color:var(--accent);box-shadow:inset 0 0 0 3px var(--accent)}
.radio b{display:block;font-size:13px;font-weight:650;color:var(--text)}
.radio span{display:block;font-size:12px;color:var(--muted);margin-top:3px;line-height:1.5}

/* ── Callouts ──────────────────────────────────────────────────────────────
   The rule is derived from currentColor, so each variant rings itself in its
   own hue at both themes and one rule serves all four. It used to carry three
   hardcoded Indigo literals — amber .32, green .3, red .32 — none of which
   exists in this palette, so `.note.ok` drew a cyan-green line around a sage
   box. They were also `1px solid`, which §2 bans on anything that is not a
   table rule. */
.note{border-radius:var(--core);padding:13px 15px;font-size:13.5px;line-height:1.58;
  display:flex;gap:10px;align-items:flex-start;
  box-shadow:inset 0 0 0 1px color-mix(in srgb, currentColor 24%, transparent)}
.note b{font-weight:650}
.note svg{width:15px;height:15px;flex-shrink:0;margin-top:2px;fill:none;
  stroke:currentColor;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}
.note.warn{background:var(--tint-lon);color:var(--longhold)}
.note.ok{background:var(--tint-nur);color:var(--nurture)}
.note.info{background:var(--accent-soft);color:var(--text-2)}
.note.danger{background:var(--tint-hot);color:var(--hot)}

/* ── Modal ─────────────────────────────────────────────────────────────── */
.scrim{position:fixed;inset:0;background:var(--scrim);display:grid;place-items:center;
  z-index:50;backdrop-filter:blur(3px);padding:24px}
.modal{background:var(--surface);border-radius:var(--shell);
  box-shadow:inset 0 1px 0 var(--gloss), 0 0 0 1px var(--hair), var(--lift-hi);
  width:100%;max-width:560px;max-height:90vh;display:flex;flex-direction:column;
  animation:pop .18s var(--swing)}
@keyframes pop{from{opacity:0;transform:translateY(10px) scale(.985)}to{opacity:1;transform:none}}
.modal-hd{padding:18px 20px 14px;border-bottom:1px solid var(--border)}
.modal-hd h2{font-family:var(--serif);font-size:23px;font-weight:400;letter-spacing:-.022em;
  display:flex;align-items:center;gap:9px}
.modal-hd p{font-size:12.5px;color:var(--muted);margin-top:5px;line-height:1.55}
.modal-body{padding:16px 20px;overflow-y:auto;flex:1}
.modal-foot{padding:14px 20px;border-top:1px solid var(--border);display:flex;align-items:center;gap:9px;
  background:var(--surface-2);border-radius:0 0 var(--r-xl) var(--r-xl)}

/* ── Misc ──────────────────────────────────────────────────────────────── */
.kv{display:flex;justify-content:space-between;gap:12px;padding:6px 0;font-size:12.5px;color:var(--muted)}
.kv b{color:var(--text-2);font-weight:600;text-align:right}
.avatar{border-radius:50%;display:grid;place-items:center;color:var(--on-accent);font-weight:700;flex-shrink:0}
.bars{display:grid;gap:7px}
.bar{display:grid;grid-template-columns:70px 1fr 24px;gap:9px;align-items:center;font-size:11px;color:var(--muted)}
.bar .tr{height:4px;background:var(--surface-3);border-radius:2px;overflow:hidden}
.bar .fl{height:100%;background:var(--accent);border-radius:2px}
.bar b{font-variant-numeric:tabular-nums;color:var(--text-2);text-align:right}

::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:var(--border-2);border-radius:6px;border:3px solid var(--bg)}
::-webkit-scrollbar-track{background:transparent}

/* ══════════════════════════════════════════════════════════════════════════
   Application layout
   ══════════════════════════════════════════════════════════════════════════ */

/* position:relative but *no* z-index: a stacking context here would trap the
   fixed island at z-45 inside a z-1 layer, and the grain (z-2) would paint
   over the nav and every modal. */
#app{display:block;height:100vh;height:100dvh;overflow:hidden;position:relative}
.hidden{display:none !important}
/* Present to a screen reader, absent to the eye. Every icon that carries
   data rather than decoration needs one of these beside it: svgIcon() marks
   itself aria-hidden, so an icon alone in a table cell is an empty cell. */
.vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border:0}
/* The intent icon, wherever it lands: a lead row, a table cell, a cold-state
   badge, the focus card's name line. Sized here so no call site passes
   width/height attributes. */
/* svgIcon() now carries its own size and paint, so this only adjusts the
   places that want something other than the 15px default. */
.ic svg,.nm svg,td svg{flex-shrink:0}
.chcell{display:flex;gap:7px;color:var(--muted)}
.coldstate .ic svg{width:22px;height:22px}
.focus .lc-top .nm svg{width:24px;height:24px}

/* ── Today: the brief ──────────────────────────────────────────────────────
   No longer a coloured banner. The hero is the page's first bezel, and the
   headline is the biggest thing on the screen because the one honest sentence
   about the morning is the most valuable thing we compute. */
.hero .core{padding:clamp(30px,5vw,62px) clamp(26px,5vw,60px) clamp(26px,4vw,46px)}
.hero h1{font-family:var(--serif);font-size:clamp(42px,7.4vw,88px);font-weight:300;
  line-height:.99;letter-spacing:-.035em;margin-top:26px;max-width:14ch}
.hero h1 em{font-style:italic;font-weight:400;color:var(--accent-2)}
.hero .sub{margin-top:22px;max-width:56ch;font-size:17px;line-height:1.65;
  color:var(--text-2)}
.hero .sub b{color:var(--text);font-weight:600}
.hero .cta{display:flex;flex-wrap:wrap;gap:12px;margin-top:34px}
.eyebrow .out{border-radius:999px;padding:2px 9px;letter-spacing:.08em;
  background:var(--surface-2);box-shadow:0 0 0 1px var(--hair-soft);color:var(--muted)}

/* Island button with a nested trailing icon — never a naked arrow.

   The knob's ground is a translucent *foreground*, not --accent-soft. That
   token is a tint OF the accent, so on an accent ground it is the same hue at
   5% and the knob disappeared in both themes — the one micro-interaction the
   system is recognised by, invisible. */
.pill{display:inline-flex;align-items:center;gap:14px;padding:9px 9px 9px 26px;
  border-radius:999px;border:0;cursor:pointer;text-decoration:none;
  font-family:var(--font);font-size:15px;font-weight:600;letter-spacing:-.01em;
  background:var(--accent);color:var(--on-accent);
  box-shadow:inset 0 1px 0 var(--on-accent-soft), var(--lift);
  transition:transform .7s var(--swing),box-shadow .7s var(--swing)}
.pill .knob{width:34px;height:34px;border-radius:50%;display:grid;
  place-items:center;flex-shrink:0;background:var(--on-accent-soft);
  transition:transform .7s var(--swing),background-color .7s var(--swing)}
.pill .knob svg{width:15px;height:15px;fill:none;stroke:currentColor;
  stroke-width:1.1;stroke-linecap:round;stroke-linejoin:round}
.pill:hover{box-shadow:inset 0 1px 0 var(--on-accent-soft-hi), var(--lift-hi)}
.pill:hover .knob{transform:translate(4px,-1px) scale(1.06);
  background:var(--on-accent-soft-hi)}
.pill:active{transform:scale(.98)}
.pill.ghost{background:transparent;color:var(--text);padding:9px 24px;
  box-shadow:inset 0 0 0 1px var(--hair)}
.pill.ghost:hover{box-shadow:inset 0 0 0 1px var(--muted)}

.hero-stats{display:flex;flex-wrap:wrap;gap:0;margin-top:52px;padding-top:26px;
  box-shadow:inset 0 1px 0 var(--hair-soft)}
.hero-stats div{flex:1 1 118px;padding-right:22px}
.hero-stats .n{font-family:var(--serif);font-size:44px;font-weight:300;
  line-height:1;letter-spacing:-.04em;font-variant-numeric:tabular-nums}
.hero-stats .n.warm{color:var(--hot)}
.hero-stats .l{font-family:var(--mono);font-size:10px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--muted);margin-top:10px}

/* ── Lead cards ────────────────────────────────────────────────────────── */
.lead{background:var(--surface);border-left:3px solid var(--muted);
  border-radius:var(--core);
  box-shadow:inset 0 1px 0 var(--gloss), 0 0 0 1px var(--hair), var(--lift);
  padding:14px 15px;cursor:pointer;
  transition:transform .7s var(--swing),box-shadow .7s var(--swing)}
.lead:hover{transform:translateY(-3px);
  box-shadow:inset 0 1px 0 var(--gloss), 0 0 0 1px var(--hair), var(--lift-hi)}
.lead.t-hot-b{border-left-color:var(--hot)}
.lead.t-nur-b{border-left-color:var(--nurture)}
.lead.t-lon-b{border-left-color:var(--longhold)}
.lead.t-ann-b{border-left-color:var(--annual)}
.lead .top{display:flex;align-items:flex-start;gap:9px}
.lead .nm{font-family:var(--serif);font-size:21px;font-weight:400;
  letter-spacing:-.022em;display:flex;align-items:center;gap:8px;min-width:0}
.lead .nm span.t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lead .sc{margin-left:auto;text-align:right;flex-shrink:0}
.lead .sc b{font-family:var(--serif);font-size:24px;font-weight:400;
  font-variant-numeric:tabular-nums;letter-spacing:-.03em}
.lead .sc small{display:block;font-size:9.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}
.why{margin-top:9px;font-size:12.5px;color:var(--text-2);line-height:1.55}
.why b{color:var(--text);font-weight:650}
.facts{display:flex;gap:13px;margin-top:9px;font-size:12px;color:var(--muted);flex-wrap:wrap}
.facts b{color:var(--text-2);font-weight:600}
.lacts{display:flex;gap:6px;margin-top:11px}
.lacts .btn{flex:1;justify-content:center;font-size:12px;padding:8px 6px;min-height:40px}

/* ── Panels ────────────────────────────────────────────────────────────── */
.panel .pad{padding:14px 16px}
.evrow{display:flex;gap:10px;padding:11px 16px;border-bottom:1px solid var(--border);
  font-size:12.5px;color:var(--text-2);line-height:1.5;align-items:flex-start}
.evrow:last-child{border-bottom:0}
.evrow .ic{width:22px;height:22px;border-radius:7px;background:var(--surface-2);
  display:grid;place-items:center;font-size:11px;flex-shrink:0}
.evrow b{color:var(--text);font-weight:640}
.evrow time{margin-left:auto;font-size:11px;color:var(--muted);white-space:nowrap;flex-shrink:0}

/* ── Conversations ─────────────────────────────────────────────────────── */
.convo{display:flex;flex:1;min-width:0;min-height:0}
.convo-list{width:330px;flex-shrink:0;border-right:1px solid var(--border);
  background:var(--surface);display:flex;flex-direction:column;min-height:0}
.convo-items{flex:1;min-height:0;overflow-y:auto}
.it{padding:11px 15px;border-bottom:1px solid var(--border);cursor:pointer;position:relative;
  transition:background .1s}
.it:hover{background:var(--surface-2)}
.it.on{background:var(--accent-soft)}
.it.on::before{content:"";position:absolute;left:0;top:0;bottom:0;width:2.5px;background:var(--accent)}
.it .r1{display:flex;align-items:center;gap:8px}
.it .nm{font-weight:650;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.it .tm{margin-left:auto;font-size:11px;color:var(--muted);flex-shrink:0}
.it .pv{margin-top:5px;margin-left:34px;font-size:12.5px;color:var(--muted);line-height:1.45;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.it .tags{margin-top:6px;margin-left:34px;display:flex;gap:5px;flex-wrap:wrap}
.thread{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--bg)}
/* The control exists only at the width where the column does not. */
.ctxbtn{display:none}
/* min-height, not height. Between 768 and 861px the three-column shell has
   not collapsed yet but the thread column is down to ~170px, so the lead's
   name wraps to three lines. Centred inside a fixed 56px box that content
   overflowed *upward*, into the band the island occupies — putting the name
   of the person you are about to write to behind the nav. */
.thread-hd{min-height:56px;flex-shrink:0;background:var(--surface);
  box-shadow:inset 0 -1px 0 var(--hair-soft);
  display:flex;align-items:center;gap:11px;padding:10px 18px}
.msgs{flex:1;min-height:0;overflow-y:auto;padding:18px 22px;display:flex;flex-direction:column;
  gap:12px;justify-content:flex-end}
.msgs[hidden]{display:none}
.bub{max-width:66%;padding:10px 14px;border-radius:15px;font-size:13.5px;line-height:1.58;
  background:var(--in-bg);color:var(--text);border-bottom-left-radius:5px;align-self:flex-start}
.bub.out{align-self:flex-end;background:var(--out-bg);color:var(--out-fg);
  border-bottom-left-radius:15px;border-bottom-right-radius:5px}
/* Email subject line inside a bubble. Scoped under .bub so it cannot reach
   the subject shown in the composer, which is an editable field. */
.bub .bubsubj{font-weight:660;margin-bottom:5px;line-height:1.35}
.bub{white-space:pre-wrap}
.mmeta{font-size:10.5px;color:var(--muted);margin-top:-7px}
.mmeta.out{align-self:flex-end}
.coldstate{margin:auto;text-align:center;max-width:430px;padding:20px}
.coldstate .ic{width:52px;height:52px;border-radius:16px;background:var(--tint-hot);
  display:grid;place-items:center;font-size:23px;margin:0 auto 14px}
.coldstate h3{font-family:var(--serif);font-size:23px;font-weight:400;letter-spacing:-.022em}
.coldstate p{font-size:13px;color:var(--muted);margin-top:8px;line-height:1.62}
.coldstate .cfacts{display:flex;gap:8px;justify-content:center;margin-top:14px;flex-wrap:wrap}
.coldstate .f{background:var(--surface);box-shadow:0 0 0 1px var(--hair-soft);
  border-radius:var(--r-sm);padding:7px 11px;font-size:12px;color:var(--text-2)}
.coldstate .f b{display:block;color:var(--text);font-weight:650;font-size:13px;margin-bottom:1px}
.composer{flex-shrink:0;background:var(--surface);border-top:1px solid var(--border);padding:11px 18px 14px}
.cchips{display:flex;align-items:center;gap:6px;margin-bottom:9px;flex-wrap:wrap}
/* The draft field is one container holding two editables, so the bezel goes
   around both. `.cbox` names the bezel; `.cbox-body` is the editable itself,
   sitting on the core, and it draws no ring of its own — a ring inside a ring
   is the double border this sweep exists to remove. */
.cbox{margin-top:0}
.cbox:focus-within{box-shadow:0 0 0 1px var(--accent), var(--lift)}
.cbox-subj{padding:9px 12px;background:var(--surface-2);
  box-shadow:inset 0 -1px 0 var(--hair)}
.cbox-body{padding:11px 12px;font-size:13.5px;line-height:1.6;color:var(--text);
  min-height:74px;white-space:pre-wrap;outline:none}
.subjline{font-weight:650;font-size:12.5px;color:var(--text);outline:none}
.cfoot{display:flex;align-items:center;gap:8px;margin-top:9px;flex-wrap:wrap}
.ctx{width:300px;flex-shrink:0;border-left:1px solid var(--border);background:var(--surface);overflow-y:auto}
.cbl{padding:14px 16px;border-bottom:1px solid var(--border)}
.cbl h4{font-size:10.5px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
  color:var(--muted);margin-bottom:10px}
.scorebig{display:flex;align-items:baseline;gap:8px}
.scorebig b{font-family:var(--serif);font-size:40px;font-weight:300;
  letter-spacing:-.035em;font-variant-numeric:tabular-nums}
.scorebig span{font-size:11.5px;color:var(--muted)}
/* Suggested listings. Fit (how well the home suits them) and priority (how
   urgently the lead needs a touch) stay visually separate on purpose — one is
   about the house, the other about the person, and a blended number hides both. */
.mt{margin-bottom:8px}
.mt:last-child{margin-bottom:0}
.mt > .core{padding:10px 11px;background:var(--surface-2)}
.mt-hd{display:flex;align-items:flex-start;gap:8px}
.mt-ad{font-size:12.5px;font-weight:650;color:var(--text);line-height:1.35;flex:1}
a.mt-ad{color:var(--accent);text-decoration:none}
a.mt-ad:hover{text-decoration:underline}
.mt-fit{flex-shrink:0;font-size:10.5px;font-weight:700;padding:2px 6px;border-radius:var(--r-xs);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.mt-fit.hi{background:var(--accent-soft);color:var(--accent)}
.mt-fit.mid{background:var(--surface);color:var(--text-2);box-shadow:0 0 0 1px var(--hair)}
.mt-fit.lo{background:var(--surface);color:var(--muted);box-shadow:0 0 0 1px var(--hair-soft)}
.mt-sub{font-size:11.5px;color:var(--muted);margin-top:3px;font-variant-numeric:tabular-nums}
.mt-why{font-size:11.5px;color:var(--text-2);line-height:1.55;margin-top:7px}
.mt-warn{font-size:11px;color:var(--longhold);line-height:1.5;margin-top:5px}
.mt-foot{display:flex;align-items:center;gap:8px;margin-top:9px;
  font-size:10.5px;color:var(--muted)}
.mt-x{margin-left:auto;font:inherit;font-size:10.5px;background:none;border:none;
  color:var(--muted);cursor:pointer;padding:2px 4px;border-radius:var(--r-xs);
  display:inline-flex;align-items:center}
.mt-x svg{width:13px;height:13px}
.mt-x:hover{color:var(--hot);background:var(--surface)}
.mt-none{font-size:11.5px;color:var(--muted);line-height:1.55}

/* The morning agent's top three. Visually distinct from the queue cards below
   on purpose: these are a recommendation with reasoning attached, and the ones
   underneath are the full list. Blending them would hide which is which. */

/* ── The bento ─────────────────────────────────────────────────────────────
   Twelve columns, deliberately uneven. The agent's first pick gets seven and
   carries its full reasoning; the fourth lead gets four. That asymmetry is the
   recommendation — a grid of equal tiles recommends nothing.

   Density is not a goal here (spec D2): below the top four the queue
   compresses into the ledger strip, and that is where the volume lives. */
.bento{display:grid;grid-template-columns:repeat(12,1fr);gap:18px}
.b-4{grid-column:span 4} .b-5{grid-column:span 5}
.b-7{grid-column:span 7} .b-8{grid-column:span 8} .b-12{grid-column:span 12}

.tcard{height:100%}
.tcard .core{padding:24px 26px 22px;height:100%;display:flex;flex-direction:column}
.tcard:hover{transform:translateY(-3px);
  box-shadow:0 0 0 1px var(--hair-soft), var(--lift-hi)}
.tcard .rank{display:flex;align-items:center;gap:10px;font-family:var(--mono);
  font-size:10px;letter-spacing:.18em;text-transform:uppercase;color:var(--muted)}
.tcard .rank .rule{flex:1;height:1px;background:var(--hair-soft)}
.tcard .who{font-family:var(--serif);font-size:26px;font-weight:400;
  letter-spacing:-.025em;line-height:1.05;margin-top:16px}
.tcard.feature .who{font-size:clamp(30px,4.2vw,46px)}
.tcard .meta{display:flex;flex-wrap:wrap;align-items:center;gap:9px;margin-top:14px}
.tcard .place{font-size:13px;color:var(--muted);display:flex;
  align-items:center;gap:6px}
.tcard .place svg{width:13px;height:13px;fill:none;stroke:currentColor;
  stroke-width:1;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
.tcard .why{margin-top:18px;font-size:15px;line-height:1.62;color:var(--text-2);flex:1}
.tcard.feature .why{font-size:17.5px;line-height:1.6;max-width:46ch}
.tcard .why b{color:var(--text);font-weight:600}
.tcard .foot{display:flex;align-items:center;gap:14px;margin-top:24px;
  padding-top:18px;box-shadow:inset 0 1px 0 var(--hair-soft)}
.tcard .score{display:flex;align-items:baseline;gap:7px}
.tcard .score b{font-family:var(--serif);font-size:30px;font-weight:300;
  letter-spacing:-.035em;font-variant-numeric:tabular-nums;line-height:1}
.tcard.feature .score b{font-size:44px}
.tcard .score span,.tcard .fee span{font-family:var(--mono);font-size:9.5px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}
.tcard .fee{margin-left:auto;text-align:right}
.tcard .fee b{font-family:var(--mono);font-size:14px;font-weight:500;
  letter-spacing:-.01em;font-variant-numeric:tabular-nums}
.tcard .fee span{display:block;margin-top:4px}
.tcard .acts{display:flex;gap:8px;margin-top:18px}

.act{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:8px;
  padding:11px 12px;border-radius:999px;border:0;cursor:pointer;
  font-family:var(--font);font-size:13px;font-weight:600;color:var(--text-2);
  background:transparent;box-shadow:inset 0 0 0 1px var(--hair);
  transition:transform .7s var(--swing),box-shadow .7s var(--swing),
             color .7s var(--swing)}
.act:hover{color:var(--text);box-shadow:inset 0 0 0 1px var(--muted)}
.act:active{transform:scale(.98)}
.act.solid{background:var(--accent);color:var(--on-accent);
  box-shadow:inset 0 1px 0 var(--on-accent-soft)}
.act.solid:hover{color:var(--on-accent)}
.act svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1;
  stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}

/* ── Trust strip ───────────────────────────────────────────────────────────
   The send-mode statement, on Today rather than only in the Trust centre.
   She should be able to see that sending is manual without navigating to a
   page that says so. */
.trust-strip .core{padding:38px 40px;display:grid;grid-template-columns:1fr auto;
  gap:34px;align-items:center}
.trust-strip h3{font-family:var(--serif);font-size:27px;font-weight:300;
  letter-spacing:-.028em;line-height:1.15;max-width:22ch;margin-top:14px}
.trust-strip p{margin-top:12px;font-size:14.5px;color:var(--text-2);
  max-width:56ch;line-height:1.62}
.trust-strip .modes{display:flex;gap:26px}
.trust-strip .modes div{text-align:right}
.trust-strip .modes b{font-family:var(--mono);font-size:13px;font-weight:500;display:block}
.trust-strip .modes span{font-family:var(--mono);font-size:9.5px;letter-spacing:.16em;
  text-transform:uppercase;color:var(--muted);display:block;margin-top:5px}
@media (max-width:767px){
  .trust-strip .core{grid-template-columns:1fr;padding:28px 24px}
  .trust-strip .modes{justify-content:flex-start}
  .trust-strip .modes div{text-align:left}
}

/* ── The ledger strip ──────────────────────────────────────────────────────
   Where the density went. The bento gives the top four room to be read; the
   tail compresses here so the long list is scannable rather than endless.
   Both halves are the design (spec D2) — dropping this strip is what makes
   eighty-nine leads scroll for a minute. */
.ledger .core{padding:8px 10px}
.lrow{display:grid;grid-template-columns:34px 1fr auto auto;gap:18px;
  align-items:center;padding:17px 18px;border-radius:var(--r-md);cursor:pointer;
  transition:background-color .7s var(--swing)}
.lrow + .lrow{box-shadow:inset 0 1px 0 var(--hair-soft)}
.lrow:hover{background:var(--tray)}
.lrow .idx{font-family:var(--mono);font-size:11px;color:var(--muted);
  font-variant-numeric:tabular-nums}
.lrow .nm{font-family:var(--serif);font-size:20px;font-weight:400;letter-spacing:-.02em}
.lrow .sub{font-size:13.5px;color:var(--muted);margin-top:3px;line-height:1.5}
.lrow .when{font-family:var(--mono);font-size:11px;letter-spacing:.1em;
  text-transform:uppercase;color:var(--muted);white-space:nowrap}
.lrow .go{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;
  box-shadow:inset 0 0 0 1px var(--hair);
  transition:transform .7s var(--swing),box-shadow .7s var(--swing)}
.lrow .go svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:1;
  stroke-linecap:round;stroke-linejoin:round}
.lrow:hover .go{transform:translateX(3px);box-shadow:inset 0 0 0 1px var(--muted)}
@media (max-width:640px){
  .lrow{grid-template-columns:1fr auto;gap:12px}
  .lrow .idx,.lrow .when{display:none}
}

/* The gate's passed checks, as marginalia. The headline answer is "all clear";
   the specifics live in the title attribute, for when she doubts it. */
.evidence{display:flex;flex-wrap:wrap;gap:7px 18px;margin-top:20px;padding-top:16px;
  box-shadow:inset 0 1px 0 var(--hair-soft)}
.evidence span{display:inline-flex;align-items:center;gap:7px;cursor:help;
  font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--muted)}
.evidence svg{width:12px;height:12px;fill:none;stroke:currentColor;
  stroke-width:1.2;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
.evidence .ok svg{stroke:var(--nurture)}
.evidence .no svg{stroke:var(--longhold)}

.ag-chips{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:11px}
.ag-ask{font-size:12px;color:var(--muted);font-weight:600}
.btn.sm{font-size:11.5px;padding:5px 10px}
.ag-said{margin-top:11px;font-size:12px;color:var(--muted)}
/* The held-back tile's disclosure. Styled as one of the pill actions rather
   than as a link, because in the design that tile ends in a single button. */
.ag-more{margin-top:18px;max-width:220px}
.ag-more summary{list-style:none;cursor:pointer}
.ag-more summary::-webkit-details-marker{display:none}
.ag-more summary::marker{content:""}
.ag-more[open] summary{margin-bottom:4px}
.ag-skips{padding:4px 2px 8px}
.ag-skip{font-size:12px;color:var(--muted);line-height:1.75}
.ag-skip b{color:var(--text-2);font-weight:620}

.kbdbar{flex-shrink:0;height:27px;border-top:1px solid var(--border);background:var(--surface);
  display:flex;align-items:center;gap:14px;padding:0 18px;font-size:10.5px;color:var(--muted);
  overflow-x:auto}
.kbdbar span{display:flex;align-items:center;gap:5px;white-space:nowrap}

/* ── Tables ────────────────────────────────────────────────────────────── */
.tblwrap{flex:1;min-height:0;overflow:auto}
table.leads{width:100%;border-collapse:separate;border-spacing:0;font-size:12.5px}
table.leads th{position:sticky;top:var(--util-h);z-index:3;background:var(--surface-2);text-align:left;
  font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);
  padding:8px 12px;border-bottom:1px solid var(--border);white-space:nowrap;cursor:pointer;user-select:none}
table.leads th:hover{color:var(--text-2)}
table.leads td{padding:8px 12px;border-bottom:1px solid var(--border);color:var(--text-2);white-space:nowrap}
table.leads tbody tr{cursor:pointer;transition:background .1s}
table.leads tbody tr:hover{background:var(--surface-2)}
.sq{width:24px;height:24px;border-radius:7px;display:grid;place-items:center;font-size:11px;
  font-weight:700;font-variant-numeric:tabular-nums}
.sq.hi{background:var(--tint-hot);color:var(--hot)}
.sq.md{background:var(--tint-lon);color:var(--longhold)}
.sq.lo{background:var(--surface-3);color:var(--text-2)}

/* ── States ────────────────────────────────────────────────────────────── */
.es{margin:auto;text-align:center;max-width:340px;padding:44px 20px}
.es .ic{width:46px;height:46px;border-radius:50%;display:grid;place-items:center;font-size:21px;
  margin:0 auto 13px;background:var(--surface-3)}
.es .ic svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.2;
  stroke-linecap:round;stroke-linejoin:round}
.es h3{font-family:var(--serif);font-size:21px;font-weight:400;letter-spacing:-.022em}
.es p{font-size:12.5px;color:var(--muted);margin-top:7px;line-height:1.6}
.es .acts{display:flex;gap:7px;justify-content:center;margin-top:14px;flex-wrap:wrap}
.sk{background:linear-gradient(90deg,var(--surface-3) 25%,var(--surface-2) 50%,var(--surface-3) 75%);
  background-size:220% 100%;animation:sh 1.3s infinite linear;border-radius:6px}
@keyframes sh{from{background-position:220% 0}to{background-position:-20% 0}}
.spin{width:15px;height:15px;border:2px solid var(--border-2);border-top-color:var(--accent);
  border-radius:50%;animation:sp .7s linear infinite;display:inline-block}
@keyframes sp{to{transform:rotate(360deg)}}

/* ── Toast ─────────────────────────────────────────────────────────────── */
#toasts{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:80;
  display:flex;flex-direction:column;gap:8px;align-items:center}
.toast{background:var(--text);color:var(--surface);font-size:12.5px;font-weight:550;
  padding:10px 15px;border-radius:var(--r-sm);box-shadow:var(--shadow-lg);
  animation:tin .18s var(--ease);display:flex;align-items:center;gap:10px;max-width:440px}
.toast.err{background:var(--hot);color:var(--surface)}
.toast button{background:none;border:0;color:inherit;font:inherit;font-weight:700;
  cursor:pointer;text-decoration:underline;padding:0}
@keyframes tin{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}

/* ── Mobile ────────────────────────────────────────────────────────────── */
@media (max-width:767px){
  /* No .pane override here on purpose. Below 860px the island's links and
     burger go to 40px for touch, so the pill gets *taller* (bottom 84px, up
     from 83px) — narrowing the reserved band is precisely backwards. The
     84px is why --island-band is 88 and not 84: four pixels of margin for
     the next thing that changes the pill's height. */
  .pane{min-height:0}
  .wrap{padding:32px 16px 80px}
  .bento{grid-template-columns:1fr;gap:16px}
  .b-4,.b-5,.b-7,.b-8,.b-12{grid-column:span 1}
  .convo-list{width:100%;border-right:0}
  .convo.has-sel .convo-list{display:none}
  .convo:not(.has-sel) .thread{display:none}
  /* Not deleted — disclosed. This panel is the only place the product says
     "mention this house to this person", so hiding it at 767px removed a
     feature rather than a column, and the match cards inside it were still
     marking themselves `shown` for an impression nobody had. It comes back
     as a sheet over the thread, opened from `.ctxbtn` in the header.
     translateY(101%) and not 100%: a subpixel rounding error must not leave
     a sliver of it on screen. */
  .ctx{position:absolute;left:0;right:0;bottom:0;top:auto;width:auto;
    max-height:70%;z-index:40;transform:translateY(101%);
    border-left:0;box-shadow:0 -1px 0 var(--hair), var(--lift-hi);
    border-radius:var(--shell) var(--shell) 0 0;
    transition:transform .34s var(--swing)}
  .convo.ctx-open .ctx{transform:none}
  .thread{position:relative}
  .ctxbtn{display:inline-flex}
  .kbdbar{display:none}
  .lacts .btn{min-height:44px}
}

.btn[disabled]{opacity:.5;cursor:not-allowed;pointer-events:auto}
.btn[disabled]:hover{border-color:var(--border-2);color:var(--muted)}

/* Content settles in rather than snapping. Short and subtle — this runs on
   every navigation, so anything longer reads as sluggish. */
/* ── Motion ────────────────────────────────────────────────────────────────
   Content arrives rather than appearing: a heavy fade-up with a blur, on the
   one curve this system uses everywhere.

   The hidden state is gated on html.motion-ready, which core.js adds before
   the first render. That gate is not decoration. Without it a stylesheet can
   blank the entire app on its own the moment one module fails to import, and
   nothing in the console would say why. */
html.motion-ready .rise{opacity:0;transform:translateY(64px);filter:blur(10px)}
html.motion-ready .rise.in{opacity:1;transform:none;filter:blur(0);
  transition:opacity .9s var(--swing),transform .9s var(--swing),filter .9s var(--swing)}

.enter{animation:enter .16s var(--swing)}
@keyframes enter{from{opacity:0}to{opacity:1}}

@media (prefers-reduced-motion:reduce){
  html.motion-ready .rise,html.motion-ready .rise.in{
    opacity:1;transform:none;filter:none;transition:none}
  .enter{animation:none}
  *{transition-duration:.01ms !important;animation-duration:.01ms !important}
}

/* Links styled as buttons must not keep the underline. */
a.btn { text-decoration: none; }

/* Focus run — a full-screen overlay, one lead at a time.
   Every rule is scoped under .focus on purpose: .hero, .why, .facts and .acts
   all already mean something on Today, and an unscoped copy here would quietly
   restyle that screen. */
/* Above the island (45), not below it. Focus is a mode — full-screen, one
   lead at a time, with its own Exit control — so the global nav floating over
   its progress track is the mode leaking. */
.focus{position:fixed;inset:0;background:var(--bg);display:flex;flex-direction:column;
  z-index:50}
.focus .fhead{flex-shrink:0;background:var(--surface);border-bottom:1px solid var(--border);
  padding:13px 22px}
.focus .fhead .row{display:flex;align-items:center;gap:14px}
.focus .fhead h1{font-size:15px;font-weight:700;letter-spacing:-.016em}
.focus .fhead .n{font-size:12.5px;color:var(--muted);font-variant-numeric:tabular-nums}
.focus .prog{height:5px;background:var(--surface-3);border-radius:3px;margin-top:11px;
  overflow:hidden;position:relative}
.focus .prog .fl{height:100%;background:linear-gradient(90deg,var(--accent),var(--accent-2));
  border-radius:3px;transition:width .35s var(--ease)}
.focus .prog .ticks{position:absolute;inset:0;display:flex}
.focus .prog .ticks i{flex:1;border-right:1px solid var(--bg)}
.focus .prog .ticks i:last-child{border:0}

.focus .fbody{flex:1;overflow-y:auto;display:grid;place-items:center;padding:26px 22px}
.focus .fhero{width:100%;max-width:660px}
.focus .lead-card{background:var(--surface);
  border-left:4px solid var(--accent);border-radius:var(--core);
  box-shadow:inset 0 1px 0 var(--gloss), 0 0 0 1px var(--hair), var(--lift);
  overflow:hidden}
.focus .lead-card.t-hot-b{border-left-color:var(--hot)}
.focus .lead-card.t-nur-b{border-left-color:var(--nurture)}
.focus .lead-card.t-lon-b{border-left-color:var(--longhold)}
.focus .lc-top{padding:20px 22px 16px}
.focus .lc-top .nm{font-family:var(--serif);font-size:34px;font-weight:400;
  letter-spacing:-.03em;display:flex;align-items:center;gap:11px}
.focus .lc-top .sub{font-size:13.5px;color:var(--muted);margin-top:6px;line-height:1.55}
.focus .lc-top .sc{float:right;text-align:right}
.focus .lc-top .sc b{font-family:var(--serif);font-size:40px;font-weight:300;
  letter-spacing:-.035em;font-variant-numeric:tabular-nums;color:var(--accent);
  line-height:1}
.focus .lc-top .sc small{display:block;font-size:10px;color:var(--muted);text-transform:uppercase;
  letter-spacing:.07em;margin-top:3px}
.focus .why{margin:0 22px;background:var(--surface-2);border-radius:var(--r-md);padding:13px 15px;
  font-size:13.5px;line-height:1.62;color:var(--text-2)}
.focus .why b{color:var(--text);font-weight:650}
.focus .facts{display:flex;gap:9px;margin:14px 22px 0;flex-wrap:wrap}
.focus .fact{background:var(--surface-2);box-shadow:0 0 0 1px var(--hair-soft);
  border-radius:var(--r-sm);padding:8px 12px;font-size:12px;color:var(--muted)}
.focus .fact b{display:block;color:var(--text);font-weight:650;font-size:14px;margin-bottom:2px}
.focus .draftbox{margin:16px 22px 0;box-shadow:0 0 0 1px var(--hair-soft);
  border-radius:var(--r-md);overflow:hidden}
.focus .draftbox .dh{background:var(--surface-2);border-bottom:1px solid var(--border);
  padding:8px 13px;font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--muted);display:flex;align-items:center;gap:8px}
.focus .draftbox .dh svg{width:13px;height:13px}
.focus .draftbox .dh .n{margin-left:auto;text-transform:none;letter-spacing:0;font-size:11px;
  font-weight:600}
.focus .draftbox .db{padding:13px 15px;font-size:13.5px;line-height:1.65;color:var(--text-2);
  white-space:pre-wrap;max-height:220px;overflow-y:auto}
.focus .draftbox .db .subj{color:var(--text);font-weight:650;margin-bottom:7px;font-size:13px}

.focus .acts{display:grid;grid-template-columns:2fr 1fr 1fr;gap:9px;padding:18px 22px 20px}
/* Pills, per spec §8. `--r-md` is 18px, which on a 52px-tall button is a
   rounded rectangle — the last thing making this screen read as nearly-right.
   `min-height` stays `min-height`: below 640px `.focus .acts` goes to one
   column and the label wraps, and a fixed box with centred content overflows
   upward (brief §5). */
.focus .acts .btn{justify-content:center;min-height:52px;font-size:14.5px;
  border-radius:999px;flex-direction:column;gap:2px}
.focus .acts .btn small{font-size:10px;opacity:.75;font-weight:500}
.focus .skip{text-align:center;margin-top:14px}
.focus .skip a{font-size:12.5px;color:var(--muted);text-decoration:none;cursor:pointer;
  border-bottom:1px dashed var(--border-2)}
.focus .skip a:hover{color:var(--text-2)}

.focus .ffoot{flex-shrink:0;background:var(--surface);border-top:1px solid var(--border);
  min-height:34px;display:flex;align-items:center;gap:16px;padding:0 22px;font-size:11px;
  color:var(--muted);flex-wrap:wrap}
.focus .ffoot span{display:flex;align-items:center;gap:5px}
.focus .ffoot kbd{font-family:var(--mono);font-size:10px;background:var(--surface-3);
  border:1px solid var(--border-2);border-radius:3px;padding:1px 5px;color:var(--text-2)}
.focus .done-strip{display:flex;gap:5px;align-items:center;margin-left:auto;flex-wrap:wrap;
  padding:5px 0}
.focus .dot{width:8px;height:8px;border-radius:50%;background:var(--surface-3);flex-shrink:0}
.focus .dot.done{background:var(--nurture)}
.focus .dot.snoozed{background:var(--longhold)}
.focus .dot.now{background:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.focus .dot.skipped{background:var(--muted);opacity:.4}

/* The keyboard footer is a desktop affordance; on a phone it is a row of
   nonsense taking up the only screen space that matters. */
@media (max-width:640px){
  .focus .ffoot span{display:none}
  .focus .acts{grid-template-columns:1fr}
  .focus .done-strip{margin:0 auto}
}

/* Settings: voice profile and the agent's standing instructions. */
.sublabel{font-size:12px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--muted);margin:22px 0 8px}

.vstrength{display:flex;align-items:center;gap:11px;font-size:12.5px;color:var(--text-2)}
.vbar{flex:1;height:6px;background:var(--surface-3);border-radius:3px;overflow:hidden;max-width:240px}
.vbar i{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--accent-2));
  border-radius:3px;transition:width .3s var(--ease)}
.vsample{display:flex;gap:9px;align-items:flex-start;background:var(--surface-2);
  box-shadow:0 0 0 1px var(--hair-soft);border-radius:var(--r-sm);padding:10px 12px;
  margin-bottom:7px;font-size:12.5px;color:var(--text-2);line-height:1.6}
.vsample > div{flex:1;white-space:pre-wrap}

/* Side by side on a desktop, stacked on a phone — at 390px two columns of
   prose are two columns of nothing. */
.vcompare{display:grid;grid-template-columns:1fr 1fr;gap:11px}
.vcol{box-shadow:0 0 0 1px var(--hair);border-radius:var(--core);overflow:hidden;
  background:var(--surface-2)}
.vcol.mine{box-shadow:0 0 0 1px var(--accent-line)}
.vcol .vchd{display:flex;align-items:center;gap:7px;padding:8px 12px;font-size:10.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--muted);background:var(--surface);
  border-bottom:1px solid var(--border)}
.vcol.mine .vchd{color:var(--accent);background:var(--accent-soft)}
.vcol .vb{padding:12px 13px;font-size:12.5px;line-height:1.62;color:var(--text-2);
  white-space:pre-wrap}
.vcol .vb b{display:block;color:var(--text);margin-bottom:6px}

.autorow{display:flex;align-items:center;gap:12px;padding:11px 0;
  border-bottom:1px solid var(--border)}
.autorow:last-child{border-bottom:0}
.autorow > div{flex:1;min-width:0}
.autorow b{display:block;font-size:13px;font-weight:600;color:var(--text)}
.autorow span{display:block;font-size:11.5px;color:var(--muted);margin-top:2px;line-height:1.5}
/* Locked rows are visibly inert rather than absent: she should be able to see
   that sending is manual, not have to trust that it is. */
.autorow.locked{opacity:.85}
.autolock{font-size:11px;font-weight:700;padding:4px 10px;border-radius:999px;
  border:1px dashed var(--border-2);color:var(--muted);white-space:nowrap}
.autolock.auto{border-color:var(--nurture);color:var(--nurture)}

@media (max-width:640px){ .vcompare{grid-template-columns:1fr} }

/* Import wizard. */
.impsteps{display:flex;gap:8px;margin-bottom:26px;flex-wrap:wrap}
.impstep{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:600;
  color:var(--muted);padding:7px 13px;border-radius:999px;
  box-shadow:0 0 0 1px var(--hair-soft);background:var(--surface)}
.impstep i svg{width:12px;height:12px}
.impstep i{width:19px;height:19px;border-radius:50%;background:var(--surface-3);
  color:var(--muted);font-size:11px;font-weight:700;display:grid;place-items:center;
  font-style:normal;flex-shrink:0}
.impstep.on{color:var(--accent);box-shadow:0 0 0 1px var(--accent-line);
  background:var(--accent-soft)}
.impstep.on i{background:var(--accent);color:var(--on-accent)}
.impstep.done i{background:var(--nurture);color:var(--surface)}

.imp-h{font-family:var(--serif);font-size:26px;font-weight:400;letter-spacing:-.025em}
.imp-p{font-size:13px;color:var(--muted);margin-top:7px;line-height:1.6}

.impcols{margin-top:18px}
/* The left border is the whole scanning aid: green means matched, amber means
   the matcher only guessed, grey means it isn't coming in. */
.impcol{display:flex;align-items:center;gap:14px;padding:11px 14px;
  border-bottom:1px solid var(--border);border-left:3px solid transparent;
  background:var(--surface)}
.impcol:last-child{border-bottom:0}
.impcol.set{border-left-color:var(--nurture)}
.impcol.guess{border-left-color:var(--longhold)}
.impcol.off{border-left-color:var(--border-2);opacity:.72}
.impc-l{flex:1;min-width:0}
.impc-l b{display:block;font-size:13px;font-weight:650;color:var(--text)}
.impc-v{display:block;font-size:11.5px;color:var(--muted);margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.impc-f{display:block;font-size:11px;color:var(--muted);margin-top:1px;
  font-variant-numeric:tabular-nums}
.impc-r{display:flex;align-items:center;gap:8px;flex-shrink:0}
.impc-r select{width:auto;min-width:150px}
.impc-tag{font-size:10px;font-weight:700;padding:2px 7px;border-radius:var(--r-xs);
  background:var(--tint-lon);color:var(--longhold);cursor:help}

.impstats{display:flex;gap:10px;margin-top:18px;flex-wrap:wrap}
.impstat{background:var(--surface);box-shadow:0 0 0 1px var(--hair);border-radius:var(--core);
  padding:13px 17px;min-width:110px}
.impstat b{display:block;font-family:var(--serif);font-size:30px;font-weight:300;
  letter-spacing:-.035em;font-variant-numeric:tabular-nums}
.impstat span{display:block;font-size:11.5px;color:var(--muted);margin-top:3px}

@media (max-width:640px){
  .impcol{flex-direction:column;align-items:stretch;gap:9px}
  .impc-r select{width:100%}
}
