/* desk.css: the desk design system, flattened for a static site with no build step.
   Copied 2026-09-25 from /Users/Shared/Projects/system/design-systems/desk
   (tokens/tokens.css, styles/base.css, styles/components.css, in that order).
   Edit the package, then re-copy; do not edit here. */
/* ============================================================
   desk-design-system — tokens
   Contemporary-Japanese design language: warm washi paper
   (oklch hue 60), graded hairlines, zero radius, no shadows.
   Exactly two accents: vermilion = a human must act / active;
   indigo = confirmed / settled. Values extracted verbatim from
   the desk app skin — restyle values here, never rename.

   Dark mechanism: the source skin switches on the OS media
   query only (with a color-scheme flip). This package keeps
   that behavior and adds a data-theme override: the media
   block is guarded with :root:not([data-theme=light]) and the
   same overrides are duplicated under :root[data-theme=dark],
   so a host can force either theme via <html data-theme="...">.
   ============================================================ */
:root{
  color-scheme:light;
  --rail:25%;                              /* JS-driven pane width — keep */
  --bg:#f6f4f1;                            /* canvas */
  --panel:#fbfaf8;                         /* cards / header */
  --rail-bg:#f9f7f5;                       /* side rails */
  --text:oklch(0.26 0.008 60);             /* warm ink */
  --meta:oklch(0.45 0.008 60);             /* mono metadata */
  --muted:oklch(0.51 0.008 60);
  --faint:oklch(0.54 0.008 60);
  --line:oklch(0.86 0.006 60);             /* structural hairline */
  --line-soft:oklch(0.895 0.006 60);       /* intra-panel hairline */
  --line-faint:oklch(0.91 0.006 60);       /* list-row separators */
  --accent:oklch(0.49 0.13 32);            /* vermilion — FILLS */
  --accent-ink:oklch(0.49 0.13 32);        /* vermilion — TEXT + thin edges */
  --ok-ink:oklch(0.48 0.09 250);
  --accent-hov:oklch(0.45 0.13 32);
  --accent-border:oklch(0.78 0.1 32);
  --accent-tint:oklch(0.96 0.02 32);
  --warn:oklch(0.48 0.13 32);              /* warning voice = deep vermilion */
  --ok:oklch(0.48 0.09 250);               /* indigo: confirmed / settled */
  --ok-border:oklch(0.86 0.03 250);
  --ok-tint:oklch(0.97 0.012 250);
  --client-b:oklch(0.955 0.012 60);        /* client voice: warm wash */
  --team-b:oklch(0.955 0.006 60);          /* retired wash — near-neutral; team voice = edge, not fill */
  --sel-tint:oklch(0.97 0.012 60);         /* selected-row warm overlay */
  --dim:oklch(0.94 0.008 60);
  --on-accent:#fbfaf8;
  --foot-bg:oklch(0.26 0.008 60);          /* inverted ink band */
  --foot-text:oklch(0.93 0.004 60);
  --foot-muted:oklch(0.72 0.008 60);
  --foot-line:oklch(0.38 0.008 60);
  --font-serif:"Shippori Mincho","Hiragino Mincho ProN","Yu Mincho","Noto Serif JP",Georgia,serif;
  --font-sans:"Zen Kaku Gothic New","Hiragino Kaku Gothic ProN",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  --font-mono:"JetBrains Mono",ui-monospace,"SF Mono",SFMono-Regular,Menlo,Consolas,monospace;
  /* ---- type, spacing and radius scales (2026-09-23) ----
     Type: nine steps, raised to the estate floors on the owner's ruling
     (html-interface CHECKS.md): label steps at 11.5px or more, body steps at
     17px or more. A step that serves any body element is a body step. Labels
     moved +3px and body +5px, so the order and the gaps between steps hold;
     the wordmark keeps its ratio to the page body. Leading is unitless and
     tracking is in em, so both follow the size in proportion.
     Spacing: the smallest set that holds every margin, padding and gap within
     2px and still renders every component on the same lines; --space-bleed is
     the Composer's host contract (a 0 26px pane). */
  --type-announce:11.5px;                  /* label: draft · human sends, gated tag */
  --type-eyebrow:12.5px;                   /* label: chips, pills, eyebrows, footer band */
  --type-stamp:13px;                       /* label: verdict stamp line, outlook labels */
  --type-meta:13.5px;                      /* label: mono metadata: sender, tenant, marker, evidence */
  --type-note:17px;                        /* body: bullets, note field (verdict buttons ride it) */
  --type-card:17.5px;                      /* body: card and row body (toggle, Ask ride it) */
  --type-input:18px;                       /* body: composer input (file-chip remove rides it) */
  --type-body:18.5px;                      /* body: page body, machine card */
  --type-wordmark:24.5px;                  /* serif wordmark, 18/13.5 of the page body */
  --leading-chip:1.4;
  --leading-row:1.45;
  --leading-card:1.55;
  --leading-body:1.6;
  --leading-read:1.7;
  --tracking-wordmark:0.005em;
  --tracking-marker:0.02em;
  --tracking-meta:0.03em;
  --tracking-label:0.05em;
  --tracking-chip:0.06em;
  --tracking-band:0.08em;
  --tracking-tenant:0.14em;
  --tracking-eyebrow:0.16em;               /* mono uppercase eyebrows and announcements */
  --space-hair:2px;                        /* insets on chips, tags, pills */
  --space-close:7px;                       /* gaps, control padding, stack rhythm */
  --space-pad:12px;                        /* card and row padding */
  --space-wide:16px;                       /* card and row gutters, header run */
  --space-band:20px;                       /* header and footer band gutters */
  --space-bleed:26px;                      /* composer bleed = host pane padding */
  --radius:0;                              /* zero radius, everywhere */
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme=light]){
    color-scheme:dark;
    --bg:oklch(0.21 0.008 60);
    --panel:oklch(0.245 0.008 60);
    --rail-bg:oklch(0.23 0.008 60);
    --text:oklch(0.93 0.004 60);
    --meta:oklch(0.78 0.008 60);
    --muted:oklch(0.71 0.008 60);
    --faint:oklch(0.66 0.008 60);
    --line:oklch(0.36 0.008 60);
    --line-soft:oklch(0.33 0.008 60);
    --line-faint:oklch(0.31 0.008 60);
    --accent:oklch(0.50 0.14 32);        /* fills keep their weight in dark */
    --accent-ink:oklch(0.74 0.11 32);    /* only text/edges lighten */
    --ok-ink:oklch(0.74 0.08 250);
    --accent-hov:oklch(0.56 0.14 32);
    --accent-border:oklch(0.5 0.1 32);
    --accent-tint:oklch(0.3 0.035 32);
    --warn:oklch(0.7 0.12 32);
    --ok:oklch(0.72 0.08 250);
    --ok-border:oklch(0.46 0.05 250);
    --ok-tint:oklch(0.29 0.025 250);
    --client-b:oklch(0.28 0.016 60);
    --team-b:oklch(0.27 0.006 60);
    --sel-tint:oklch(0.29 0.014 45);
    --dim:oklch(0.27 0.008 60);
    --on-accent:oklch(0.96 0.006 60);
    --foot-bg:oklch(0.30 0.012 55);
    --foot-text:oklch(0.85 0.006 60);
    --foot-muted:oklch(0.76 0.008 60);
    --foot-line:oklch(0.32 0.008 60);
  }
}
/* forced dark — identical values to the media block above; keep in sync */
:root[data-theme=dark]{
  color-scheme:dark;
  --bg:oklch(0.21 0.008 60);
  --panel:oklch(0.245 0.008 60);
  --rail-bg:oklch(0.23 0.008 60);
  --text:oklch(0.93 0.004 60);
  --meta:oklch(0.78 0.008 60);
  --muted:oklch(0.71 0.008 60);
  --faint:oklch(0.66 0.008 60);
  --line:oklch(0.36 0.008 60);
  --line-soft:oklch(0.33 0.008 60);
  --line-faint:oklch(0.31 0.008 60);
  --accent:oklch(0.50 0.14 32);        /* fills keep their weight in dark */
  --accent-ink:oklch(0.74 0.11 32);    /* only text/edges lighten */
  --ok-ink:oklch(0.74 0.08 250);
  --accent-hov:oklch(0.56 0.14 32);
  --accent-border:oklch(0.5 0.1 32);
  --accent-tint:oklch(0.3 0.035 32);
  --warn:oklch(0.7 0.12 32);
  --ok:oklch(0.72 0.08 250);
  --ok-border:oklch(0.46 0.05 250);
  --ok-tint:oklch(0.29 0.025 250);
  --client-b:oklch(0.28 0.016 60);
  --team-b:oklch(0.27 0.006 60);
  --sel-tint:oklch(0.29 0.014 45);
  --dim:oklch(0.27 0.008 60);
  --on-accent:oklch(0.96 0.006 60);
  --foot-bg:oklch(0.30 0.012 55);
  --foot-text:oklch(0.85 0.006 60);
  --foot-muted:oklch(0.76 0.008 60);
  --foot-line:oklch(0.32 0.008 60);
}
/* ============================================================
   desk-design-system — base
   The skin's ground layer: reset + typographic fundamentals,
   rewritten against the tokens. App-shell layout (flex column,
   100vh, overflow) is the host's business and stays out.
   ============================================================ */
*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0; background:var(--bg); color:var(--text);
  font-family:var(--font-sans);
  font-size:var(--type-body); line-height:var(--leading-body);
  font-variant-emoji:text;   /* symbols render as set type (line art), never color emoji */
}

/* type-voice helpers — the skin's three voices */
.dds-serif{font-family:var(--font-serif)}            /* wordmark / headline anchor */
.dds-sans{font-family:var(--font-sans)}              /* body voice */
.dds-mono{font-family:var(--font-mono)}              /* metadata voice */
/* ============================================================
   desk-design-system — components
   Every component's CSS lives in THIS file, under the .dds-
   class prefix, faithful to the desk skin: warm washi surfaces,
   graded hairlines (--line / --line-soft / --line-faint),
   border-radius:0 everywhere, no shadows, mono uppercase
   metadata, exactly two accents (vermilion = a human must act;
   indigo = confirmed / settled). Component batches append below.
   ============================================================ */

/* == batch B == */
/* Content panels, ported from the desk app skin (index.html). Line references
   are into that file's <style> block and render functions. */

/* ---- MachineCard (skin #mcard, index.html:254-265; renderCenter :817-828) ----
   the featured machine-synthesis card: verdict pill, one-liner, evidence
   bullets; an auto-sourced summary carries its own honesty tag */
.dds-mcard{
  border:1px solid var(--line); border-radius:var(--radius); background:var(--panel);
  padding:var(--space-wide) var(--space-wide) var(--space-wide); margin:var(--space-wide) 0; font-size:var(--type-body); line-height:var(--leading-read);
}
.dds-mcard-pill{
  display:inline-block; border:1px solid var(--line); background:transparent;
  color:var(--meta); border-radius:var(--radius); padding:var(--space-hair) var(--space-close); margin-bottom:var(--space-close);
  font-family:var(--font-mono); font-size:var(--type-eyebrow); letter-spacing:var(--tracking-chip); text-transform:uppercase;
}
.dds-mcard ul{margin:var(--space-close) 0 0; padding-left:var(--space-wide)}
.dds-mcard li{margin:var(--space-hair) 0; font-size:var(--type-note); color:var(--muted); line-height:var(--leading-card)}
/* the provenance tag — the skin renders it inline (class="muted",
   font-size:10.5px, margin-top:6px, index.html:825-827) */
.dds-mcard-src{color:var(--muted); font-size:var(--type-meta); margin-top:var(--space-close)}

/* ---- PlanCard (skin .pc family, index.html:347-369; renderBoard :950-967) ----
   the trust ladder: auto = solid settled indigo edge (+ "✓ " prefix, mono
   evidence line); draft = vermilion edge + the mono "draft · human sends"
   announcement (machine prepared, human sends); open = quiet hairline edge, no
   announcement (an obligation someone owes); human = gated tag; timer = "⏱ "
   prefix. Separation is carried by TYPE and 2px left edges — never by fills
   or dashed alert-box strokes. */
.dds-pc{
  border:1px solid var(--line); border-left:2px solid transparent; border-radius:var(--radius); background:var(--panel);
  padding:var(--space-close) var(--space-pad) var(--space-pad); margin-bottom:var(--space-close); font-size:var(--type-card); line-height:var(--leading-card);
}
.dds-pc-auto{border-left:2px solid var(--ok)}
.dds-pc-draft{border:1px solid var(--line); border-left:2px solid var(--accent-ink)}
.dds-pc-draft::before{
  content:"draft · human sends"; display:block; font-family:var(--font-mono);
  font-size:var(--type-announce); font-weight:500; letter-spacing:var(--tracking-eyebrow); text-transform:uppercase;
  color:var(--accent-ink); margin-bottom:var(--space-close);
}
.dds-pc-open{border:1px solid var(--line); border-left:2px solid var(--line)}
/* .dds-pc-human / .dds-pc-timer carry no extra box rules in the skin: the
   human state speaks through the gated tag, the timer state through its prefix */
.dds-pc-gated{
  float:right; font-family:var(--font-mono); font-size:var(--type-announce); letter-spacing:var(--tracking-band);
  text-transform:uppercase; color:var(--muted);
  border:1px solid var(--line); border-radius:var(--radius); padding:var(--space-hair) var(--space-close);
}
.dds-pc-ev{font-family:var(--font-mono); font-size:var(--type-meta); color:var(--faint); margin-top:var(--space-hair)}

/* ---- Composer (skin #ask/#askrow/#askin/#askgo/#askfile/#attachbar/.fchip,
        index.html:266-299, 416, 429-447) ----
   HOST CONTRACT (the skin's #center pane, index.html:216): the composer
   expects to sit at the END of a scrollable flex-column pane with 26px
   horizontal padding —
     display:flex; flex-direction:column; overflow-y:auto; padding:0 26px;
   margin:… -26px bleeds the bar to the pane's full width; margin-top:auto
   pushes it to the bottom edge when content is short; position:sticky +
   bottom:0 docks it over content when the pane scrolls (the skin's v0.3.1
   "tucked/magnet" behavior). The ::before fade band makes mid-scroll content
   read as scrolled, not chopped. A pane with different padding overrides the
   -26px/26px pair to match its own. */
.dds-ask{
  position:sticky; bottom:0; z-index:2; background:var(--bg);
  margin:var(--space-wide) calc(-1 * var(--space-bleed)) 0; margin-top:auto; padding:var(--space-pad) var(--space-bleed) var(--space-pad);
  border-top:1px solid var(--line);
}
.dds-ask::before{
  content:""; position:absolute; left:0; right:0; bottom:calc(100% + 1px); height:18px;
  background:linear-gradient(to bottom,transparent,var(--bg)); pointer-events:none;
}
.dds-askrow{
  display:flex; gap:var(--space-close); margin:0; align-items:center; background:var(--panel);
  border:1px solid var(--line); border-radius:var(--radius); padding:var(--space-close);
}
.dds-askrow:focus-within{border-color:var(--accent)}
/* the field grows to its text: a long placeholder or question wraps and reads
   in full at any width, never cut at the field's edge (a one-row textarea) */
.dds-askin{
  flex:1; min-width:0; padding:var(--space-close); font:inherit; font-size:var(--type-input);
  border:0; background:transparent; color:var(--text);
  display:block; margin:0; resize:none; field-sizing:content; overflow-wrap:anywhere; line-height:var(--leading-chip);
  /* a long typed question stops growing at 40% of the screen and scrolls inside the field */
  max-height:40vh; overflow-y:auto;
}
.dds-askin:focus{outline:none}
/* narrow bar (a phone, a thin pane): the "+file" chip takes a line of its own
   above the field, so the field keeps the width and its text wraps over fewer
   lines. The break is a zero-height full-width pseudo item ordered after the
   chip; the chip, field and Ask keep their DOM order on screen and in focus.
   Measured on the bar itself, so a narrow pane on a wide screen folds too. */
.dds-ask{container-type:inline-size}
@container (max-width: 520px){
  /* half row-gap: the break sits between two gaps, so the lines stay one gap apart */
  .dds-askrow:has(> .dds-askfile){flex-wrap:wrap; row-gap:calc(var(--space-close) / 2)}
  .dds-askrow:has(> .dds-askfile)::before{content:""; flex-basis:100%; height:0; order:1}
  .dds-askrow:has(> .dds-askfile) > .dds-askfile{order:0}
  .dds-askrow:has(> .dds-askfile) > .dds-askin,
  .dds-askrow:has(> .dds-askfile) > .dds-askgo{order:2}
}
.dds-askgo{
  padding:var(--space-close) var(--space-wide); font:inherit; font-size:var(--type-card); font-weight:500; cursor:pointer;
  border:1px solid var(--accent); border-radius:var(--radius); background:var(--accent); color:var(--on-accent);
}
.dds-askgo:hover:enabled{background:var(--accent-hov); border-color:var(--accent-hov)}
.dds-askgo:disabled{opacity:.55; cursor:default}
/* attach affordance: the DOM glyph is suppressed (font-size:0) and replaced by
   a mono "+file" chip — iconography stays typographic, no color emoji */
.dds-askfile{border:0; background:transparent; cursor:pointer; font-size:0; padding:var(--space-hair) var(--space-close); color:var(--muted)}
.dds-askfile::before{
  content:"+file"; display:inline-block;
  font-family:var(--font-mono); font-size:var(--type-meta); letter-spacing:var(--tracking-chip);
  text-transform:uppercase; line-height:var(--leading-chip); color:var(--muted);
  border:1px solid var(--line); border-radius:var(--radius); padding:var(--space-hair) var(--space-close);
}
.dds-askfile:hover::before{border-color:var(--accent); color:var(--accent)}
.dds-attachbar{display:flex; flex-wrap:wrap; gap:var(--space-close); margin:0 0 var(--space-close)}
.dds-fchip{
  display:inline-flex; align-items:center; gap:var(--space-close); border:1px solid var(--line);
  border-radius:var(--radius); padding:var(--space-hair) var(--space-close); font-family:var(--font-mono); font-size:var(--type-meta);
  color:var(--muted); background:var(--panel);
}
.dds-fchip button{border:0; background:none; color:var(--muted); cursor:pointer; font-size:var(--type-input); padding:0}
.dds-fchip button:hover{color:var(--warn)}

/* ---- VerdictBox (skin #verdictbox family, index.html:304-326; renderBoard :843-874) ----
   the gold capture door: silver confirm (indigo edge) / reject (vermilion
   edge) + note field + the stamp line naming where the verdict lives
   (the shared desk record vs this browser's un-exported click) */
.dds-verdictbox{
  border:1px solid var(--line); border-radius:var(--radius); background:var(--panel);
  padding:var(--space-pad) var(--space-pad); margin-bottom:var(--space-pad); font-size:var(--type-card);
}
.dds-vh{
  font-family:var(--font-mono); font-size:var(--type-eyebrow); font-weight:500; letter-spacing:var(--tracking-eyebrow);
  text-transform:uppercase; color:var(--warn); margin-bottom:var(--space-close);
}
.dds-vbtns{display:flex; gap:var(--space-close); margin-bottom:var(--space-close)}
.dds-vbtns button{
  font:inherit; font-size:var(--type-note); font-weight:500; padding:var(--space-close) var(--space-pad);
  border-radius:var(--radius); cursor:pointer; background:transparent;
}
.dds-vok{border:1px solid var(--ok); color:var(--ok)}
.dds-vok:hover{background:var(--ok-tint)}
.dds-vno{border:1px solid var(--accent-border); color:var(--warn)}
.dds-vno:hover{background:var(--accent-tint)}
.dds-vnote{
  width:100%; padding:var(--space-close) var(--space-pad); font:inherit; font-size:var(--type-note);
  border:1px solid var(--line); border-radius:var(--radius); background:var(--panel); color:var(--text);
  /* the note grows to its text: a long note wraps and shows in full (a one-row textarea) */
  display:block; margin:0; resize:none; field-sizing:content; overflow-wrap:anywhere; line-height:var(--leading-chip);
}
.dds-vnote:focus{outline:none; border-color:var(--accent)}
.dds-vstamp{margin-top:var(--space-close); font-family:var(--font-mono); font-size:var(--type-stamp); letter-spacing:var(--tracking-meta); color:var(--faint)}

/* ---- CrystalPanel (skin #crystal family, index.html:327-346; renderBoard :875-944) ----
   the deterministic outlook: mono vermilion-ink eyebrow, label/value rows,
   needle list; numbers only, every figure carries its n — "typical", never
   "will" */
.dds-crystal{
  border:1px solid var(--line); border-radius:var(--radius); background:var(--panel);
  padding:var(--space-pad) var(--space-pad); margin-bottom:var(--space-pad); font-size:var(--type-card); line-height:var(--leading-card);
}
.dds-crystal-ch{
  font-family:var(--font-mono); font-size:var(--type-eyebrow); font-weight:500; letter-spacing:var(--tracking-eyebrow);
  text-transform:uppercase; color:var(--accent-ink); margin-bottom:var(--space-close);
}
.dds-cr{margin-bottom:var(--space-close)}
.dds-cr:last-child{margin-bottom:0}
.dds-cl{
  font-family:var(--font-mono); font-size:var(--type-stamp); letter-spacing:var(--tracking-label);
  text-transform:uppercase; color:var(--faint); margin-bottom:var(--space-hair);
}
.dds-cv b{font-weight:600}
.dds-needle{margin:0; padding-left:var(--space-wide)}
.dds-needle li{margin-bottom:var(--space-hair)}
.dds-muted-n{color:var(--faint)}
/* the n-honesty caveat row — the skin renders it inline
   (class="cr muted-n" style="margin-top:8px", index.html:940) */
.dds-crystal-foot{margin-top:var(--space-close)}

/* ---- EmptyBlock (doctrine: html-interface CHECKS.md, empty rows in three modes) ----
   an empty row said in words where the missing thing would sit: the status in
   the ink voice, the parts after it quieter, the instruction to a person last
   in vermilion ink (a human must act). A quiet hairline box, never a fill or a
   dashed alert stroke. echo_page is one quiet line with no box; silent is
   hidden and takes no room. */
.dds-empty{
  border:1px solid var(--line-soft); border-radius:var(--radius); background:transparent;
  padding:var(--space-pad) var(--space-pad); margin-bottom:var(--space-pad); font-size:var(--type-card); line-height:var(--leading-card);
}
.dds-empty-status{color:var(--text)}
.dds-empty-part{color:var(--muted); font-size:var(--type-note); margin-top:var(--space-hair)}
.dds-empty-instruction{color:var(--accent-ink); font-size:var(--type-note); margin-top:var(--space-close)}
.dds-empty--echo{border:0; padding:var(--space-close) 0; margin-bottom:var(--space-close)}
.dds-empty--echo .dds-empty-status{color:var(--muted); font-size:var(--type-note)}
.dds-empty--silent,.dds-empty[hidden]{display:none}

/* == batch A == */

/* ---- DeskHeader (skin #hdr / .t / .tsub / #marker) ---- */
.dds-header{
  display:flex; align-items:baseline; gap:var(--space-wide); flex-wrap:wrap;
  padding:var(--space-pad) var(--space-band) var(--space-pad); background:var(--panel);
  border-bottom:1px solid var(--line); flex:0 0 auto;
}
.dds-header-wordmark{font-family:var(--font-serif); font-weight:600; font-size:var(--type-wordmark); letter-spacing:var(--tracking-wordmark)}
/* tenant scope reads as mono metadata beside the serif wordmark, never welded
   into it with a hyphen */
.dds-header-tenant{
  font-family:var(--font-mono); font-size:var(--type-meta); letter-spacing:var(--tracking-tenant);
  text-transform:uppercase; color:var(--faint); margin-left:var(--space-pad);
}
.dds-header-marker{font-family:var(--font-mono); font-size:var(--type-meta); letter-spacing:var(--tracking-marker); color:var(--faint)}
/* Freshness clause: an overdue sweep must read as overdue. The "STALE"/"NO SWEEP"
   text carries the meaning on its own; colour only reinforces it. */
.dds-header-marker--stale{
  color:var(--warn); font-weight:600;
  border:1px solid var(--accent-border); background:var(--accent-tint);
  padding:var(--space-hair) var(--space-close); margin-left:var(--space-hair);
}
/* right-side action slot: the skin's header buttons ride the same baseline run */
.dds-header-actions{margin-left:auto; display:flex; align-items:center; gap:var(--space-close)}

/* ---- ViewToggle (skin #views): bordered shell, flush segments,
   active = solid ink; count-free per the 2026-07-31 header ruling.
   The segment text is a control label, so it rides a label step with space-scale
   side padding; minmax(0,1fr) keeps the columns equal at five views (340px rail) ---- */
.dds-viewtoggle{
  display:grid; grid-auto-flow:column; grid-auto-columns:minmax(0,1fr); gap:0;
  margin:var(--space-wide) var(--space-wide) var(--space-pad); border:1px solid var(--line); background:var(--panel);
}
.dds-viewtoggle-btn{
  font:inherit; font-size:var(--type-eyebrow); font-weight:500; padding:var(--space-close);
  border:0; border-radius:var(--radius); background:transparent; color:var(--muted); cursor:pointer;
}
.dds-viewtoggle-btn + .dds-viewtoggle-btn{border-left:1px solid var(--line)}
.dds-viewtoggle-btn:hover{background:var(--dim)}
.dds-viewtoggle-btn--active,
.dds-viewtoggle-btn--active:hover{background:var(--text); color:var(--bg)}
/* translate, never invert: the active segment must stay the brightest thing on
   the shell in dark (skin's dark #views override) */
@media (prefers-color-scheme: dark){
  :root:not([data-theme=light]) .dds-viewtoggle-btn--active,
  :root:not([data-theme=light]) .dds-viewtoggle-btn--active:hover{
    background:oklch(0.31 0.012 55); color:var(--text);
    box-shadow:inset 0 -2px 0 var(--accent-ink);
  }
}
/* forced dark — identical values to the media block above; keep in sync */
:root[data-theme=dark] .dds-viewtoggle-btn--active,
:root[data-theme=dark] .dds-viewtoggle-btn--active:hover{
  background:oklch(0.31 0.012 55); color:var(--text);
  box-shadow:inset 0 -2px 0 var(--accent-ink);
}

/* ---- CaseRow (skin .row / .s1 / .s2) ---- */
.dds-caserow{padding:var(--space-pad) var(--space-wide) var(--space-pad); border-bottom:1px solid var(--line-faint); cursor:pointer; font-size:var(--type-card)}
.dds-caserow:hover{background:var(--panel)}
/* selected: 2px vermilion edge + warm tint — the edge bar carries selection */
.dds-caserow--selected{background:var(--sel-tint); box-shadow:inset 2px 0 0 var(--accent)}
.dds-caserow--dimmed{opacity:.45; cursor:default}
.dds-caserow--dimmed:hover{background:transparent}
.dds-caserow-sender{
  font-family:var(--font-mono); font-size:var(--type-meta); font-weight:500; letter-spacing:var(--tracking-meta);
  color:var(--meta); overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
/* the subject is the case's title: it wraps, never clamps or truncates (html-interface doctrine) */
.dds-caserow-subject{color:var(--text); overflow-wrap:anywhere; margin-top:var(--space-hair); line-height:var(--leading-row)}

/* ---- Chip (skin .chip / .cv / .cok / .cwarn / .ccontract / .cunset / .overridden):
   square, mono, hairline-bordered — never filled pills ---- */
.dds-chip{
  display:inline-block; border:1px solid var(--line); border-radius:var(--radius);
  padding:var(--space-hair) var(--space-close); font-family:var(--font-mono); font-size:var(--type-eyebrow); line-height:var(--leading-chip);
  letter-spacing:var(--tracking-chip); text-transform:uppercase; color:var(--muted); margin:var(--space-close) var(--space-close) 0 0;
}
/* .cv — settled indigo voice: machine verdict / PERSONAL admitted-tier badge */
.dds-chip--verdict,
.dds-chip--badge{border-color:var(--ok-border); background:var(--ok-tint); color:var(--ok)}
/* .cok — confirmed click: stronger indigo edge */
.dds-chip--ok{border-color:var(--ok); background:var(--ok-tint); color:var(--ok)}
/* .cwarn — warning voice: armed timers, quiet counters, follow-up-needed */
.dds-chip--warn{border-color:var(--accent-border); background:var(--accent-tint); color:var(--warn)}
/* contract chip — attributed instrument vs muted unmapped marker */
.dds-chip--contract{border-color:var(--accent-border); color:var(--accent)}
.dds-chip--unmapped{color:var(--faint); border-style:dashed}
/* bronze status visibly overridden by a machine verdict — a correction, not noise */
.dds-chip--overridden{color:var(--faint); text-decoration:line-through; text-decoration-color:var(--accent); text-decoration-thickness:1.5px}

/* ---- ClassificationFooter (skin #foot / #preds / #footmark):
   inverted ink band — the classification line as an institutional stamp ---- */
.dds-footer{
  flex:0 0 auto; padding:var(--space-close) var(--space-band); background:var(--foot-bg); border-top:1px solid var(--foot-line);
  font-family:var(--font-mono); font-size:var(--type-eyebrow); letter-spacing:var(--tracking-band); text-transform:uppercase;
  color:var(--foot-muted); display:flex; flex-wrap:wrap; column-gap:var(--space-wide); row-gap:var(--space-hair);
}
.dds-footer-mode{color:var(--foot-muted)}
.dds-footer-mark{margin-left:auto; color:var(--foot-text)}
