/* MMD Portal — components. All classes here must appear in design-system.manifest.json */

/* ===== Cards ===== */
.card{background:var(--paper);border:1px solid var(--hairline);border-radius:4px;padding:32px;display:flex;flex-direction:column;gap:14px}
.card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-top:32px}
/* KPI summary strip (LeaveList.tsx, P2-40.1 orphan sweep) -- same auto-fit
   grid shape as .card-grid, narrower min-column and tighter gap for compact
   summary tiles rather than full content cards. */
.ds-kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px}
.card-title{font-family:var(--font-display);font-style:italic;font-weight:700;font-size:calc(22px * var(--fs-scale, 1));line-height:1.15;letter-spacing:-0.015em;color:var(--ink);margin:0}
.card-body{font-family:var(--font-ui);font-weight:500;font-size:calc(14.5px * var(--fs-scale, 1));line-height:1.55;color:var(--ink-soft);margin:0}
.card-cta{margin-top:auto;padding-top:10px}

/* ===== Buttons ===== */
.ds-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:11px 18px;border-radius:4px;font-family:var(--font-ui);font-weight:600;font-size:calc(12.5px * var(--fs-scale, 1));letter-spacing:0.04em;cursor:pointer;transition:background 0.14s ease, color 0.14s ease, border-color 0.14s ease;text-decoration:none;border:1px solid transparent;line-height:1;white-space:nowrap;text-transform:uppercase}
.ds-button-primary{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.ds-button-primary:hover{background:var(--baobab);border-color:var(--baobab);color:var(--baobab-on, var(--paper))}
.ds-button-secondary{background:transparent;color:var(--ink);border-color:var(--ink)}
.ds-button-secondary:hover{background:var(--ink);color:var(--paper)}
/* Destructive-secondary weight (2026-07-28) -- ds-button-danger was already
   referenced by several TA step dialogs (reject/return/no-hire controls)
   with no matching rule anywhere in this file, so those buttons silently
   rendered as plain unstyled buttons. Same structure as ds-button-secondary
   (transparent, outlined, inverts solid on hover) with baobab red standing
   in for ink -- the same token .ds-menu-item-danger already uses for
   destructive semantics, never a new color. */
.ds-button-danger{background:transparent;color:var(--baobab);border-color:var(--baobab)}
.ds-button-danger:hover{background:var(--baobab);color:var(--paper)}
/* MMDB-1785 round 2 (2026-08-28) -- inline-style sweep: small semantic
   modifiers so app code never needs style={{...}} on a button-like element.
   All reuse existing tokens; zero new hex. */
.ds-button-accent{background:var(--baobab);color:var(--paper);border-color:var(--baobab)}
.ds-button-accent:hover{background:var(--baobab-2);border-color:var(--baobab-2)}
.ds-button-accent:disabled,.ds-button-accent.ds-button-disabled{background:var(--paper-2);color:var(--ink-mute);border-color:var(--hairline)}
.ds-button-followup{margin-top:16px}
.ds-button-full{width:100%}
.ds-button-pill{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 8px;font-family:var(--font-mono);font-size:10.5px;font-weight:600;white-space:nowrap;line-height:1;border-radius:2px}
.ds-pf-block-act-end{margin-left:auto}
.md-ghost-on-dark{color:var(--paper-2)}
.ds-select-left{text-align:left}
.ds-ctl-btn:hover{background:rgba(255,255,255,.18)}
.ds-titlebar-front .ds-ctl-btn:hover{background:rgba(0,0,0,.07)}
/* Zoom-level pips in the HR document viewer's dark image toolbar -- values
   relocated verbatim from the inline style they replace (MMDB-1785 round
   2), not new colors: a scoped, non-DS-token pair specific to this one
   dark overlay widget. */
.docviewer-zoom-btn{background:#3f3f46;color:#ffffff;border:none;padding:0.15rem 0.4rem;border-radius:3px;font-size:0.7rem;cursor:pointer}
.docviewer-zoom-btn.active{background:#3b82f6}
.ds-button-on-dark-primary{background:var(--paper);color:var(--ink);border-color:var(--paper)}
.ds-button-on-dark-primary:hover{background:var(--baobab);color:var(--paper);border-color:var(--baobab)}
.ds-button-on-dark-ghost{background:transparent;color:var(--paper);border-color:var(--paper)}
/* .ds-btn/.ds-btn-quiet (2026-08-15, P2-40.1 orphan sweep) -- a second,
   older button-class name (StaffBoards.tsx's board-error retry control)
   with no matching rule at all, not even a bare .ds-btn base. Authored as a
   minimal, deliberately quiet variant distinct from .ds-button-secondary's
   bold outline -- this control sits under an inline error message and
   should read as a low-emphasis retry, not a primary CTA. */
.ds-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:4px;font-family:var(--font-ui);font-weight:600;font-size:calc(12px * var(--fs-scale, 1));cursor:pointer;border:1px solid var(--hairline);background:var(--paper);color:var(--ink)}
.ds-btn:hover{border-color:var(--ink)}
.ds-btn-quiet{background:transparent;color:var(--ink-mute)}
.ds-btn-quiet:hover{color:var(--ink);border-color:var(--hairline)}
.ds-button-on-dark-ghost:hover{background:var(--paper);color:var(--ink)}
/* Compact size (2026-08-15, TASK-P2-30.2a fix round) -- a DS-level size
   need, not a dealer-specific one: the base .ds-button's 11px/18px padding
   is too tall for a toolbar-row primary action sitting beside 30-36px
   inputs (first consumer: DealerCockpit.tsx's "+ Create New Price Enquiry"
   button, which previously carried this as an inline style). Additive to
   any color variant, e.g. `ds-button ds-button-primary ds-button-compact`. */
.ds-button-compact{font-weight:700;padding:8px 16px;height:36px}
/* Tiny size (2026-08-15, TASK-P2-staffboards-inline-style fix round) -- a
   DS-level size need, not an OMS-specific one: a table-row secondary
   action (e.g. "Manage Logins" beside a dense DataGrid row) needs a
   smaller footprint than even .ds-button-compact provides -- 8px/16px at
   36px height still overflows a compact row. First consumer:
   StaffBoards.tsx's dealer-directory "Manage Logins" button, which
   previously carried this as an inline style. Additive to any color
   variant, e.g. `ds-button ds-button-secondary ds-button-tiny`. */
.ds-button-tiny{padding:3px 8px;font-size:11px}
.ds-button:focus-visible{outline:2px solid var(--baobab);outline-offset:4px}
.ds-button:disabled,.ds-button-disabled,.ds-button.ds-button-disabled{opacity:0.45;cursor:not-allowed;pointer-events:none;background:var(--paper-2);color:var(--ink-mute);border-color:var(--hairline)}
.ds-button-primary:disabled,.ds-button-primary.ds-button-disabled,.ds-button-primary:disabled:hover,.ds-button-primary.ds-button-disabled:hover{background:var(--paper-2);color:var(--ink-mute);border-color:var(--hairline)}
.ds-button-secondary:disabled,.ds-button-secondary.ds-button-disabled,.ds-button-secondary:disabled:hover,.ds-button-secondary.ds-button-disabled:hover{background:var(--paper-2);color:var(--ink-mute);border-color:var(--hairline)}
.chat-quick-actions{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 8px 0;max-width:720px;width:100%;margin-left:auto;margin-right:auto}
.chat-quick-actions .quick-action-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 14px;border-radius:4px;font-family:var(--font-ui);font-weight:600;font-size:calc(11.5px * var(--fs-scale, 1));letter-spacing:0.03em;cursor:pointer;transition:background 0.14s ease, color 0.14s ease, border-color 0.14s ease;text-decoration:none;border:1px solid var(--hairline);background:transparent;color:var(--ink);line-height:1;white-space:nowrap;text-transform:uppercase}
.chat-quick-actions .quick-action-btn:hover{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.chat-quick-actions .quick-action-btn:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}
.chat-quick-actions .quick-action-btn:disabled{opacity:0.5;cursor:not-allowed}

/* ===== Forms ===== */
.ds-form{display:flex;flex-direction:column;gap:32px;margin-top:40px}
.ds-fieldset{background:var(--paper);border:1px solid var(--hairline);border-radius:4px;padding:28px 32px;display:flex;flex-direction:column;gap:18px;margin:0}
.ds-legend{font-family:var(--font-mono);font-weight:500;font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.16em;text-transform:uppercase;color:var(--ink-mute);padding:0 6px;margin-left:-6px}
.ds-field{display:flex;flex-direction:column;gap:6px}
.ds-field-row-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.ds-field-row-3{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;align-items:start}
/* defect D4b (2026-08-14) -- a grid item's default min-width is `auto`
   (its own content size), not 0; a plain .ds-field used directly as a
   .ds-field-row-2/-3 grid cell (e.g. every enum <select> field in
   ProcEa2Renderer's FieldControl) had no min-width override, so its
   track could size to the control's intrinsic minimum instead of its
   share of the row -- the same class of bug .ds-field-slot below already
   documents and fixes for its own usage. Applies here too. */
.ds-field-row-2>.ds-field,.ds-field-row-3>.ds-field{min-width:0}
.ds-field-span-2{grid-column:span 2}
.ds-field-control{position:relative;display:flex;align-items:center;width:100%}
.ds-field-control>.ds-input,.ds-field-control>.ds-select,.ds-field-control>.rsel,.ds-field-control>.rsel-startdate,.ds-field-control>.ds-calc-input{flex:1;min-width:0}
.ds-field-control .rsel-input,.ds-field-control>.ds-input,.ds-field-control>.ds-select,.ds-field-control>.ds-calc-input{padding-right:24px}
.ds-field-clear{position:absolute;right:5px;top:50%;transform:translateY(-50%);z-index:2;background:transparent;border:0;color:var(--ink-mute);font-family:var(--font-ui);font-size:13px;line-height:1;cursor:pointer;padding:3px 5px;border-radius:3px}
.ds-field-clear:hover{color:var(--paper);background:var(--baobab)}
.ds-calc-input{font-family:var(--font-mono);font-weight:600;font-variant-numeric:tabular-nums;text-align:right;font-size:calc(14.5px * var(--fs-scale, 1));line-height:1.4;color:var(--ink);background:var(--paper-2);border:1px solid var(--hairline);border-radius:3px;padding:10px 12px;width:100%;transition:border-color 0.14s ease, background 0.14s ease}
.ds-calc-input:hover{border-color:var(--ink-mute)}
.ds-calc-input:focus{outline:none;border-color:var(--baobab);background:var(--paper)}
/* defect D3 (2026-07-24) -- steppers were stacked (flex-direction:column),
   forcing the whole calc row taller than a normal single-line input and
   breaking grid row height. Side-by-side instead: same visual height as
   any other .ds-input in the row. */
.ds-calc-row{position:relative;display:flex;align-items:stretch;width:100%;height:42px}
.ds-calc-steppers{display:flex;flex-direction:row;margin-left:-1px}
.ds-calc-step-btn{flex:1;font-family:var(--font-mono);font-size:9px;line-height:1;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);cursor:pointer;padding:0 8px}
.ds-calc-step-btn:first-child{border-top-right-radius:3px;border-bottom:none}
.ds-calc-step-btn:last-child{border-bottom-right-radius:3px}
.ds-calc-step-btn:hover{color:var(--ink);border-color:var(--ink-mute)}
.ds-label{font-family:var(--font-ui);font-weight:600;font-size:calc(12px * var(--fs-scale, 1));letter-spacing:0.04em;color:var(--ink);text-transform:uppercase}
.ds-input,
.ds-select,
.ds-textarea{font-family:var(--font-ui);font-weight:500;font-size:calc(14.5px * var(--fs-scale, 1));line-height:1.4;color:var(--ink);background:var(--paper-2);border:1px solid var(--hairline);border-radius:3px;padding:10px 12px;width:100%;transition:border-color 0.14s ease, background 0.14s ease}
.ds-input:hover,
.ds-select:hover,
.ds-textarea:hover{border-color:var(--ink-mute)}
.ds-input:focus,
.ds-select:focus,
.ds-textarea:focus{outline:none;border-color:var(--baobab);background:var(--paper)}
.ds-textarea{min-height:96px;resize:vertical;font-family:var(--font-ui)}
.ds-input[data-invalid="true"],
.ds-select[data-invalid="true"],
.ds-textarea[data-invalid="true"]{border-color:var(--baobab);background:var(--baobab-bg, var(--paper))}
.te-req{color:var(--baobab)}
.req-mark{color:var(--baobab)}
/* One field's cell on a .ds-field-row-2 grid. min-width:0 is load-bearing:
   without it a long value forces the grid track wider than its share and the
   two-column layout collapses to overflow. */
.ds-field-slot{min-width:0;display:flex;flex-direction:column}
/* Dense form grid for steps too large for a fixed two-column layout: columns
   auto-fit to the available width instead of being pinned at two. */
.ds-field-grid-auto{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:16px 20px;align-items:start}
.ds-field-span-all{grid-column:1/-1}
/* Boolean control. A checkbox must not inherit .ds-input's full-width
   bordered box — that geometry is meant for a text control and leaves the tick
   orphaned under its label. Fixed box, caption inline beside it. */
.ds-checkbox-row{display:flex;align-items:center;gap:9px;min-height:42px;cursor:pointer}
.ds-checkbox{flex:0 0 auto;width:16px;height:16px;margin:0;accent-color:var(--baobab);cursor:pointer}
.ds-hint{font-family:var(--font-ui);font-weight:500;font-size:calc(12px * var(--fs-scale, 1));color:var(--ink-mute)}
.ds-field-hidden{display:none}
.ds-actions{display:flex;flex-wrap:wrap;gap:12px;padding-top:8px}

@media (max-width:640px){
  .ds-field-row-2{grid-template-columns:1fr}
  .ds-field-row-3{grid-template-columns:1fr}
  .ds-field-span-2{grid-column:span 1}
  .ds-fieldset{padding:20px}
}

/* ===== Review screen blocks ===== */
.ds-review-block{background:var(--paper);border:1px solid var(--hairline);border-radius:4px;padding:28px 32px;display:flex;flex-direction:column;gap:14px}
.ds-review-grid{display:grid;grid-template-columns:1.4fr 1fr;gap:24px;margin-top:40px;align-items:start}
.ds-review-field{display:flex;flex-direction:column;gap:4px;padding:8px 0;border-bottom:1px solid var(--hairline)}
.ds-review-field:last-child{border-bottom:0}
.ds-review-label{font-family:var(--font-mono);font-weight:500;font-size:calc(10.5px * var(--fs-scale, 1));letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute)}
.ds-review-value{font-family:var(--font-ui);font-weight:500;font-size:calc(15px * var(--fs-scale, 1));color:var(--ink)}
.ds-review-aside{display:flex;flex-direction:column;gap:20px;position:sticky;top:96px}

@media (max-width:880px){
  .ds-review-grid{grid-template-columns:1fr}
  .ds-review-aside{position:static}
}

/* ===== Records table — used on landing for "open tasks" ===== */
.ds-records{width:100%;border-collapse:collapse;margin-top:24px}
.ds-records td{padding:18px 14px;border-bottom:1px solid var(--hairline);vertical-align:middle}
.ds-records-id{width:120px}
.ds-records-title{font-family:var(--font-display);font-weight:700;font-size:calc(16px * var(--fs-scale, 1));letter-spacing:-0.015em;line-height:1.2;color:var(--ink)}
/* Atlas review-loop 3 (2026-07-18): unavailable actions in a records list (e.g. Invoices'
   Actions modal) used to render with the SAME full-weight .ds-records-title as an actually-
   clickable action next to it -- no visual distinction between "you can do this now" and "not
   available yet", forcing the reader down to small grey caption text to tell them apart. This
   modifier keeps the same face/size (still scannable as the same kind of row) but mutes the
   color and adds a not-allowed cursor, matching how .ds-button:disabled already signals
   unavailability elsewhere in the DS. */
.ds-records-title-disabled{font-family:var(--font-display);font-weight:700;font-size:calc(16px * var(--fs-scale, 1));letter-spacing:-0.015em;line-height:1.2;color:var(--ink-mute);cursor:not-allowed}
.ds-records-sub{display:block;margin-top:5px;color:var(--ink-mute);font-size:calc(12.5px * var(--fs-scale, 1));line-height:1.45}
.ds-table-section{background:transparent;border:0;border-top:1px solid var(--hairline);border-radius:0;margin-top:18px}
.ds-table-header{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:13px 16px;border-bottom:1px solid var(--hairline);flex-wrap:wrap;row-gap:10px}
.ds-table-title{font-family:var(--font-display);font-weight:700;font-size:calc(15px * var(--fs-scale, 1));letter-spacing:-0.01em;line-height:1.2;color:var(--ink);margin:0}
/* Italic-display modifier -- combine with .ds-table-title (or similar) when
   a title should read as an editorial headline, e.g. the legend row atop a
   centered ds-modal--dialog record-detail popup. Same font-style:italic
   already used on .brand/.brand-mini, surfaced here as a reusable class
   instead of repeating it ad hoc. */
.ds-title-italic{font-style:italic}
/* Plain mono uppercase kicker label, standalone (distinct from
   .ds-notice-label, which is baobab-tinted and lives inside a notice
   block). Pairs with .ds-table-title inside a .ds-table-header used as a
   dialog "legend" row: kicker + italic title on the left, a status tag on
   the right, single bottom border under just that row. */
.ds-kicker{font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));text-transform:uppercase;letter-spacing:0.06em;color:var(--ink-mute)}
.ds-filterbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:24px}
.ds-filterbar--scroll{flex-wrap:nowrap;overflow-x:auto}
/* Quiet inline toggle — small utility switches (e.g. elapsed vs actual time)
   that must not compete with real actions (Ben, 2026-07-27). */
.ds-quiet-toggle{background:none;border:0;padding:2px 0;font-family:var(--font-mono,monospace);font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-mute,#8a857c);cursor:pointer}
.ds-quiet-toggle:hover{color:var(--ink,#141414);text-decoration:underline dotted}
.ds-filterbar--scroll>*{flex:0 0 auto}
.ds-filter-chip{font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute);background:transparent;border:1px solid var(--hairline);border-radius:2px;padding:7px 10px;cursor:pointer}
.ds-filter-chip:hover,
.ds-filter-chip-active{color:var(--paper);background:var(--ink);border-color:var(--ink)}
/* Generic flex-wrap wrapper for a chip picker (e.g. TA Supplier Admin's
   countries multi-select) — reusable anywhere else a chip group is needed. */
.ds-chip-group{display:flex;flex-wrap:wrap;gap:6px}
/* MMDB-1361 — persistent top-of-content black process-nav bar (e.g. the
   Procurement demand→pay strip). Deliberately its own class, not a reuse of
   .topbar: the shell forces `.shell .topbar{position:static;background:
   transparent}` so a lightweight breadcrumb strip never paints a full-bleed
   fixed black bar over the sidebar (see src/app/globals.css) — that override
   would strip the ink background this component needs. rgba(250,250,246,x)
   is the existing "paper on ink" convention already used for hover/hairline
   states on dark surfaces (see --hairline-on-ink, .ds-window-back:hover). */
.ds-procnav{display:flex;align-items:center;gap:2px;flex-wrap:wrap;background:var(--ink);border-radius:4px;padding:6px;margin:0 0 24px}
.ds-procnav-item{display:inline-flex;align-items:center;font-family:var(--font-mono);font-weight:600;font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.1em;text-transform:uppercase;color:rgba(250,250,246,0.6);background:transparent;border:0;border-radius:3px;padding:10px 14px;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background 0.14s ease,color 0.14s ease}
.ds-procnav-item:hover{color:var(--paper);background:rgba(250,250,246,0.1)}
.ds-procnav-item-active,
.ds-procnav-item-active:hover{color:var(--ink);background:var(--paper)}
.ds-records-compact{width:100%;border-collapse:collapse}
.ds-records-compact td{padding:10px 12px;border-bottom:1px solid var(--hairline);vertical-align:middle}
.ds-records-compact tr:last-child td{border-bottom:0}
.ds-records-compact .ds-records-id{width:76px}
/* Minor fix (round-4 BA review, 2026-07-31): the plain (non-sticky)
   .ds-records-compact variant had NO header-cell padding rule at all --
   <th> fell back to the browser default (near-zero), so two adjacent
   nowrap numeric headers (.ds-mono-num, e.g. sales-gp's "COST" next to
   "MARGIN PCT") rendered with no visible gap between them ("COSTMARGIN
   PCT"). .ds-records-compact-sticky already had the correct header
   styling -- this brings the plain variant to the same baseline. */
.ds-records-compact thead th{padding:8px 12px;text-align:left;border-bottom:1px solid var(--ink);font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.1em;text-transform:uppercase;color:var(--ink-mute)}
.ds-records-compact thead th.ds-mono-num{text-align:right}
.ds-empty-row{padding:14px 16px;color:var(--ink-mute);font-family:var(--font-ui);font-weight:500;font-size:calc(13px * var(--fs-scale, 1))}

/* ===== Embedded task surface ===== */
.ds-embed-frame{display:block;width:100%;height:calc(100vh - 56px);min-height:720px;border:0;background:var(--paper-2)}
.ds-modal-backdrop{position:fixed;inset:0;background:var(--paper-2);display:flex;align-items:stretch;justify-content:stretch;padding:0;z-index:1000}
.ds-modal{background:var(--paper-2);border:0;border-radius:0;width:100%;height:100vh;display:flex;flex-direction:column;box-shadow:none}
.ds-modal-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 18px;border-bottom:2px solid var(--ink,#111110);background:var(--paper-sheet,#FAF8F2);color:var(--ink,#111110)}
.ds-modal-header .eyebrow,
.ds-modal-header .ds-table-title{color:var(--ink,#111110)}
.ds-modal-body{padding:0;overflow:hidden;flex:1}
.ds-modal .ds-embed-frame{height:100%;min-height:0}

/* ds-modal-dialog — centered popup card variant for forms/dialogs, distinct from
   the full-screen .ds-modal (embed/case-detail) surface (PORTAL-R-060) */
.ds-modal-backdrop.ds-modal-backdrop--dialog{background:rgba(14,14,12,.55);align-items:center;justify-content:center;padding:24px}
/* R3 (2026-07-24) -- resize:both + overflow:hidden on the element itself
   makes the native browser resize handle actually work (it needs
   overflow != visible and a box that isn't sized purely by intrinsic
   content); min-height/min-width stop it collapsing on the flex
   head/body/foot children. */
.ds-modal.ds-modal--dialog{position:relative;width:min(880px,calc(100vw - 24px));min-width:min(480px,calc(100vw - 24px));max-width:calc(100vw - 16px);height:min(740px,calc(100vh - 32px));min-height:min(480px,calc(100vh - 32px));max-height:calc(100vh - 16px);background:var(--paper,#FAF8F2);border:1.5px solid var(--hairline-dark,#B8AF98);border-radius:2px;box-shadow:0 20px 60px rgba(14,14,12,.35),0 2px 8px rgba(14,14,12,.12);display:flex;flex-direction:column;overflow:hidden;padding:0;resize:both !important;box-sizing:border-box}
.ds-step-span-2{grid-column:1 / -1}
.ds-modal-dialog-head{flex:none}
/* Physical Paper Masthead Header (2026-08-16, signed-off paper system) --
   Light paper sheet background, Fraunces serif title, mono kicker, ink-black text. */
.ds-modal-dialog-titlebar{display:flex;align-items:baseline;gap:10px;background:var(--paper,#FAF8F2);color:var(--ink,#111110);border-bottom:2px solid var(--ink,#111110);padding:14px 28px}
.ds-modal-dialog-titlebar-kicker{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.08em;color:var(--ink-mute,#6A675C)}
.ds-modal-dialog-titlebar-pos{font-family:var(--font-display);font-style:italic;font-weight:700;font-size:20px;color:var(--ink,#111110)}
.ds-modal-dialog-titlebar-chip{margin-left:auto;font-family:var(--font-mono);font-size:9px;text-transform:uppercase;color:var(--ink,#111110);border:1.5px solid var(--hairline-dark,#B8AF98);border-radius:2px;padding:2px 7px;background:var(--paper-card,#F4EFE3);white-space:nowrap;font-weight:700}
.ds-modal-dialog-dismiss--on-dark{color:var(--ink,#111110);border:1px solid var(--hairline-dark,#B8AF98);background:transparent;border-radius:2px;padding:2px 6px;cursor:pointer}
.ds-modal-dialog-dismiss--on-dark:hover{color:var(--baobab);border-color:var(--baobab);background:var(--paper-card,#F4EFE3)}
.ds-modal-dialog-stepstrip{padding:12px 28px 0}
.ds-modal-dialog-body{position:static;flex:1 1 auto;overflow-y:auto;overflow-x:hidden;padding:16px 24px 20px;background:var(--paper,#FAF8F2) !important;background-image:none !important;border:0;box-shadow:none;transform:none;width:auto;max-width:none;max-height:none;top:auto;left:auto;z-index:auto;box-sizing:border-box;scrollbar-width:thin;scrollbar-color:var(--ink-mute) var(--paper-2)}
/* R3 -- visible scroll affordance (webkit) -- a body that overflows must
   visibly look scrollable, not like a hard-clipped edge. */
.ds-modal-dialog-body::-webkit-scrollbar{width:10px}
.ds-modal-dialog-body::-webkit-scrollbar-track{background:var(--paper-2)}
.ds-modal-dialog-body::-webkit-scrollbar-thumb{background:var(--ink-mute);border-radius:5px;border:2px solid var(--paper-2)}
.ds-modal-dialog-body::-webkit-scrollbar-thumb:hover{background:var(--ink-soft)}
.ds-modal-dialog-foot{flex:none;border-top:1px solid var(--hairline);padding:12px 28px 18px;background:var(--paper-2)}
.ds-modal-dialog-dismiss{flex:none;width:22px;height:22px;display:flex;align-items:center;justify-content:center;background:transparent;border:1px solid var(--hairline);border-radius:2px;color:var(--ink-mute);font-family:var(--font-mono);font-size:10px;line-height:1;cursor:pointer;padding:0;margin-left:auto}
.ds-modal-dialog-dismiss:hover{color:var(--baobab);border-color:var(--baobab)}

/* ds-step-flow -- process-phase stepper header, shared by every step dialog */
.ds-step-flow{display:flex;align-items:center;gap:2px;margin:12px 0 16px;padding:8px 4px;background:var(--paper);border:1px solid var(--hairline)}
.ds-step-flow-arrow{flex:none;width:22px;height:22px;display:flex;align-items:center;justify-content:center;background:transparent;border:1px solid var(--hairline);border-radius:2px;color:var(--ink-soft);cursor:pointer;font-family:var(--font-mono);font-size:11px;padding:0}
.ds-step-flow-arrow:disabled{color:var(--ink-faint);cursor:not-allowed;opacity:.4}
.ds-step-flow-arrow:not(:disabled):hover{color:var(--baobab);border-color:var(--baobab)}
.ds-step-flow-track{flex:1;display:flex;align-items:flex-start;justify-content:space-between;padding:0 8px}
.ds-step-flow-item{display:flex;flex-direction:column;align-items:center;gap:5px;position:relative;flex:1;min-width:0}
.ds-step-flow-connector{position:absolute;top:6px;left:-50%;width:100%;height:1px;background:var(--hairline);z-index:0}
.ds-step-flow-item:first-child .ds-step-flow-connector{display:none}
.ds-step-flow-dot{position:relative;z-index:1;width:13px;height:13px;border-radius:50%;border:1px solid var(--ink-mute);background:var(--paper);padding:0;cursor:default}
.ds-step-flow-dot--done{background:var(--ink-soft);border-color:var(--ink-soft);cursor:pointer}
.ds-step-flow-dot--current{width:15px;height:15px;background:var(--baobab);border-color:var(--baobab);box-shadow:0 0 0 3px var(--signal-amber-bg)}
.ds-step-flow-dot--locked{background:var(--paper);border-color:var(--hairline);cursor:not-allowed}
.ds-step-flow-dot--viewing{box-shadow:0 0 0 3px var(--paper-2),0 0 0 4px var(--ink-soft)}
.ds-step-flow-dot--done:hover,.ds-step-flow-dot--current:hover{filter:brightness(.85)}
.ds-step-flow-label{font-family:var(--font-mono);font-size:8.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-mute);text-align:center;white-space:nowrap;max-width:64px;overflow:hidden;text-overflow:ellipsis}
.ds-step-flow-item .ds-step-flow-label--current{color:var(--baobab);font-weight:600}
.ds-step-history{border:1px solid var(--hairline);border-left:3px solid var(--ink-soft);background:var(--paper);padding:10px 12px;margin-bottom:14px}
.ds-step-history-tag{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft);margin-bottom:8px}

/* main's TA-Supplier-Portal dismiss-collision fix (2026-07-22) -- scoped to
   the OLD shared .ds-modal-body class name (src/app/globals.css), which the
   new ds-modal-dialog-titlebar/-body/-foot head/body/foot layout above does
   NOT use (renamed specifically to stop colliding with that class, see the
   comment on .ds-modal-dialog-body). Any .ds-modal--dialog consumer still
   using the legacy .ds-modal-dialog-dismiss + .ds-modal-body pair (i.e. not
   yet migrated to StepShell) keeps this fix; migrated dialogs use the
   compact header-band dismiss above instead, which does not collide because
   it lives inside the flex titlebar, not position:absolute over the body. */
.ds-modal--dialog .ds-modal-body{overflow:auto;padding:36px 26px 20px}

/* ds-menu — central-DS popover primitive (PORTAL-R-007), mirrored from the
   shell (src/app/globals.css) so remote fragments may reuse it. */
.ds-menu{position:absolute;bottom:100%;left:12px;right:12px;margin-bottom:8px;background:var(--paper);color:var(--ink);border:1px solid var(--ink);border-radius:var(--radius);box-shadow:0 18px 44px rgba(14,14,12,0.28);overflow:hidden;z-index:30}
.ds-menu-card{display:flex;flex-direction:column}
.ds-menu-identity{display:flex;align-items:center;gap:10px;padding:14px;border-bottom:1px solid var(--hairline)}
.ds-menu-identity-meta{min-width:0;display:flex;flex-direction:column}
.ds-menu-identity-name{font-size:calc(13px * var(--fs-scale, 1));font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-menu-identity-email{font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale, 1));color:var(--ink-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-menu-item{display:block;padding:10px 14px;font-size:calc(13px * var(--fs-scale, 1));font-weight:500;color:var(--ink);text-decoration:none;border-bottom:1px solid var(--hairline);background:transparent;border-left:0;border-right:0;border-top:0;width:100%;text-align:left;cursor:pointer}
.ds-menu-item:hover{background:var(--paper-2)}
.ds-menu-item-danger{color:var(--baobab)}
.ds-menu-section{padding:12px 14px;border-bottom:1px solid var(--hairline)}
.ds-menu-section:last-child{border-bottom:0}
.ds-menu-section-label{display:block;font-family:var(--font-mono);font-size:calc(9px * var(--fs-scale, 1));letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:8px}
.ds-menu-toggle-row{display:flex;gap:6px;margin-bottom:6px}
.ds-menu-toggle-row:last-child{margin-bottom:0}
.ds-menu-toggle{flex:1;padding:6px 8px;font-family:var(--font-ui);font-size:calc(12px * var(--fs-scale, 1));font-weight:600;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);cursor:pointer}
.ds-menu-toggle:hover{color:var(--ink)}
.ds-menu-toggle.is-active{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.mmd-course-content{font-family:var(--font-ui)!important;background:var(--paper-2)!important;color:var(--ink)!important}
.mmd-course-content h1,
.mmd-course-content h2,
.mmd-course-content h3,
.mmd-course-content .brand{font-family:var(--font-display)!important;color:var(--ink)!important;letter-spacing:0!important}
.mmd-course-content p,
.mmd-course-content li,
.mmd-course-content button{font-family:var(--font-ui)!important}
.mmd-course-content .topbar,
.mmd-course-content .progress-fill{background:var(--baobab)!important}
.mmd-course-content .topbar{height:6px!important}
.mmd-course-content header{display:none!important}
.mmd-course-content main{max-width:none!important;width:100%!important;min-height:100vh!important;margin:0!important;padding:0!important}
.mmd-course-content .card{width:100%!important;min-height:0!important;margin:0!important;border:0!important;box-shadow:none!important;border-radius:0!important;background:var(--paper-2)!important;display:block!important;gap:0!important;overflow:visible!important}
.mmd-course-content .slide{max-width:none!important;width:100%!important;margin:0!important;padding:clamp(20px,3.4vw,42px)!important;border:0!important;gap:0!important}
.mmd-course-content .slide-illustration{margin:0 0 18px!important}
.mmd-course-content .slide-illustration svg{width:96px!important;height:96px!important}
.mmd-course-content .slide:has(.quiz),
.mmd-course-content .slide:has(.quiz-card),
.mmd-course-content .slide:has(.question),
.mmd-course-content .slide:has(.question-card),
.mmd-course-content .slide:has([class*="quiz"]),
.mmd-course-content .slide:has([class*="question"]){padding-top:clamp(16px,2.5vw,30px)!important}
.mmd-course-content .slide:has(.quiz) .slide-illustration,
.mmd-course-content .slide:has(.quiz-card) .slide-illustration,
.mmd-course-content .slide:has(.question) .slide-illustration,
.mmd-course-content .slide:has(.question-card) .slide-illustration,
.mmd-course-content .slide:has([class*="quiz"]) .slide-illustration,
.mmd-course-content .slide:has([class*="question"]) .slide-illustration{display:none!important}
.mmd-course-content .slide:has(.quiz) h1,
.mmd-course-content .slide:has(.quiz-card) h1,
.mmd-course-content .slide:has(.question) h1,
.mmd-course-content .slide:has(.question-card) h1,
.mmd-course-content .slide:has([class*="quiz"]) h1,
.mmd-course-content .slide:has([class*="question"]) h1{margin-bottom:16px!important}
.mmd-course-content .quiz,
.mmd-course-content .quiz-card,
.mmd-course-content .question,
.mmd-course-content .question-card,
.mmd-course-content [class*="quiz"],
.mmd-course-content [class*="question"]{margin-top:0!important;padding-top:0!important}
.mmd-course-content .answers,
.mmd-course-content .options,
.mmd-course-content .quiz-options{margin-top:14px!important}
.mmd-course-content header,
.mmd-course-content .lesson,
.mmd-course-content .slide,
.mmd-course-content .quiz-option{background:var(--paper-2)!important;border-color:var(--hairline)!important}
.mmd-course-content .callout,
.mmd-course-content .score-card{background:var(--paper-3)!important;border-color:var(--hairline)!important;color:var(--ink)!important}

/* ===== Mono + tag ===== */
.ds-mono{font-family:var(--font-mono);font-weight:500;font-size:calc(11.5px * var(--fs-scale, 1));letter-spacing:0.06em;color:var(--ink-soft)}
.ds-mono-hash{color:var(--baobab);margin-right:1px}
/* IT Backlog detail modal (2026-07-11): multiline verbatim mono block for test-case / agent context-query text, a clickable-row affordance, and a single-column stack-with-gap for stacked review blocks. Token-only, DS-owned. */
.ds-mono-block{font-family:var(--font-mono);font-weight:500;font-size:calc(11.5px * var(--fs-scale, 1));line-height:1.55;letter-spacing:0.01em;color:var(--ink-soft);background:var(--paper);border:1px solid var(--hairline);border-radius:4px;padding:12px 14px;margin:0;white-space:pre-wrap;overflow-wrap:anywhere;overflow-x:auto;max-height:340px;overflow-y:auto}
.ds-row-click{cursor:pointer}
/* Hover must read on BOTH zebra states. The striped (even) rows already sit at
   ~55% of --paper-2, so hovering them to --paper-2 was a change of a few
   percent — visually nothing. Ben, 2026-08-01: "It allows me only to select or
   highlight every second row. Only the white rows are highlighted." --paper-3
   is a step darker than the stripe itself, so plain and striped rows both
   change visibly by the same amount. The cell paints over the row's stripe, so
   the hovered row reads as one continuous band. */
.ds-row-click:hover td,
.ds-row-click:hover th{background:var(--paper-3)}
.ds-row-click:focus-visible{outline:2px solid var(--baobab);outline-offset:-2px}
.ds-row-click:focus-visible td,
.ds-row-click:focus-visible th{background:var(--paper-3)}
.ds-detail-stack{display:flex;flex-direction:column;gap:16px}

.ds-tag{display:inline-block;font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px;padding:3px 7px}

/* ===== Notice strip ===== */
.ds-notice{background:var(--paper);border-top:1px solid var(--hairline);border-bottom:1px solid var(--hairline);padding:20px 24px;margin:32px 0;display:flex;gap:18px;align-items:stretch;border-radius:4px}
.ds-notice-rule{width:3px;background:var(--baobab);align-self:stretch;border-radius:1px}
.ds-notice-label{font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.16em;text-transform:uppercase;color:var(--baobab);display:block;margin-bottom:5px}
.ds-notice-text{flex:1;font-family:var(--font-ui);font-weight:500;font-size:calc(14px * var(--fs-scale, 1));color:var(--ink-soft)}
.ds-notice-ok .ds-notice-rule{background:var(--signal-grass)}
.ds-notice-ok .ds-notice-label{color:var(--signal-grass)}
.ds-notice-warn .ds-notice-rule{background:var(--signal-amber)}
.ds-notice-warn .ds-notice-label{color:var(--signal-amber)}
/* TASK-18.0e: informational tone, same accent-bar + label pattern as -ok/-warn. */
.ds-notice-info .ds-notice-rule{background:var(--signal-info)}
.ds-notice-info .ds-notice-label{color:var(--signal-info)}

/* ===== Console log (TASK-18.0c) =====
   Green-on-black monospace surface for rendering machine output -- agent run
   logs, security-scanner output. The colours carry meaning here (this is a
   terminal), which is why this is its own component rather than a paper/ink
   surface with a mono font. Reuses the existing --font-mono / --ds-space-12 /
   --ds-radius-sm tokens; both real call sites already hardcoded values matching
   those exactly, so nothing new is invented for spacing or radius.
   Markup: <div class="ds-console-log"><span class="ds-console-log-label">…</span>…</div> */
.ds-console-log{background:var(--console-bg);color:var(--console-fg);font-family:var(--font-mono);font-size:calc(12px * var(--fs-scale, 1));line-height:1.5;padding:var(--ds-space-12);border-radius:var(--ds-radius-sm);white-space:pre-wrap;overflow-x:auto}
.ds-console-log-label{color:var(--console-label)}
/* Dense inline variant -- same ds-notice-rule/ds-notice-label/ds-notice-text
   children (accent bar + label + text), tight padding/margin for a callout
   INSIDE a dialog body (e.g. a single contact line) instead of .ds-notice's
   page-level banner spacing. Combine as class="ds-notice ds-notice-compact"
   (plus ds-notice-ok for the green variant). */
.ds-notice-compact{padding:10px 14px;margin:0 0 12px;gap:12px;align-items:center}
.ds-notice-compact .ds-notice-label{margin-bottom:2px}

/* ===== TA-W8 (MMDB-1543) — inline button-busy spinner ===== */
.ds-spinner{display:inline-block;width:13px;height:13px;border-radius:50%;border:2px solid color-mix(in srgb, currentColor 30%, transparent);border-top-color:currentColor;animation:ds-spin 0.7s linear infinite;flex:none}
@keyframes ds-spin{to{transform:rotate(360deg)}}
.ds-button-busy{cursor:progress;opacity:0.85}

/* ===== TA-W7 (MMDB-1533) — bottom-of-page decision/action row ===== */
.module-actions-bottom{border-top:1px solid var(--hairline);padding-top:18px;margin-top:6px}

/* ===== ServiceFlow — dense LiveKit avatar session stage =====
   Video tile + inline mic control + status line. One working surface:
   connect, watch/listen, talk. No dashboard chrome. Stage aspect ratio
   matches the avatar worker's native 512x576 (~8:9) portrait frame so the
   face is never cropped by a landscape tile. */
.sf-video-stage{position:relative;width:100%;max-width:400px;aspect-ratio:512/576;background:var(--ink);border-radius:4px;overflow:hidden;display:flex;align-items:center;justify-content:center}
.sf-video-stage video{width:100%;height:100%;object-fit:cover;display:block}
.sf-video-stage-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:24px}
.sf-video-stage-placeholder-glyph{font-family:var(--font-mono);font-size:calc(28px * var(--fs-scale, 1));line-height:1;color:var(--paper-2)}
.sf-video-stage[data-has-video="false"] .sf-video-stage-placeholder-glyph{animation:sf-pulse 1.8s ease-in-out infinite}
.sf-video-stage-placeholder-text{font-family:var(--font-mono);font-weight:500;font-size:calc(11.5px * var(--fs-scale, 1));letter-spacing:0.08em;text-transform:uppercase;color:var(--paper-2);text-align:center}
@keyframes sf-pulse{0%,100%{opacity:0.5}50%{opacity:1}}
.sf-controls{display:flex;align-items:center;gap:14px;margin-top:16px;flex-wrap:wrap}
.sf-mic-btn{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:50%;border:1px solid var(--ink);background:var(--ink);color:var(--paper);cursor:pointer;transition:background 0.14s ease, border-color 0.14s ease}
.sf-mic-btn:hover{background:var(--baobab);border-color:var(--baobab)}
.sf-mic-btn[data-state="listening"],.sf-mic-btn[data-state="speaking"]{background:var(--baobab);border-color:var(--baobab)}
.sf-mic-btn[data-state="connecting"]{background:var(--paper-2);border-color:var(--hairline);color:var(--ink-soft);cursor:progress}
.sf-mic-btn:disabled{cursor:not-allowed;opacity:0.6}
/* Prominent circular "press and talk" control — a bigger, unmistakable
   orb variant of the mic button meant to sit centered under/overlaying an
   avatar video stage, with a distinct pulsing ring per connection state so
   the user always knows who currently has the floor: calm when idle,
   red-ring pulse while the mic is live and listening, green-ring pulse
   (different rhythm) while the avatar is speaking back. */
.sf-mic-orb{position:relative;z-index:2;display:inline-flex;align-items:center;justify-content:center;width:72px;height:72px;border-radius:50%;border:3px solid var(--paper);background:var(--ink);color:var(--paper);cursor:pointer;box-shadow:0 2px 8px rgba(0,0,0,.28);transition:background 0.16s ease,border-color 0.16s ease}
.sf-mic-orb svg{width:28px;height:28px}
.sf-mic-orb:hover{background:var(--baobab)}
.sf-mic-orb:disabled{cursor:progress;opacity:0.7}
.sf-mic-orb[data-state="listening"]{background:var(--baobab)}
.sf-mic-orb[data-state="listening"]::after{content:"";position:absolute;inset:-7px;border-radius:50%;border:2px solid var(--baobab);animation:sf-orb-ring 1.3s ease-out infinite}
.sf-mic-orb[data-state="speaking"]{background:var(--ink);border-color:var(--signal-grass)}
.sf-mic-orb[data-state="speaking"]::after{content:"";position:absolute;inset:-7px;border-radius:50%;border:2px solid var(--signal-grass);animation:sf-orb-ring 0.85s ease-out infinite}
.sf-mic-orb[data-state="connecting"]{background:var(--paper-2);color:var(--ink-soft);border-color:var(--hairline)}
.sf-mic-orb[data-state="error"]{background:var(--paper);color:var(--baobab);border-color:var(--baobab)}
@keyframes sf-orb-ring{0%{opacity:0.85;transform:scale(1)}100%{opacity:0;transform:scale(1.5)}}
.sf-persona-label{font-family:var(--font-ui);font-weight:600;font-size:calc(13px * var(--fs-scale, 1));color:var(--ink)}
.sf-status-line{font-family:var(--font-mono);font-weight:500;font-size:calc(12px * var(--fs-scale, 1));letter-spacing:0.04em;color:var(--ink-soft)}
.sf-status-line[data-state="speaking"]{color:var(--baobab)}
.sf-mute-btn{font-family:var(--font-mono);font-weight:600;font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.06em;text-transform:uppercase;padding:6px 12px;border-radius:3px;border:1px solid var(--hairline);background:var(--paper);color:var(--ink-soft);cursor:pointer;transition:background 0.14s ease, color 0.14s ease}
.sf-mute-btn:hover{border-color:var(--ink);color:var(--ink)}
.sf-mute-btn[data-muted="true"]{background:var(--ink);color:var(--paper);border-color:var(--ink)}

/* ===== Search + browse — dense list of link-only rows (PORTAL-R-009) =====
   A search input feeding a server-filtered list, where every row is a plain
   <a> (no per-row buttons/selects/dropdowns — those live on the row's detail
   page instead). Used by /app/admin/flowstate and reusable anywhere a
   "search+browse to detail" pattern is needed. */
.ds-search-row{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:20px}
.ds-search-row .ds-input{max-width:360px}
.ds-link-list{display:flex;flex-direction:column;border-top:1px solid var(--hairline);margin-top:12px}
.ds-link-row{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 6px;border-bottom:1px solid var(--hairline);text-decoration:none;color:var(--ink);transition:background .12s ease}
/* UX-01 round 2 (2026-08-15): ds-link-row is consumed as a <button> in hub
   queue lists; a button is content-sized, so rows rendered ragged-right.
   The row is a full-width list element by design, whatever tag consumes it. */
.ds-link-row{width:100%;text-align:left;background:transparent;border:0;border-bottom:1px solid var(--hairline);cursor:pointer;font:inherit}
/* UX-01 round 2: an inline field's select must never collapse to a sliver
   when its placeholder option is short (hub country picker). */
.ds-field-inline .ds-select{min-width:180px}
/* UX-01 round 3: queue rows are a uniform-height list; long titles clamp. */
.ds-link-row{min-height:56px}
.ds-link-row-title{max-width:520px}
.ds-link-row:hover{background:var(--paper)}
.ds-link-row-main{display:flex;flex-direction:column;gap:3px;min-width:0}
.ds-link-row-title{font-family:var(--font-ui);font-weight:600;font-size:calc(14.5px * var(--fs-scale, 1));color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-link-row-sub{font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.04em;color:var(--ink-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-link-row-meta{display:flex;align-items:center;gap:10px;flex:none}
.ds-link-row-go{font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.06em;text-transform:uppercase;color:var(--ink-faint)}
.ds-link-row:hover .ds-link-row-go{color:var(--ink)}

/* Plain inline link (BacklogTable.tsx evidence URLs, P2-40.1 orphan sweep) --
   distinct from .ds-link-row (a full clickable row); this marks a value that
   is itself a link, underlined so it reads as clickable inside a value cell. */
.ds-link{text-decoration:underline;text-underline-offset:2px}
.ds-link:hover{color:var(--baobab)}

/* =====================================================================   MMD LEARNING (LMS) — premium redesign block. Editorial Industrial Letterbox.
   Self-contained: targets the learning remote's data-slots + classes. Tokens
   only (no new fonts/colors). Authored 2026-06-21 from a 3-critic synthesis.
   ============================================================================ */

/* --- Home page shell ------------------------------------------------------- */
.mmd-course-content,
.ds-learning-page { color: var(--ink); }
.ds-learning-page { max-width: 1180px; margin: 0 auto; padding: 34px 0 64px; }
.ds-learning-heading { margin: 0; font-family: var(--font-display); font-weight: 500; font-size: clamp(38px, 4.6vw, 62px); line-height: 0.98; letter-spacing: -0.02em; }
.ds-learning-heading a { color: inherit; text-decoration: none; }
.ds-learning-heading em { color: var(--baobab); font-style: italic; }
.ds-learning-page .lede { max-width: 64ch; margin: 16px 0 0; color: var(--ink-soft); font-size:calc(15px * var(--fs-scale, 1)); line-height: 1.62; font-style: normal; }
.ds-empty-row { padding: 22px; border: 1px solid var(--hairline); color: var(--ink-mute); font-size:calc(14px * var(--fs-scale, 1)); background: var(--paper); }

/* --- Resume hero card ------------------------------------------------------ */
[data-slot="ds-resume"] {
  display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 6px 28px;
  margin: 26px 0 30px; padding: 22px 26px; background: var(--paper);
  border: 1px solid var(--hairline); border-left: 3px solid var(--baobab);
  text-decoration: none; color: var(--ink); transition: border-color .15s ease, transform .15s ease;
}
[data-slot="ds-resume"]:hover { border-color: var(--ink); transform: translateY(-1px); }
[data-slot="ds-resume-eyebrow"] { grid-column: 1; font-family: var(--font-mono); font-size:calc(10.5px * var(--fs-scale, 1)); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-resume-title"] { grid-column: 1; font-family: var(--font-display); font-weight: 500; font-size: clamp(20px, 2.2vw, 27px); line-height: 1.08; margin-top: 3px; }
[data-slot="ds-resume-meta"] { grid-column: 1; font-size:calc(13px * var(--fs-scale, 1)); color: var(--ink-soft); margin-top: 4px; }
[data-slot="ds-resume-meter"] { grid-column: 1; display: block; margin-top: 12px; max-width: 360px; }
[data-slot="ds-resume-cta"] { grid-column: 2; grid-row: 1 / span 4; align-self: center; font-family: var(--font-mono); font-size:calc(12px * var(--fs-scale, 1)); letter-spacing: 0.06em; text-transform: uppercase; color: var(--paper); background: var(--ink); padding: 12px 20px; white-space: nowrap; transition: background .15s ease; }
[data-slot="ds-resume"]:hover [data-slot="ds-resume-cta"] { background: var(--baobab); }

/* --- Filter chips ---------------------------------------------------------- */
.ds-filterbar { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0 18px; padding-bottom: 16px; border-bottom: 1px solid var(--hairline); }
.ds-filter-chip { font-family: var(--font-mono); font-size:calc(11px * var(--fs-scale, 1)); letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-mute); background: transparent; border: 1px solid var(--hairline); padding: 7px 13px; text-decoration: none; transition: all .12s ease; }
.ds-filter-chip:hover { color: var(--ink); border-color: var(--ink-mute); }
.ds-filter-chip-active { color: var(--paper); background: var(--ink); border-color: var(--ink); }

/* --- Section header (catalogue) ------------------------------------------- */
.ds-table-section { margin-top: 6px; }
.ds-table-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 14px; }
.eyebrow, [data-slot="course-kicker"] { font-family: var(--font-mono); font-size:calc(10.5px * var(--fs-scale, 1)); letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-mute); display: block; }
.ds-table-title, [data-slot="ds-table-title"] { font-family: var(--font-display); font-weight: 500; font-size: clamp(19px, 2vw, 24px); line-height: 1.1; margin: 3px 0 0; }

/* --- Catalogue: course cards (was a table) -------------------------------- */
[data-slot="ds-course-grid"] { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
[data-slot~="ds-course-card"] {
  display: grid; grid-template-rows: auto 1fr auto; gap: 10px; min-height: 148px;
  padding: 20px 22px; background: var(--paper); border: 1px solid var(--hairline);
  text-decoration: none; color: var(--ink); position: relative; transition: border-color .15s ease, transform .15s ease;
}
[data-slot~="ds-course-card"]::after { content: "→"; position: absolute; right: 20px; bottom: 18px; font-size:calc(15px * var(--fs-scale, 1)); color: var(--ink-faint); opacity: 0; transform: translateX(-4px); transition: all .15s ease; }
[data-slot~="ds-course-card"]:hover { border-color: var(--ink); transform: translateY(-2px); }
[data-slot~="ds-course-card"]:hover::after { opacity: 1; transform: translateX(0); color: var(--baobab); }
[data-slot~="is-progress"] { border-left: 3px solid var(--ink); }
[data-slot~="is-complete"] { border-left: 3px solid var(--baobab); }
[data-slot="ds-course-cat"] { font-family: var(--font-mono); font-size:calc(10px * var(--fs-scale, 1)); letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-course-name"] { font-family: var(--font-display); font-weight: 500; font-size:calc(21px * var(--fs-scale, 1)); line-height: 1.14; align-self: start; }
[data-slot="ds-course-foot"] { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
[data-slot="ds-course-go"] { font-family: var(--font-mono); font-size:calc(11px * var(--fs-scale, 1)); letter-spacing: 0.07em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot~="ds-course-card"]:hover [data-slot="ds-course-go"] { color: var(--ink); }
[data-slot="ds-course-fresh"] { font-size:calc(12.5px * var(--fs-scale, 1)); color: var(--ink-faint); }
[data-slot="ds-course-stamp"] { font-family: var(--font-mono); font-size:calc(11px * var(--fs-scale, 1)); letter-spacing: 0.06em; text-transform: uppercase; color: var(--baobab); }

/* --- Meter (proportional hairline) ---------------------------------------- */
[data-slot="ds-meter"] { display: inline-flex; align-items: center; gap: 10px; min-width: 0; }
[data-slot="ds-meter-track"] { position: relative; flex: 1 1 auto; min-width: 70px; height: 6px; background: var(--paper-2); border: 1px solid var(--hairline); overflow: hidden; }
[data-slot="ds-meter-fill"] { position: absolute; inset: 0 auto 0 0; height: 100%; background: var(--ink); width: 0; }
[data-slot="ds-meter-fill"][data-pct="0"] { width: 0; }
[data-slot="ds-meter-label"] { font-family: var(--font-mono); font-size:calc(11px * var(--fs-scale, 1)); letter-spacing: 0.04em; color: var(--ink-mute); white-space: nowrap; }

/* Proportional fill width keyed on data-pct (markup buckets to nearest 5).
   No inline styles — these live in the central DS. Applies to any *-fill. */
[data-pct="0"]{width:0}
[data-pct="5"]{width:5%}   [data-pct="10"]{width:10%} [data-pct="15"]{width:15%}
[data-pct="20"]{width:20%} [data-pct="25"]{width:25%} [data-pct="30"]{width:30%}
[data-pct="35"]{width:35%} [data-pct="40"]{width:40%} [data-pct="45"]{width:45%}
[data-pct="50"]{width:50%} [data-pct="55"]{width:55%} [data-pct="60"]{width:60%}
[data-pct="65"]{width:65%} [data-pct="70"]{width:70%} [data-pct="75"]{width:75%}
[data-pct="80"]{width:80%} [data-pct="85"]{width:85%} [data-pct="90"]{width:90%}
[data-pct="95"]{width:95%} [data-pct="100"]{width:100%}

/* =====================================================================   COURSE + ACTIVITY — dark letterbox frame + body
   ============================================================================ */
[data-slot="ds-modal"] { display: flex; flex-direction: column; min-height: 100dvh; background: var(--paper); }
[data-slot="ds-modal-header"] {
  position: sticky; top: 0; z-index: 5; display: flex; align-items: center; justify-content: space-between; gap: 18px;
  padding: 14px 30px; background: var(--ink); color: var(--paper);
}
[data-slot="ds-modal-headline"] { min-width: 0; }
[data-slot="ds-modal-header"] [data-slot="course-kicker"] { color: color-mix(in srgb, var(--paper) 55%, transparent); }
[data-slot="ds-modal-crumb"] { color: color-mix(in srgb, var(--paper) 80%, transparent); text-decoration: none; }
[data-slot="ds-modal-crumb"]:hover { color: var(--paper); text-decoration: underline; }
[data-slot="ds-modal-header"] [data-slot="ds-table-title"] { color: var(--paper); font-size: clamp(15px, 1.6vw, 19px); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 52ch; }
[data-slot="ds-modal-header"] [data-slot="ds-actions"] { display: flex; align-items: center; gap: 8px; flex: none; }
[data-slot="ds-modal-body"] { flex: 1 1 auto; padding: 30px; }
[data-slot="ds-course-shell"] { max-width: 940px; margin: 0 auto; }

/* progress rule on course overview */
[data-slot="ds-progress"] { max-width: 520px; margin: 4px 0 20px; }
[data-slot="ds-progress-head"] { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 7px; }
[data-slot="ds-progress-goal"] { font-size:calc(13px * var(--fs-scale, 1)); color: var(--ink-soft); }
[data-slot="ds-progress-label"] { font-family: var(--font-mono); font-size:calc(12px * var(--fs-scale, 1)); letter-spacing: 0.04em; color: var(--ink-mute); }
[data-slot="ds-progress-track"] { position: relative; height: 7px; background: var(--paper-2); border: 1px solid var(--hairline); overflow: hidden; }
[data-slot="ds-progress-fill"] { position: absolute; inset: 0 auto 0 0; height: 100%; background: var(--ink); width: 0; }

/* =====================================================================   COURSE SPINE — vertical timeline (was a table)
   ============================================================================ */
[data-slot="ds-spine"] { list-style: none; margin: 22px 0 0; padding: 0; position: relative; }
[data-slot="ds-spine"]::before { content: ""; position: absolute; left: 7px; top: 12px; bottom: 12px; width: 1px; background: var(--hairline); }
[data-slot~="ds-spine-step"] { position: relative; }
[data-slot="ds-spine-main"] {
  display: grid; grid-template-columns: 16px 40px 1fr auto; align-items: center; column-gap: 16px;
  padding: 15px 14px 15px 0; border-bottom: 1px solid var(--hairline); text-decoration: none; color: var(--ink);
  transition: background .12s ease;
}
[data-slot="ds-spine-main"]:hover { background: var(--paper); }
[data-slot="ds-spine-node"] { grid-column: 1; width: 14px; height: 14px; border-radius: 50%; background: var(--paper-2); border: 1px solid var(--ink-faint); box-shadow: 0 0 0 4px var(--paper); z-index: 1; }
[data-slot~="is-done"] [data-slot="ds-spine-node"] { background: var(--ink); border-color: var(--ink); }
[data-slot~="is-next"] [data-slot="ds-spine-node"] { background: var(--paper); border: 2px solid var(--baobab); }
[data-slot="ds-spine-num"] { grid-column: 2; font-family: var(--font-display); font-size:calc(22px * var(--fs-scale, 1)); font-weight: 500; color: var(--ink-faint); line-height: 1; text-align: center; }
[data-slot~="is-next"] [data-slot="ds-spine-num"] { color: var(--ink); }
[data-slot~="is-done"] [data-slot="ds-spine-num"] { color: var(--ink-mute); }
[data-slot="ds-spine-text"] { grid-column: 3; min-width: 0; display: grid; gap: 2px; }
[data-slot="ds-spine-title"] { font-family: var(--font-display); font-weight: 500; font-size:calc(17px * var(--fs-scale, 1)); line-height: 1.18; color: var(--ink); }
[data-slot="ds-spine-sum"] { font-size:calc(13px * var(--fs-scale, 1)); color: var(--ink-mute); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
[data-slot="ds-spine-meta"] { grid-column: 4; display: flex; align-items: center; gap: 14px; flex: none; }
[data-slot~="ds-spine-state"] { font-family: var(--font-mono); font-size:calc(10.5px * var(--fs-scale, 1)); letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-spine-next"] { font-family: var(--font-mono); font-size:calc(10.5px * var(--fs-scale, 1)); letter-spacing: 0.08em; text-transform: uppercase; color: var(--baobab); }
[data-slot="ds-spine-go"] { font-family: var(--font-mono); font-size:calc(11px * var(--fs-scale, 1)); letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-mute); opacity: 0; transition: opacity .12s ease; white-space: nowrap; }
[data-slot="ds-spine-main"]:hover [data-slot="ds-spine-go"] { opacity: 1; color: var(--ink); }
[data-slot="ds-spine-go"].is-primary { opacity: 1; color: var(--paper); background: var(--ink); padding: 8px 14px; }
[data-slot="ds-spine-main"]:hover [data-slot="ds-spine-go"].is-primary { background: var(--baobab); color: var(--paper); }

/* =====================================================================   ACTIVITY / LESSON — de-boxed editorial article
   ============================================================================ */
[data-slot="ds-activity"] { max-width: 720px; margin: 0 auto; }
[data-slot="ds-activity"] [data-slot="ds-table-header"] { display: block; margin-bottom: 6px; }
[data-slot="ds-activity-status"] { display: inline-block; margin-top: 10px; font-family: var(--font-mono); font-size:calc(10.5px * var(--fs-scale, 1)); letter-spacing: 0.08em; text-transform: uppercase; padding: 5px 11px; border: 1px solid var(--hairline); color: var(--ink-mute); }
[data-slot~="ds-activity-status-quiz"] { color: var(--baobab); border-color: var(--baobab); background: var(--baobab-bg); }
[data-slot~="ds-activity-status-done"] { color: var(--ink); border-color: var(--ink); }
[data-slot="ds-activity-content"] { margin-top: 22px; font-size:calc(16px * var(--fs-scale, 1)); line-height: 1.66; color: var(--ink-soft); border-top: 2px solid var(--baobab); padding-top: 22px; }
[data-slot="ds-activity-content"] > *:first-child { margin-top: 0; }
[data-slot="ds-activity-content"] p { margin: 0 0 16px; max-width: 64ch; }
[data-slot="ds-activity-content"] h2, [data-slot="ds-activity-content"] h3, [data-slot="ds-activity-content"] h4 { font-family: var(--font-display); font-weight: 500; color: var(--ink); line-height: 1.2; margin: 30px 0 10px; padding-top: 18px; border-top: 1px solid var(--hairline); }
[data-slot="ds-activity-content"] ul, [data-slot="ds-activity-content"] ol { margin: 0 0 16px; padding-left: 4px; list-style: none; }
[data-slot="ds-activity-content"] li { position: relative; padding-left: 20px; margin: 0 0 9px; max-width: 62ch; }
[data-slot="ds-activity-content"] li::before { content: ""; position: absolute; left: 2px; top: 9px; width: 5px; height: 5px; background: var(--baobab); }
[data-slot="ds-activity-content"] strong, [data-slot="ds-activity-content"] b { color: var(--ink); font-weight: 600; }
[data-slot="ds-activity-content"] blockquote { margin: 0 0 16px; padding-left: 16px; border-left: 2px solid var(--hairline); color: var(--ink-mute); font-style: italic; }
[data-slot="ds-figure"] { margin: 22px 0; padding: 22px; border: 1px solid var(--hairline); background: var(--paper); text-align: center; }
[data-slot="ds-figure"] svg { max-width: 100%; height: auto; }

/* activity banners */
[data-slot~="ds-activity-banner"] { margin: 18px 0; padding: 13px 16px; font-size:calc(14px * var(--fs-scale, 1)); border: 1px solid var(--hairline); }
[data-slot~="ds-activity-banner-pass"] { border-left: 3px solid var(--baobab); color: var(--ink); background: var(--paper); }
[data-slot~="ds-activity-banner-fail"] { border-left: 3px solid var(--signal-amber); color: var(--ink); background: var(--signal-amber-bg); }

/* =====================================================================   KNOWLEDGE CHECK — hard dark section break (cinema bar feel)
   ============================================================================ */
.ds-quiz-form, [data-slot="ds-quiz"] { margin-top: 30px; }
[data-slot="ds-quiz-intro"] { background: var(--ink); color: var(--paper); padding: 20px 24px; margin: 0 0 4px; }
[data-slot="ds-quiz-intro-label"] { font-family: var(--font-display); font-style: italic; font-size:calc(22px * var(--fs-scale, 1)); display: block; }
[data-slot="ds-quiz-intro"] p { margin: 6px 0 0; font-size:calc(13.5px * var(--fs-scale, 1)); color: color-mix(in srgb, var(--paper) 75%, transparent); }
[data-slot="ds-quiz-question"] { border: 0; border-bottom: 1px solid var(--hairline); margin: 0; padding: 20px 0; }
[data-slot="ds-quiz-legend"] { font-family: var(--font-display); font-weight: 500; font-size:calc(17px * var(--fs-scale, 1)); padding: 0; margin-bottom: 12px; }
[data-slot="ds-quiz-option"] { display: flex; align-items: center; gap: 11px; padding: 11px 14px; border: 1px solid var(--hairline); margin: 0 0 8px; cursor: pointer; transition: border-color .12s ease, background .12s ease; }
[data-slot="ds-quiz-option"]:hover { border-color: var(--ink-mute); background: var(--paper); }
[data-slot="ds-quiz-option"]:has(.ds-choice:checked) { border-color: var(--baobab); box-shadow: inset 3px 0 0 var(--baobab); }
[data-slot="ds-quiz-option"] .ds-choice { accent-color: var(--baobab); width: 16px; height: 16px; flex: none; }
[data-slot="ds-quiz-option-text"] { font-size:calc(14.5px * var(--fs-scale, 1)); color: var(--ink); }

/* =====================================================================   ASSIGNMENT
   ============================================================================ */
.ds-assignment-form, [data-slot="ds-assignment"] { display: grid; gap: 10px; margin-top: 22px; }
[data-slot="ds-assignment-saved"] { padding: 16px 18px; background: var(--paper); border: 1px solid var(--hairline); border-left: 3px solid var(--baobab); margin-top: 18px; }
[data-slot="ds-assignment-saved"] blockquote { margin: 6px 0 0; font-size:calc(14.5px * var(--fs-scale, 1)); line-height: 1.55; color: var(--ink-soft); }
.ds-textarea { width: 100%; font-family: var(--font-ui); font-size:calc(14.5px * var(--fs-scale, 1)); line-height: 1.55; padding: 13px 15px; border: 1px solid var(--hairline); background: var(--paper); color: var(--ink); resize: vertical; }
.ds-textarea:focus { outline: none; border-color: var(--ink); }
.ds-field-hidden { display: none; }

/* =====================================================================   COMPLETION MOMENT — the reward
   ============================================================================ */
[data-slot="ds-complete"] { margin-top: 30px; padding: 34px 30px; background: var(--ink); color: var(--paper); text-align: center; display: grid; justify-items: center; gap: 8px; }
[data-slot="ds-complete-tick"] { display: inline-grid; place-items: center; width: 44px; height: 44px; border-radius: 50%; background: var(--baobab); color: var(--paper); font-size:calc(22px * var(--fs-scale, 1)); line-height: 1; }
[data-slot="ds-complete-head"] { font-family: var(--font-display); font-style: italic; font-size:calc(30px * var(--fs-scale, 1)); line-height: 1.05; margin-top: 6px; }
[data-slot="ds-complete-sub"] { font-size:calc(13.5px * var(--fs-scale, 1)); color: color-mix(in srgb, var(--paper) 72%, transparent); }
[data-slot="ds-complete"] [data-slot="ds-actions"] { margin-top: 16px; }

/* =====================================================================   BUTTONS + actions (data-slot AND class forms) + tags
   ============================================================================ */
[data-slot="ds-actions"] { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 18px; }
.ds-button, [data-slot~="ds-button"] {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  font-family: var(--font-mono); font-size:calc(12px * var(--fs-scale, 1)); letter-spacing: 0.05em; text-transform: uppercase;
  padding: 11px 18px; border: 1px solid var(--ink); background: var(--paper); color: var(--ink);
  text-decoration: none; cursor: pointer; transition: all .14s ease;
}
.ds-button:hover, [data-slot~="ds-button"]:hover { background: var(--paper-2); }
.ds-button-primary, [data-slot~="ds-button-primary"] { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.ds-button-primary:hover, [data-slot~="ds-button-primary"]:hover { background: var(--baobab); border-color: var(--baobab); }
.ds-button-secondary, [data-slot~="ds-button-secondary"], [data-slot~="ds-button-on-light"] { background: transparent; color: var(--ink); border-color: var(--hairline); }
.ds-button-secondary:hover, [data-slot~="ds-button-secondary"]:hover { border-color: var(--ink); background: transparent; }
[data-slot~="ds-button-on-dark-ghost"] { background: transparent; color: var(--paper); border-color: color-mix(in srgb, var(--paper) 35%, transparent); }
[data-slot~="ds-button-on-dark-ghost"]:hover { border-color: var(--paper); background: color-mix(in srgb, var(--paper) 8%, transparent); }
[data-slot~="ds-button-on-dark-primary"] { background: var(--paper); color: var(--ink); border-color: var(--paper); }
[data-slot~="ds-button-on-dark-primary"]:hover { background: var(--baobab); color: var(--paper); border-color: var(--baobab); }
[data-slot="ds-tag"] { display: inline-block; font-family: var(--font-mono); font-size:calc(11px * var(--fs-scale, 1)); letter-spacing: 0.06em; text-transform: uppercase; color: var(--paper); border: 1px solid color-mix(in srgb, var(--paper) 30%, transparent); padding: 5px 10px; }
[data-slot="ds-records-sub"] { font-size:calc(13px * var(--fs-scale, 1)); color: var(--ink-mute); }

/* embedded raw runtime frame (fallback only) */
[data-slot="ds-embed-frame"][hidden] { display: none; }
[data-slot="ds-embed-frame"] { margin-top: 18px; }

/* generated fallback course body */
[data-slot="course-body"] { max-width: 820px; margin: 0 auto; }
[data-slot="course-title"] { font-family: var(--font-display); font-weight: 500; font-size:calc(30px * var(--fs-scale, 1)); margin: 4px 0 8px; }
[data-slot="course-summary"] { color: var(--ink-soft); font-size:calc(15px * var(--fs-scale, 1)); margin: 0 0 20px; }
[data-slot="ds-records-compact"] { display: grid; gap: 8px; }

/* =====================================================================   RESPONSIVE — stacked, thumb-first
   ============================================================================ */
@media (max-width: 860px) {
  [data-slot="ds-course-grid"] { grid-template-columns: minmax(0, 1fr); }
  [data-slot="ds-resume"] { grid-template-columns: minmax(0,1fr); }
  [data-slot="ds-resume-cta"] { grid-column: 1; grid-row: auto; justify-self: start; margin-top: 14px; }
  [data-slot="ds-modal-header"] { flex-wrap: wrap; padding: 12px 18px; gap: 10px; }
  [data-slot="ds-modal-header"] [data-slot="ds-table-title"] { max-width: 100%; white-space: normal; }
  [data-slot="ds-modal-body"] { padding: 20px 16px; }
  [data-slot="ds-spine-main"] { grid-template-columns: 16px 1fr; grid-template-areas: "node text" "node meta"; row-gap: 8px; column-gap: 12px; }
  [data-slot="ds-spine-num"] { display: none; }
  [data-slot="ds-spine-text"] { grid-area: text; }
  [data-slot="ds-spine-sum"] { white-space: normal; }
  [data-slot="ds-spine-meta"] { grid-area: meta; justify-content: flex-start; }
  [data-slot="ds-spine-go"] { opacity: 1; }
  [data-slot="ds-activity-content"] p, [data-slot="ds-activity-content"] li { max-width: none; }
}
/* ===== end LMS redesign block ===== */
.ds-tag-open{color:var(--ink);border-color:var(--ink)}
.ds-tag-progress{color:var(--ink);border-color:var(--ink-mute)}
.ds-tag-waiting{color:var(--ink-mute);border-color:var(--ink-mute)}
.ds-tag-resolved{color:var(--ink-mute);border-color:var(--hairline)}
.ds-tag-closed{color:var(--ink-faint);border-color:var(--hairline)}
.ds-tag-error{color:var(--baobab);border-color:var(--baobab)}

/* === LMS v2 P2 block === */
/* ===================================================================   MMD LMS v2 — PHASE 2 (consumers) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Covers: R1 (course scroll), R2 (in-content pager), R6 (end page + cert CTA),
   R7 (home trophies).
   ========================================================================== */

/* --------------------------------------------------------------------------
   R1 — Course content must scroll (TC1.*)
   The course modal is a BOUNDED viewport box (height, not min-height) so its
   body can own the overflow; the header stays sticky at the top of that box.
   -------------------------------------------------------------------------- */
[data-slot="ds-modal"] {
  height: 100dvh;
  max-height: 100dvh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

[data-slot="ds-modal-header"] {
  position: sticky;
  top: 0;
  z-index: 2;
  flex: 0 0 auto;
}

[data-slot="ds-modal-body"] {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  -webkit-overflow-scrolling: touch;
}

/* --------------------------------------------------------------------------
   R2 — In-content navigation pager (TC2.*)
   A bottom prev/next pager rendered inside the activity, in addition to the
   sticky header prev/next. Real DB-ordered hrefs; first activity has no prev,
   the last content activity's next is the terminal knowledge check.
   -------------------------------------------------------------------------- */
[data-slot="ds-pager"] {
  display: flex;
  align-items: stretch;
  justify-content: space-between;
  gap: 0.75rem;
  margin-top: 2rem;
  padding-top: 1.25rem;
  border-top: 1px solid var(--hairline);
}

[data-slot="ds-pager-link"] {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  flex: 1 1 0;
  min-width: 0;
  padding: 0.7rem 0.9rem;
  border: 1px solid var(--hairline);
  border-radius: 0;
  text-decoration: none;
  color: var(--ink);
  background: var(--paper-2);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-pager-link"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, var(--paper-2));
}

[data-slot="ds-pager-link"][data-dir="next"] {
  text-align: right;
  align-items: flex-end;
}

[data-slot="ds-pager-dir"] {
  font-family: var(--font-mono);
  font-size: 0.66rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-pager-title"] {
  font-family: var(--font-ui);
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}

/* A disabled/absent slot (first activity has no prev) keeps the layout balanced. */
[data-slot="ds-pager-spacer"] {
  flex: 1 1 0;
  min-width: 0;
}

@media (max-width: 560px) {
  [data-slot="ds-pager"] {
    flex-direction: column;
  }
  [data-slot="ds-pager-link"][data-dir="next"] {
    text-align: left;
    align-items: flex-start;
  }
}

/* --------------------------------------------------------------------------
   R6 — End-of-course page + certificate (TC6.*)
   Shown only when isCourseComplete. Trophy mark, "Course complete", and the
   "Download certificate (PDF)" action.
   -------------------------------------------------------------------------- */
[data-slot="ds-end"] {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 1rem;
  max-width: 38rem;
  margin: 0 auto;
  padding: 3rem 1.5rem;
}

[data-slot="ds-end-trophy"] {
  width: 96px;
  height: 96px;
  display: block;
  color: var(--baobab);
}

[data-slot="ds-end-kicker"] {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--baobab);
}

[data-slot="ds-end-title"] {
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(2rem, 4vw, 2.9rem);
  line-height: 1.05;
  color: var(--ink);
  margin: 0;
}

[data-slot="ds-end-sub"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  color: var(--ink-soft);
  max-width: 30rem;
}

[data-slot="ds-end-course"] {
  font-family: var(--font-ui);
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--ink);
}

[data-slot="ds-end"] [data-slot="ds-actions"] {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  justify-content: center;
  margin-top: 0.5rem;
}

/* --------------------------------------------------------------------------
   R7 — Trophies on the home page (TC7.*)
   One trophy per completed course; empty state when none.
   -------------------------------------------------------------------------- */
[data-slot="ds-trophies"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
  gap: 1rem;
}

[data-slot="ds-trophy"] {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  padding: 1rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-trophy"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 55%, var(--paper-2));
}

[data-slot="ds-trophy-emblem"] {
  width: 56px;
  height: 56px;
  flex: 0 0 auto;
  display: block;
  color: var(--baobab);
}

[data-slot="ds-trophy-text"] {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  min-width: 0;
}

[data-slot="ds-trophy-cat"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-trophy-name"] {
  font-family: var(--font-ui);
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
}

[data-slot="ds-trophy-empty"] {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 1.25rem;
  border: 1px dashed var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
  color: var(--ink-mute);
  font-family: var(--font-ui);
  font-size: 0.95rem;
}

/* === LMS v2 P3 block === */
/* ===================================================================   MMD LMS v2 — PHASE 3 (catalogue + admin) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Covers: R9 (~N min estimate), R10 (categories + grouped catalogue),
   R11 (featured strip), R12 (required-for-you), R13 (admin page), R14 (covers).
   ========================================================================== */

/* --------------------------------------------------------------------------
   R14 — Course covers. A 1200x630 image (overviewfiles photo or generated
   Letterbox SVG) sat above the card body. object-fit:cover keeps the ratio.
   -------------------------------------------------------------------------- */
[data-slot="ds-cover"] {
  display: block;
  width: 100%;
  aspect-ratio: 1200 / 630;
  height: auto;
  object-fit: cover;
  background: var(--paper-2);
  border-bottom: 1px solid var(--hairline);
}

/* --------------------------------------------------------------------------
   R9 — "~N min" time-estimate badge.
   -------------------------------------------------------------------------- */
[data-slot="ds-est"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-soft);
  padding: 0.12rem 0.4rem;
  border: 1px solid var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   Course card with a cover (extends the P2 ds-course-card). The card becomes a
   vertical stack: cover on top, body (category + est, name, footer) below.
   -------------------------------------------------------------------------- */
[data-slot="ds-course-card"] {
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
}

[data-slot="ds-course-cover"] {
  display: block;
}

[data-slot="ds-course-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 0.95rem 1rem 1rem;
  flex: 1 1 auto;
}

[data-slot="ds-course-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

/* --------------------------------------------------------------------------
   R12 — Required for you. Top-of-page section; cards carry due-state styling.
   -------------------------------------------------------------------------- */
[data-slot="ds-required-grid"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: 1rem;
}

[data-slot="ds-required-card"] {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  overflow: hidden;
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-required-card"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 55%, var(--paper-2));
}

[data-slot="ds-required-card"].is-overdue {
  border-left: 3px solid var(--baobab);
}

[data-slot="ds-required-card"].is-soon {
  border-left: 3px solid var(--signal-amber);
}

[data-slot="ds-required-cover"] {
  display: block;
}

[data-slot="ds-required-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
  padding: 0.9rem 1rem 1rem;
}

[data-slot="ds-required-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

[data-slot="ds-required-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-required-flag"] {
  font-family: var(--font-mono);
  font-size: 0.6rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--baobab);
  padding: 0.1rem 0.4rem;
  border: 1px solid color-mix(in srgb, var(--baobab) 40%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, transparent);
}

[data-slot="ds-required-name"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  font-weight: 600;
  color: var(--ink);
}

[data-slot="ds-required-due"] {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
}

[data-slot="ds-required-due"].is-overdue {
  color: var(--baobab);
  font-weight: 600;
}

[data-slot="ds-required-due"].is-soon {
  color: color-mix(in srgb, var(--signal-amber) 80%, var(--ink));
  font-weight: 600;
}

[data-slot="ds-required-est"] {
  margin-top: 0.1rem;
}

/* --------------------------------------------------------------------------
   R11 — Featured strip. A grid of cover cards above the catalogue.
   -------------------------------------------------------------------------- */
[data-slot="ds-featured-grid"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: 1rem;
}

/* --------------------------------------------------------------------------
   R10 — Catalogue grouped by real category, with per-category headers.
   -------------------------------------------------------------------------- */
[data-slot="ds-cat-group"] {
  margin-top: 1.5rem;
}

[data-slot="ds-cat-group"]:first-child {
  margin-top: 0;
}

[data-slot="ds-cat-heading"] {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.3rem;
  color: var(--ink);
  margin: 0 0 0.75rem;
  padding-bottom: 0.4rem;
  border-bottom: 1px solid var(--hairline);
}

/* Resume hero with a cover thumbnail alongside the text. */
[data-slot="ds-resume"] {
  display: grid;
  grid-template-columns: minmax(0, 14rem) 1fr;
  gap: 1.25rem;
  align-items: stretch;
}

[data-slot="ds-resume-cover"] {
  display: block;
  overflow: hidden;
  border: 1px solid var(--hairline);
}

[data-slot="ds-resume-text"] {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  min-width: 0;
}

@media (max-width: 640px) {
  [data-slot="ds-resume"] {
    grid-template-columns: 1fr;
  }
}

/* --------------------------------------------------------------------------
   R13 — Admin page. Course rows with editable controls; 403 state.
   -------------------------------------------------------------------------- */
[data-slot="ds-admin-list"] {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}

[data-slot="ds-admin-course"] {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  padding: 1.1rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
}

[data-slot="ds-admin-course-head"] {
  display: grid;
  grid-template-columns: minmax(0, 10rem) 1fr;
  gap: 1rem;
  align-items: center;
}

[data-slot="ds-admin-cover"] {
  display: block;
  width: 100%;
  aspect-ratio: 1200 / 630;
  height: auto;
  object-fit: cover;
  border: 1px solid var(--hairline);
  background: var(--paper);
}

[data-slot="ds-admin-course-id"] {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
}

[data-slot="ds-admin-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-admin-title"] {
  font-family: var(--font-ui);
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--ink);
  margin: 0;
}

[data-slot="ds-admin-meta-line"] {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  color: var(--ink-mute);
}

[data-slot="ds-admin-controls"] {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
  gap: 0.85rem;
  padding-top: 0.85rem;
  border-top: 1px solid var(--hairline);
}

[data-slot="ds-admin-form"] {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 0.75rem;
  border: 1px solid var(--hairline);
  background: color-mix(in srgb, var(--paper) 60%, var(--paper-2));
}

[data-slot="ds-admin-field"] {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

[data-slot="ds-admin-label"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-soft);
}

[data-slot="ds-admin-banner"] {
  padding: 0.7rem 0.95rem;
  border: 1px solid var(--hairline);
  font-family: var(--font-ui);
  font-size: 0.9rem;
  margin-bottom: 1rem;
}

[data-slot="ds-admin-banner"].ds-admin-banner-ok {
  border-color: color-mix(in srgb, var(--signal-grass) 45%, var(--hairline));
  background: color-mix(in srgb, var(--signal-grass-bg) 60%, var(--paper-2));
  color: color-mix(in srgb, var(--signal-grass) 70%, var(--ink));
}

[data-slot="ds-admin-banner"].ds-admin-banner-err {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, var(--paper-2));
  color: var(--baobab);
}

[data-slot="ds-admin-403"] {
  display: flex;
  flex-direction: column;
  gap: 0.85rem;
  max-width: 34rem;
  padding: 2rem 1.5rem;
  border: 1px dashed var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
}

[data-slot="ds-admin-403-kicker"] {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--baobab);
}

@media (max-width: 560px) {
  [data-slot="ds-admin-course-head"] {
    grid-template-columns: 1fr;
  }
}

/* === LMS v2 P4 block === */
/* ===================================================================   MMD LMS v2 — PHASE 4 (home UX polish) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Scope: P4 redesigns "Required for you" from an oversized cover hero into a
   COMPACT horizontal alert list (thumb · title + badge + due + ~min · CTA).
   The data-slot values carry state suffixes (e.g. "ds-required-row is-overdue"),
   so selectors use the whitespace-token match [data-slot~="…"].
   ========================================================================== */

/* --------------------------------------------------------------------------
   R12 (P4) — Required for you as a compact alert list. Each item is a tight
   horizontal row: small cover thumbnail (left) → title + Mandatory + due + ~min
   (centre, grows) → Continue/Start primary button (right). Rows stack.
   -------------------------------------------------------------------------- */
[data-slot~="ds-required-list"] {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

[data-slot~="ds-required-row"] {
  display: grid;
  grid-template-columns: 140px 1fr auto;
  align-items: center;
  gap: 1rem;
  padding: 0.7rem 0.85rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot~="ds-required-row"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 45%, var(--paper-2));
}

/* Due-state left rail — overdue (baobab) and due-soon (amber) only. */
[data-slot~="ds-required-row"][data-slot~="is-overdue"] {
  border-left: 3px solid var(--baobab);
}

[data-slot~="ds-required-row"][data-slot~="is-soon"] {
  border-left: 3px solid var(--signal-amber);
}

/* Small fixed-ratio cover thumbnail on the left. */
[data-slot~="ds-required-thumb"] {
  display: block;
  width: 140px;
  overflow: hidden;
  border: 1px solid var(--hairline);
}

[data-slot~="ds-required-thumb"] [data-slot="ds-cover"] {
  border-bottom: none;
}

[data-slot~="ds-required-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
}

[data-slot~="ds-required-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

[data-slot~="ds-required-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot~="ds-required-flag"] {
  font-family: var(--font-mono);
  font-size: 0.58rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--baobab);
  padding: 0.08rem 0.36rem;
  border: 1px solid color-mix(in srgb, var(--baobab) 40%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, transparent);
}

[data-slot~="ds-required-name"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.2;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
}

[data-slot~="ds-required-facts"] {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  flex-wrap: wrap;
}

[data-slot~="ds-required-due"] {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
}

[data-slot~="ds-required-due"][data-slot~="is-overdue"] {
  color: var(--baobab);
  font-weight: 600;
}

[data-slot~="ds-required-due"][data-slot~="is-soon"] {
  color: color-mix(in srgb, var(--signal-amber) 80%, var(--ink));
  font-weight: 600;
}

/* Continue/Start primary button on the right of each row. */
[data-slot~="ds-required-cta"] {
  flex: 0 0 auto;
  justify-self: end;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--paper);
  background: var(--ink);
  padding: 0.55rem 0.95rem;
  white-space: nowrap;
  transition: background 120ms ease;
}

[data-slot~="ds-required-row"]:hover [data-slot~="ds-required-cta"] {
  background: var(--baobab);
}

/* Mobile: drop the CTA onto its own line, keep thumb + text side by side. */
@media (max-width: 560px) {
  [data-slot~="ds-required-row"] {
    grid-template-columns: 96px 1fr;
    grid-template-areas:
      "thumb body"
      "cta   cta";
    row-gap: 0.6rem;
  }
  [data-slot~="ds-required-thumb"] {
    grid-area: thumb;
    width: 96px;
  }
  [data-slot~="ds-required-body"] {
    grid-area: body;
  }
  [data-slot~="ds-required-cta"] {
    grid-area: cta;
    justify-self: stretch;
    text-align: center;
  }
}

/* === LMS v2 P5 block === */
/* ===================================================================   MMD LMS v2 — PHASE 5 (navigation + button + usability pass) central
   design-system additions. Authored by the learning remote; batched by the
   orchestrator into the shell's public/_design-system/components.css.

   Tokens ONLY — NO hardcoded hex, NO new colours, NO new fonts. All translucency
   via color-mix() over the EXISTING central tokens. This is a USABILITY pass
   inside the existing "Editorial Letterbox" aesthetic — it does NOT change the
   colour scheme, fonts, covers, sections, or the concept of the app.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Fixes (all external-UX-critique validated, navigation/buttons/usability only):
   1. STEP-COUNT — markup-only (route.ts). No CSS here.
   2. BUTTON CLUTTER / HIERARCHY in the dark course/activity header:
      - breadcrumb trail (Learning / <course> / <step>) at top-left,
      - progress rendered as a plain label/meter (NOT a bordered pill),
      - Next is the single filled PRIMARY, Prev a quiet ghost secondary.
   3. ONE obvious next action on the home, reachable on mobile (390px).
   4. MOBILE TAP TARGETS — all nav/action buttons >=44px tall, single line.
   5. COWORK pill overlap — reserve bottom/right gutter on the LMS surfaces so
      the floating "Ask Cowork" launcher never covers actions or text.
   ========================================================================== */

/* --------------------------------------------------------------------------
   #2 — Dark header breadcrumb trail. "All courses" and "Course overview" were
   competing bordered buttons; they are NAV LEVELS, not actions, so they become
   a quiet breadcrumb in the headline (top-left). Inherits the dark-header
   --paper text already set on [data-slot="ds-modal-header"].
   -------------------------------------------------------------------------- */
[data-slot="ds-modal-crumbs"] {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  font-family: var(--font-mono);
  font-size:calc(11px * var(--fs-scale, 1));
  letter-spacing: 0.06em;
  text-transform: uppercase;
  line-height: 1.2;
  min-width: 0;
}

[data-slot="ds-modal-crumbs"] [data-slot="ds-modal-crumb"] {
  color: color-mix(in srgb, var(--paper) 72%, transparent);
  text-decoration: none;
  max-width: 24ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

[data-slot="ds-modal-crumbs"] [data-slot="ds-modal-crumb"]:hover {
  color: var(--paper);
  text-decoration: underline;
  text-underline-offset: 3px;
}

[data-slot="ds-crumb-sep"] {
  color: color-mix(in srgb, var(--paper) 40%, transparent);
}

[data-slot="ds-crumb-current"] {
  color: color-mix(in srgb, var(--paper) 92%, transparent);
  font-weight: 700;
  max-width: 30ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* #2 — Progress as a PLAIN label, not a bordered button-looking pill. No border,
   no fill box — just a quiet mono reading on the dark bar, set apart from the
   action buttons by spacing. */
[data-slot="ds-modal-progress"] {
  font-family: var(--font-mono);
  font-size:calc(11px * var(--fs-scale, 1));
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--paper) 70%, transparent);
  white-space: nowrap;
  padding-right: 6px;
  border: 0;
  background: none;
}

/* #2 + #4 — Header action buttons: Next is the single filled PRIMARY, Prev the
   quiet ghost. Give both a comfortable >=44px tap target while keeping the
   compact letterbox look. Header buttons stay on a single line. */
[data-slot="ds-modal-header"] [data-slot~="ds-button"] {
  min-height: 40px;
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   #4 — MOBILE TAP TARGETS. On touch-width screens every nav/action button must
   be >=44px tall, single-line, and not clustered so tightly that they are easy
   to mis-tap. Applies to the dark header actions, the in-content pager, the
   spine "go" actions, and the home CTAs.
   -------------------------------------------------------------------------- */
@media (max-width: 640px) {
  /* Header actions: full comfortable height, sensible spacing, Next stays
     dominant. They wrap onto their own row (shell already sets flex-wrap). */
  [data-slot="ds-modal-header"] [data-slot="ds-actions"] {
    gap: 10px;
    row-gap: 10px;
    width: 100%;
  }
  [data-slot="ds-modal-header"] [data-slot~="ds-button"] {
    min-height: 44px;
    flex: 1 1 auto;
  }
  /* The plain progress label drops above the buttons, not squeezed between them. */
  [data-slot="ds-modal-progress"] {
    flex: 1 0 100%;
    padding-right: 0;
  }

  /* In-content pager links: comfortable tap height, already stack at <=560px. */
  [data-slot="ds-pager-link"] {
    min-height: 44px;
  }

  /* Spine actions: the per-step "go" chip becomes a real, reachable button on
     mobile (the shell already reveals it at <=560px; here we give it height). */
  [data-slot="ds-spine-go"] {
    min-height: 40px;
    display: inline-flex;
    align-items: center;
  }
  [data-slot="ds-spine-go"].is-primary {
    min-height: 44px;
    padding: 0 16px;
  }
}

/* --------------------------------------------------------------------------
   #3 — ONE obvious next action on the home, reachable on mobile. The compact
   required row and the resume hero each carry a single dominant primary button.
   Give those CTAs a >=44px tap target and, on mobile, keep them on their own
   full-width line below the card text (never hidden beside / under the cover).
   -------------------------------------------------------------------------- */
[data-slot~="ds-required-cta"] {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

[data-slot="ds-resume-cta"] {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

@media (max-width: 640px) {
  /* Resume hero: cover sits on top, then text, then a full-width primary CTA so
     the action is visible without horizontal scroll and is not hidden below the
     image. (The shell already collapses to a single column; we make the CTA
     full-bleed and unmistakably the primary action.) */
  [data-slot="ds-resume-cta"] {
    justify-self: stretch;
    width: 100%;
    text-align: center;
  }
  /* Required row: the Continue/Start button spans full width on its own line
     (the shell sets grid-area:cta at <=560px; reinforce stretch up to 640px). */
  [data-slot~="ds-required-cta"] {
    justify-self: stretch;
    width: 100%;
    text-align: center;
  }
}

/* --------------------------------------------------------------------------
   #5 — COWORK pill overlap. The floating "Ask Cowork" launcher is pinned to the
   bottom-right of the viewport (~54px pill + 14px inset). Reserve a bottom (and
   a little right) gutter on the LMS surfaces so the launcher never sits over the
   primary action or body text. Token-free spacing only; no colours touched.

   --mmd-cowork-gutter: the clearance below the fold the launcher needs.
   -------------------------------------------------------------------------- */
[data-slot="ds-modal"],
.ds-learning-page {
  --mmd-cowork-gutter: 92px;
}

/* Course / activity surface: the scrolling body's inner shell reserves the
   gutter so the in-content pager, Next button, assignment form, and end-page
   CTA all clear the launcher. */
[data-slot="ds-modal-body"] [data-slot="ds-course-shell"] {
  padding-bottom: var(--mmd-cowork-gutter);
}

/* Home surface: reserve the same clearance below the last section so the
   catalogue's final card / CTA is never covered. */
.ds-learning-page {
  padding-bottom: var(--mmd-cowork-gutter);
}

/* On narrow screens the launcher is a touch larger relative to the viewport and
   actions go full-width; give a little more breathing room. */
@media (max-width: 640px) {
  [data-slot="ds-modal"],
  .ds-learning-page {
    --mmd-cowork-gutter: 104px;
  }
}

/* === LMS v2 P6 block === */
/* ===================================================================   MMD LMS v2 — PHASE 6 (navigation de-clutter + top step-progress nav) central
   design-system additions. Authored by the learning remote; batched by the
   orchestrator into the shell's public/_design-system/components.css.

   Tokens ONLY — NO hardcoded hex, NO new colours, NO new fonts. All translucency
   via color-mix() over the EXISTING central tokens. This is a NAVIGATION /
   USABILITY pass inside the existing "Editorial Letterbox" aesthetic — it does
   NOT change the colour scheme, fonts, covers, sections, or the app concept.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Stakeholder fixes (navigation/usability only):
   - Problem 2: a compact horizontal STEP-PROGRESS NAV at the TOP (under the dark
     header, inside ds-modal) on the in-activity / in-check views. Lists every
     step (content activities + terminal Knowledge check) as small clickable dots,
     marks done / current / to-do reusing the spine node language (filled ink disc
     = done, baobab ring = current, hollow = todo), includes a "Course overview"
     link, lets the learner jump to any chapter, and scrolls / wraps on mobile.
   - Problems 1 & 4: handled in route.ts markup (removed duplicate nav buttons);
     no CSS needed here.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Problem 2 — top step-progress nav. It sits between the dark ds-modal-header
   and the ds-modal-body, on the light --paper surface. A "Course overview" link
   on the left, then a horizontally scrollable track of numbered step dots.
   -------------------------------------------------------------------------- */
[data-slot="ds-stepper"] {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 18px;
  background: var(--paper);
  border-bottom: 1px solid var(--hairline);
  min-width: 0;
}

/* "Course overview" — a quiet mono nav link (not a button), set apart on the
   left so the user can always jump back to the spine. */
[data-slot="ds-stepper-overview"] {
  flex: none;
  font-family: var(--font-mono);
  font-size:calc(10.5px * var(--fs-scale, 1));
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: var(--ink-mute);
  text-decoration: none;
  white-space: nowrap;
  padding: 6px 10px 6px 0;
  border-right: 1px solid var(--hairline);
  min-height: 32px;
  display: inline-flex;
  align-items: center;
}
[data-slot="ds-stepper-overview"]:hover {
  color: var(--ink);
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* The track scrolls horizontally so a long course never breaks the header. */
[data-slot="ds-stepper-track"] {
  display: flex;
  align-items: center;
  gap: 4px;
  flex: 1 1 auto;
  min-width: 0;
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: thin;
  scrollbar-color: color-mix(in srgb, var(--ink) 22%, transparent) transparent;
  -webkit-overflow-scrolling: touch;
  padding-bottom: 2px;
}
[data-slot="ds-stepper-track"]::-webkit-scrollbar { height: 4px; }
[data-slot="ds-stepper-track"]::-webkit-scrollbar-thumb {
  background: color-mix(in srgb, var(--ink) 22%, transparent);
}

/* Each step: a node dot + number, with the label revealed for the current step
   and on hover/focus. Compact so many steps fit; min 40px hit area. */
[data-slot~="ds-stepper-step"] {
  flex: none;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  text-decoration: none;
  color: var(--ink-mute);
  padding: 6px 10px;
  min-height: 40px;
  border: 1px solid transparent;
  white-space: nowrap;
  transition: background .12s ease, color .12s ease, border-color .12s ease;
}
[data-slot~="ds-stepper-step"]:hover,
[data-slot~="ds-stepper-step"]:focus-visible {
  background: var(--paper-2);
  color: var(--ink);
  border-color: var(--hairline);
  outline: none;
}

/* Node dot — reuse the spine visual language exactly:
   to-do = hollow (paper fill, faint ring); done = filled ink disc;
   current = paper fill with a baobab ring. */
[data-slot="ds-stepper-node"] {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  flex: none;
  background: var(--paper-2);
  border: 1px solid var(--ink-faint);
}
[data-slot~="is-done"] [data-slot="ds-stepper-node"] {
  background: var(--ink);
  border-color: var(--ink);
}
[data-slot~="is-current"] [data-slot="ds-stepper-node"] {
  background: var(--paper);
  border: 2px solid var(--baobab);
}

/* Step number — mono, quiet; sharpens for the current step. */
[data-slot="ds-stepper-num"] {
  font-family: var(--font-mono);
  font-size:calc(11px * var(--fs-scale, 1));
  letter-spacing: 0.04em;
  color: var(--ink-mute);
  line-height: 1;
}
[data-slot~="is-done"] [data-slot="ds-stepper-num"] { color: var(--ink-faint); }
[data-slot~="is-current"] [data-slot="ds-stepper-num"] { color: var(--ink); }

/* Label — hidden by default to keep the track compact; shown for the current
   step (so the learner sees where they are) and on hover/focus of any step. */
[data-slot="ds-stepper-label"] {
  font-family: var(--font-ui);
  font-size:calc(12px * var(--fs-scale, 1));
  line-height: 1.1;
  color: inherit;
  max-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  opacity: 0;
  transition: max-width .14s ease, opacity .14s ease;
}
[data-slot~="is-current"] [data-slot="ds-stepper-label"],
[data-slot~="ds-stepper-step"]:hover [data-slot="ds-stepper-label"],
[data-slot~="ds-stepper-step"]:focus-visible [data-slot="ds-stepper-label"] {
  max-width: 16ch;
  opacity: 1;
}
[data-slot~="is-current"] {
  background: var(--paper-2);
  border-color: var(--hairline);
  color: var(--ink);
}

/* The terminal Knowledge check step reads as the sequence end — give its label a
   touch more room when revealed since "Knowledge check" is longer. */
[data-slot~="is-check"][data-slot~="is-current"] [data-slot="ds-stepper-label"],
[data-slot~="is-check"]:hover [data-slot="ds-stepper-label"],
[data-slot~="is-check"]:focus-visible [data-slot="ds-stepper-label"] {
  max-width: 20ch;
}

/* --------------------------------------------------------------------------
   Mobile (<=640px) — the stepper wraps gracefully without breaking the header.
   The overview link drops onto its own row above a full-width scrollable track,
   and step hit areas stay >=40px.
   -------------------------------------------------------------------------- */
@media (max-width: 640px) {
  [data-slot="ds-stepper"] {
    flex-wrap: wrap;
    gap: 8px;
    padding: 8px 14px;
  }
  [data-slot="ds-stepper-overview"] {
    border-right: 0;
    border-bottom: 1px solid var(--hairline);
    width: 100%;
    padding: 4px 0;
    min-height: 36px;
  }
  [data-slot="ds-stepper-track"] {
    width: 100%;
    flex: 1 1 100%;
  }
}

/* ===== PORTAL-R-027 — floating-window chrome (central primitive) =====
   Consumed by the shell's R-026 manager AND available to remotes (the
   helpdesk FloatingWindow/.portal-pin-layer pattern migrates to this at its
   next touch — see PORTAL-R-027). Paper card on the letterbox canvas, ink
   border, restrained shadow, mono titlebar label; baobab red reserved for
   the close control's hover/active only. Every color here is a DS token —
   dark-canvas compatibility (R-007) is automatic. */
.ds-window{position:fixed;left:0;top:0;transform:translate(var(--win-x, 0px), var(--win-y, 0px));width:var(--win-w, 340px);height:var(--win-h, 260px);z-index:calc(80 + var(--win-z, 0));background:var(--paper);border:1px solid var(--ink);box-shadow:0 18px 44px -12px rgba(14,14,12,0.35);display:flex;flex-direction:column;overflow:hidden}
.ds-window[hidden]{display:none}
.ds-window--standard{background:var(--paper)}
.ds-window--note{background:var(--paper-2)}
.ds-window--frame{border-color:var(--ink)}
.ds-window--transient{box-shadow:0 12px 30px -10px rgba(14,14,12,0.3)}
.ds-window--auto{height:auto;max-height:calc(100vh - 5rem)}
.ds-window-titlebar{display:flex;align-items:center;gap:4px;padding:6px 8px;background:var(--ink);color:var(--paper);cursor:grab;flex:0 0 auto;touch-action:none}
.ds-window-titlebar:active{cursor:grabbing}
.ds-window-title{font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.1em;text-transform:uppercase;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-window-spacer{flex:1}
.ds-window-back,.ds-window-pin,.ds-window-popout,.ds-window-close,.ds-window-minimize{border:0;background:transparent;color:var(--paper);cursor:pointer;width:22px;height:22px;display:grid;place-items:center;border-radius:3px;font-size:13px;line-height:1;flex:0 0 auto}
.ds-window-back:hover,.ds-window-pin:hover,.ds-window-popout:hover,.ds-window-minimize:hover{background:rgba(250,250,246,0.15)}
.ds-window-pin[aria-pressed="true"],.ds-window-minimize[aria-pressed="true"]{color:var(--baobab)}
.ds-window-close:hover{background:var(--baobab);color:var(--paper)}
.ds-window-body{flex:1;overflow:auto;padding:10px;font-size:calc(12.5px * var(--fs-scale, 1));color:var(--ink)}
.ds-window--frame .ds-window-body{padding:0;overflow:hidden}
.ds-window-resize{position:absolute;right:0;bottom:0;width:16px;height:16px;cursor:nwse-resize;background:linear-gradient(135deg, transparent 50%, var(--ink-mute) 50%)}

/* ===== UNION MERGE 2026-07-07: main-line central DS (datagrid, drilldown, workbench density, ds-range, fragment-topbar) appended after the deployed-line file (ds-window/menu/link-row/sf blocks). Last-rule-wins; shared classes take the main-line definition. Proper de-duplication tracked as DS debt. ===== */

/* MMD Portal — components. All classes here must appear in design-system.manifest.json */

/* ===== Cards ===== */
.card{background:var(--paper);border:1px solid var(--hairline);border-radius:4px;padding:32px;display:flex;flex-direction:column;gap:14px}
.card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:20px;margin-top:32px}
.card-title{font-family:var(--font-display);font-style:italic;font-weight:700;font-size:22px;line-height:1.15;letter-spacing:-0.015em;color:var(--ink);margin:0}
.card-body{font-family:var(--font-ui);font-weight:500;font-size:14.5px;line-height:1.55;color:var(--ink-soft);margin:0}
.card-cta{margin-top:auto;padding-top:10px}

/* ===== Buttons ===== */
.ds-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:11px 18px;border-radius:4px;font-family:var(--font-ui);font-weight:600;font-size:12.5px;letter-spacing:0.04em;cursor:pointer;transition:background 0.14s ease, color 0.14s ease, border-color 0.14s ease;text-decoration:none;border:1px solid transparent;line-height:1;white-space:nowrap;text-transform:uppercase}
.ds-button-primary{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.ds-button-primary:hover{background:var(--baobab);border-color:var(--baobab);color:var(--baobab-on, var(--paper))}
.ds-button-secondary{background:transparent;color:var(--ink);border-color:var(--ink)}
.ds-button-secondary:hover{background:var(--ink);color:var(--paper)}
/* Destructive-secondary weight (2026-07-28) -- ds-button-danger was already
   referenced by several TA step dialogs (reject/return/no-hire controls)
   with no matching rule anywhere in this file, so those buttons silently
   rendered as plain unstyled buttons. Same structure as ds-button-secondary
   (transparent, outlined, inverts solid on hover) with baobab red standing
   in for ink -- the same token .ds-menu-item-danger already uses for
   destructive semantics, never a new color. */
.ds-button-danger{background:transparent;color:var(--baobab);border-color:var(--baobab)}
.ds-button-danger:hover{background:var(--baobab);color:var(--paper)}
.ds-button-on-dark-primary{background:var(--paper);color:var(--ink);border-color:var(--paper)}
.ds-button-on-dark-primary:hover{background:var(--baobab);color:var(--paper);border-color:var(--baobab)}
.ds-button-on-dark-ghost{background:transparent;color:var(--paper);border-color:var(--paper)}
.ds-button-on-dark-ghost:hover{background:var(--paper);color:var(--ink)}
.ds-button:focus-visible{outline:2px solid var(--baobab);outline-offset:4px}
.ds-button:disabled,.ds-button-disabled,.ds-button.ds-button-disabled{opacity:0.45;cursor:not-allowed;pointer-events:none;background:var(--paper-2);color:var(--ink-mute);border-color:var(--hairline)}
.ds-button-primary:disabled,.ds-button-primary.ds-button-disabled,.ds-button-primary:disabled:hover,.ds-button-primary.ds-button-disabled:hover{background:var(--paper-2);color:var(--ink-mute);border-color:var(--hairline)}
.ds-button-secondary:disabled,.ds-button-secondary.ds-button-disabled,.ds-button-secondary:disabled:hover,.ds-button-secondary.ds-button-disabled:hover{background:var(--paper-2);color:var(--ink-mute);border-color:var(--hairline)}

/* ===== Forms ===== */
.ds-form{display:flex;flex-direction:column;gap:32px;margin-top:40px}
.ds-fieldset{background:var(--paper);border:1px solid var(--hairline);border-radius:4px;padding:28px 32px;display:flex;flex-direction:column;gap:18px;margin:0}
.ds-legend{font-family:var(--font-mono);font-weight:500;font-size:11px;letter-spacing:0.16em;text-transform:uppercase;color:var(--ink-mute);padding:0 6px;margin-left:-6px}
.ds-field{display:flex;flex-direction:column;gap:6px}
.ds-field-row-2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.ds-label{font-family:var(--font-ui);font-weight:600;font-size:12px;letter-spacing:0.04em;color:var(--ink);text-transform:uppercase}
.ds-input,
.ds-select,
.ds-textarea{font-family:var(--font-ui);font-weight:500;font-size:14.5px;line-height:1.4;color:var(--ink);background:var(--paper-2);border:1px solid var(--hairline);border-radius:3px;padding:10px 12px;width:100%;transition:border-color 0.14s ease, background 0.14s ease}
.ds-input:hover,
.ds-select:hover,
.ds-textarea:hover{border-color:var(--ink-mute)}
.ds-input:focus,
.ds-select:focus,
.ds-textarea:focus{outline:none;border-color:var(--baobab);background:var(--paper)}
.ds-textarea{min-height:96px;resize:vertical;font-family:var(--font-ui)}
.ds-hint{font-family:var(--font-ui);font-weight:500;font-size:12px;color:var(--ink-mute)}
.ds-field-hidden{display:none}
.ds-actions{display:flex;flex-wrap:wrap;gap:12px;padding-top:8px}

@media (max-width:640px){
  .ds-field-row-2{grid-template-columns:1fr}
  .ds-fieldset{padding:20px}
}

/* ===== Review screen blocks ===== */
.ds-review-block{background:var(--paper);border:1px solid var(--hairline);border-radius:4px;padding:28px 32px;display:flex;flex-direction:column;gap:14px}
.ds-review-grid{display:grid;grid-template-columns:1.4fr 1fr;gap:24px;margin-top:40px;align-items:start}
.ds-review-field{display:flex;flex-direction:column;gap:4px;padding:8px 0;border-bottom:1px solid var(--hairline)}
.ds-review-field:last-child{border-bottom:0}
.ds-review-label{font-family:var(--font-mono);font-weight:500;font-size:10.5px;letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute)}
.ds-review-value{font-family:var(--font-ui);font-weight:500;font-size:15px;color:var(--ink)}
.ds-review-aside{display:flex;flex-direction:column;gap:20px;position:sticky;top:96px}

@media (max-width:880px){
  .ds-review-grid{grid-template-columns:1fr}
  .ds-review-aside{position:static}
}

/* ===== Records table — used on landing for "open tasks" ===== */
.ds-records{width:100%;border-collapse:collapse;margin-top:24px}
.ds-records td{padding:18px 14px;border-bottom:1px solid var(--hairline);vertical-align:middle}
.ds-records-id{width:120px}
.ds-records-title{font-family:var(--font-display);font-weight:700;font-size:16px;letter-spacing:-0.015em;line-height:1.2;color:var(--ink)}
.ds-records-sub{display:block;margin-top:5px;color:var(--ink-mute);font-size:12.5px;line-height:1.45}
.ds-table-section{background:transparent;border:0;border-top:1px solid var(--hairline);border-radius:0;margin-top:18px}
.ds-table-header{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:13px 16px;border-bottom:1px solid var(--hairline);flex-wrap:wrap;row-gap:10px}
.ds-table-title{font-family:var(--font-display);font-weight:700;font-size:15px;letter-spacing:-0.01em;line-height:1.2;color:var(--ink);margin:0}
.ds-filterbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:24px}
.ds-filter-chip{font-family:var(--font-mono);font-weight:500;font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute);background:transparent;border:1px solid var(--hairline);border-radius:2px;padding:7px 10px;cursor:pointer}
.ds-filter-chip:hover,
.ds-filter-chip-active{color:var(--paper);background:var(--ink);border-color:var(--ink)}
.ds-records-compact{width:100%;border-collapse:collapse}
.ds-records-compact td{padding:10px 12px;border-bottom:1px solid var(--hairline);vertical-align:middle}
.ds-records-compact tr:last-child td{border-bottom:0}
.ds-records-compact .ds-records-id{width:76px}
/* Minor fix (round-4 BA review, 2026-07-31): the plain (non-sticky)
   .ds-records-compact variant had NO header-cell padding rule at all --
   <th> fell back to the browser default (near-zero), so two adjacent
   nowrap numeric headers (.ds-mono-num, e.g. sales-gp's "COST" next to
   "MARGIN PCT") rendered with no visible gap between them ("COSTMARGIN
   PCT"). .ds-records-compact-sticky already had the correct header
   styling -- this brings the plain variant to the same baseline. */
.ds-records-compact thead th{padding:8px 12px;text-align:left;border-bottom:1px solid var(--ink);font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.1em;text-transform:uppercase;color:var(--ink-mute)}
.ds-records-compact thead th.ds-mono-num{text-align:right}
.ds-empty-row{padding:14px 16px;color:var(--ink-mute);font-family:var(--font-ui);font-weight:500;font-size:13px}

/* ===== Embedded task surface ===== */
.ds-embed-frame{display:block;width:100%;height:calc(100vh - 56px);min-height:720px;border:0;background:var(--paper-2)}
.ds-modal-backdrop{position:fixed;inset:0;background:var(--paper-2);display:flex;align-items:stretch;justify-content:stretch;padding:0;z-index:1000}
.ds-modal{background:var(--paper-2);border:0;border-radius:0;width:100%;height:100vh;display:flex;flex-direction:column;box-shadow:none}
.ds-modal-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:12px 18px;border-bottom:0;background:var(--ink);color:var(--paper)}
.ds-modal-header .eyebrow,
.ds-modal-header .ds-table-title{color:var(--paper)}
.ds-modal-body{padding:0;overflow:hidden;flex:1}
.ds-modal .ds-embed-frame{height:100%;min-height:0}
/* ===== Modal scrollable form body (design-system ratchet: no per-component
   <style jsx> for this recurring pattern -- a scrollable, padded, vertically
   stacked form area inside a ds-modal-body, e.g. an H2R create/entry-step
   drawer). Consume directly; do not re-declare locally. ===== */
.ds-modal-body-form{overflow-y:auto;overflow-x:hidden;padding:20px;display:flex;flex-direction:column;gap:18px}
.ds-actions-end{justify-content:flex-end}
.ds-hint-error{color:var(--baobab)}
.mmd-course-content{font-family:var(--font-ui)!important;background:var(--paper-2)!important;color:var(--ink)!important}
.mmd-course-content h1,
.mmd-course-content h2,
.mmd-course-content h3,
.mmd-course-content .brand{font-family:var(--font-display)!important;color:var(--ink)!important;letter-spacing:0!important}
.mmd-course-content p,
.mmd-course-content li,
.mmd-course-content button{font-family:var(--font-ui)!important}
.mmd-course-content .topbar,
.mmd-course-content .progress-fill{background:var(--baobab)!important}
.mmd-course-content .topbar{height:6px!important}
.mmd-course-content header{display:none!important}
.mmd-course-content main{max-width:none!important;width:100%!important;min-height:100vh!important;margin:0!important;padding:0!important}
.mmd-course-content .card{width:100%!important;min-height:0!important;margin:0!important;border:0!important;box-shadow:none!important;border-radius:0!important;background:var(--paper-2)!important;display:block!important;gap:0!important;overflow:visible!important}
.mmd-course-content .slide{max-width:none!important;width:100%!important;margin:0!important;padding:clamp(20px,3.4vw,42px)!important;border:0!important;gap:0!important}
.mmd-course-content .slide-illustration{margin:0 0 18px!important}
.mmd-course-content .slide-illustration svg{width:96px!important;height:96px!important}
.mmd-course-content .slide:has(.quiz),
.mmd-course-content .slide:has(.quiz-card),
.mmd-course-content .slide:has(.question),
.mmd-course-content .slide:has(.question-card),
.mmd-course-content .slide:has([class*="quiz"]),
.mmd-course-content .slide:has([class*="question"]){padding-top:clamp(16px,2.5vw,30px)!important}
.mmd-course-content .slide:has(.quiz) .slide-illustration,
.mmd-course-content .slide:has(.quiz-card) .slide-illustration,
.mmd-course-content .slide:has(.question) .slide-illustration,
.mmd-course-content .slide:has(.question-card) .slide-illustration,
.mmd-course-content .slide:has([class*="quiz"]) .slide-illustration,
.mmd-course-content .slide:has([class*="question"]) .slide-illustration{display:none!important}
.mmd-course-content .slide:has(.quiz) h1,
.mmd-course-content .slide:has(.quiz-card) h1,
.mmd-course-content .slide:has(.question) h1,
.mmd-course-content .slide:has(.question-card) h1,
.mmd-course-content .slide:has([class*="quiz"]) h1,
.mmd-course-content .slide:has([class*="question"]) h1{margin-bottom:16px!important}
.mmd-course-content .quiz,
.mmd-course-content .quiz-card,
.mmd-course-content .question,
.mmd-course-content .question-card,
.mmd-course-content [class*="quiz"],
.mmd-course-content [class*="question"]{margin-top:0!important;padding-top:0!important}
.mmd-course-content .answers,
.mmd-course-content .options,
.mmd-course-content .quiz-options{margin-top:14px!important}
.mmd-course-content header,
.mmd-course-content .lesson,
.mmd-course-content .slide,
.mmd-course-content .quiz-option{background:var(--paper-2)!important;border-color:var(--hairline)!important}
.mmd-course-content .callout,
.mmd-course-content .score-card{background:var(--paper-3)!important;border-color:var(--hairline)!important;color:var(--ink)!important}

/* ===== Mono + tag ===== */
.ds-mono{font-family:var(--font-mono);font-weight:500;font-size:11.5px;letter-spacing:0.06em;color:var(--ink-soft)}
.ds-mono-hash{color:var(--baobab);margin-right:1px}
.ds-tag{display:inline-block;font-family:var(--font-mono);font-weight:500;font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px;padding:3px 7px}

/* ===== Notice strip ===== */
.ds-notice{background:var(--paper);border-top:1px solid var(--hairline);border-bottom:1px solid var(--hairline);padding:20px 24px;margin:32px 0;display:flex;gap:18px;align-items:stretch;border-radius:4px}
.ds-notice-rule{width:3px;background:var(--baobab);align-self:stretch;border-radius:1px}
.ds-notice-label{font-family:var(--font-mono);font-weight:500;font-size:10px;letter-spacing:0.16em;text-transform:uppercase;color:var(--baobab);display:block;margin-bottom:5px}
.ds-notice-text{flex:1;font-family:var(--font-ui);font-weight:500;font-size:14px;color:var(--ink-soft)}

/* =====================================================================   MMD LEARNING (LMS) — premium redesign block. Editorial Industrial Letterbox.
   Self-contained: targets the learning remote's data-slots + classes. Tokens
   only (no new fonts/colors). Authored 2026-06-21 from a 3-critic synthesis.
   ============================================================================ */

/* --- Home page shell ------------------------------------------------------- */
.mmd-course-content,
.ds-learning-page { color: var(--ink); }
.ds-learning-page { max-width: 1180px; margin: 0 auto; padding: 34px 0 64px; }
.ds-learning-heading { margin: 0; font-family: var(--font-display); font-weight: 500; font-size: clamp(38px, 4.6vw, 62px); line-height: 0.98; letter-spacing: -0.02em; }
.ds-learning-heading a { color: inherit; text-decoration: none; }
.ds-learning-heading em { color: var(--baobab); font-style: italic; }
.ds-learning-page .lede { max-width: 64ch; margin: 16px 0 0; color: var(--ink-soft); font-size: 15px; line-height: 1.62; font-style: normal; }
.ds-empty-row { padding: 22px; border: 1px solid var(--hairline); color: var(--ink-mute); font-size: 14px; background: var(--paper); }

/* --- Resume hero card ------------------------------------------------------ */
[data-slot="ds-resume"] {
  display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 6px 28px;
  margin: 26px 0 30px; padding: 22px 26px; background: var(--paper);
  border: 1px solid var(--hairline); border-left: 3px solid var(--baobab);
  text-decoration: none; color: var(--ink); transition: border-color .15s ease, transform .15s ease;
}
[data-slot="ds-resume"]:hover { border-color: var(--ink); transform: translateY(-1px); }
[data-slot="ds-resume-eyebrow"] { grid-column: 1; font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-resume-title"] { grid-column: 1; font-family: var(--font-display); font-weight: 500; font-size: clamp(20px, 2.2vw, 27px); line-height: 1.08; margin-top: 3px; }
[data-slot="ds-resume-meta"] { grid-column: 1; font-size: 13px; color: var(--ink-soft); margin-top: 4px; }
[data-slot="ds-resume-meter"] { grid-column: 1; display: block; margin-top: 12px; max-width: 360px; }
[data-slot="ds-resume-cta"] { grid-column: 2; grid-row: 1 / span 4; align-self: center; font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--paper); background: var(--ink); padding: 12px 20px; white-space: nowrap; transition: background .15s ease; }
[data-slot="ds-resume"]:hover [data-slot="ds-resume-cta"] { background: var(--baobab); }

/* --- Filter chips ---------------------------------------------------------- */
.ds-filterbar { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0 18px; padding-bottom: 16px; border-bottom: 1px solid var(--hairline); }
.ds-filter-chip { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-mute); background: transparent; border: 1px solid var(--hairline); padding: 7px 13px; text-decoration: none; transition: all .12s ease; }
.ds-filter-chip:hover { color: var(--ink); border-color: var(--ink-mute); }
.ds-filter-chip-active { color: var(--paper); background: var(--ink); border-color: var(--ink); }

/* --- Section header (catalogue) ------------------------------------------- */
.ds-table-section { margin-top: 6px; }
.ds-table-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 14px; }
.eyebrow, [data-slot="course-kicker"] { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-mute); display: block; }
.ds-table-title, [data-slot="ds-table-title"] { font-family: var(--font-display); font-weight: 500; font-size: clamp(19px, 2vw, 24px); line-height: 1.1; margin: 3px 0 0; }

/* --- Catalogue: course cards (was a table) -------------------------------- */
[data-slot="ds-course-grid"] { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
[data-slot~="ds-course-card"] {
  display: grid; grid-template-rows: auto 1fr auto; gap: 10px; min-height: 148px;
  padding: 20px 22px; background: var(--paper); border: 1px solid var(--hairline);
  text-decoration: none; color: var(--ink); position: relative; transition: border-color .15s ease, transform .15s ease;
}
[data-slot~="ds-course-card"]::after { content: "→"; position: absolute; right: 20px; bottom: 18px; font-size: 15px; color: var(--ink-faint); opacity: 0; transform: translateX(-4px); transition: all .15s ease; }
[data-slot~="ds-course-card"]:hover { border-color: var(--ink); transform: translateY(-2px); }
[data-slot~="ds-course-card"]:hover::after { opacity: 1; transform: translateX(0); color: var(--baobab); }
[data-slot~="is-progress"] { border-left: 3px solid var(--ink); }
[data-slot~="is-complete"] { border-left: 3px solid var(--baobab); }
[data-slot="ds-course-cat"] { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-course-name"] { font-family: var(--font-display); font-weight: 500; font-size: 21px; line-height: 1.14; align-self: start; }
[data-slot="ds-course-foot"] { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
[data-slot="ds-course-go"] { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.07em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot~="ds-course-card"]:hover [data-slot="ds-course-go"] { color: var(--ink); }
[data-slot="ds-course-fresh"] { font-size: 12.5px; color: var(--ink-faint); }
[data-slot="ds-course-stamp"] { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--baobab); }

/* --- Meter (proportional hairline) ---------------------------------------- */
[data-slot="ds-meter"] { display: inline-flex; align-items: center; gap: 10px; min-width: 0; }
[data-slot="ds-meter-track"] { position: relative; flex: 1 1 auto; min-width: 70px; height: 6px; background: var(--paper-2); border: 1px solid var(--hairline); overflow: hidden; }
[data-slot="ds-meter-fill"] { position: absolute; inset: 0 auto 0 0; height: 100%; background: var(--ink); width: 0; }
[data-slot="ds-meter-fill"][data-pct="0"] { width: 0; }
[data-slot="ds-meter-label"] { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.04em; color: var(--ink-mute); white-space: nowrap; }

/* Proportional fill width keyed on data-pct (markup buckets to nearest 5).
   No inline styles — these live in the central DS. Applies to any *-fill. */
[data-pct="0"]{width:0}
[data-pct="5"]{width:5%}   [data-pct="10"]{width:10%} [data-pct="15"]{width:15%}
[data-pct="20"]{width:20%} [data-pct="25"]{width:25%} [data-pct="30"]{width:30%}
[data-pct="35"]{width:35%} [data-pct="40"]{width:40%} [data-pct="45"]{width:45%}
[data-pct="50"]{width:50%} [data-pct="55"]{width:55%} [data-pct="60"]{width:60%}
[data-pct="65"]{width:65%} [data-pct="70"]{width:70%} [data-pct="75"]{width:75%}
[data-pct="80"]{width:80%} [data-pct="85"]{width:85%} [data-pct="90"]{width:90%}
[data-pct="95"]{width:95%} [data-pct="100"]{width:100%}

/* =====================================================================   COURSE + ACTIVITY — dark letterbox frame + body
   ============================================================================ */
[data-slot="ds-modal"] { display: flex; flex-direction: column; min-height: 100dvh; background: var(--paper); }
[data-slot="ds-modal-header"] {
  position: sticky; top: 0; z-index: 5; display: flex; align-items: center; justify-content: space-between; gap: 18px;
  padding: 14px 30px; background: var(--ink); color: var(--paper);
}
[data-slot="ds-modal-headline"] { min-width: 0; }
[data-slot="ds-modal-header"] [data-slot="course-kicker"] { color: color-mix(in srgb, var(--paper) 55%, transparent); }
[data-slot="ds-modal-crumb"] { color: color-mix(in srgb, var(--paper) 80%, transparent); text-decoration: none; }
[data-slot="ds-modal-crumb"]:hover { color: var(--paper); text-decoration: underline; }
[data-slot="ds-modal-header"] [data-slot="ds-table-title"] { color: var(--paper); font-size: clamp(15px, 1.6vw, 19px); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 52ch; }
[data-slot="ds-modal-header"] [data-slot="ds-actions"] { display: flex; align-items: center; gap: 8px; flex: none; }
[data-slot="ds-modal-body"] { flex: 1 1 auto; padding: 30px; }
[data-slot="ds-course-shell"] { max-width: 940px; margin: 0 auto; }

/* progress rule on course overview */
[data-slot="ds-progress"] { max-width: 520px; margin: 4px 0 20px; }
[data-slot="ds-progress-head"] { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 7px; }
[data-slot="ds-progress-goal"] { font-size: 13px; color: var(--ink-soft); }
[data-slot="ds-progress-label"] { font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.04em; color: var(--ink-mute); }
[data-slot="ds-progress-track"] { position: relative; height: 7px; background: var(--paper-2); border: 1px solid var(--hairline); overflow: hidden; }
[data-slot="ds-progress-fill"] { position: absolute; inset: 0 auto 0 0; height: 100%; background: var(--ink); width: 0; }

/* =====================================================================   COURSE SPINE — vertical timeline (was a table)
   ============================================================================ */
[data-slot="ds-spine"] { list-style: none; margin: 22px 0 0; padding: 0; position: relative; }
[data-slot="ds-spine"]::before { content: ""; position: absolute; left: 7px; top: 12px; bottom: 12px; width: 1px; background: var(--hairline); }
[data-slot~="ds-spine-step"] { position: relative; }
[data-slot="ds-spine-main"] {
  display: grid; grid-template-columns: 16px 40px 1fr auto; align-items: center; column-gap: 16px;
  padding: 15px 14px 15px 0; border-bottom: 1px solid var(--hairline); text-decoration: none; color: var(--ink);
  transition: background .12s ease;
}
[data-slot="ds-spine-main"]:hover { background: var(--paper); }
[data-slot="ds-spine-node"] { grid-column: 1; width: 14px; height: 14px; border-radius: 50%; background: var(--paper-2); border: 1px solid var(--ink-faint); box-shadow: 0 0 0 4px var(--paper); z-index: 1; }
[data-slot~="is-done"] [data-slot="ds-spine-node"] { background: var(--ink); border-color: var(--ink); }
[data-slot~="is-next"] [data-slot="ds-spine-node"] { background: var(--paper); border: 2px solid var(--baobab); }
[data-slot="ds-spine-num"] { grid-column: 2; font-family: var(--font-display); font-size: 22px; font-weight: 500; color: var(--ink-faint); line-height: 1; text-align: center; }
[data-slot~="is-next"] [data-slot="ds-spine-num"] { color: var(--ink); }
[data-slot~="is-done"] [data-slot="ds-spine-num"] { color: var(--ink-mute); }
[data-slot="ds-spine-text"] { grid-column: 3; min-width: 0; display: grid; gap: 2px; }
[data-slot="ds-spine-title"] { font-family: var(--font-display); font-weight: 500; font-size: 17px; line-height: 1.18; color: var(--ink); }
[data-slot="ds-spine-sum"] { font-size: 13px; color: var(--ink-mute); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
[data-slot="ds-spine-meta"] { grid-column: 4; display: flex; align-items: center; gap: 14px; flex: none; }
[data-slot~="ds-spine-state"] { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-spine-next"] { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--baobab); }
[data-slot="ds-spine-go"] { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-mute); opacity: 0; transition: opacity .12s ease; white-space: nowrap; }
[data-slot="ds-spine-main"]:hover [data-slot="ds-spine-go"] { opacity: 1; color: var(--ink); }
[data-slot="ds-spine-go"].is-primary { opacity: 1; color: var(--paper); background: var(--ink); padding: 8px 14px; }
[data-slot="ds-spine-main"]:hover [data-slot="ds-spine-go"].is-primary { background: var(--baobab); color: var(--paper); }

/* =====================================================================   ACTIVITY / LESSON — de-boxed editorial article
   ============================================================================ */
[data-slot="ds-activity"] { max-width: 720px; margin: 0 auto; }
[data-slot="ds-activity"] [data-slot="ds-table-header"] { display: block; margin-bottom: 6px; }
[data-slot="ds-activity-status"] { display: inline-block; margin-top: 10px; font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; padding: 5px 11px; border: 1px solid var(--hairline); color: var(--ink-mute); }
[data-slot~="ds-activity-status-quiz"] { color: var(--baobab); border-color: var(--baobab); background: var(--baobab-bg); }
[data-slot~="ds-activity-status-done"] { color: var(--ink); border-color: var(--ink); }
[data-slot="ds-activity-content"] { margin-top: 22px; font-size: 16px; line-height: 1.66; color: var(--ink-soft); border-top: 2px solid var(--baobab); padding-top: 22px; }
[data-slot="ds-activity-content"] > *:first-child { margin-top: 0; }
[data-slot="ds-activity-content"] p { margin: 0 0 16px; max-width: 64ch; }
[data-slot="ds-activity-content"] h2, [data-slot="ds-activity-content"] h3, [data-slot="ds-activity-content"] h4 { font-family: var(--font-display); font-weight: 500; color: var(--ink); line-height: 1.2; margin: 30px 0 10px; padding-top: 18px; border-top: 1px solid var(--hairline); }
[data-slot="ds-activity-content"] ul, [data-slot="ds-activity-content"] ol { margin: 0 0 16px; padding-left: 4px; list-style: none; }
[data-slot="ds-activity-content"] li { position: relative; padding-left: 20px; margin: 0 0 9px; max-width: 62ch; }
[data-slot="ds-activity-content"] li::before { content: ""; position: absolute; left: 2px; top: 9px; width: 5px; height: 5px; background: var(--baobab); }
[data-slot="ds-activity-content"] strong, [data-slot="ds-activity-content"] b { color: var(--ink); font-weight: 600; }
[data-slot="ds-activity-content"] blockquote { margin: 0 0 16px; padding-left: 16px; border-left: 2px solid var(--hairline); color: var(--ink-mute); font-style: italic; }
[data-slot="ds-figure"] { margin: 22px 0; padding: 22px; border: 1px solid var(--hairline); background: var(--paper); text-align: center; }
[data-slot="ds-figure"] svg { max-width: 100%; height: auto; }

/* activity banners */
[data-slot~="ds-activity-banner"] { margin: 18px 0; padding: 13px 16px; font-size: 14px; border: 1px solid var(--hairline); }
[data-slot~="ds-activity-banner-pass"] { border-left: 3px solid var(--baobab); color: var(--ink); background: var(--paper); }
[data-slot~="ds-activity-banner-fail"] { border-left: 3px solid var(--signal-amber); color: var(--ink); background: var(--signal-amber-bg); }

/* =====================================================================   KNOWLEDGE CHECK — hard dark section break (cinema bar feel)
   ============================================================================ */
.ds-quiz-form, [data-slot="ds-quiz"] { margin-top: 30px; }
[data-slot="ds-quiz-intro"] { background: var(--ink); color: var(--paper); padding: 20px 24px; margin: 0 0 4px; }
[data-slot="ds-quiz-intro-label"] { font-family: var(--font-display); font-style: italic; font-size: 22px; display: block; }
[data-slot="ds-quiz-intro"] p { margin: 6px 0 0; font-size: 13.5px; color: color-mix(in srgb, var(--paper) 75%, transparent); }
[data-slot="ds-quiz-question"] { border: 0; border-bottom: 1px solid var(--hairline); margin: 0; padding: 20px 0; }
[data-slot="ds-quiz-legend"] { font-family: var(--font-display); font-weight: 500; font-size: 17px; padding: 0; margin-bottom: 12px; }
[data-slot="ds-quiz-option"] { display: flex; align-items: center; gap: 11px; padding: 11px 14px; border: 1px solid var(--hairline); margin: 0 0 8px; cursor: pointer; transition: border-color .12s ease, background .12s ease; }
[data-slot="ds-quiz-option"]:hover { border-color: var(--ink-mute); background: var(--paper); }
[data-slot="ds-quiz-option"]:has(.ds-choice:checked) { border-color: var(--baobab); box-shadow: inset 3px 0 0 var(--baobab); }
[data-slot="ds-quiz-option"] .ds-choice { accent-color: var(--baobab); width: 16px; height: 16px; flex: none; }
[data-slot="ds-quiz-option-text"] { font-size: 14.5px; color: var(--ink); }

/* =====================================================================   ASSIGNMENT
   ============================================================================ */
.ds-assignment-form, [data-slot="ds-assignment"] { display: grid; gap: 10px; margin-top: 22px; }
[data-slot="ds-assignment-saved"] { padding: 16px 18px; background: var(--paper); border: 1px solid var(--hairline); border-left: 3px solid var(--baobab); margin-top: 18px; }
[data-slot="ds-assignment-saved"] blockquote { margin: 6px 0 0; font-size: 14.5px; line-height: 1.55; color: var(--ink-soft); }
.ds-textarea { width: 100%; font-family: var(--font-ui); font-size: 14.5px; line-height: 1.55; padding: 13px 15px; border: 1px solid var(--hairline); background: var(--paper); color: var(--ink); resize: vertical; }
.ds-textarea:focus { outline: none; border-color: var(--ink); }
.ds-field-hidden { display: none; }

/* =====================================================================   COMPLETION MOMENT — the reward
   ============================================================================ */
[data-slot="ds-complete"] { margin-top: 30px; padding: 34px 30px; background: var(--ink); color: var(--paper); text-align: center; display: grid; justify-items: center; gap: 8px; }
[data-slot="ds-complete-tick"] { display: inline-grid; place-items: center; width: 44px; height: 44px; border-radius: 50%; background: var(--baobab); color: var(--paper); font-size: 22px; line-height: 1; }
[data-slot="ds-complete-head"] { font-family: var(--font-display); font-style: italic; font-size: 30px; line-height: 1.05; margin-top: 6px; }
[data-slot="ds-complete-sub"] { font-size: 13.5px; color: color-mix(in srgb, var(--paper) 72%, transparent); }
[data-slot="ds-complete"] [data-slot="ds-actions"] { margin-top: 16px; }

/* =====================================================================   BUTTONS + actions (data-slot AND class forms) + tags
   ============================================================================ */
[data-slot="ds-actions"] { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 18px; }
.ds-button, [data-slot~="ds-button"] {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.05em; text-transform: uppercase;
  padding: 11px 18px; border: 1px solid var(--ink); background: var(--paper); color: var(--ink);
  text-decoration: none; cursor: pointer; transition: all .14s ease;
}
.ds-button:hover, [data-slot~="ds-button"]:hover { background: var(--paper-2); }
.ds-button-primary, [data-slot~="ds-button-primary"] { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.ds-button-primary:hover, [data-slot~="ds-button-primary"]:hover { background: var(--baobab); border-color: var(--baobab); }
.ds-button-secondary, [data-slot~="ds-button-secondary"], [data-slot~="ds-button-on-light"] { background: transparent; color: var(--ink); border-color: var(--hairline); }
.ds-button-secondary:hover, [data-slot~="ds-button-secondary"]:hover { border-color: var(--ink); background: transparent; }
[data-slot~="ds-button-on-dark-ghost"] { background: transparent; color: var(--paper); border-color: color-mix(in srgb, var(--paper) 35%, transparent); }
[data-slot~="ds-button-on-dark-ghost"]:hover { border-color: var(--paper); background: color-mix(in srgb, var(--paper) 8%, transparent); }
[data-slot~="ds-button-on-dark-primary"] { background: var(--paper); color: var(--ink); border-color: var(--paper); }
[data-slot~="ds-button-on-dark-primary"]:hover { background: var(--baobab); color: var(--paper); border-color: var(--baobab); }
[data-slot="ds-tag"] { display: inline-block; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--paper); border: 1px solid color-mix(in srgb, var(--paper) 30%, transparent); padding: 5px 10px; }
[data-slot="ds-records-sub"] { font-size: 13px; color: var(--ink-mute); }

/* embedded raw runtime frame (fallback only) */
[data-slot="ds-embed-frame"][hidden] { display: none; }
[data-slot="ds-embed-frame"] { margin-top: 18px; }

/* generated fallback course body */
[data-slot="course-body"] { max-width: 820px; margin: 0 auto; }
[data-slot="course-title"] { font-family: var(--font-display); font-weight: 500; font-size: 30px; margin: 4px 0 8px; }
[data-slot="course-summary"] { color: var(--ink-soft); font-size: 15px; margin: 0 0 20px; }
[data-slot="ds-records-compact"] { display: grid; gap: 8px; }

/* =====================================================================   RESPONSIVE — stacked, thumb-first
   ============================================================================ */
@media (max-width: 860px) {
  [data-slot="ds-course-grid"] { grid-template-columns: minmax(0, 1fr); }
  [data-slot="ds-resume"] { grid-template-columns: minmax(0,1fr); }
  [data-slot="ds-resume-cta"] { grid-column: 1; grid-row: auto; justify-self: start; margin-top: 14px; }
  [data-slot="ds-modal-header"] { flex-wrap: wrap; padding: 12px 18px; gap: 10px; }
  [data-slot="ds-modal-header"] [data-slot="ds-table-title"] { max-width: 100%; white-space: normal; }
  [data-slot="ds-modal-body"] { padding: 20px 16px; }
  [data-slot="ds-spine-main"] { grid-template-columns: 16px 1fr; grid-template-areas: "node text" "node meta"; row-gap: 8px; column-gap: 12px; }
  [data-slot="ds-spine-num"] { display: none; }
  [data-slot="ds-spine-text"] { grid-area: text; }
  [data-slot="ds-spine-sum"] { white-space: normal; }
  [data-slot="ds-spine-meta"] { grid-area: meta; justify-content: flex-start; }
  [data-slot="ds-spine-go"] { opacity: 1; }
  [data-slot="ds-activity-content"] p, [data-slot="ds-activity-content"] li { max-width: none; }
}
/* ===== end LMS redesign block ===== */
.ds-tag-open{color:var(--ink);border-color:var(--ink)}
.ds-tag-progress{color:var(--ink);border-color:var(--ink-mute)}
.ds-tag-waiting{color:var(--ink-mute);border-color:var(--ink-mute)}
.ds-tag-resolved{color:var(--ink-mute);border-color:var(--hairline)}
.ds-tag-closed{color:var(--ink-faint);border-color:var(--hairline)}
.ds-tag-error{color:var(--baobab);border-color:var(--baobab)}

/* === LMS v2 P2 block === */
/* ===================================================================   MMD LMS v2 — PHASE 2 (consumers) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Covers: R1 (course scroll), R2 (in-content pager), R6 (end page + cert CTA),
   R7 (home trophies).
   ========================================================================== */

/* --------------------------------------------------------------------------
   R1 — Course content must scroll (TC1.*)
   The course modal is a BOUNDED viewport box (height, not min-height) so its
   body can own the overflow; the header stays sticky at the top of that box.
   -------------------------------------------------------------------------- */
[data-slot="ds-modal"] {
  height: 100dvh;
  max-height: 100dvh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

[data-slot="ds-modal-header"] {
  position: sticky;
  top: 0;
  z-index: 2;
  flex: 0 0 auto;
}

[data-slot="ds-modal-body"] {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  -webkit-overflow-scrolling: touch;
}

/* --------------------------------------------------------------------------
   R2 — In-content navigation pager (TC2.*)
   A bottom prev/next pager rendered inside the activity, in addition to the
   sticky header prev/next. Real DB-ordered hrefs; first activity has no prev,
   the last content activity's next is the terminal knowledge check.
   -------------------------------------------------------------------------- */
[data-slot="ds-pager"] {
  display: flex;
  align-items: stretch;
  justify-content: space-between;
  gap: 0.75rem;
  margin-top: 2rem;
  padding-top: 1.25rem;
  border-top: 1px solid var(--hairline);
}

[data-slot="ds-pager-link"] {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  flex: 1 1 0;
  min-width: 0;
  padding: 0.7rem 0.9rem;
  border: 1px solid var(--hairline);
  border-radius: 0;
  text-decoration: none;
  color: var(--ink);
  background: var(--paper-2);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-pager-link"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, var(--paper-2));
}

[data-slot="ds-pager-link"][data-dir="next"] {
  text-align: right;
  align-items: flex-end;
}

[data-slot="ds-pager-dir"] {
  font-family: var(--font-mono);
  font-size: 0.66rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-pager-title"] {
  font-family: var(--font-ui);
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}

/* A disabled/absent slot (first activity has no prev) keeps the layout balanced. */
[data-slot="ds-pager-spacer"] {
  flex: 1 1 0;
  min-width: 0;
}

@media (max-width: 560px) {
  [data-slot="ds-pager"] {
    flex-direction: column;
  }
  [data-slot="ds-pager-link"][data-dir="next"] {
    text-align: left;
    align-items: flex-start;
  }
}

/* --------------------------------------------------------------------------
   R6 — End-of-course page + certificate (TC6.*)
   Shown only when isCourseComplete. Trophy mark, "Course complete", and the
   "Download certificate (PDF)" action.
   -------------------------------------------------------------------------- */
[data-slot="ds-end"] {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 1rem;
  max-width: 38rem;
  margin: 0 auto;
  padding: 3rem 1.5rem;
}

[data-slot="ds-end-trophy"] {
  width: 96px;
  height: 96px;
  display: block;
  color: var(--baobab);
}

[data-slot="ds-end-kicker"] {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--baobab);
}

[data-slot="ds-end-title"] {
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(2rem, 4vw, 2.9rem);
  line-height: 1.05;
  color: var(--ink);
  margin: 0;
}

[data-slot="ds-end-sub"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  color: var(--ink-soft);
  max-width: 30rem;
}

[data-slot="ds-end-course"] {
  font-family: var(--font-ui);
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--ink);
}

[data-slot="ds-end"] [data-slot="ds-actions"] {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  justify-content: center;
  margin-top: 0.5rem;
}

/* --------------------------------------------------------------------------
   R7 — Trophies on the home page (TC7.*)
   One trophy per completed course; empty state when none.
   -------------------------------------------------------------------------- */
[data-slot="ds-trophies"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
  gap: 1rem;
}

[data-slot="ds-trophy"] {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  padding: 1rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-trophy"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 55%, var(--paper-2));
}

[data-slot="ds-trophy-emblem"] {
  width: 56px;
  height: 56px;
  flex: 0 0 auto;
  display: block;
  color: var(--baobab);
}

[data-slot="ds-trophy-text"] {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  min-width: 0;
}

[data-slot="ds-trophy-cat"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-trophy-name"] {
  font-family: var(--font-ui);
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
}

[data-slot="ds-trophy-empty"] {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 1.25rem;
  border: 1px dashed var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
  color: var(--ink-mute);
  font-family: var(--font-ui);
  font-size: 0.95rem;
}

/* === LMS v2 P3 block === */
/* ===================================================================   MMD LMS v2 — PHASE 3 (catalogue + admin) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Covers: R9 (~N min estimate), R10 (categories + grouped catalogue),
   R11 (featured strip), R12 (required-for-you), R13 (admin page), R14 (covers).
   ========================================================================== */

/* --------------------------------------------------------------------------
   R14 — Course covers. A 1200x630 image (overviewfiles photo or generated
   Letterbox SVG) sat above the card body. object-fit:cover keeps the ratio.
   -------------------------------------------------------------------------- */
[data-slot="ds-cover"] {
  display: block;
  width: 100%;
  aspect-ratio: 1200 / 630;
  height: auto;
  object-fit: cover;
  background: var(--paper-2);
  border-bottom: 1px solid var(--hairline);
}

/* --------------------------------------------------------------------------
   R9 — "~N min" time-estimate badge.
   -------------------------------------------------------------------------- */
[data-slot="ds-est"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-soft);
  padding: 0.12rem 0.4rem;
  border: 1px solid var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   Course card with a cover (extends the P2 ds-course-card). The card becomes a
   vertical stack: cover on top, body (category + est, name, footer) below.
   -------------------------------------------------------------------------- */
[data-slot="ds-course-card"] {
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
}

[data-slot="ds-course-cover"] {
  display: block;
}

[data-slot="ds-course-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 0.95rem 1rem 1rem;
  flex: 1 1 auto;
}

[data-slot="ds-course-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

/* --------------------------------------------------------------------------
   R12 — Required for you. Top-of-page section; cards carry due-state styling.
   -------------------------------------------------------------------------- */
[data-slot="ds-required-grid"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: 1rem;
}

[data-slot="ds-required-card"] {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  overflow: hidden;
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-required-card"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 55%, var(--paper-2));
}

[data-slot="ds-required-card"].is-overdue {
  border-left: 3px solid var(--baobab);
}

[data-slot="ds-required-card"].is-soon {
  border-left: 3px solid var(--signal-amber);
}

[data-slot="ds-required-cover"] {
  display: block;
}

[data-slot="ds-required-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
  padding: 0.9rem 1rem 1rem;
}

[data-slot="ds-required-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

[data-slot="ds-required-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-required-flag"] {
  font-family: var(--font-mono);
  font-size: 0.6rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--baobab);
  padding: 0.1rem 0.4rem;
  border: 1px solid color-mix(in srgb, var(--baobab) 40%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, transparent);
}

[data-slot="ds-required-name"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  font-weight: 600;
  color: var(--ink);
}

[data-slot="ds-required-due"] {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
}

[data-slot="ds-required-due"].is-overdue {
  color: var(--baobab);
  font-weight: 600;
}

[data-slot="ds-required-due"].is-soon {
  color: color-mix(in srgb, var(--signal-amber) 80%, var(--ink));
  font-weight: 600;
}

[data-slot="ds-required-est"] {
  margin-top: 0.1rem;
}

/* --------------------------------------------------------------------------
   R11 — Featured strip. A grid of cover cards above the catalogue.
   -------------------------------------------------------------------------- */
[data-slot="ds-featured-grid"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: 1rem;
}

/* --------------------------------------------------------------------------
   R10 — Catalogue grouped by real category, with per-category headers.
   -------------------------------------------------------------------------- */
[data-slot="ds-cat-group"] {
  margin-top: 1.5rem;
}

[data-slot="ds-cat-group"]:first-child {
  margin-top: 0;
}

[data-slot="ds-cat-heading"] {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.3rem;
  color: var(--ink);
  margin: 0 0 0.75rem;
  padding-bottom: 0.4rem;
  border-bottom: 1px solid var(--hairline);
}

/* Resume hero with a cover thumbnail alongside the text. */
[data-slot="ds-resume"] {
  display: grid;
  grid-template-columns: minmax(0, 14rem) 1fr;
  gap: 1.25rem;
  align-items: stretch;
}

[data-slot="ds-resume-cover"] {
  display: block;
  overflow: hidden;
  border: 1px solid var(--hairline);
}

[data-slot="ds-resume-text"] {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  min-width: 0;
}

@media (max-width: 640px) {
  [data-slot="ds-resume"] {
    grid-template-columns: 1fr;
  }
}

/* --------------------------------------------------------------------------
   R13 — Admin page. Course rows with editable controls; 403 state.
   -------------------------------------------------------------------------- */
[data-slot="ds-admin-list"] {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}

[data-slot="ds-admin-course"] {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  padding: 1.1rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
}

[data-slot="ds-admin-course-head"] {
  display: grid;
  grid-template-columns: minmax(0, 10rem) 1fr;
  gap: 1rem;
  align-items: center;
}

[data-slot="ds-admin-cover"] {
  display: block;
  width: 100%;
  aspect-ratio: 1200 / 630;
  height: auto;
  object-fit: cover;
  border: 1px solid var(--hairline);
  background: var(--paper);
}

[data-slot="ds-admin-course-id"] {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
}

[data-slot="ds-admin-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-admin-title"] {
  font-family: var(--font-ui);
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--ink);
  margin: 0;
}

[data-slot="ds-admin-meta-line"] {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  color: var(--ink-mute);
}

[data-slot="ds-admin-controls"] {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
  gap: 0.85rem;
  padding-top: 0.85rem;
  border-top: 1px solid var(--hairline);
}

[data-slot="ds-admin-form"] {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 0.75rem;
  border: 1px solid var(--hairline);
  background: color-mix(in srgb, var(--paper) 60%, var(--paper-2));
}

[data-slot="ds-admin-field"] {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

[data-slot="ds-admin-label"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-soft);
}

[data-slot="ds-admin-banner"] {
  padding: 0.7rem 0.95rem;
  border: 1px solid var(--hairline);
  font-family: var(--font-ui);
  font-size: 0.9rem;
  margin-bottom: 1rem;
}

[data-slot="ds-admin-banner"].ds-admin-banner-ok {
  border-color: color-mix(in srgb, var(--signal-grass) 45%, var(--hairline));
  background: color-mix(in srgb, var(--signal-grass-bg) 60%, var(--paper-2));
  color: color-mix(in srgb, var(--signal-grass) 70%, var(--ink));
}

[data-slot="ds-admin-banner"].ds-admin-banner-err {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, var(--paper-2));
  color: var(--baobab);
}

[data-slot="ds-admin-403"] {
  display: flex;
  flex-direction: column;
  gap: 0.85rem;
  max-width: 34rem;
  padding: 2rem 1.5rem;
  border: 1px dashed var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
}

[data-slot="ds-admin-403-kicker"] {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--baobab);
}

@media (max-width: 560px) {
  [data-slot="ds-admin-course-head"] {
    grid-template-columns: 1fr;
  }
}

/* === LMS v2 P4 block === */
/* ===================================================================   MMD LMS v2 — PHASE 4 (home UX polish) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Scope: P4 redesigns "Required for you" from an oversized cover hero into a
   COMPACT horizontal alert list (thumb · title + badge + due + ~min · CTA).
   The data-slot values carry state suffixes (e.g. "ds-required-row is-overdue"),
   so selectors use the whitespace-token match [data-slot~="…"].
   ========================================================================== */

/* --------------------------------------------------------------------------
   R12 (P4) — Required for you as a compact alert list. Each item is a tight
   horizontal row: small cover thumbnail (left) → title + Mandatory + due + ~min
   (centre, grows) → Continue/Start primary button (right). Rows stack.
   -------------------------------------------------------------------------- */
[data-slot~="ds-required-list"] {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

[data-slot~="ds-required-row"] {
  display: grid;
  grid-template-columns: 140px 1fr auto;
  align-items: center;
  gap: 1rem;
  padding: 0.7rem 0.85rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot~="ds-required-row"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 45%, var(--paper-2));
}

/* Due-state left rail — overdue (baobab) and due-soon (amber) only. */
[data-slot~="ds-required-row"][data-slot~="is-overdue"] {
  border-left: 3px solid var(--baobab);
}

[data-slot~="ds-required-row"][data-slot~="is-soon"] {
  border-left: 3px solid var(--signal-amber);
}

/* Small fixed-ratio cover thumbnail on the left. */
[data-slot~="ds-required-thumb"] {
  display: block;
  width: 140px;
  overflow: hidden;
  border: 1px solid var(--hairline);
}

[data-slot~="ds-required-thumb"] [data-slot="ds-cover"] {
  border-bottom: none;
}

[data-slot~="ds-required-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
}

[data-slot~="ds-required-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

[data-slot~="ds-required-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot~="ds-required-flag"] {
  font-family: var(--font-mono);
  font-size: 0.58rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--baobab);
  padding: 0.08rem 0.36rem;
  border: 1px solid color-mix(in srgb, var(--baobab) 40%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, transparent);
}

[data-slot~="ds-required-name"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.2;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
}

[data-slot~="ds-required-facts"] {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  flex-wrap: wrap;
}

[data-slot~="ds-required-due"] {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
}

[data-slot~="ds-required-due"][data-slot~="is-overdue"] {
  color: var(--baobab);
  font-weight: 600;
}

[data-slot~="ds-required-due"][data-slot~="is-soon"] {
  color: color-mix(in srgb, var(--signal-amber) 80%, var(--ink));
  font-weight: 600;
}

/* Continue/Start primary button on the right of each row. */
[data-slot~="ds-required-cta"] {
  flex: 0 0 auto;
  justify-self: end;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--paper);
  background: var(--ink);
  padding: 0.55rem 0.95rem;
  white-space: nowrap;
  transition: background 120ms ease;
}

[data-slot~="ds-required-row"]:hover [data-slot~="ds-required-cta"] {
  background: var(--baobab);
}

/* Mobile: drop the CTA onto its own line, keep thumb + text side by side. */
@media (max-width: 560px) {
  [data-slot~="ds-required-row"] {
    grid-template-columns: 96px 1fr;
    grid-template-areas:
      "thumb body"
      "cta   cta";
    row-gap: 0.6rem;
  }
  [data-slot~="ds-required-thumb"] {
    grid-area: thumb;
    width: 96px;
  }
  [data-slot~="ds-required-body"] {
    grid-area: body;
  }
  [data-slot~="ds-required-cta"] {
    grid-area: cta;
    justify-self: stretch;
    text-align: center;
  }
}

/* === LMS v2 P5 block === */
/* ===================================================================   MMD LMS v2 — PHASE 5 (navigation + button + usability pass) central
   design-system additions. Authored by the learning remote; batched by the
   orchestrator into the shell's public/_design-system/components.css.

   Tokens ONLY — NO hardcoded hex, NO new colours, NO new fonts. All translucency
   via color-mix() over the EXISTING central tokens. This is a USABILITY pass
   inside the existing "Editorial Letterbox" aesthetic — it does NOT change the
   colour scheme, fonts, covers, sections, or the concept of the app.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Fixes (all external-UX-critique validated, navigation/buttons/usability only):
   1. STEP-COUNT — markup-only (route.ts). No CSS here.
   2. BUTTON CLUTTER / HIERARCHY in the dark course/activity header:
      - breadcrumb trail (Learning / <course> / <step>) at top-left,
      - progress rendered as a plain label/meter (NOT a bordered pill),
      - Next is the single filled PRIMARY, Prev a quiet ghost secondary.
   3. ONE obvious next action on the home, reachable on mobile (390px).
   4. MOBILE TAP TARGETS — all nav/action buttons >=44px tall, single line.
   5. COWORK pill overlap — reserve bottom/right gutter on the LMS surfaces so
      the floating "Ask Cowork" launcher never covers actions or text.
   ========================================================================== */

/* --------------------------------------------------------------------------
   #2 — Dark header breadcrumb trail. "All courses" and "Course overview" were
   competing bordered buttons; they are NAV LEVELS, not actions, so they become
   a quiet breadcrumb in the headline (top-left). Inherits the dark-header
   --paper text already set on [data-slot="ds-modal-header"].
   -------------------------------------------------------------------------- */
[data-slot="ds-modal-crumbs"] {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  line-height: 1.2;
  min-width: 0;
}

[data-slot="ds-modal-crumbs"] [data-slot="ds-modal-crumb"] {
  color: color-mix(in srgb, var(--paper) 72%, transparent);
  text-decoration: none;
  max-width: 24ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

[data-slot="ds-modal-crumbs"] [data-slot="ds-modal-crumb"]:hover {
  color: var(--paper);
  text-decoration: underline;
  text-underline-offset: 3px;
}

[data-slot="ds-crumb-sep"] {
  color: color-mix(in srgb, var(--paper) 40%, transparent);
}

[data-slot="ds-crumb-current"] {
  color: color-mix(in srgb, var(--paper) 92%, transparent);
  font-weight: 700;
  max-width: 30ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* #2 — Progress as a PLAIN label, not a bordered button-looking pill. No border,
   no fill box — just a quiet mono reading on the dark bar, set apart from the
   action buttons by spacing. */
[data-slot="ds-modal-progress"] {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--paper) 70%, transparent);
  white-space: nowrap;
  padding-right: 6px;
  border: 0;
  background: none;
}

/* #2 + #4 — Header action buttons: Next is the single filled PRIMARY, Prev the
   quiet ghost. Give both a comfortable >=44px tap target while keeping the
   compact letterbox look. Header buttons stay on a single line. */
[data-slot="ds-modal-header"] [data-slot~="ds-button"] {
  min-height: 40px;
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   #4 — MOBILE TAP TARGETS. On touch-width screens every nav/action button must
   be >=44px tall, single-line, and not clustered so tightly that they are easy
   to mis-tap. Applies to the dark header actions, the in-content pager, the
   spine "go" actions, and the home CTAs.
   -------------------------------------------------------------------------- */
@media (max-width: 640px) {
  /* Header actions: full comfortable height, sensible spacing, Next stays
     dominant. They wrap onto their own row (shell already sets flex-wrap). */
  [data-slot="ds-modal-header"] [data-slot="ds-actions"] {
    gap: 10px;
    row-gap: 10px;
    width: 100%;
  }
  [data-slot="ds-modal-header"] [data-slot~="ds-button"] {
    min-height: 44px;
    flex: 1 1 auto;
  }
  /* The plain progress label drops above the buttons, not squeezed between them. */
  [data-slot="ds-modal-progress"] {
    flex: 1 0 100%;
    padding-right: 0;
  }

  /* In-content pager links: comfortable tap height, already stack at <=560px. */
  [data-slot="ds-pager-link"] {
    min-height: 44px;
  }

  /* Spine actions: the per-step "go" chip becomes a real, reachable button on
     mobile (the shell already reveals it at <=560px; here we give it height). */
  [data-slot="ds-spine-go"] {
    min-height: 40px;
    display: inline-flex;
    align-items: center;
  }
  [data-slot="ds-spine-go"].is-primary {
    min-height: 44px;
    padding: 0 16px;
  }
}

/* --------------------------------------------------------------------------
   #3 — ONE obvious next action on the home, reachable on mobile. The compact
   required row and the resume hero each carry a single dominant primary button.
   Give those CTAs a >=44px tap target and, on mobile, keep them on their own
   full-width line below the card text (never hidden beside / under the cover).
   -------------------------------------------------------------------------- */
[data-slot~="ds-required-cta"] {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

[data-slot="ds-resume-cta"] {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

@media (max-width: 640px) {
  /* Resume hero: cover sits on top, then text, then a full-width primary CTA so
     the action is visible without horizontal scroll and is not hidden below the
     image. (The shell already collapses to a single column; we make the CTA
     full-bleed and unmistakably the primary action.) */
  [data-slot="ds-resume-cta"] {
    justify-self: stretch;
    width: 100%;
    text-align: center;
  }
  /* Required row: the Continue/Start button spans full width on its own line
     (the shell sets grid-area:cta at <=560px; reinforce stretch up to 640px). */
  [data-slot~="ds-required-cta"] {
    justify-self: stretch;
    width: 100%;
    text-align: center;
  }
}

/* --------------------------------------------------------------------------
   #5 — COWORK pill overlap. The floating "Ask Cowork" launcher is pinned to the
   bottom-right of the viewport (~54px pill + 14px inset). Reserve a bottom (and
   a little right) gutter on the LMS surfaces so the launcher never sits over the
   primary action or body text. Token-free spacing only; no colours touched.

   --mmd-cowork-gutter: the clearance below the fold the launcher needs.
   -------------------------------------------------------------------------- */
[data-slot="ds-modal"],
.ds-learning-page {
  --mmd-cowork-gutter: 92px;
}

/* Course / activity surface: the scrolling body's inner shell reserves the
   gutter so the in-content pager, Next button, assignment form, and end-page
   CTA all clear the launcher. */
[data-slot="ds-modal-body"] [data-slot="ds-course-shell"] {
  padding-bottom: var(--mmd-cowork-gutter);
}

/* Home surface: reserve the same clearance below the last section so the
   catalogue's final card / CTA is never covered. */
.ds-learning-page {
  padding-bottom: var(--mmd-cowork-gutter);
}

/* On narrow screens the launcher is a touch larger relative to the viewport and
   actions go full-width; give a little more breathing room. */
@media (max-width: 640px) {
  [data-slot="ds-modal"],
  .ds-learning-page {
    --mmd-cowork-gutter: 104px;
  }
}

/* === LMS v2 P6 block === */
/* ===================================================================   MMD LMS v2 — PHASE 6 (navigation de-clutter + top step-progress nav) central
   design-system additions. Authored by the learning remote; batched by the
   orchestrator into the shell's public/_design-system/components.css.

   Tokens ONLY — NO hardcoded hex, NO new colours, NO new fonts. All translucency
   via color-mix() over the EXISTING central tokens. This is a NAVIGATION /
   USABILITY pass inside the existing "Editorial Letterbox" aesthetic — it does
   NOT change the colour scheme, fonts, covers, sections, or the app concept.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Stakeholder fixes (navigation/usability only):
   - Problem 2: a compact horizontal STEP-PROGRESS NAV at the TOP (under the dark
     header, inside ds-modal) on the in-activity / in-check views. Lists every
     step (content activities + terminal Knowledge check) as small clickable dots,
     marks done / current / to-do reusing the spine node language (filled ink disc
     = done, baobab ring = current, hollow = todo), includes a "Course overview"
     link, lets the learner jump to any chapter, and scrolls / wraps on mobile.
   - Problems 1 & 4: handled in route.ts markup (removed duplicate nav buttons);
     no CSS needed here.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Problem 2 — top step-progress nav. It sits between the dark ds-modal-header
   and the ds-modal-body, on the light --paper surface. A "Course overview" link
   on the left, then a horizontally scrollable track of numbered step dots.
   -------------------------------------------------------------------------- */
[data-slot="ds-stepper"] {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 18px;
  background: var(--paper);
  border-bottom: 1px solid var(--hairline);
  min-width: 0;
}

/* "Course overview" — a quiet mono nav link (not a button), set apart on the
   left so the user can always jump back to the spine. */
[data-slot="ds-stepper-overview"] {
  flex: none;
  font-family: var(--font-mono);
  font-size: 10.5px;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: var(--ink-mute);
  text-decoration: none;
  white-space: nowrap;
  padding: 6px 10px 6px 0;
  border-right: 1px solid var(--hairline);
  min-height: 32px;
  display: inline-flex;
  align-items: center;
}
[data-slot="ds-stepper-overview"]:hover {
  color: var(--ink);
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* === Directory org chart (vertical tree) — central DS-owned. Search-and-expand
   hierarchy that replaces the old directory table. Indentation comes purely from
   nested <ul> nesting (no inline styles). === */
.directory-head{padding:30px 0 18px;border-bottom:1px solid var(--hairline)}
.directory-head h1{margin:10px 0 0;font-family:var(--font-display);font-style:italic;font-weight:500;font-size:clamp(34px,4vw,56px);line-height:1;letter-spacing:-0.02em;color:var(--ink)}
.directory-intro{max-width:70ch;margin:14px 0 0;color:var(--ink-soft);font-size:15px;line-height:1.6;display:flex;flex-wrap:wrap;align-items:center;gap:10px}
.directory-source{flex:none}
.directory-orgchart{display:grid;gap:16px;min-width:0}
.directory-toolbar{display:flex;flex-wrap:wrap;align-items:end;gap:12px}
.directory-toolbar .ds-field{min-width:180px}
.directory-tree{list-style:none;margin:0;padding:0;display:grid;gap:2px;min-width:0}
.directory-tree-root{margin-top:2px}
.directory-tree .directory-tree{margin:2px 0 2px 17px;padding-left:15px;border-left:1px solid var(--hairline)}
.directory-tree-item{margin:0;min-width:0}
.directory-node{display:grid;grid-template-columns:24px minmax(0,1fr) auto;align-items:center;gap:8px;padding:6px 8px;border:1px solid transparent;border-radius:4px;min-width:0}
.directory-node:hover{background:var(--paper)}
.directory-node.active{background:var(--paper);border-color:var(--ink)}
.directory-node-me{box-shadow:inset 3px 0 0 var(--baobab)}
.directory-node-match{background:var(--baobab-bg)}
.directory-node-toggle{width:24px;height:24px;display:inline-grid;place-items:center;border:1px solid var(--hairline);background:var(--paper);color:var(--ink-mute);cursor:pointer;border-radius:4px;font-family:var(--font-mono);font-size:13px;line-height:1;padding:0}
.directory-node-toggle:hover{color:var(--baobab);border-color:var(--baobab)}
.directory-node-spacer{display:inline-block;width:24px;height:24px}
.directory-node-main{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px;border:0;background:transparent;color:var(--ink);text-align:left;cursor:pointer;min-width:0;padding:0;font:inherit}
.directory-node-text{display:grid;gap:1px;min-width:0}
.directory-node-name{font-family:var(--font-ui);font-weight:700;font-size:14px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.directory-node-meta{font-size:12px;color:var(--ink-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.directory-node-reports{font-family:var(--font-mono);font-size:10px;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-mute);white-space:nowrap;padding-left:8px}
.directory-me-link{border:0;background:transparent;cursor:pointer;font:inherit}
.directory-me-link:disabled{cursor:default;opacity:0.6}
@media (max-width:820px){.directory-node-reports{display:none}.directory-tree .directory-tree{margin-left:12px;padding-left:11px}}

/* =====================================================================   MMD LEARNING (LMS) design-system block — restored to source so every shell
   build carries it (previously lived only in ad-hoc build artifacts, which is
   why the learning page kept rendering unstyled after shell rebuilds).
   ============================================================================ */
/* =====================================================================   MMD LEARNING (LMS) — premium redesign block. Editorial Industrial Letterbox.
   Self-contained: targets the learning remote's data-slots + classes. Tokens
   only (no new fonts/colors). Authored 2026-06-21 from a 3-critic synthesis.
   ============================================================================ */

/* --- Home page shell ------------------------------------------------------- */
.mmd-course-content,
.ds-learning-page { color: var(--ink); }
.ds-learning-page { max-width: 1180px; margin: 0 auto; padding: 34px 0 64px; }
.ds-learning-heading { margin: 0; font-family: var(--font-display); font-weight: 500; font-size: clamp(38px, 4.6vw, 62px); line-height: 0.98; letter-spacing: -0.02em; }
.ds-learning-heading a { color: inherit; text-decoration: none; }
.ds-learning-heading em { color: var(--baobab); font-style: italic; }
.ds-learning-page .lede { max-width: 64ch; margin: 16px 0 0; color: var(--ink-soft); font-size: 15px; line-height: 1.62; font-style: normal; }
.ds-empty-row { padding: 22px; border: 1px solid var(--hairline); color: var(--ink-mute); font-size: 14px; background: var(--paper); }

/* --- Resume hero card ------------------------------------------------------ */
[data-slot="ds-resume"] {
  display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 6px 28px;
  margin: 26px 0 30px; padding: 22px 26px; background: var(--paper);
  border: 1px solid var(--hairline); border-left: 3px solid var(--baobab);
  text-decoration: none; color: var(--ink); transition: border-color .15s ease, transform .15s ease;
}
[data-slot="ds-resume"]:hover { border-color: var(--ink); transform: translateY(-1px); }
[data-slot="ds-resume-eyebrow"] { grid-column: 1; font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-resume-title"] { grid-column: 1; font-family: var(--font-display); font-weight: 500; font-size: clamp(20px, 2.2vw, 27px); line-height: 1.08; margin-top: 3px; }
[data-slot="ds-resume-meta"] { grid-column: 1; font-size: 13px; color: var(--ink-soft); margin-top: 4px; }
[data-slot="ds-resume-meter"] { grid-column: 1; display: block; margin-top: 12px; max-width: 360px; }
[data-slot="ds-resume-cta"] { grid-column: 2; grid-row: 1 / span 4; align-self: center; font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--paper); background: var(--ink); padding: 12px 20px; white-space: nowrap; transition: background .15s ease; }
[data-slot="ds-resume"]:hover [data-slot="ds-resume-cta"] { background: var(--baobab); }

/* --- Filter chips ---------------------------------------------------------- */
.ds-filterbar { display: flex; flex-wrap: wrap; gap: 8px; margin: 8px 0 18px; padding-bottom: 16px; border-bottom: 1px solid var(--hairline); }
.ds-filter-chip { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-mute); background: transparent; border: 1px solid var(--hairline); padding: 7px 13px; text-decoration: none; transition: all .12s ease; }
.ds-filter-chip:hover { color: var(--ink); border-color: var(--ink-mute); }
.ds-filter-chip-active { color: var(--paper); background: var(--ink); border-color: var(--ink); }

/* --- Section header (catalogue) ------------------------------------------- */
.ds-table-section { margin-top: 6px; }
.ds-table-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 14px; }
.eyebrow, [data-slot="course-kicker"] { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-mute); display: block; }
.ds-table-title, [data-slot="ds-table-title"] { font-family: var(--font-display); font-weight: 500; font-size: clamp(19px, 2vw, 24px); line-height: 1.1; margin: 3px 0 0; }

/* --- Catalogue: course cards (was a table) -------------------------------- */
[data-slot="ds-course-grid"] { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
[data-slot~="ds-course-card"] {
  display: grid; grid-template-rows: auto 1fr auto; gap: 10px; min-height: 148px;
  padding: 20px 22px; background: var(--paper); border: 1px solid var(--hairline);
  text-decoration: none; color: var(--ink); position: relative; transition: border-color .15s ease, transform .15s ease;
}
[data-slot~="ds-course-card"]::after { content: "→"; position: absolute; right: 20px; bottom: 18px; font-size: 15px; color: var(--ink-faint); opacity: 0; transform: translateX(-4px); transition: all .15s ease; }
[data-slot~="ds-course-card"]:hover { border-color: var(--ink); transform: translateY(-2px); }
[data-slot~="ds-course-card"]:hover::after { opacity: 1; transform: translateX(0); color: var(--baobab); }
[data-slot~="is-progress"] { border-left: 3px solid var(--ink); }
[data-slot~="is-complete"] { border-left: 3px solid var(--baobab); }
[data-slot="ds-course-cat"] { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-course-name"] { font-family: var(--font-display); font-weight: 500; font-size: 21px; line-height: 1.14; align-self: start; }
[data-slot="ds-course-foot"] { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
[data-slot="ds-course-go"] { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.07em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot~="ds-course-card"]:hover [data-slot="ds-course-go"] { color: var(--ink); }
[data-slot="ds-course-fresh"] { font-size: 12.5px; color: var(--ink-faint); }
[data-slot="ds-course-stamp"] { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--baobab); }

/* --- Meter (proportional hairline) ---------------------------------------- */
[data-slot="ds-meter"] { display: inline-flex; align-items: center; gap: 10px; min-width: 0; }
[data-slot="ds-meter-track"] { position: relative; flex: 1 1 auto; min-width: 70px; height: 6px; background: var(--paper-2); border: 1px solid var(--hairline); overflow: hidden; }
[data-slot="ds-meter-fill"] { position: absolute; inset: 0 auto 0 0; height: 100%; background: var(--ink); width: 0; }
[data-slot="ds-meter-fill"][data-pct="0"] { width: 0; }
[data-slot="ds-meter-label"] { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.04em; color: var(--ink-mute); white-space: nowrap; }

/* Proportional fill width keyed on data-pct (markup buckets to nearest 5).
   No inline styles — these live in the central DS. Applies to any *-fill. */
[data-pct="0"]{width:0}
[data-pct="5"]{width:5%}   [data-pct="10"]{width:10%} [data-pct="15"]{width:15%}
[data-pct="20"]{width:20%} [data-pct="25"]{width:25%} [data-pct="30"]{width:30%}
[data-pct="35"]{width:35%} [data-pct="40"]{width:40%} [data-pct="45"]{width:45%}
[data-pct="50"]{width:50%} [data-pct="55"]{width:55%} [data-pct="60"]{width:60%}
[data-pct="65"]{width:65%} [data-pct="70"]{width:70%} [data-pct="75"]{width:75%}
[data-pct="80"]{width:80%} [data-pct="85"]{width:85%} [data-pct="90"]{width:90%}
[data-pct="95"]{width:95%} [data-pct="100"]{width:100%}

/* =====================================================================   COURSE + ACTIVITY — dark letterbox frame + body
   ============================================================================ */
[data-slot="ds-modal"] { display: flex; flex-direction: column; min-height: 100dvh; background: var(--paper); }
[data-slot="ds-modal-header"] {
  position: sticky; top: 0; z-index: 5; display: flex; align-items: center; justify-content: space-between; gap: 18px;
  padding: 14px 30px; background: var(--ink); color: var(--paper);
}
[data-slot="ds-modal-headline"] { min-width: 0; }
[data-slot="ds-modal-header"] [data-slot="course-kicker"] { color: color-mix(in srgb, var(--paper) 55%, transparent); }
[data-slot="ds-modal-crumb"] { color: color-mix(in srgb, var(--paper) 80%, transparent); text-decoration: none; }
[data-slot="ds-modal-crumb"]:hover { color: var(--paper); text-decoration: underline; }
[data-slot="ds-modal-header"] [data-slot="ds-table-title"] { color: var(--paper); font-size: clamp(15px, 1.6vw, 19px); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 52ch; }
[data-slot="ds-modal-header"] [data-slot="ds-actions"] { display: flex; align-items: center; gap: 8px; flex: none; }
[data-slot="ds-modal-body"] { flex: 1 1 auto; padding: 30px; }
[data-slot="ds-course-shell"] { max-width: 940px; margin: 0 auto; }

/* progress rule on course overview */
[data-slot="ds-progress"] { max-width: 520px; margin: 4px 0 20px; }
[data-slot="ds-progress-head"] { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 7px; }
[data-slot="ds-progress-goal"] { font-size: 13px; color: var(--ink-soft); }
[data-slot="ds-progress-label"] { font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.04em; color: var(--ink-mute); }
[data-slot="ds-progress-track"] { position: relative; height: 7px; background: var(--paper-2); border: 1px solid var(--hairline); overflow: hidden; }
[data-slot="ds-progress-fill"] { position: absolute; inset: 0 auto 0 0; height: 100%; background: var(--ink); width: 0; }

/* =====================================================================   COURSE SPINE — vertical timeline (was a table)
   ============================================================================ */
[data-slot="ds-spine"] { list-style: none; margin: 22px 0 0; padding: 0; position: relative; }
[data-slot="ds-spine"]::before { content: ""; position: absolute; left: 7px; top: 12px; bottom: 12px; width: 1px; background: var(--hairline); }
[data-slot~="ds-spine-step"] { position: relative; }
[data-slot="ds-spine-main"] {
  display: grid; grid-template-columns: 16px 40px 1fr auto; align-items: center; column-gap: 16px;
  padding: 15px 14px 15px 0; border-bottom: 1px solid var(--hairline); text-decoration: none; color: var(--ink);
  transition: background .12s ease;
}
[data-slot="ds-spine-main"]:hover { background: var(--paper); }
[data-slot="ds-spine-node"] { grid-column: 1; width: 14px; height: 14px; border-radius: 50%; background: var(--paper-2); border: 1px solid var(--ink-faint); box-shadow: 0 0 0 4px var(--paper); z-index: 1; }
[data-slot~="is-done"] [data-slot="ds-spine-node"] { background: var(--ink); border-color: var(--ink); }
[data-slot~="is-next"] [data-slot="ds-spine-node"] { background: var(--paper); border: 2px solid var(--baobab); }
[data-slot="ds-spine-num"] { grid-column: 2; font-family: var(--font-display); font-size: 22px; font-weight: 500; color: var(--ink-faint); line-height: 1; text-align: center; }
[data-slot~="is-next"] [data-slot="ds-spine-num"] { color: var(--ink); }
[data-slot~="is-done"] [data-slot="ds-spine-num"] { color: var(--ink-mute); }
[data-slot="ds-spine-text"] { grid-column: 3; min-width: 0; display: grid; gap: 2px; }
[data-slot="ds-spine-title"] { font-family: var(--font-display); font-weight: 500; font-size: 17px; line-height: 1.18; color: var(--ink); }
[data-slot="ds-spine-sum"] { font-size: 13px; color: var(--ink-mute); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
[data-slot="ds-spine-meta"] { grid-column: 4; display: flex; align-items: center; gap: 14px; flex: none; }
[data-slot~="ds-spine-state"] { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-mute); }
[data-slot="ds-spine-next"] { font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--baobab); }
[data-slot="ds-spine-go"] { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-mute); opacity: 0; transition: opacity .12s ease; white-space: nowrap; }
[data-slot="ds-spine-main"]:hover [data-slot="ds-spine-go"] { opacity: 1; color: var(--ink); }
[data-slot="ds-spine-go"].is-primary { opacity: 1; color: var(--paper); background: var(--ink); padding: 8px 14px; }
[data-slot="ds-spine-main"]:hover [data-slot="ds-spine-go"].is-primary { background: var(--baobab); color: var(--paper); }

/* =====================================================================   ACTIVITY / LESSON — de-boxed editorial article
   ============================================================================ */
[data-slot="ds-activity"] { max-width: 720px; margin: 0 auto; }
[data-slot="ds-activity"] [data-slot="ds-table-header"] { display: block; margin-bottom: 6px; }
[data-slot="ds-activity-status"] { display: inline-block; margin-top: 10px; font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; padding: 5px 11px; border: 1px solid var(--hairline); color: var(--ink-mute); }
[data-slot~="ds-activity-status-quiz"] { color: var(--baobab); border-color: var(--baobab); background: var(--baobab-bg); }
[data-slot~="ds-activity-status-done"] { color: var(--ink); border-color: var(--ink); }
[data-slot="ds-activity-content"] { margin-top: 22px; font-size: 16px; line-height: 1.66; color: var(--ink-soft); border-top: 2px solid var(--baobab); padding-top: 22px; }
[data-slot="ds-activity-content"] > *:first-child { margin-top: 0; }
[data-slot="ds-activity-content"] p { margin: 0 0 16px; max-width: 64ch; }
[data-slot="ds-activity-content"] h2, [data-slot="ds-activity-content"] h3, [data-slot="ds-activity-content"] h4 { font-family: var(--font-display); font-weight: 500; color: var(--ink); line-height: 1.2; margin: 30px 0 10px; padding-top: 18px; border-top: 1px solid var(--hairline); }
[data-slot="ds-activity-content"] ul, [data-slot="ds-activity-content"] ol { margin: 0 0 16px; padding-left: 4px; list-style: none; }
[data-slot="ds-activity-content"] li { position: relative; padding-left: 20px; margin: 0 0 9px; max-width: 62ch; }
[data-slot="ds-activity-content"] li::before { content: ""; position: absolute; left: 2px; top: 9px; width: 5px; height: 5px; background: var(--baobab); }
[data-slot="ds-activity-content"] strong, [data-slot="ds-activity-content"] b { color: var(--ink); font-weight: 600; }
[data-slot="ds-activity-content"] blockquote { margin: 0 0 16px; padding-left: 16px; border-left: 2px solid var(--hairline); color: var(--ink-mute); font-style: italic; }
[data-slot="ds-figure"] { margin: 22px 0; padding: 22px; border: 1px solid var(--hairline); background: var(--paper); text-align: center; }
[data-slot="ds-figure"] svg { max-width: 100%; height: auto; }

/* activity banners */
[data-slot~="ds-activity-banner"] { margin: 18px 0; padding: 13px 16px; font-size: 14px; border: 1px solid var(--hairline); }
[data-slot~="ds-activity-banner-pass"] { border-left: 3px solid var(--baobab); color: var(--ink); background: var(--paper); }
[data-slot~="ds-activity-banner-fail"] { border-left: 3px solid var(--signal-amber); color: var(--ink); background: var(--signal-amber-bg); }

/* =====================================================================   KNOWLEDGE CHECK — hard dark section break (cinema bar feel)
   ============================================================================ */
.ds-quiz-form, [data-slot="ds-quiz"] { margin-top: 30px; }
[data-slot="ds-quiz-intro"] { background: var(--ink); color: var(--paper); padding: 20px 24px; margin: 0 0 4px; }
[data-slot="ds-quiz-intro-label"] { font-family: var(--font-display); font-style: italic; font-size: 22px; display: block; }
[data-slot="ds-quiz-intro"] p { margin: 6px 0 0; font-size: 13.5px; color: color-mix(in srgb, var(--paper) 75%, transparent); }
[data-slot="ds-quiz-question"] { border: 0; border-bottom: 1px solid var(--hairline); margin: 0; padding: 20px 0; }
[data-slot="ds-quiz-legend"] { font-family: var(--font-display); font-weight: 500; font-size: 17px; padding: 0; margin-bottom: 12px; }
[data-slot="ds-quiz-option"] { display: flex; align-items: center; gap: 11px; padding: 11px 14px; border: 1px solid var(--hairline); margin: 0 0 8px; cursor: pointer; transition: border-color .12s ease, background .12s ease; }
[data-slot="ds-quiz-option"]:hover { border-color: var(--ink-mute); background: var(--paper); }
[data-slot="ds-quiz-option"]:has(.ds-choice:checked) { border-color: var(--baobab); box-shadow: inset 3px 0 0 var(--baobab); }
[data-slot="ds-quiz-option"] .ds-choice { accent-color: var(--baobab); width: 16px; height: 16px; flex: none; }
[data-slot="ds-quiz-option-text"] { font-size: 14.5px; color: var(--ink); }

/* =====================================================================   ASSIGNMENT
   ============================================================================ */
.ds-assignment-form, [data-slot="ds-assignment"] { display: grid; gap: 10px; margin-top: 22px; }
[data-slot="ds-assignment-saved"] { padding: 16px 18px; background: var(--paper); border: 1px solid var(--hairline); border-left: 3px solid var(--baobab); margin-top: 18px; }
[data-slot="ds-assignment-saved"] blockquote { margin: 6px 0 0; font-size: 14.5px; line-height: 1.55; color: var(--ink-soft); }
.ds-textarea { width: 100%; font-family: var(--font-ui); font-size: 14.5px; line-height: 1.55; padding: 13px 15px; border: 1px solid var(--hairline); background: var(--paper); color: var(--ink); resize: vertical; }
.ds-textarea:focus { outline: none; border-color: var(--ink); }
.ds-field-hidden { display: none; }

/* =====================================================================   COMPLETION MOMENT — the reward
   ============================================================================ */
[data-slot="ds-complete"] { margin-top: 30px; padding: 34px 30px; background: var(--ink); color: var(--paper); text-align: center; display: grid; justify-items: center; gap: 8px; }
[data-slot="ds-complete-tick"] { display: inline-grid; place-items: center; width: 44px; height: 44px; border-radius: 50%; background: var(--baobab); color: var(--paper); font-size: 22px; line-height: 1; }
[data-slot="ds-complete-head"] { font-family: var(--font-display); font-style: italic; font-size: 30px; line-height: 1.05; margin-top: 6px; }
[data-slot="ds-complete-sub"] { font-size: 13.5px; color: color-mix(in srgb, var(--paper) 72%, transparent); }
[data-slot="ds-complete"] [data-slot="ds-actions"] { margin-top: 16px; }

/* =====================================================================   BUTTONS + actions (data-slot AND class forms) + tags
   ============================================================================ */
[data-slot="ds-actions"] { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-top: 18px; }
.ds-button, [data-slot~="ds-button"] {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.05em; text-transform: uppercase;
  padding: 11px 18px; border: 1px solid var(--ink); background: var(--paper); color: var(--ink);
  text-decoration: none; cursor: pointer; transition: all .14s ease;
}
.ds-button:hover, [data-slot~="ds-button"]:hover { background: var(--paper-2); }
.ds-button-primary, [data-slot~="ds-button-primary"] { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.ds-button-primary:hover, [data-slot~="ds-button-primary"]:hover { background: var(--baobab); border-color: var(--baobab); }
.ds-button-secondary, [data-slot~="ds-button-secondary"], [data-slot~="ds-button-on-light"] { background: transparent; color: var(--ink); border-color: var(--hairline); }
.ds-button-secondary:hover, [data-slot~="ds-button-secondary"]:hover { border-color: var(--ink); background: transparent; }
[data-slot~="ds-button-on-dark-ghost"] { background: transparent; color: var(--paper); border-color: color-mix(in srgb, var(--paper) 35%, transparent); }
[data-slot~="ds-button-on-dark-ghost"]:hover { border-color: var(--paper); background: color-mix(in srgb, var(--paper) 8%, transparent); }
[data-slot~="ds-button-on-dark-primary"] { background: var(--paper); color: var(--ink); border-color: var(--paper); }
[data-slot~="ds-button-on-dark-primary"]:hover { background: var(--baobab); color: var(--paper); border-color: var(--baobab); }
[data-slot="ds-tag"] { display: inline-block; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--paper); border: 1px solid color-mix(in srgb, var(--paper) 30%, transparent); padding: 5px 10px; }
[data-slot="ds-records-sub"] { font-size: 13px; color: var(--ink-mute); }

/* embedded raw runtime frame (fallback only) */
[data-slot="ds-embed-frame"][hidden] { display: none; }
[data-slot="ds-embed-frame"] { margin-top: 18px; }

/* generated fallback course body */
[data-slot="course-body"] { max-width: 820px; margin: 0 auto; }
[data-slot="course-title"] { font-family: var(--font-display); font-weight: 500; font-size: 30px; margin: 4px 0 8px; }
[data-slot="course-summary"] { color: var(--ink-soft); font-size: 15px; margin: 0 0 20px; }
[data-slot="ds-records-compact"] { display: grid; gap: 8px; }

/* =====================================================================   RESPONSIVE — stacked, thumb-first
   ============================================================================ */
@media (max-width: 860px) {
  [data-slot="ds-course-grid"] { grid-template-columns: minmax(0, 1fr); }
  [data-slot="ds-resume"] { grid-template-columns: minmax(0,1fr); }
  [data-slot="ds-resume-cta"] { grid-column: 1; grid-row: auto; justify-self: start; margin-top: 14px; }
  [data-slot="ds-modal-header"] { flex-wrap: wrap; padding: 12px 18px; gap: 10px; }
  [data-slot="ds-modal-header"] [data-slot="ds-table-title"] { max-width: 100%; white-space: normal; }
  [data-slot="ds-modal-body"] { padding: 20px 16px; }
  [data-slot="ds-spine-main"] { grid-template-columns: 16px 1fr; grid-template-areas: "node text" "node meta"; row-gap: 8px; column-gap: 12px; }
  [data-slot="ds-spine-num"] { display: none; }
  [data-slot="ds-spine-text"] { grid-area: text; }
  [data-slot="ds-spine-sum"] { white-space: normal; }
  [data-slot="ds-spine-meta"] { grid-area: meta; justify-content: flex-start; }
  [data-slot="ds-spine-go"] { opacity: 1; }
  [data-slot="ds-activity-content"] p, [data-slot="ds-activity-content"] li { max-width: none; }
}
/* ===== end LMS redesign block ===== */
.ds-tag-open{color:var(--ink);border-color:var(--ink)}
.ds-tag-progress{color:var(--ink);border-color:var(--ink-mute)}
.ds-tag-waiting{color:var(--ink-mute);border-color:var(--ink-mute)}
.ds-tag-resolved{color:var(--ink-mute);border-color:var(--hairline)}
.ds-tag-closed{color:var(--ink-faint);border-color:var(--hairline)}
.ds-tag-error{color:var(--baobab);border-color:var(--baobab)}

/* === LMS v2 P2 block === */
/* ===================================================================   MMD LMS v2 — PHASE 2 (consumers) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Covers: R1 (course scroll), R2 (in-content pager), R6 (end page + cert CTA),
   R7 (home trophies).
   ========================================================================== */

/* --------------------------------------------------------------------------
   R1 — Course content must scroll (TC1.*)
   The course modal is a BOUNDED viewport box (height, not min-height) so its
   body can own the overflow; the header stays sticky at the top of that box.
   -------------------------------------------------------------------------- */
[data-slot="ds-modal"] {
  height: 100dvh;
  max-height: 100dvh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

[data-slot="ds-modal-header"] {
  position: sticky;
  top: 0;
  z-index: 2;
  flex: 0 0 auto;
}

[data-slot="ds-modal-body"] {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  -webkit-overflow-scrolling: touch;
}

/* --------------------------------------------------------------------------
   R2 — In-content navigation pager (TC2.*)
   A bottom prev/next pager rendered inside the activity, in addition to the
   sticky header prev/next. Real DB-ordered hrefs; first activity has no prev,
   the last content activity's next is the terminal knowledge check.
   -------------------------------------------------------------------------- */
[data-slot="ds-pager"] {
  display: flex;
  align-items: stretch;
  justify-content: space-between;
  gap: 0.75rem;
  margin-top: 2rem;
  padding-top: 1.25rem;
  border-top: 1px solid var(--hairline);
}

[data-slot="ds-pager-link"] {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  flex: 1 1 0;
  min-width: 0;
  padding: 0.7rem 0.9rem;
  border: 1px solid var(--hairline);
  border-radius: 0;
  text-decoration: none;
  color: var(--ink);
  background: var(--paper-2);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-pager-link"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, var(--paper-2));
}

[data-slot="ds-pager-link"][data-dir="next"] {
  text-align: right;
  align-items: flex-end;
}

[data-slot="ds-pager-dir"] {
  font-family: var(--font-mono);
  font-size: 0.66rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-pager-title"] {
  font-family: var(--font-ui);
  font-size: 0.92rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 100%;
}

/* A disabled/absent slot (first activity has no prev) keeps the layout balanced. */
[data-slot="ds-pager-spacer"] {
  flex: 1 1 0;
  min-width: 0;
}

@media (max-width: 560px) {
  [data-slot="ds-pager"] {
    flex-direction: column;
  }
  [data-slot="ds-pager-link"][data-dir="next"] {
    text-align: left;
    align-items: flex-start;
  }
}

/* --------------------------------------------------------------------------
   R6 — End-of-course page + certificate (TC6.*)
   Shown only when isCourseComplete. Trophy mark, "Course complete", and the
   "Download certificate (PDF)" action.
   -------------------------------------------------------------------------- */
[data-slot="ds-end"] {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 1rem;
  max-width: 38rem;
  margin: 0 auto;
  padding: 3rem 1.5rem;
}

[data-slot="ds-end-trophy"] {
  width: 96px;
  height: 96px;
  display: block;
  color: var(--baobab);
}

[data-slot="ds-end-kicker"] {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--baobab);
}

[data-slot="ds-end-title"] {
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(2rem, 4vw, 2.9rem);
  line-height: 1.05;
  color: var(--ink);
  margin: 0;
}

[data-slot="ds-end-sub"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  color: var(--ink-soft);
  max-width: 30rem;
}

[data-slot="ds-end-course"] {
  font-family: var(--font-ui);
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--ink);
}

[data-slot="ds-end"] [data-slot="ds-actions"] {
  display: flex;
  flex-wrap: wrap;
  gap: 0.75rem;
  justify-content: center;
  margin-top: 0.5rem;
}

/* --------------------------------------------------------------------------
   R7 — Trophies on the home page (TC7.*)
   One trophy per completed course; empty state when none.
   -------------------------------------------------------------------------- */
[data-slot="ds-trophies"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
  gap: 1rem;
}

[data-slot="ds-trophy"] {
  display: flex;
  align-items: center;
  gap: 0.9rem;
  padding: 1rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-trophy"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 55%, var(--paper-2));
}

[data-slot="ds-trophy-emblem"] {
  width: 56px;
  height: 56px;
  flex: 0 0 auto;
  display: block;
  color: var(--baobab);
}

[data-slot="ds-trophy-text"] {
  display: flex;
  flex-direction: column;
  gap: 0.2rem;
  min-width: 0;
}

[data-slot="ds-trophy-cat"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-trophy-name"] {
  font-family: var(--font-ui);
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
}

[data-slot="ds-trophy-empty"] {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 1.25rem;
  border: 1px dashed var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
  color: var(--ink-mute);
  font-family: var(--font-ui);
  font-size: 0.95rem;
}

/* === LMS v2 P3 block === */
/* ===================================================================   MMD LMS v2 — PHASE 3 (catalogue + admin) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Covers: R9 (~N min estimate), R10 (categories + grouped catalogue),
   R11 (featured strip), R12 (required-for-you), R13 (admin page), R14 (covers).
   ========================================================================== */

/* --------------------------------------------------------------------------
   R14 — Course covers. A 1200x630 image (overviewfiles photo or generated
   Letterbox SVG) sat above the card body. object-fit:cover keeps the ratio.
   -------------------------------------------------------------------------- */
[data-slot="ds-cover"] {
  display: block;
  width: 100%;
  aspect-ratio: 1200 / 630;
  height: auto;
  object-fit: cover;
  background: var(--paper-2);
  border-bottom: 1px solid var(--hairline);
}

/* --------------------------------------------------------------------------
   R9 — "~N min" time-estimate badge.
   -------------------------------------------------------------------------- */
[data-slot="ds-est"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-soft);
  padding: 0.12rem 0.4rem;
  border: 1px solid var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   Course card with a cover (extends the P2 ds-course-card). The card becomes a
   vertical stack: cover on top, body (category + est, name, footer) below.
   -------------------------------------------------------------------------- */
[data-slot="ds-course-card"] {
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
}

[data-slot="ds-course-cover"] {
  display: block;
}

[data-slot="ds-course-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 0.95rem 1rem 1rem;
  flex: 1 1 auto;
}

[data-slot="ds-course-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

/* --------------------------------------------------------------------------
   R12 — Required for you. Top-of-page section; cards carry due-state styling.
   -------------------------------------------------------------------------- */
[data-slot="ds-required-grid"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: 1rem;
}

[data-slot="ds-required-card"] {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  overflow: hidden;
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot="ds-required-card"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 55%, var(--paper-2));
}

[data-slot="ds-required-card"].is-overdue {
  border-left: 3px solid var(--baobab);
}

[data-slot="ds-required-card"].is-soon {
  border-left: 3px solid var(--signal-amber);
}

[data-slot="ds-required-cover"] {
  display: block;
}

[data-slot="ds-required-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.45rem;
  padding: 0.9rem 1rem 1rem;
}

[data-slot="ds-required-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

[data-slot="ds-required-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-required-flag"] {
  font-family: var(--font-mono);
  font-size: 0.6rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--baobab);
  padding: 0.1rem 0.4rem;
  border: 1px solid color-mix(in srgb, var(--baobab) 40%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, transparent);
}

[data-slot="ds-required-name"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  font-weight: 600;
  color: var(--ink);
}

[data-slot="ds-required-due"] {
  font-family: var(--font-mono);
  font-size: 0.7rem;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
}

[data-slot="ds-required-due"].is-overdue {
  color: var(--baobab);
  font-weight: 600;
}

[data-slot="ds-required-due"].is-soon {
  color: color-mix(in srgb, var(--signal-amber) 80%, var(--ink));
  font-weight: 600;
}

[data-slot="ds-required-est"] {
  margin-top: 0.1rem;
}

/* --------------------------------------------------------------------------
   R11 — Featured strip. A grid of cover cards above the catalogue.
   -------------------------------------------------------------------------- */
[data-slot="ds-featured-grid"] {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: 1rem;
}

/* --------------------------------------------------------------------------
   R10 — Catalogue grouped by real category, with per-category headers.
   -------------------------------------------------------------------------- */
[data-slot="ds-cat-group"] {
  margin-top: 1.5rem;
}

[data-slot="ds-cat-group"]:first-child {
  margin-top: 0;
}

[data-slot="ds-cat-heading"] {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.3rem;
  color: var(--ink);
  margin: 0 0 0.75rem;
  padding-bottom: 0.4rem;
  border-bottom: 1px solid var(--hairline);
}

/* Resume hero with a cover thumbnail alongside the text. */
[data-slot="ds-resume"] {
  display: grid;
  grid-template-columns: minmax(0, 14rem) 1fr;
  gap: 1.25rem;
  align-items: stretch;
}

[data-slot="ds-resume-cover"] {
  display: block;
  overflow: hidden;
  border: 1px solid var(--hairline);
}

[data-slot="ds-resume-text"] {
  display: flex;
  flex-direction: column;
  gap: 0.4rem;
  min-width: 0;
}

@media (max-width: 640px) {
  [data-slot="ds-resume"] {
    grid-template-columns: 1fr;
  }
}

/* --------------------------------------------------------------------------
   R13 — Admin page. Course rows with editable controls; 403 state.
   -------------------------------------------------------------------------- */
[data-slot="ds-admin-list"] {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}

[data-slot="ds-admin-course"] {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  padding: 1.1rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
}

[data-slot="ds-admin-course-head"] {
  display: grid;
  grid-template-columns: minmax(0, 10rem) 1fr;
  gap: 1rem;
  align-items: center;
}

[data-slot="ds-admin-cover"] {
  display: block;
  width: 100%;
  aspect-ratio: 1200 / 630;
  height: auto;
  object-fit: cover;
  border: 1px solid var(--hairline);
  background: var(--paper);
}

[data-slot="ds-admin-course-id"] {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
}

[data-slot="ds-admin-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot="ds-admin-title"] {
  font-family: var(--font-ui);
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--ink);
  margin: 0;
}

[data-slot="ds-admin-meta-line"] {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  color: var(--ink-mute);
}

[data-slot="ds-admin-controls"] {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr));
  gap: 0.85rem;
  padding-top: 0.85rem;
  border-top: 1px solid var(--hairline);
}

[data-slot="ds-admin-form"] {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding: 0.75rem;
  border: 1px solid var(--hairline);
  background: color-mix(in srgb, var(--paper) 60%, var(--paper-2));
}

[data-slot="ds-admin-field"] {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}

[data-slot="ds-admin-label"] {
  font-family: var(--font-mono);
  font-size: 0.64rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-soft);
}

[data-slot="ds-admin-banner"] {
  padding: 0.7rem 0.95rem;
  border: 1px solid var(--hairline);
  font-family: var(--font-ui);
  font-size: 0.9rem;
  margin-bottom: 1rem;
}

[data-slot="ds-admin-banner"].ds-admin-banner-ok {
  border-color: color-mix(in srgb, var(--signal-grass) 45%, var(--hairline));
  background: color-mix(in srgb, var(--signal-grass-bg) 60%, var(--paper-2));
  color: color-mix(in srgb, var(--signal-grass) 70%, var(--ink));
}

[data-slot="ds-admin-banner"].ds-admin-banner-err {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, var(--paper-2));
  color: var(--baobab);
}

[data-slot="ds-admin-403"] {
  display: flex;
  flex-direction: column;
  gap: 0.85rem;
  max-width: 34rem;
  padding: 2rem 1.5rem;
  border: 1px dashed var(--hairline);
  background: color-mix(in srgb, var(--paper-2) 70%, transparent);
}

[data-slot="ds-admin-403-kicker"] {
  font-family: var(--font-mono);
  font-size: 0.72rem;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--baobab);
}

@media (max-width: 560px) {
  [data-slot="ds-admin-course-head"] {
    grid-template-columns: 1fr;
  }
}

/* === LMS v2 P4 block === */
/* ===================================================================   MMD LMS v2 — PHASE 4 (home UX polish) central design-system additions.
   Authored by the learning remote; batched by the orchestrator into the shell's
   public/_design-system/components.css. Tokens ONLY — no hardcoded hex; all
   translucency via color-mix() over the central tokens.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Scope: P4 redesigns "Required for you" from an oversized cover hero into a
   COMPACT horizontal alert list (thumb · title + badge + due + ~min · CTA).
   The data-slot values carry state suffixes (e.g. "ds-required-row is-overdue"),
   so selectors use the whitespace-token match [data-slot~="…"].
   ========================================================================== */

/* --------------------------------------------------------------------------
   R12 (P4) — Required for you as a compact alert list. Each item is a tight
   horizontal row: small cover thumbnail (left) → title + Mandatory + due + ~min
   (centre, grows) → Continue/Start primary button (right). Rows stack.
   -------------------------------------------------------------------------- */
[data-slot~="ds-required-list"] {
  display: flex;
  flex-direction: column;
  gap: 0.6rem;
}

[data-slot~="ds-required-row"] {
  display: grid;
  grid-template-columns: 140px 1fr auto;
  align-items: center;
  gap: 1rem;
  padding: 0.7rem 0.85rem;
  border: 1px solid var(--hairline);
  background: var(--paper-2);
  text-decoration: none;
  color: var(--ink);
  transition: border-color 120ms ease, background 120ms ease;
}

[data-slot~="ds-required-row"]:hover {
  border-color: color-mix(in srgb, var(--baobab) 45%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 45%, var(--paper-2));
}

/* Due-state left rail — overdue (baobab) and due-soon (amber) only. */
[data-slot~="ds-required-row"][data-slot~="is-overdue"] {
  border-left: 3px solid var(--baobab);
}

[data-slot~="ds-required-row"][data-slot~="is-soon"] {
  border-left: 3px solid var(--signal-amber);
}

/* Small fixed-ratio cover thumbnail on the left. */
[data-slot~="ds-required-thumb"] {
  display: block;
  width: 140px;
  overflow: hidden;
  border: 1px solid var(--hairline);
}

[data-slot~="ds-required-thumb"] [data-slot="ds-cover"] {
  border-bottom: none;
}

[data-slot~="ds-required-body"] {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  min-width: 0;
}

[data-slot~="ds-required-meta"] {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}

[data-slot~="ds-required-cat"] {
  font-family: var(--font-mono);
  font-size: 0.62rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-faint);
}

[data-slot~="ds-required-flag"] {
  font-family: var(--font-mono);
  font-size: 0.58rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--baobab);
  padding: 0.08rem 0.36rem;
  border: 1px solid color-mix(in srgb, var(--baobab) 40%, var(--hairline));
  background: color-mix(in srgb, var(--baobab-bg) 60%, transparent);
}

[data-slot~="ds-required-name"] {
  font-family: var(--font-ui);
  font-size: 1rem;
  font-weight: 600;
  line-height: 1.2;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
}

[data-slot~="ds-required-facts"] {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  flex-wrap: wrap;
}

[data-slot~="ds-required-due"] {
  font-family: var(--font-mono);
  font-size: 0.68rem;
  letter-spacing: 0.04em;
  color: var(--ink-soft);
}

[data-slot~="ds-required-due"][data-slot~="is-overdue"] {
  color: var(--baobab);
  font-weight: 600;
}

[data-slot~="ds-required-due"][data-slot~="is-soon"] {
  color: color-mix(in srgb, var(--signal-amber) 80%, var(--ink));
  font-weight: 600;
}

/* Continue/Start primary button on the right of each row. */
[data-slot~="ds-required-cta"] {
  flex: 0 0 auto;
  justify-self: end;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--paper);
  background: var(--ink);
  padding: 0.55rem 0.95rem;
  white-space: nowrap;
  transition: background 120ms ease;
}

[data-slot~="ds-required-row"]:hover [data-slot~="ds-required-cta"] {
  background: var(--baobab);
}

/* Mobile: drop the CTA onto its own line, keep thumb + text side by side. */
@media (max-width: 560px) {
  [data-slot~="ds-required-row"] {
    grid-template-columns: 96px 1fr;
    grid-template-areas:
      "thumb body"
      "cta   cta";
    row-gap: 0.6rem;
  }
  [data-slot~="ds-required-thumb"] {
    grid-area: thumb;
    width: 96px;
  }
  [data-slot~="ds-required-body"] {
    grid-area: body;
  }
  [data-slot~="ds-required-cta"] {
    grid-area: cta;
    justify-self: stretch;
    text-align: center;
  }
}

/* === LMS v2 P5 block === */
/* ===================================================================   MMD LMS v2 — PHASE 5 (navigation + button + usability pass) central
   design-system additions. Authored by the learning remote; batched by the
   orchestrator into the shell's public/_design-system/components.css.

   Tokens ONLY — NO hardcoded hex, NO new colours, NO new fonts. All translucency
   via color-mix() over the EXISTING central tokens. This is a USABILITY pass
   inside the existing "Editorial Letterbox" aesthetic — it does NOT change the
   colour scheme, fonts, covers, sections, or the concept of the app.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Fixes (all external-UX-critique validated, navigation/buttons/usability only):
   1. STEP-COUNT — markup-only (route.ts). No CSS here.
   2. BUTTON CLUTTER / HIERARCHY in the dark course/activity header:
      - breadcrumb trail (Learning / <course> / <step>) at top-left,
      - progress rendered as a plain label/meter (NOT a bordered pill),
      - Next is the single filled PRIMARY, Prev a quiet ghost secondary.
   3. ONE obvious next action on the home, reachable on mobile (390px).
   4. MOBILE TAP TARGETS — all nav/action buttons >=44px tall, single line.
   5. COWORK pill overlap — reserve bottom/right gutter on the LMS surfaces so
      the floating "Ask Cowork" launcher never covers actions or text.
   ========================================================================== */

/* --------------------------------------------------------------------------
   #2 — Dark header breadcrumb trail. "All courses" and "Course overview" were
   competing bordered buttons; they are NAV LEVELS, not actions, so they become
   a quiet breadcrumb in the headline (top-left). Inherits the dark-header
   --paper text already set on [data-slot="ds-modal-header"].
   -------------------------------------------------------------------------- */
[data-slot="ds-modal-crumbs"] {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  line-height: 1.2;
  min-width: 0;
}

[data-slot="ds-modal-crumbs"] [data-slot="ds-modal-crumb"] {
  color: color-mix(in srgb, var(--paper) 72%, transparent);
  text-decoration: none;
  max-width: 24ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

[data-slot="ds-modal-crumbs"] [data-slot="ds-modal-crumb"]:hover {
  color: var(--paper);
  text-decoration: underline;
  text-underline-offset: 3px;
}

[data-slot="ds-crumb-sep"] {
  color: color-mix(in srgb, var(--paper) 40%, transparent);
}

[data-slot="ds-crumb-current"] {
  color: color-mix(in srgb, var(--paper) 92%, transparent);
  font-weight: 700;
  max-width: 30ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* #2 — Progress as a PLAIN label, not a bordered button-looking pill. No border,
   no fill box — just a quiet mono reading on the dark bar, set apart from the
   action buttons by spacing. */
[data-slot="ds-modal-progress"] {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--paper) 70%, transparent);
  white-space: nowrap;
  padding-right: 6px;
  border: 0;
  background: none;
}

/* #2 + #4 — Header action buttons: Next is the single filled PRIMARY, Prev the
   quiet ghost. Give both a comfortable >=44px tap target while keeping the
   compact letterbox look. Header buttons stay on a single line. */
[data-slot="ds-modal-header"] [data-slot~="ds-button"] {
  min-height: 40px;
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   #4 — MOBILE TAP TARGETS. On touch-width screens every nav/action button must
   be >=44px tall, single-line, and not clustered so tightly that they are easy
   to mis-tap. Applies to the dark header actions, the in-content pager, the
   spine "go" actions, and the home CTAs.
   -------------------------------------------------------------------------- */
@media (max-width: 640px) {
  /* Header actions: full comfortable height, sensible spacing, Next stays
     dominant. They wrap onto their own row (shell already sets flex-wrap). */
  [data-slot="ds-modal-header"] [data-slot="ds-actions"] {
    gap: 10px;
    row-gap: 10px;
    width: 100%;
  }
  [data-slot="ds-modal-header"] [data-slot~="ds-button"] {
    min-height: 44px;
    flex: 1 1 auto;
  }
  /* The plain progress label drops above the buttons, not squeezed between them. */
  [data-slot="ds-modal-progress"] {
    flex: 1 0 100%;
    padding-right: 0;
  }

  /* In-content pager links: comfortable tap height, already stack at <=560px. */
  [data-slot="ds-pager-link"] {
    min-height: 44px;
  }

  /* Spine actions: the per-step "go" chip becomes a real, reachable button on
     mobile (the shell already reveals it at <=560px; here we give it height). */
  [data-slot="ds-spine-go"] {
    min-height: 40px;
    display: inline-flex;
    align-items: center;
  }
  [data-slot="ds-spine-go"].is-primary {
    min-height: 44px;
    padding: 0 16px;
  }
}

/* --------------------------------------------------------------------------
   #3 — ONE obvious next action on the home, reachable on mobile. The compact
   required row and the resume hero each carry a single dominant primary button.
   Give those CTAs a >=44px tap target and, on mobile, keep them on their own
   full-width line below the card text (never hidden beside / under the cover).
   -------------------------------------------------------------------------- */
[data-slot~="ds-required-cta"] {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

[data-slot="ds-resume-cta"] {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

@media (max-width: 640px) {
  /* Resume hero: cover sits on top, then text, then a full-width primary CTA so
     the action is visible without horizontal scroll and is not hidden below the
     image. (The shell already collapses to a single column; we make the CTA
     full-bleed and unmistakably the primary action.) */
  [data-slot="ds-resume-cta"] {
    justify-self: stretch;
    width: 100%;
    text-align: center;
  }
  /* Required row: the Continue/Start button spans full width on its own line
     (the shell sets grid-area:cta at <=560px; reinforce stretch up to 640px). */
  [data-slot~="ds-required-cta"] {
    justify-self: stretch;
    width: 100%;
    text-align: center;
  }
}

/* --------------------------------------------------------------------------
   #5 — COWORK pill overlap. The floating "Ask Cowork" launcher is pinned to the
   bottom-right of the viewport (~54px pill + 14px inset). Reserve a bottom (and
   a little right) gutter on the LMS surfaces so the launcher never sits over the
   primary action or body text. Token-free spacing only; no colours touched.

   --mmd-cowork-gutter: the clearance below the fold the launcher needs.
   -------------------------------------------------------------------------- */
[data-slot="ds-modal"],
.ds-learning-page {
  --mmd-cowork-gutter: 92px;
}

/* Course / activity surface: the scrolling body's inner shell reserves the
   gutter so the in-content pager, Next button, assignment form, and end-page
   CTA all clear the launcher. */
[data-slot="ds-modal-body"] [data-slot="ds-course-shell"] {
  padding-bottom: var(--mmd-cowork-gutter);
}

/* Home surface: reserve the same clearance below the last section so the
   catalogue's final card / CTA is never covered. */
.ds-learning-page {
  padding-bottom: var(--mmd-cowork-gutter);
}

/* On narrow screens the launcher is a touch larger relative to the viewport and
   actions go full-width; give a little more breathing room. */
@media (max-width: 640px) {
  [data-slot="ds-modal"],
  .ds-learning-page {
    --mmd-cowork-gutter: 104px;
  }
}

/* === LMS v2 P6 block === */
/* ===================================================================   MMD LMS v2 — PHASE 6 (navigation de-clutter + top step-progress nav) central
   design-system additions. Authored by the learning remote; batched by the
   orchestrator into the shell's public/_design-system/components.css.

   Tokens ONLY — NO hardcoded hex, NO new colours, NO new fonts. All translucency
   via color-mix() over the EXISTING central tokens. This is a NAVIGATION /
   USABILITY pass inside the existing "Editorial Letterbox" aesthetic — it does
   NOT change the colour scheme, fonts, covers, sections, or the app concept.

   Token contract (defined by the shell): --paper, --paper-2, --ink, --ink-soft,
   --ink-mute, --ink-faint, --hairline, --baobab, --baobab-2, --baobab-bg,
   --signal-amber, --signal-amber-bg, --signal-grass, --signal-grass-bg,
   --font-display, --font-ui, --font-mono.

   Stakeholder fixes (navigation/usability only):
   - Problem 2: a compact horizontal STEP-PROGRESS NAV at the TOP (under the dark
     header, inside ds-modal) on the in-activity / in-check views. Lists every
     step (content activities + terminal Knowledge check) as small clickable dots,
     marks done / current / to-do reusing the spine node language (filled ink disc
     = done, baobab ring = current, hollow = todo), includes a "Course overview"
     link, lets the learner jump to any chapter, and scrolls / wraps on mobile.
   - Problems 1 & 4: handled in route.ts markup (removed duplicate nav buttons);
     no CSS needed here.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Problem 2 — top step-progress nav. It sits between the dark ds-modal-header
   and the ds-modal-body, on the light --paper surface. A "Course overview" link
   on the left, then a horizontally scrollable track of numbered step dots.
   -------------------------------------------------------------------------- */
[data-slot="ds-stepper"] {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 18px;
  background: var(--paper);
  border-bottom: 1px solid var(--hairline);
  min-width: 0;
}

/* "Course overview" — a quiet mono nav link (not a button), set apart on the
   left so the user can always jump back to the spine. */
[data-slot="ds-stepper-overview"] {
  flex: none;
  font-family: var(--font-mono);
  font-size: 10.5px;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: var(--ink-mute);
  text-decoration: none;
  white-space: nowrap;
  padding: 6px 10px 6px 0;
  border-right: 1px solid var(--hairline);
  min-height: 32px;
  display: inline-flex;
  align-items: center;
}
[data-slot="ds-stepper-overview"]:hover {
  color: var(--ink);
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* The track scrolls horizontally so a long course never breaks the header. */
[data-slot="ds-stepper-track"] {
  display: flex;
  align-items: center;
  gap: 4px;
  flex: 1 1 auto;
  min-width: 0;
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: thin;
  scrollbar-color: color-mix(in srgb, var(--ink) 22%, transparent) transparent;
  -webkit-overflow-scrolling: touch;
  padding-bottom: 2px;
}
[data-slot="ds-stepper-track"]::-webkit-scrollbar { height: 4px; }
[data-slot="ds-stepper-track"]::-webkit-scrollbar-thumb {
  background: color-mix(in srgb, var(--ink) 22%, transparent);
}

/* Each step: a node dot + number, with the label revealed for the current step
   and on hover/focus. Compact so many steps fit; min 40px hit area. */
[data-slot~="ds-stepper-step"] {
  flex: none;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  text-decoration: none;
  color: var(--ink-mute);
  padding: 6px 10px;
  min-height: 40px;
  border: 1px solid transparent;
  white-space: nowrap;
  transition: background .12s ease, color .12s ease, border-color .12s ease;
}
[data-slot~="ds-stepper-step"]:hover,
[data-slot~="ds-stepper-step"]:focus-visible {
  background: var(--paper-2);
  color: var(--ink);
  border-color: var(--hairline);
  outline: none;
}

/* Node dot — reuse the spine visual language exactly:
   to-do = hollow (paper fill, faint ring); done = filled ink disc;
   current = paper fill with a baobab ring. */
[data-slot="ds-stepper-node"] {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  flex: none;
  background: var(--paper-2);
  border: 1px solid var(--ink-faint);
}
[data-slot~="is-done"] [data-slot="ds-stepper-node"] {
  background: var(--ink);
  border-color: var(--ink);
}
[data-slot~="is-current"] [data-slot="ds-stepper-node"] {
  background: var(--paper);
  border: 2px solid var(--baobab);
}

/* Step number — mono, quiet; sharpens for the current step. */
[data-slot="ds-stepper-num"] {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.04em;
  color: var(--ink-mute);
  line-height: 1;
}
[data-slot~="is-done"] [data-slot="ds-stepper-num"] { color: var(--ink-faint); }
[data-slot~="is-current"] [data-slot="ds-stepper-num"] { color: var(--ink); }

/* Label — hidden by default to keep the track compact; shown for the current
   step (so the learner sees where they are) and on hover/focus of any step. */
[data-slot="ds-stepper-label"] {
  font-family: var(--font-ui);
  font-size: 12px;
  line-height: 1.1;
  color: inherit;
  max-width: 0;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  opacity: 0;
  transition: max-width .14s ease, opacity .14s ease;
}
[data-slot~="is-current"] [data-slot="ds-stepper-label"],
[data-slot~="ds-stepper-step"]:hover [data-slot="ds-stepper-label"],
[data-slot~="ds-stepper-step"]:focus-visible [data-slot="ds-stepper-label"] {
  max-width: 16ch;
  opacity: 1;
}
[data-slot~="is-current"] {
  background: var(--paper-2);
  border-color: var(--hairline);
  color: var(--ink);
}

/* The terminal Knowledge check step reads as the sequence end — give its label a
   touch more room when revealed since "Knowledge check" is longer. */
[data-slot~="is-check"][data-slot~="is-current"] [data-slot="ds-stepper-label"],
[data-slot~="is-check"]:hover [data-slot="ds-stepper-label"],
[data-slot~="is-check"]:focus-visible [data-slot="ds-stepper-label"] {
  max-width: 20ch;
}

/* --------------------------------------------------------------------------
   Mobile (<=640px) — the stepper wraps gracefully without breaking the header.
   The overview link drops onto its own row above a full-width scrollable track,
   and step hit areas stay >=40px.
   -------------------------------------------------------------------------- */
@media (max-width: 640px) {
  [data-slot="ds-stepper"] {
    flex-wrap: wrap;
    gap: 8px;
    padding: 8px 14px;
  }
  [data-slot="ds-stepper-overview"] {
    border-right: 0;
    border-bottom: 1px solid var(--hairline);
    width: 100%;
    padding: 4px 0;
    min-height: 36px;
  }
  [data-slot="ds-stepper-track"] {
    width: 100%;
    flex: 1 1 100%;
  }
}

/* ===== OMS-DENSITY-RESTORE: portal-transaction workbench family (module-workbench) — spacing/size only, restored from canonical DS 2026-06-30 ===== */
/* ===== Portal transaction workbench ===== */
.module-workbench{display:grid;gap:16px;padding-top:6px}
/* D4/D5 fix: was display:grid with minmax(0,1fr) auto — the auto action track (which can itself
   be wide, e.g. a thumbnail + button) forced the 1fr title track to collapse on real content,
   so a wrapped title visually collided with the actions. Flex+wrap lets actions drop to their
   own row once the title needs its minimum comfortable width, instead of sharing a shrinking row. */
.module-workbench-header{display:flex;flex-wrap:wrap;align-items:flex-end;gap:24px;padding:8px 0 14px;border-bottom:1px solid var(--ink)}
.module-title-block{flex:1 1 340px;min-width:0;max-width:640px}
.module-title{font-family:var(--font-ui);font-size:30px;line-height:1.12;font-weight:750;letter-spacing:0;margin:4px 0 0;color:var(--ink);max-width:100%;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}
.module-summary{max-width:880px;margin-top:7px;color:var(--ink-soft);font-family:var(--font-ui);font-size:14px;line-height:1.48}
.module-actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex-wrap:wrap;flex:0 0 auto;margin-left:auto}
.module-status-strip{display:grid;grid-template-columns:minmax(0,1fr) minmax(260px,0.55fr);gap:18px;padding:14px 16px;background:var(--paper);border:1px solid var(--hairline);border-left:3px solid var(--baobab)}
.module-status-text{margin-top:4px;color:var(--ink-soft);font-family:var(--font-ui);font-size:13px;line-height:1.45}
.module-grid{display:grid;grid-template-columns:minmax(0,1.08fr) minmax(300px,0.92fr);gap:18px;align-items:start}
.module-form{margin-top:0}
.module-form .ds-fieldset{padding:18px 20px;gap:12px}
.module-form .ds-textarea{min-height:70px}
.module-aside{display:flex;flex-direction:column;gap:18px;position:sticky;top:96px}
/* min-width:0 — same root cause as .ds-table-section below (Review C3, ~line 5999):
   .module-workbench is display:grid with an implicit auto column, and a grid item defaults to
   min-width:auto, refusing to shrink below its table's intrinsic content width. RecordsTable
   (ui.tsx) renders .module-table-section directly as a .module-workbench grid item on any
   surface that doesn't wrap it in an outer .ds-table-section (e.g. DealerCreditSurface's dealer
   picker table) — without this, a wide table (a compact id column forced open by an unbroken
   32-char ref, e.g.) can force the whole grid track past the viewport, and RecordsTable's own
   .ds-table-scroll wrapper has nothing to clip: the table's zebra-striped rows bleed past this
   section's bordered/rounded edge instead of scrolling inside it. */
.module-table-section{background:var(--paper);border:1px solid var(--hairline);border-radius:4px;margin-top:0;min-width:0}
.module-table-section .ds-records{margin-top:0}
.module-table-section .ds-records td{padding:12px 14px}
.module-row-action{width:140px;text-align:right}
.module-row-action .ds-button{padding:8px 12px;font-size:11px}

/* ===== Dense ERP working surfaces — kill the hero header + stacked full-width filters =====
   Scoped to the portal-transaction workbench family (OMS et al.). Additive overrides only:
   compact one-line title (no hero), inline auto-width filter controls (so .ds-filterbar is a
   single tight row, not a column of full-width inputs), tightened gaps so the filter bar and
   first data rows sit above the fold. Spacing/size only — no colour/theme changes. Uses
   padding-top/bottom (not the shorthand) to preserve the desktop padding-right action reserve. */
.module-workbench{gap:10px;padding-top:2px}
.module-workbench .module-workbench-header{padding-top:4px;padding-bottom:8px}
.module-workbench .module-title{font-size:19px;line-height:1.18;margin-top:2px}
.module-workbench .module-summary{margin-top:4px;font-size:13px}
.module-workbench .ds-filterbar{margin-top:0;gap:7px}
.module-workbench .ds-filterbar .ds-input,
.module-workbench .ds-filterbar .ds-select{width:auto;flex:0 0 auto;padding:7px 9px;font-size:13px}
.module-workbench .ds-filterbar .ds-input{flex:0 1 200px;min-width:120px}
.module-workbench .ds-filterbar .ds-field{flex:0 0 auto;gap:3px}
.module-workbench .ds-table-section{margin-top:8px}
.module-workbench .ds-table-header{padding:8px 14px}
.module-workbench .module-table-section .ds-records td{padding:9px 12px}

/* Reserve a right gutter on desktop so module-header actions (e.g. Helpdesk "New ticket")
   are not occluded by the fixed top-right .portal-user-menu (z-index 91). Only above the
   980px breakpoint, where the header is two-column and actions are right-aligned; below it
   actions move left (no collision) so no reserve is applied. */
@media (min-width:981px){
  .module-workbench-header{padding-right:248px}
  .portal-workbench-intro{padding-right:248px}
}
.dealer-standalone-shell{min-height:100dvh}
@media (min-width:981px){
  .dealer-standalone-shell .module-workbench-header{padding-right:0}
}
@media (max-width:980px){
  .module-workbench-header{flex-direction:column;align-items:flex-start}
  .dealer-standalone-shell .module-title-block{flex:0 0 auto}
  .module-title-block{flex:0 0 auto;max-width:100%}
  .module-actions{justify-content:flex-start;margin-left:0}
  .module-status-strip{grid-template-columns:1fr}
  .module-grid{grid-template-columns:1fr}
  .module-aside{position:static}
}
@media (max-width:720px){
  .module-workbench{gap:12px;padding-top:0}
  .module-workbench-header{gap:12px;padding:2px 0 12px}
  .module-title{font-size:24px}
  .module-summary{font-size:13px}
  .module-actions{display:grid;grid-template-columns:1fr;gap:8px;margin-left:0}
  .module-actions .ds-button{width:100%}
  .module-table-section{overflow:visible}
  .module-table-section .ds-records,
  .module-table-section .ds-records tbody,
  .module-table-section .ds-records tr,
  .module-table-section .ds-records td{display:block;width:100%}
  .module-table-section .ds-records{min-width:0}
  .module-table-section .ds-records tr{padding:12px 14px;border-bottom:1px solid var(--hairline)}
  .module-table-section .ds-records tr:last-child{border-bottom:0}
  .module-table-section .ds-records td{padding:3px 0;border-bottom:0}
  .module-table-section .ds-records-id{width:auto;font-family:var(--font-mono);font-size:11px;letter-spacing:0.08em;color:var(--ink-mute)}
  .module-table-section .module-row-action{text-align:left;padding-top:8px}
  .module-form .ds-fieldset{padding:16px 18px}
}

/* Helpdesk UX 2026-06-16: genuine "all set" empty state (composes existing primitives). */
.module-empty-state,
.ds-empty-state{display:flex;flex-direction:column;gap:10px;align-items:flex-start;padding:40px 32px}
.module-empty-state .ds-actions,
.ds-empty-state .ds-actions{padding-top:4px}
/* ===== END OMS-DENSITY-RESTORE ===== */

/* ===== EC×MD merge 2026-07-04: DataGrid (sortable/filterable/hover-preview) +
   drill-down node primitives. Composes only existing tokens (--ink/--paper/
   --hairline/--baobab/--font-mono/--radius-*) and existing ds-input/ds-filter-chip/
   ds-review-* classes for internal structure — see src/app/app/_components/DataGrid.tsx. */

/* Interactive breadcrumbs (drill-down back-navigation) — extends the existing
   ds-breadcrumbs component with a button reset; no new class introduced. */
.ds-breadcrumbs button{all:unset;cursor:pointer;font:inherit;color:inherit}
.ds-breadcrumbs button:hover:not(:disabled){color:var(--ink)}
.ds-breadcrumbs button:disabled{cursor:default;color:var(--ink)}

.ds-datagrid-wrap{position:relative;width:100%;overflow-x:auto}
.ds-datagrid{width:100%;border-collapse:collapse;font-size:12.5px}
.ds-datagrid thead tr{border-bottom:1px solid var(--ink)}
.ds-datagrid tbody tr+tr{border-top:1px solid var(--hairline)}
.ds-datagrid td{padding:7px 10px;vertical-align:middle;color:var(--ink);line-height:1.35}
.ds-datagrid-th{position:relative;text-align:left;padding:6px 10px;font-family:var(--font-mono);font-size:9.5px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-mute);white-space:nowrap}
.ds-datagrid-th-label{display:inline-flex;align-items:center;gap:4px}
.ds-datagrid-th[data-sortable="true"] .ds-datagrid-th-label{cursor:pointer}
.ds-datagrid-th[data-sortable="true"] .ds-datagrid-th-label:hover{color:var(--ink)}
.ds-datagrid-th-sort-asc .ds-datagrid-th-label::after{content:"▲";font-size:8px;color:var(--baobab);margin-left:1px}
.ds-datagrid-th-sort-desc .ds-datagrid-th-label::after{content:"▼";font-size:8px;color:var(--baobab);margin-left:1px}
.ds-datagrid-filter-toggle{border:0;background:transparent;color:var(--ink-faint);font-family:var(--font-mono);font-size:10.5px;padding:0 0 0 5px;cursor:pointer;line-height:1;vertical-align:middle}
.ds-datagrid-filter-toggle:hover,
.ds-datagrid-filter-toggle[data-active="true"]{color:var(--baobab)}
.ds-datagrid-filter{position:absolute;top:100%;left:6px;z-index:20;margin-top:4px;min-width:170px;max-width:260px;background:var(--paper);border:1px solid var(--ink);border-radius:var(--ds-radius-sm);box-shadow:0 6px 16px rgba(14,14,12,0.16);padding:8px;display:flex;flex-direction:column;gap:6px;text-transform:none;letter-spacing:normal;font-family:var(--font-ui);font-weight:500}
.ds-datagrid-filter .ds-input{font-size:12.5px;padding:6px 8px}
.ds-datagrid-filter-chips{display:flex;flex-wrap:wrap;gap:4px;max-height:170px;overflow:auto}
.ds-datagrid-row{cursor:pointer;transition:background .1s ease}
.ds-datagrid-row:hover{background:var(--paper-2)}
.ds-datagrid-row:focus-visible{outline:2px solid var(--baobab);outline-offset:-2px}
/* Selected-row state (OperationsSparesCostReport.tsx, P2-40.1 orphan sweep) --
   persistent highlight distinct from the transient :hover background above. */
.ds-row-selected{background:var(--paper-2);box-shadow:inset 2px 0 0 var(--baobab)}
.ds-datagrid-empty{padding:18px 10px;color:var(--ink-mute);font-size:12.5px;text-align:center}

/* ===== DataGrid extensions 2026-08-03 (sales-crm-oms-merge): column resize,
   cell truncation and a compact pager row. Composes only existing tokens
   (--ink/--paper/--paper-2/--hairline/--baobab/--ink-mute/--ink-faint/
   --font-mono/--radius-sm) -- no new custom properties. */
.ds-datagrid-resizer{position:absolute;top:0;right:0;bottom:0;width:6px;cursor:col-resize;background:transparent;opacity:0;transition:opacity .12s ease,background .12s ease}
.ds-datagrid-th:hover .ds-datagrid-resizer{opacity:1;background:var(--hairline)}
.ds-datagrid-resizer:hover{opacity:1;background:var(--baobab)}
.ds-datagrid-th-resizing{background:var(--paper-2)}
.ds-datagrid-th-resizing .ds-datagrid-resizer{opacity:1;background:var(--baobab)}
.ds-datagrid-cell-trunc{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-datagrid-age{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-faint);white-space:nowrap}
.ds-datagrid-pager{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 10px;border-top:1px solid var(--hairline);background:var(--paper-2)}
.ds-datagrid-pager-size{font-family:var(--font-mono);font-size:10.5px;font-weight:500;color:var(--ink-soft);background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:4px 6px;cursor:pointer}
.ds-datagrid-pager-nav{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);color:var(--ink-soft);font-family:var(--font-mono);font-size:11px;line-height:1;cursor:pointer}
.ds-datagrid-pager-nav:hover:not(:disabled){border-color:var(--ink);color:var(--ink)}
.ds-datagrid-pager-nav:disabled{color:var(--ink-faint);cursor:default}
.ds-datagrid-pager-info{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-mute);white-space:nowrap}

.ds-hover-preview{position:fixed;left:var(--hp-x,-9999px);top:var(--hp-y,-9999px);z-index:1000;min-width:220px;max-width:300px;background:var(--ink);border-radius:var(--ds-radius-sm);box-shadow:0 10px 28px rgba(14,14,12,0.3);padding:10px 12px;pointer-events:none}
.ds-hover-preview .ds-review-field{border-bottom:1px solid var(--hairline-on-ink);padding:5px 0}
.ds-hover-preview .ds-review-field:last-child{border-bottom:0}
.ds-hover-preview .ds-review-label{color:var(--paper-2)}
.ds-hover-preview .ds-review-value{color:var(--paper);font-size:12.5px}

.ds-drilldown-node{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;text-align:left;padding:12px 14px;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);cursor:pointer;transition:border-color .1s ease,background .1s ease}
.ds-drilldown-node:hover,
.ds-drilldown-node:focus-visible{border-color:var(--ink);background:var(--paper-2)}
.ds-drilldown-node-nm{font-family:var(--font-display);font-weight:700;font-size:15px;color:var(--ink);letter-spacing:-0.01em}
.ds-drilldown-node-sub{display:block;margin-top:3px;font-family:var(--font-mono);font-size:9.5px;letter-spacing:0.05em;text-transform:uppercase;color:var(--ink-mute)}
.ds-drilldown-node-count{font-family:var(--font-mono);font-size:12px;color:var(--ink-mute);white-space:nowrap}
.ds-drilldown-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;margin-top:6px}

/* ===== Process-flow iframe atlas (TA/H2R process review, 2026-07-16) ===== */
.ds-process-flow{grid-template-columns:minmax(0,1fr)}
.ds-process-flow-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:8px;margin-top:10px}
.ds-process-node{display:flex;flex-direction:column;gap:6px;min-width:0;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:8px}
.ds-process-node-head{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:start}
.ds-process-step{display:inline-grid;place-items:center;width:30px;height:30px;border:1px solid var(--ink);border-radius:999px;background:var(--ink);color:var(--paper);font-family:var(--font-mono);font-size:12px;font-weight:700}
.ds-process-thumb{height:132px;border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);overflow:hidden;background:var(--paper-2)}
.ds-process-thumb-frame{width:200%;height:200%;border:0;transform:scale(.5);transform-origin:0 0;pointer-events:none;background:var(--paper-2)}
.ds-process-thumb-img{display:block;width:100%;height:100%;object-fit:cover;object-position:top left;background:var(--paper-2);border:0}
.ds-process-node-link{text-decoration:none;color:inherit;cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease}
.ds-process-node-link:hover,.ds-process-node-link:focus-visible{border-color:var(--ink);box-shadow:0 0 0 1px var(--ink)}
.ds-process-node-link .ds-button{pointer-events:none}
/* Current/executable step in a process-flow strip — the one node the user is
   meant to act on (e.g. Record-to-Report's voucher posting). Emphasis is
   carried by an ink-weight frame, a thicker left edge and the paper-2 fill, so
   it reads as hierarchy rather than as an alert. Deliberately NOT baobab: this
   package already spends the scarce red on blocked/error states
   (.ds-process-node-badge-status-blocked), and a red step badge on the one
   step that actually works would read as the opposite of what it means. */
.ds-process-node-current{border-color:var(--ink);border-left-width:3px;background:var(--paper-2)}
.ds-process-lane{margin-top:14px}
/* Lane title row inside the process-flow atlas — mono uppercase micro-label + count + thin
   rule, same language as .ds-process-packet-section-title (TA flow-atlas rework 2026-07-18). */
.ds-process-lane-header{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin:18px 0 8px;padding-bottom:6px;border-bottom:1px solid var(--hairline)}
.ds-process-lane:first-child .ds-process-lane-header{margin-top:0}
.ds-process-lane-header-title{font-family:var(--font-mono);font-weight:600;font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.08em;text-transform:uppercase;color:var(--ink)}
.ds-process-lane-header-count{font-family:var(--font-mono);font-weight:500;font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.06em;color:var(--ink-mute)}

.ds-process-node-text{margin:0;color:var(--ink-soft);font-size:12.5px;line-height:1.45}
.ds-process-node-foot{display:flex;gap:8px;align-items:center;justify-content:space-between;flex-wrap:wrap;margin-top:auto}
.ds-process-thumb-empty{display:flex;align-items:center;justify-content:center;text-align:center;padding:12px}
/* Small bordered launch-surface screenshot (e.g. dealer-portal-launch preview image) — same frame
   language as ds-process-thumb but a plain <img>, not an iframe-scaled live preview. */
.ds-preview-thumb{width:180px;height:110px;object-fit:cover;border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper-2)}
/* Inline meta-line row (node/action/status style summary) used above a review/detail body —
   middle-dot-separated spans, muted weight, matches ds-process-node-text sizing. */
.ds-summary-row{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:center;color:var(--ink-soft);font-size:12.5px;line-height:1.5;padding:10px 14px;background:var(--paper-2);border-bottom:1px solid var(--hairline)}

a.ds-process-node{text-decoration:none;color:inherit;cursor:pointer}
a.ds-process-node:hover{border-color:var(--ink);background:var(--paper-2)}
a.ds-process-node:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}

.ds-process-modal-body{display:grid;grid-template-columns:minmax(220px,320px) minmax(0,1fr);gap:0;padding:0;overflow:hidden;background:var(--paper-2)}
.ds-process-modal-aside{display:flex;flex-direction:column;gap:12px;min-width:0;border-right:1px solid var(--hairline);background:var(--paper);padding:16px;overflow:auto}
.ds-process-modal-frame{width:100%;height:100%;border:0;background:var(--paper-2)}
.ds-process-screen-page{height:100vh;overflow:auto;background:var(--paper-2);padding:18px}

/* --- Stat card (KPI preview with a pop-out to full detail) ---------------------------------
   Dense summary tile: title + a short stack of label/value rows + a pop-out trigger.
   Used for TA Supplier reporting previews (candidate performance, billing, revenue, funnel)
   so the page shows a scannable summary and the full sortable/filterable table (ds-datagrid)
   opens on demand rather than always rendering wide tables inline. Reusable anywhere a report
   section needs the same summarize-then-drill-in pattern. */
.ds-stat-card-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;margin-top:18px}
.ds-stat-card{background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:16px}
.ds-stat-card-title{font-family:var(--font-display);font-weight:700;font-size:calc(15px * var(--fs-scale, 1));letter-spacing:-0.01em;color:var(--ink);margin:0 0 8px}
.ds-stat-row{display:flex;justify-content:space-between;gap:10px;font-size:calc(12.5px * var(--fs-scale, 1));padding:5px 0;border-bottom:1px solid var(--hairline)}
.ds-stat-row:last-of-type{border-bottom:0}
.ds-stat-row-value{font-family:var(--font-mono);font-weight:600;font-variant-numeric:tabular-nums;color:var(--ink)}
.ds-stat-card-actions{margin-top:10px}

/* --- Contact card (name + role, email/phone meta, accent bar) --------------------------------
   Dense single-row callout for a named point of contact -- e.g. the MMD recruiter/hiring-manager
   shown at the top of a record-detail dialog. Distinct from .ds-notice (which is for a system
   message/warning with a mono eyebrow label): this is a person, so the primary line is their
   name in normal weight, not a label. Tone variants (--ok/--warn) mirror .ds-notice-ok's
   pattern via a modifier class on the accent bar. */
.ds-contact-card{display:flex;align-items:center;gap:12px;background:var(--paper);border:1px solid var(--hairline);border-left:3px solid var(--baobab);border-radius:var(--ds-radius-sm);padding:10px 14px;margin:12px 0}
.ds-contact-card-ok{border-left-color:var(--signal-grass)}
.ds-contact-card-warn{border-left-color:var(--signal-amber)}
.ds-contact-name{font-weight:600;font-size:calc(13.5px * var(--fs-scale, 1));color:var(--ink)}
.ds-contact-meta{font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale, 1));color:var(--ink-mute);margin-top:2px}
.ds-contact-meta a{color:var(--baobab-deep)}

/* --- Status tile row (dense 3/4-up label+value cards) -----------------------------------------
   Compact prep/readiness indicators -- e.g. "CVs submitted / Shortlisted / Interview booked" on
   a demand-detail dialog, or interview prep status. Distinct from .ds-stat-card (which carries a
   display-font title and a stack of label/value rows): these are small, uniform, no title, and
   read at a glance in a grid. */
.ds-tile-row{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:14px 0}
.ds-tile-row-4{grid-template-columns:repeat(4,1fr)}
.ds-tile{background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:9px 10px}
.ds-tile-label{display:block;font-family:var(--font-mono);font-size:calc(9px * var(--fs-scale, 1));text-transform:uppercase;letter-spacing:0.04em;color:var(--ink-mute);margin-bottom:4px}
.ds-tile-value{font-size:calc(12.5px * var(--fs-scale, 1));color:var(--ink)}
.ds-tile-value-yes{color:var(--signal-grass)}
.ds-tile-value-no{color:var(--baobab-deep)}
.ds-process-screen-shell{max-width:980px;margin:0 auto;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:14px}
.ds-process-screen-form{margin-top:14px}
.ds-fieldset-compact{margin:0;padding:0;border:0;gap:8px}
.ds-choice-list{display:grid;gap:6px}
.ds-choice{display:flex;align-items:center;gap:8px;color:var(--ink-soft);font-size:13px}
.ds-process-node-edges{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.ds-tag-return{color:var(--ink-mute);border-style:dashed}
/* Branch/return edge token inside .ds-process-node-edges — arrow + target step number + a short
   sentence-case verb (e.g. "→ 5 Assign supplier"), same border/radius/padding language as .ds-tag
   but NOT uppercased (branch chips read as short instructions, not shouty labels). Reuses the
   dashed .ds-tag-return treatment for return/back edges. TA flow-atlas rework 2026-07-18. */
.ds-process-branch-chip{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-weight:500;font-size:calc(10.5px * var(--fs-scale, 1));letter-spacing:0.02em;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px;padding:3px 7px;text-decoration:none}
a.ds-process-branch-chip:hover,a.ds-process-branch-chip:focus-visible{color:var(--ink);border-color:var(--ink-mute)}
.ds-process-branch-chip-return{border-style:dashed}

.ds-process-role-list{margin:0;padding-left:16px;color:var(--ink-soft);font-size:12.5px;line-height:1.5}

/* Field-level data-contract source tag — small mono marker next to every field label, reuses the
   ds-tag visual weight (signal by weight not hue) rather than inventing a colour-coded taxonomy. */
.ds-tag-source{display:inline-block;margin-left:6px;font-family:var(--font-mono);font-weight:500;font-size:9px;letter-spacing:0.1em;text-transform:uppercase;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px;padding:1px 5px;vertical-align:middle}
.ds-process-field-note{display:block;margin-top:2px;color:var(--ink-mute);font-size:11px;line-height:1.4}
.ds-review-value-muted{color:var(--ink-mute);font-style:italic}

/* Approval / review packet (Section C) — requisition, budget-vs-plan, JD, candidate evidence,
   interview scores, prior-decision audit trail. Every section renders even when empty (explicit
   empty-state text), never a blank readonly line. */
.ds-process-packet{display:flex;flex-direction:column;gap:10px;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:14px;margin-bottom:14px}
.ds-process-packet-section{padding:8px 0;border-bottom:1px solid var(--hairline)}
.ds-process-packet-section:last-child{border-bottom:0}
.ds-process-packet-section-title{display:block;font-family:var(--font-mono);font-weight:600;font-size:11px;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink);margin-bottom:4px}
.ds-process-packet-section-body{margin:0;color:var(--ink-soft);font-size:12.5px;line-height:1.5}

/* Candidate intake dual-lane (CV upload primary + existing-candidate picker) */
.ds-process-intake-lanes{display:flex;flex-direction:column;gap:16px}
.ds-process-intake-lane{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper-2)}
.ds-process-candidate-card{display:flex;flex-direction:column;gap:8px;margin-top:8px;padding:10px;border:1px dashed var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper)}

/* Multi-file dropzone (CV upload, ID document upload, contract pack) */
.ds-process-dropzone{display:flex;flex-direction:column;gap:6px}
.ds-process-dropzone-area{position:relative;display:flex;align-items:center;justify-content:center;min-height:64px;border:1px dashed var(--ink-mute);border-radius:var(--ds-radius-sm);background:var(--paper-2);cursor:pointer;padding:10px}
.ds-process-dropzone-hint{color:var(--ink-mute);font-size:12px;font-family:var(--font-mono);letter-spacing:0.03em}
.ds-process-dropzone-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}
.ds-process-picker-input{background-image:none}

/* Cross-cutting case-summary slide-over (Section 1) — accumulated read-only timeline of every
   prior step's captured data, plus the "Return to step" control on nodes with a return edge. */
.ds-process-slideover-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.32);display:flex;justify-content:flex-end;z-index:1100}
.ds-process-slideover{width:min(480px,92vw);height:100vh;background:var(--paper-2);display:flex;flex-direction:column;box-shadow:-8px 0 24px rgba(0,0,0,.18)}
.ds-process-slideover-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 16px;background:var(--ink);color:var(--paper)}
.ds-process-slideover-header .eyebrow,
.ds-process-slideover-header .ds-table-title{color:var(--paper)}
.ds-process-slideover-body{flex:1;overflow:auto;padding:16px;display:flex;flex-direction:column;gap:16px}
.ds-process-timeline{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px}
.ds-process-timeline-item{border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper);padding:10px}
.ds-process-timeline-head{display:grid;grid-template-columns:auto minmax(0,1fr);gap:8px;align-items:start;margin-bottom:8px}
.ds-process-timeline-fields{display:flex;flex-direction:column;gap:4px}
.ds-process-return-panel{display:flex;flex-direction:column;gap:10px;border-top:1px solid var(--hairline);padding-top:14px}

/* External candidate/new-hire self-service screen — no internal portal chrome, distinct framing */
.ds-process-external-shell{background:var(--paper-2)}
.ds-process-external-shell .ds-process-screen-shell{border-color:var(--ink-mute)}

/* Primary-forward-path connector between lane-adjacent cards. Given the atlas renders lanes as
   sequential card-grid blocks (not a freeform canvas), the connector is drawn once per lane
   handoff — a hairline rule + arrow glyph between one lane's block and the next lane the PRIMARY
   path continues into. Branch/return edges are NOT drawn as connectors — those are
   .ds-process-branch-chip rows on the originating card. TA flow-atlas rework 2026-07-18. */
.ds-process-connector{display:flex;align-items:center;gap:8px;margin:2px 0 0;padding:6px 2px 0;color:var(--ink-mute);font-family:var(--font-mono);font-weight:500;font-size:calc(10.5px * var(--fs-scale, 1));letter-spacing:0.04em}
.ds-process-connector::before{content:"";flex:1 1 auto;height:1px;background:var(--hairline)}
.ds-process-connector-arrow{flex:none;color:var(--ink-mute);font-family:var(--font-mono)}

/* Fixed-position status pill in a process-atlas card head — Live / Design-only / Blocked /
   External. Same dot+mono-label language as .ds-node-status (agent-approval family), signalled
   by weight/color, not an invented icon set. TA flow-atlas rework 2026-07-18. */
.ds-process-node{position:relative}
.ds-process-node-badge-status{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;gap:5px;font-family:var(--font-mono);font-weight:600;font-size:calc(9px * var(--fs-scale, 1));letter-spacing:0.1em;text-transform:uppercase;padding:3px 8px;border-radius:2px;border:1px solid var(--hairline);color:var(--ink-mute);background:var(--paper);line-height:1.4}
.ds-process-node-badge-status::before{content:"";width:5px;height:5px;border-radius:50%;background:currentColor;flex:none}
.ds-process-node-badge-status-live{color:var(--signal-grass);border-color:var(--signal-grass);background:var(--signal-grass-bg)}
.ds-process-node-badge-status-design-only{color:var(--ink-mute);border-color:var(--hairline);background:var(--paper-2)}
.ds-process-node-badge-status-blocked{color:var(--baobab);border-color:var(--baobab);background:var(--paper)}
.ds-process-node-badge-status-external{color:var(--signal-amber);border-color:var(--signal-amber);background:var(--signal-amber-bg)}

@media (max-width: 900px){
  .ds-process-flow-grid{grid-template-columns:1fr}
  .ds-process-modal-body{grid-template-columns:1fr}
  .ds-process-modal-aside{border-right:0;border-bottom:1px solid var(--hairline);max-height:35vh}
  .ds-process-slideover{width:100vw}
}
/* ===== END Process-flow iframe atlas ===== */
/* ===== END EC×MD merge DataGrid/drilldown ===== */

/* ===== Coloured range slider (portal-oms quote-builder discount depth, 2026-07-07) =====
   Signal by WEIGHT not hue (same rule the existing ds-tag-* scale already follows) — green/amber
   read as ink-scale gray steps, red is the one place that spends the scarce baobab accent (a
   margin-floor breach is exactly the kind of rare, blocking signal baobab is reserved for). No new
   hex values: every colour here is an existing root token (--ink/-mute/-faint, --baobab/-bg). */
.ds-range{-webkit-appearance:none;appearance:none;width:100%;height:28px;background:transparent;padding:0;margin:0;cursor:pointer}
.ds-range::-webkit-slider-runnable-track{height:4px;border-radius:2px;background:var(--hairline)}
.ds-range::-moz-range-track{height:4px;border-radius:2px;background:var(--hairline)}
.ds-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:16px;height:16px;margin-top:-6px;border-radius:50%;border:2px solid var(--paper);background:var(--ink-mute);box-shadow:0 1px 3px rgba(14,14,12,0.25)}
.ds-range::-moz-range-thumb{width:16px;height:16px;border-radius:50%;border:2px solid var(--paper);background:var(--ink-mute);box-shadow:0 1px 3px rgba(14,14,12,0.25)}
.ds-range:focus-visible{outline:2px solid var(--baobab);outline-offset:4px}
.ds-range-green::-webkit-slider-thumb{background:var(--ink-faint)}
.ds-range-green::-moz-range-thumb{background:var(--ink-faint)}
.ds-range-amber::-webkit-slider-thumb{background:var(--ink)}
.ds-range-amber::-moz-range-thumb{background:var(--ink)}
.ds-range-red::-webkit-slider-runnable-track{background:var(--baobab-bg)}
.ds-range-red::-moz-range-track{background:var(--baobab-bg)}
.ds-range-red::-webkit-slider-thumb{background:var(--baobab);border-color:var(--baobab-bg)}
.ds-range-red::-moz-range-thumb{background:var(--baobab);border-color:var(--baobab-bg)}

/* ===== Filterbar/nav group-section micro-label (portal-oms 16-button section nav, 2026-07-07) =====
   Same mono micro-caption treatment as .ds-legend/.ds-table-title, one step quieter (ink-faint,
   ink-mute is already spoken for by legend/table-title) — a plain grouping caption, not a control. */
.ds-menu-section-label{display:block;font-family:var(--font-mono);font-weight:500;font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-faint);margin:2px 2px 0 2px}

/* ===== Remote-fragment crumb line (2026-07-07) =====
   .topbar in the DS is the standalone-page FIXED bar (shell.css). Inside a mounted remote
   fragment that bar overlays the shell chrome and intercepts clicks on the first content row
   (live defect on /app/oms). Scoped to [data-remote-fragment], a topbar>crumbs is a static,
   in-flow crumb line instead -- same mono/uppercase treatment tier as .ds-breadcrumbs. */
[data-remote-fragment] .topbar{position:static;height:auto;background:transparent;border-bottom:0;z-index:auto;padding:0;margin:0 0 6px}
[data-remote-fragment] .topbar .crumbs{display:flex;gap:8px;align-items:center;font-family:var(--font-mono);font-weight:500;font-size:11px;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-mute)}
[data-remote-fragment] .topbar .crumbs b{color:var(--ink);font-weight:600}
[data-remote-fragment] .topbar .crumbs .sep{color:var(--ink-faint)}


/* =====================================================   REFINED DESIGN SYSTEM — DS package  (2026-07-07, approved by Ben)
   Mirrors the shell refinements so remote-rendered fragments match:
   modern form fields, banded (zebra) tables, opt-in hover row-actions,
   five-role type-ladder utilities. Appended at EOF to govern over the
   file's earlier (duplicated) blocks. Reversible: delete this block.
   ============================================================ */

/* modern form fields — hairline + rounded-8 + focus ring */
.ds-input, .ds-select, .ds-textarea {
  border: 1px solid var(--hairline);
  border-radius: 8px;
  background: var(--paper);
}
.ds-input:focus, .ds-select:focus, .ds-textarea:focus {
  outline: none;
  border-color: var(--ink);
  box-shadow: 0 0 0 3px var(--baobab-bg);
}

/* banded (zebra) tables — kept per Ben, applied to every DS table */
.ds-records tbody tr { transition: background 0.12s ease; }
.ds-records tbody tr:nth-child(even) { background: color-mix(in srgb, var(--paper-2) 55%, var(--paper)); }
.ds-records tbody tr:hover           { background: var(--paper-2); }
.ds-records-compact tbody tr:nth-child(even) { background: color-mix(in srgb, var(--paper-2) 55%, var(--paper)); }
.ds-records-compact tbody tr:hover           { background: var(--paper-2); }
.ds-datagrid-row:nth-child(even) { background: color-mix(in srgb, var(--paper-2) 55%, var(--paper)); }
.ds-datagrid-row:hover           { background: var(--paper-2); }

/* opt-in hover row-actions */
.row-actions { display: inline-flex; align-items: center; gap: 4px; opacity: 0; transition: opacity 0.12s ease; }
tr:hover .row-actions, tr:focus-within .row-actions { opacity: 1; }
.row-kebab {
  display: inline-grid; place-items: center;
  width: 26px; height: 26px; border-radius: 6px;
  border: 1px solid transparent; background: transparent;
  color: var(--ink-faint); font-size: 16px; line-height: 1; cursor: pointer;
}
.row-kebab:hover { color: var(--ink); border-color: var(--hairline); background: var(--paper); }

/* five-role type-ladder utilities */
.t-display { font-family: var(--font-display); font-style: italic; font-weight: 700; font-size: 24px; letter-spacing: -0.01em; line-height: 1.12; color: var(--ink); }
.t-section { font-family: var(--font-display); font-weight: 700; font-size: 16px; letter-spacing: -0.01em; color: var(--ink); }
.t-label   { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.13em; text-transform: uppercase; color: var(--ink-mute); }
.t-body    { font-family: var(--font-ui); font-weight: 500; font-size: 14px; color: var(--ink); }
.t-num     { font-family: var(--font-ui); font-weight: 600; font-size: 14px; font-variant-numeric: tabular-nums; color: var(--ink); }

/* ===== Logo slot (THM-R-001 §1.1) — the ONE fixed masthead/splash logo component.
   Structure/size never varies per theme; only --ds-logo-asset (the background-image
   url) changes, driven by data-ds-theme (THM-R-002/THM-R-003). */
.ds-logo{display:inline-block;width:132px;height:28px;background-image:var(--ds-logo-asset);background-repeat:no-repeat;background-position:left center;background-size:contain}

/* REFINED DS — learning heading cap (2026-07-08): bring the LMS hero heading
   down to the display ceiling, consistent with the portal type ladder. */
.ds-learning-heading { font-size: clamp(26px, 2.6vw, 34px); line-height: 1.05; }

/* =====================================================================   LINT REMEDIATION BATCH (THM-T-005, 2026-07-08)
   Verbatim migration of every page-local <style jsx> block into the central
   DS — closes the styleJsx debt hidden since the 2026-07-07 lineage reconcile
   (8d1727c) dropped the styleJsx checker from this gate. Zero visual change:
   each page's rules are kept byte-equivalent under its existing unique class
   prefix (ib-/ec-/md-/cd-/am-/ce-/chr-/h2r-/ov-/tp-/hb-/it-jml-/leave-/news-/
   bd-). Targeted transforms only:
   - :global(X) unwrapped to plain descendant selectors (real stylesheet now);
   - HrHandbook's bare .ds-button override scoped to .hb-head .ds-button;
   - ItServiceRequest's .it-jml-head variant scoped under .it-jml (its page
     wrapper) so it no longer collides with ItJmlLanding's rule;
   - identical .ec-sync* duplicates (EmployeesTab/MasterData) left in place —
     byte-identical rules, harmless.
   Tokens only — no new hex values.
   ============================================================================ */
/* --- from src/app/app/finance/posting/FinancePostingInbox.tsx --- */
.ib-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; margin-bottom: 12px; }
.ib-head h1 { font-family: var(--font-display); font-weight: 700; font-size: 22px; color: var(--ink); letter-spacing: -0.02em; margin: 2px 0; }
.ib-sub { font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-mute); }
.ib-err { color: var(--baobab); font-size: 12px; }
.ib-muted { color: var(--ink-mute); font-size: 12px; }
.ib-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.ib-table thead th { text-align: left; font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-mute); padding: 4px 10px; border-bottom: 1px solid var(--hairline); }
/* Row is no longer a clickable <tr> (FIN-033 a11y): the voucher cell carries the
   real Next <Link>. Keep a subtle hover band but drop the row-level pointer so
   the row does not promise whole-row clickability it no longer has. */
.ib-row { border-bottom: 1px solid var(--hairline); }
.ib-row:hover { background: var(--paper-2); }
.ib-row td,.ib-row th { padding: 7px 10px; vertical-align: middle; }
.ib-table tbody th { text-align: left; font-family: var(--font-ui)!important; font-size: 12.5px!important; font-weight: 500!important; letter-spacing: 0!important; text-transform: none!important; color: var(--ink)!important; }
.ib-c { width: 64px; }
.ib-code { font-family: var(--font-mono); font-size: 11px; font-weight: 600; color: var(--baobab); }
.ib-subj { color: var(--ink); }
a.ib-subj { cursor: pointer; text-decoration: none; }
a.ib-subj:hover { color: var(--baobab); text-decoration: underline; }
a.ib-subj:focus-visible { outline: 2px solid var(--baobab); outline-offset: 2px; }
.ib-step { display: block; font-size: 11px; color: var(--ink-mute); margin-top: 1px; }
.ib-s { width: 150px; }
.ib-badge { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-mute); background: var(--paper-2); border: 1px solid var(--hairline); border-radius: 3px; padding: 2px 5px; white-space: nowrap; }
.ib-badge.waiting-for-user { color: var(--signal-amber); border-color: var(--signal-amber); background: var(--signal-amber-bg); }
.ib-badge.running { color: var(--signal-amber); border-color: var(--signal-amber); background: var(--signal-amber-bg); }
.ib-badge.completed, .ib-badge.done { color: var(--signal-grass); border-color: var(--signal-grass); background: var(--signal-grass-bg); }
.ib-u { width: 120px; font-family: var(--font-mono); font-size: 11px; color: var(--ink-mute); white-space: nowrap; }

/* --- from src/app/app/hr/master-data/EmployeesTab.tsx --- */
.ec-head { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 10px; flex-wrap: wrap; }
.ec-sub { font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-mute); }
.ec-tools { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.ec-in { font-size: 12px; padding: 6px 8px; background: var(--paper); border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); color: var(--ink); }
.ec-err { color: var(--baobab); font-size: 12px; }
.ec-sync { border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); background: var(--paper-2); padding: 10px 12px; margin-bottom: 12px; }
.ec-sync-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 12px; color: var(--ink-mute); margin-bottom: 6px; }
.ec-sync-head b { color: var(--ink); font-family: var(--font-display); }
.ec-muted { color: var(--ink-mute); font-size: 12px; }
.ec-form { border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); background: var(--paper-2); padding: 12px; margin-bottom: 14px; }
.ec-form-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 10px; }
.ec-form-head b { font-family: var(--font-display); color: var(--ink); font-size: 14px; }
.ec-uid { font-family: var(--font-mono); font-size: 10px; color: var(--ink-mute); }
.ec-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px 10px; }
.ec-field { display: flex; flex-direction: column; gap: 3px; }
.ec-field.wide { grid-column: span 2; }
.ec-field span { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-mute); }
.ec-field input, .ec-field select { font-size: 13.5px; padding: 7px 10px; background: var(--paper); border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); color: var(--ink); }
.ec-form-actions { display: flex; gap: 8px; align-items: center; margin-top: 12px; }
.ec-ghost { font-size: 12px; background: none; border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); padding: 6px 12px; color: var(--ink-mute); cursor: pointer; }
.ec-ghost.on { color: var(--baobab); border-color: var(--baobab); }
.ec-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.ec-table thead th { text-align: left; font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-mute); padding: 4px 10px; border-bottom: 1px solid var(--hairline); }
.ec-row { border-bottom: 1px solid var(--hairline); }
.ec-row:hover { background: var(--paper-2); }
.ec-row td { padding: 6px 10px; vertical-align: middle; color: var(--ink); }
.ec-nm { font-weight: 600; }
.ec-em { font-family: var(--font-mono); font-size: 11px; color: var(--ink-mute); }
.ec-st { width: 90px; }
.ec-badge { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-mute); background: var(--paper-2); border: 1px solid var(--hairline); border-radius: 3px; padding: 2px 5px; }
.ec-badge.active { color: var(--signal-grass); border-color: var(--signal-grass); background: var(--signal-grass-bg); }
.ec-badge.inactive { color: var(--ink-mute); }
.ec-badge.retired { color: var(--signal-amber); border-color: var(--signal-amber); background: var(--signal-amber-bg); }
.ec-badge.dormant { color: var(--ink-faint); border-color: var(--hairline); }
.ec-ax { width: 170px; white-space: nowrap; text-align: right; }
.ec-link { background: none; border: none; font-size: 12px; color: var(--baobab); cursor: pointer; padding: 2px 6px; text-decoration: none; }
.ec-link.danger { color: var(--signal-amber); }
.ec-link:disabled { opacity: 0.5; cursor: default; }
@media (max-width: 900px) { .ec-grid { grid-template-columns: repeat(2, 1fr); } .ec-field.wide { grid-column: span 2; } }

/* --- from src/app/app/hr/master-data/MasterData.tsx --- */
.md-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; margin-bottom: 10px; flex-wrap: wrap; }
.md-head h1 { font-family: var(--font-display); font-weight: 700; font-size: 22px; color: var(--ink); letter-spacing: -0.02em; margin: 2px 0; }
.md-sub { font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-mute); }
.md-tools { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.md-in { font-size: 12px; padding: 6px 8px; background: var(--paper); border: 1px solid var(--hairline); border-radius: 8px; color: var(--ink); }
.md-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--hairline); margin-bottom: 12px; }
.md-tab { font-size: 12px; padding: 6px 12px; background: none; border: none; border-bottom: 2px solid transparent; color: var(--ink-mute); cursor: pointer; }
.md-tab.on { color: var(--baobab); border-bottom-color: var(--baobab); font-weight: 600; }
.md-err { color: var(--baobab); font-size: 12px; }
.md-import-label { display: inline-flex; align-items: center; cursor: pointer; }
.ec-sync { border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); background: var(--paper-2); padding: 10px 12px; margin-bottom: 12px; }
.ec-sync-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: 12px; color: var(--ink-mute); margin-bottom: 6px; }
.ec-sync-head b { color: var(--ink); font-family: var(--font-display); }
.md-muted { color: var(--ink-mute); font-size: 12px; }
.md-form, .md-hist { border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); background: var(--paper-2); padding: 12px; margin-bottom: 14px; }
.md-form-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 10px; }
.md-form-head b { font-family: var(--font-display); color: var(--ink); font-size: 14px; }
.md-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px 10px; }
.md-field { display: flex; flex-direction: column; gap: 3px; position: relative; }
.md-field.wide { grid-column: span 2; }
.md-field span { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--ink-mute); }
.md-field input, .md-field select { font-size: 12px; padding: 5px 7px; background: var(--paper); border: 1px solid var(--hairline); border-radius: 8px; color: var(--ink); }
.md-field input.ro { background: var(--paper-2); color: var(--ink-mute); }
.md-mgr-list { position: absolute; top: 100%; left: 0; right: 0; z-index: 5; background: var(--paper); border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
.md-mgr-item { display: block; width: 100%; text-align: left; font-size: 12px; padding: 5px 8px; background: none; border: none; border-bottom: 1px solid var(--hairline); cursor: pointer; color: var(--ink); }
.md-mgr-item:hover { background: var(--paper-2); }
.md-mgr-cur { font-size: 11px; color: var(--signal-grass); }
.md-form-actions { display: flex; gap: 8px; align-items: center; margin-top: 12px; }
.md-ghost { font-size: 12px; background: none; border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); padding: 6px 12px; color: var(--ink-mute); cursor: pointer; }
.md-ghost.on { color: var(--baobab); border-color: var(--baobab); }
.md-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.md-table thead th { text-align: left; font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-mute); padding: 4px 10px; border-bottom: 1px solid var(--hairline); }
.md-row { border-bottom: 1px solid var(--hairline); }
.md-row:nth-child(even) { background: var(--paper-2); }
.md-row:hover { background: color-mix(in srgb, var(--paper-2) 72%, var(--ink) 9%); }
.md-ax .md-link { visibility: hidden; }
.md-row:hover .md-ax .md-link, .md-row:focus-within .md-ax .md-link { visibility: visible; }
.md-in:focus, .md-field input:focus, .md-field select:focus { outline: none; border-color: var(--ink); box-shadow: 0 0 0 3px var(--baobab-bg); }
.md-row td { padding: 6px 10px; vertical-align: middle; color: var(--ink); }
.md-badge { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-mute); background: var(--paper-2); border: 1px solid var(--hairline); border-radius: 3px; padding: 2px 5px; }
.md-badge.active { color: var(--signal-grass); border-color: var(--signal-grass); background: var(--signal-grass-bg); }
.md-badge.retired, .md-badge.archived, .md-badge.inactive { color: var(--signal-amber); border-color: var(--signal-amber); background: var(--signal-amber-bg); }
.md-ax { width: 150px; white-space: nowrap; text-align: right; }
.md-link { background: none; border: none; font-size: 12px; color: var(--baobab); cursor: pointer; padding: 2px 5px; }
.md-link.danger { color: var(--signal-amber); }
.md-link:disabled { opacity: 0.5; }
.md-chg { font-family: var(--font-mono); font-size: 10px; color: var(--ink-mute); max-width: 400px; overflow: hidden; text-overflow: ellipsis; }
.md-tree-country { margin-bottom: 10px; }
.md-tree-country-hd { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-mute); border-bottom: 1px solid var(--hairline); padding: 4px 0; margin-bottom: 2px; }
.md-tree-node { }
.md-tree-children { padding-left: 18px; }
.md-tree-item { display: flex; justify-content: space-between; align-items: center; width: 100%; text-align: left; background: none; border: none; border-bottom: 1px solid var(--hairline); padding: 4px 6px; cursor: pointer; font-size: 12.5px; color: var(--ink); }
.md-tree-item:hover { background: var(--paper-2); }
.md-tree-hc { font-family: var(--font-mono); font-size: 10px; color: var(--ink-mute); }
@media (max-width: 900px) { .md-grid { grid-template-columns: repeat(2, 1fr); } }

/* --- from src/app/app/hr-h2r/HrH2rCaseDrawer.tsx --- */
/* The step form is the task on this surface; "Case details" is reference.
   .ds-review-grid / .ds-review-aside / .ds-form are page-level primitives that
   assume a scrolling page with 96px of fixed chrome and a content-dominant
   left column — all three are wrong inside this full-screen modal, so the
   drawer restates them here rather than changing them for every consumer. */
.cd-body { overflow-y: auto; padding: 24px 28px 32px; }
.cd-grid { margin-top: 0; grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr); }
.cd-grid .ds-review-aside { position: static; }
.cd-form { margin-top: 0; }
.cd-err { color: var(--baobab); }
.cd-form .ds-actions { justify-content: flex-end; }
/* Fields flow into as many columns as fit, so the submit stays above the fold
   instead of ~200px below it, and collapse to one column when narrow.
   Textareas and the actions row always take the full width. */
.cd-form .ds-fieldset { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 18px 24px; align-items: start; }
.cd-form .ds-fieldset > .ds-hint,
.cd-form .ds-actions,
.cd-form .ds-field:has(.ds-textarea) { grid-column: 1 / -1; }
.cd-header-actions { display: flex; align-items: center; gap: 8px; }
.cd-cancel-btn { border-color: var(--baobab); color: var(--baobab); }
.cd-cancel-btn:hover { background: var(--baobab); color: var(--paper); }
.cd-cancel-btn-solid { border-color: var(--baobab); color: var(--baobab); }
.cd-cancel-btn-solid:hover { background: var(--baobab); color: var(--paper); }
.cd-cancel-confirm { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.cd-cancel-confirm-actions { display: flex; gap: 8px; margin-left: auto; }
.cd-start-recruitment { margin-top: 10px; }
@media (max-width: 880px) { .cd-grid { grid-template-columns: 1fr; } }
      

.am-modal { max-width: 720px; margin: 40px auto; height: auto; max-height: calc(100vh - 80px); border: 1px solid var(--hairline); }
.am-body { padding: 20px; display: flex; flex-direction: column; gap: 18px; overflow-y: auto; }
.am-details { grid-template-columns: repeat(2, 1fr); margin-top: 8px; }
.am-comment { max-width: 100%; }
.am-actions { justify-content: flex-end; }
.am-decline { border-color: var(--baobab); color: var(--baobab); }
.am-decline:hover { background: var(--baobab); color: var(--paper); }
.am-sendback { border-color: var(--signal-amber); color: var(--signal-amber); }
.am-sendback:hover { background: var(--signal-amber); color: var(--paper); }
@media (max-width: 640px) { .am-details { grid-template-columns: 1fr; } }

/* --- from src/app/app/hr-h2r/HrH2rCreateExit.tsx --- */
.cxe-body { overflow-y: auto; padding: 20px; display: flex; flex-direction: column; gap: 18px; }
.cxe-err { color: var(--baobab); }
.cxe-submit { justify-content: flex-end; }

/* --- from src/app/app/hr-h2r/HrH2rCreateHiringRequest.tsx --- */
.chr-body { overflow-y: auto; padding: 20px; display: flex; flex-direction: column; gap: 18px; }
.chr-err { color: var(--baobab); }
.chr-role-mini { border-top: 1px dashed var(--hairline); margin-top: 14px; padding-top: 14px; display: flex; flex-direction: column; gap: 12px; }
.chr-submit { justify-content: flex-end; }

/* --- from src/app/app/hr-h2r/HrH2rKanbanBoard.tsx --- */
.h2r-board { margin-bottom: 4px; }
.h2r-board-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px; }
.h2r-board-title { font-family: var(--font-display); font-weight: 700; font-size: 17px; color: var(--ink); letter-spacing: -0.02em; margin: 0; }
.h2r-board-count { font-family: var(--font-mono); font-size: 10px; color: var(--ink-mute); text-transform: uppercase; letter-spacing: 0.06em; }
.h2r-board-err { color: var(--baobab); font-size: 12px; margin: 4px 0; }
.h2r-board-muted { color: var(--ink-mute); font-size: 12px; }
.h2r-board-scroll { display: flex; gap: 8px; overflow-x: auto; padding-bottom: 8px; align-items: flex-start; }
.h2r-col { flex: 0 0 200px; background: var(--paper-2); border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); display: flex; flex-direction: column; max-height: 360px; }
.h2r-col-h { display: flex; align-items: center; gap: 6px; padding: 6px 8px; border-bottom: 1px solid var(--hairline); position: sticky; top: 0; background: var(--paper-2); }
.h2r-col-t { font-family: var(--font-mono); font-size: 10px; font-weight: 600; color: var(--ink-soft); text-transform: uppercase; letter-spacing: 0.03em; line-height: 1.25; flex: 1; }
.h2r-col-n { font-family: var(--font-mono); font-size: 10px; color: var(--ink-mute); background: var(--paper); border: 1px solid var(--hairline); border-radius: 8px; padding: 0 5px; }
.h2r-col-add { flex: none; width: 18px; height: 18px; display: grid; place-items: center; border: 1px solid var(--baobab); color: var(--baobab); background: var(--paper); border-radius: 3px; font-family: var(--font-mono); font-size: 12px; line-height: 1; cursor: pointer; }
.h2r-col-add:hover { background: var(--baobab); color: var(--paper); }
.h2r-col-b { padding: 6px; display: flex; flex-direction: column; gap: 5px; overflow-y: auto; }
.h2r-card { text-align: left; background: var(--paper); border: 1px solid var(--hairline); border-left: 3px solid var(--baobab); border-radius: var(--ds-radius-sm); padding: 6px 8px; cursor: pointer; display: flex; flex-direction: column; gap: 4px; }
.h2r-card:hover { border-color: var(--ink-faint); }
.h2r-card-title { font-size: 11.5px; color: var(--ink); line-height: 1.3; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.h2r-card-meta { display: flex; justify-content: space-between; align-items: center; }
.h2r-chip { font-family: var(--font-mono); font-size: 8.5px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-mute); background: var(--paper-2); border: 1px solid var(--hairline); border-radius: 3px; padding: 1px 4px; }
.h2r-card-id { font-family: var(--font-mono); font-size: 8.5px; color: var(--ink-faint); }
.h2r-empty { color: var(--ink-faint); font-size: 11px; text-align: center; padding: 4px 0; }

/* --- from src/app/app/hr-h2r/HrH2rLanding.tsx --- */
.h2r-landing-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; margin-bottom: 12px; }
.h2r-landing-head h1 { font-family: var(--font-display); font-weight: 700; font-size: 22px; color: var(--ink); letter-spacing: -0.02em; margin: 2px 0; }
.h2r-filters { display: flex; gap: 8px; }
.h2r-filter-select { min-width: 150px; }
.h2r-landing-err { color: var(--baobab); font-size: 12px; }
.h2r-landing-muted { color: var(--ink-mute); font-size: 12px; }
.h2r-boards { display: flex; flex-direction: column; gap: 16px; }
.h2r-tiles { margin-top: 20px; border-top: 1px solid var(--hairline); padding-top: 12px; }
.h2r-tiles-label { font-family: var(--font-mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-mute); }
.h2r-tile-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 8px; margin-top: 8px; }
.h2r-tile { display: flex; flex-direction: column; gap: 3px; padding: 8px 10px; background: var(--paper); border: 1px solid var(--hairline); border-left: 3px solid var(--baobab); border-radius: var(--ds-radius-sm); text-decoration: none; }
.h2r-tile:hover { border-color: var(--ink-faint); background: var(--paper-2); }
.h2r-tile-code { font-family: var(--font-mono); font-size: 10px; font-weight: 600; color: var(--baobab); letter-spacing: 0.04em; }
.h2r-tile-name { font-family: var(--font-display); font-weight: 600; font-size: 13px; color: var(--ink); line-height: 1.2; }
      

.gcm-body { padding: 0; overflow-y: auto; }
.gcm-body .topbar { display: none; }

/* --- from src/app/app/hr-h2r/HrH2rRenderer.tsx --- */
.hr-h2r-nav-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.hr-h2r-cancel-btn { border-color: var(--baobab); color: var(--baobab); }
.hr-h2r-cancel-btn:hover { background: var(--baobab); color: var(--paper); }
.hr-h2r-cancel-confirm { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.hr-h2r-cancel-confirm-actions { display: flex; gap: 8px; margin-left: auto; }
.hr-h2r-tech-detail { margin-top: 16px; font-size: 12px; color: var(--ink-mute); }
.hr-h2r-tech-detail summary { cursor: pointer; font-family: var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em; font-size: 10px; }

/* --- from src/app/app/hr-h2r/HrH2rTileSubpage.tsx --- */
.tp-head { display: flex; justify-content: space-between; align-items: center; gap: 12px; margin-bottom: 12px; }
.tp-head h1 { font-family: var(--font-display); font-weight: 700; font-size: 20px; color: var(--ink); letter-spacing: -0.02em; margin: 2px 0; }
.tp-err { color: var(--baobab); font-size: 12px; }
.tp-muted { color: var(--ink-mute); font-size: 12px; }
.tp-row-link { color: var(--ink); text-decoration: none; font-size: 13px; }
.tp-row-link:hover { color: var(--baobab); }
.tp-when { font-family: var(--font-mono); font-size: 11px; color: var(--ink-mute); }

/* --- from src/app/app/hr-handbook/HrHandbook.tsx --- */
.hb-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; margin-bottom: 14px; }
.hb-head .ds-button { white-space: nowrap; }
.hb-grid { display: grid; grid-template-columns: 248px 1fr; gap: 18px; align-items: start; }
.hb-list { display: flex; flex-direction: column; gap: 2px; border: 1px solid var(--hairline); border-radius: var(--radius); overflow: hidden; background: var(--paper); }
.hb-item { display: flex; flex-direction: column; gap: 1px; text-align: left; padding: 7px 10px; background: transparent; border: 0; border-bottom: 1px solid var(--hairline); cursor: pointer; }
.hb-item:last-child { border-bottom: 0; }
.hb-item:hover { background: var(--paper-2); }
.hb-item.active { background: var(--baobab-bg); box-shadow: inset 3px 0 0 var(--baobab); }
.hb-code { font-family: var(--font-mono); font-size: 10px; color: var(--baobab); letter-spacing: 0.04em; }
.hb-code.lg { font-size: 13px; }
.hb-name { font-size: 12px; color: var(--ink-soft); line-height: 1.25; }
.hb-detail { border: 1px solid var(--hairline); border-radius: var(--radius); padding: 16px 18px; background: var(--paper); min-width: 0; }
.hb-d-head { display: flex; align-items: baseline; gap: 10px; }
.hb-d-title { font-family: var(--font-display); font-weight: 700; font-size: 19px; color: var(--ink); letter-spacing: -0.02em; margin: 0; }
.hb-overview { font-size: 13px; color: var(--ink-soft); margin: 6px 0 8px; }
.hb-kv { background: var(--paper-2); border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); padding: 7px 10px; font-size: 12px; color: var(--ink-soft); margin-bottom: 12px; }
.hb-kv div { margin: 1px 0; }
.hb-kl { font-family: var(--font-mono); font-size: 9px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--ink-mute); margin-right: 6px; }
.hb-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--hairline); margin-bottom: 12px; }
.hb-tab { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.04em; text-transform: uppercase; padding: 6px 12px; background: transparent; border: 0; border-bottom: 2px solid transparent; color: var(--ink-mute); cursor: pointer; }
.hb-tab:hover { color: var(--ink-soft); }
.hb-tab.active { color: var(--baobab); border-bottom-color: var(--baobab); }
.hb-swim-scroll { overflow-x: auto; border: 1px solid var(--hairline); border-radius: var(--ds-radius-sm); padding: 10px; background: var(--paper); }
/* Scale the generated swimlane to the column so wide diagrams are never clipped;
   preserve aspect ratio and keep horizontal scroll as a fallback for very wide lanes. */
.hb-swim-scroll svg { width: 100%; max-width: 100%; height: auto; display: block; }
.hb-legend { font-size: 11px; color: var(--ink-mute); margin: 6px 0 0; }
.hb-legend .dia { color: var(--baobab); }
.hb-steps { list-style: none; margin: 0; padding: 0; }
.hb-steps li { margin: 0 0 9px; }
.hb-step-h { font-weight: 600; color: var(--ink); font-size: 13px; }
.hb-sn { display: inline-flex; align-items: center; justify-content: center; width: 17px; height: 17px; background: var(--baobab); color: var(--paper); border-radius: 50%; font-family: var(--font-mono); font-size: 10px; margin-right: 6px; }
.hb-role { float: right; font-family: var(--font-mono); font-size: 10px; color: var(--ink-mute); }
.hb-steps p { margin: 2px 0 0; font-size: 12.5px; color: var(--ink-soft); line-height: 1.45; }
.hb-raci { width: 100%; border-collapse: collapse; font-size: 11.5px; }
.hb-raci th { background: var(--ink); color: var(--paper); padding: 5px 8px; text-align: left; font-family: var(--font-mono); font-size: 10px; font-weight: 500; }
.hb-raci td { border: 1px solid var(--hairline); padding: 4px 8px; vertical-align: top; color: var(--ink-soft); }
.hb-raci th:nth-child(n+2), .hb-raci td:nth-child(n+2) { width: 15%; }
.hb-adv-block { margin: 0 0 8px; }
.hb-adv-role { font-family: var(--font-mono); font-size: 12px; font-weight: 700; color: var(--ink); }
.hb-adv ul { margin: 2px 0 6px 16px; }
.hb-adv li { font-size: 12.5px; color: var(--ink-soft); margin: 2px 0; line-height: 1.45; }
@media (max-width: 860px) { .hb-grid { grid-template-columns: 1fr; } }

/* --- from src/app/app/it/onboarding-offboarding/ItJmlLanding.tsx --- */
.it-jml-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; margin-bottom: 12px; }
.it-jml-head h1 { font-family: var(--font-display); font-weight: 700; font-size: 22px; color: var(--ink); letter-spacing: -0.02em; margin: 2px 0; }
.it-jml-err { color: var(--baobab); font-size: 12px; }
.it-jml-muted { color: var(--ink-mute); font-size: 12px; }
.it-jml-boards { display: flex; flex-direction: column; gap: 16px; }

/* --- from src/app/app/it/onboarding-offboarding/ItServiceRequest.tsx --- */
.it-jml .it-jml-head { display: flex; justify-content: space-between; align-items: flex-end; gap: 12px; margin-bottom: 14px; }
.it-jml-head h1 { font-family: var(--font-display); font-weight: 700; font-size: 22px; color: var(--ink); letter-spacing: -0.02em; margin: 2px 0; }
.it-jml-tabs { display: flex; gap: 4px; }
.it-jml-tab { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; padding: 6px 14px; border: 1px solid var(--hairline); background: var(--paper); color: var(--ink-mute); border-radius: var(--ds-radius-sm); cursor: pointer; }
.it-jml-tab.is-active { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.it-jml-card { max-width: 720px; background: var(--paper); border: 1px solid var(--hairline); border-radius: var(--radius); padding: 18px 20px; }
.it-jml-actions { margin-top: 14px; display: flex; justify-content: flex-end; }
.it-jml-status { max-width: 720px; margin-top: 12px; font-size: 13px; padding: 10px 12px; border-radius: var(--ds-radius-sm); border: 1px solid var(--hairline); }
.it-jml-status.is-ok { color: var(--signal-grass); border-color: var(--signal-grass); background: var(--signal-grass-bg); }
.it-jml-status.is-err { color: var(--baobab); border-color: var(--baobab); background: var(--baobab-bg); }

/* --- from src/app/app/me/leave/LeaveList.tsx --- */
.leave-list-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 12px;
  margin-bottom: 14px;
}
.leave-list-head h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 22px;
  color: var(--ink);
  letter-spacing: -0.02em;
  margin: 2px 0;
}

/* --- from src/app/app/me/leave/[leaveId]/LeaveDetail.tsx --- */
.leave-detail-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 12px;
  margin-bottom: 14px;
}
.leave-detail-head h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 22px;
  color: var(--ink);
  letter-spacing: -0.02em;
  margin: 2px 0;
}

/* --- from src/app/app/me/leave/new/LeaveRequestForm.tsx --- */
.leave-new-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 12px;
  margin-bottom: 14px;
}
.leave-new-head h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 22px;
  color: var(--ink);
  letter-spacing: -0.02em;
  margin: 2px 0;
}
.leave-new-card {
  max-width: 720px;
  background: var(--paper);
  border: 1px solid var(--hairline);
  border-radius: var(--radius);
  padding: 18px 20px;
}
.leave-status {
  max-width: 720px;
  margin-top: 12px;
  font-size: 13px;
  padding: 10px 12px;
  border-radius: var(--ds-radius-sm);
  border: 1px solid var(--hairline);
}
.leave-status.is-ok {
  color: var(--signal-grass);
  border-color: var(--signal-grass);
  background: var(--signal-grass-bg);
}
.leave-status.is-err {
  color: var(--baobab);
  border-color: var(--baobab);
  background: var(--baobab-bg);
}

/* --- from src/app/app/news/NewsList.tsx --- */
.news-head {
  margin-bottom: 14px;
}
.news-head h1 {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 22px;
  color: var(--ink);
  letter-spacing: -0.02em;
  margin: 2px 0;
}

/* --- from src/app/app/hub/HubShell.tsx --- */
.hub-shell-metrics {
  font-family: var(--font-mono);
  font-size: 10.5px;
  letter-spacing: 0.05em;
  color: var(--ink-mute);
  text-transform: uppercase;
  margin: 6px 0 0;
}
.hub-shell-tab-count {
  display: inline-block;
  font-family: var(--font-mono);
  font-size: 9px;
  color: inherit;
  opacity: 0.62;
  margin-left: 6px;
}
.ds-repnav-tab-active .hub-shell-tab-count {
  opacity: 0.85;
}

/* --- from src/app/app/procurement/ProcEa2Board.tsx --- */
/* --- from src/app/app/procurement/ProcEa2Board.tsx & HubShell.tsx --- */
[data-eid="hub-shell"].page-inner {
  max-width: none;
  width: 100%;
  margin: 0;
  padding: 12px 24px 16px;
  box-sizing: border-box;
}
.hub-repnav-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  border-bottom: 1px solid var(--hairline);
  margin-bottom: 8px;
}
.hub-repnav-row .ds-repnav {
  border-bottom: none;
  margin-bottom: 0;
  flex: 1 1 auto;
}
.hub-actions {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 8px;
}
.board {
  padding-bottom: 0;
  display: flex;
  flex-direction: column;
  height: calc(100vh - 165px);
  min-height: 540px;
}
.bd-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  margin-bottom: 8px;
  flex-wrap: nowrap;
  flex-shrink: 0;
}
.bd-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
  margin-left: auto;
}
.bd-actions .ds-button-primary {
  background: var(--ink);
  color: var(--paper);
  border: 1px solid var(--ink);
  font-weight: 600;
  white-space: nowrap;
}
.bd-actions .ds-button-primary:hover:not(:disabled) {
  background: var(--baobab);
  border-color: var(--baobab);
  color: var(--paper);
}
.bd-title {
  display: flex;
  align-items: baseline;
  gap: 8px;
  flex: 1 1 auto;
  min-width: 0;
}
.bd-title h1 {
  flex: 1 1 auto;
  min-width: 0;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 18px;
  line-height: 1.2;
  color: var(--ink);
  letter-spacing: -0.02em;
  margin: 0;
  white-space: normal;
  word-break: normal;
  overflow-wrap: normal;
}
.bd-code {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--baobab);
  white-space: nowrap;
  word-break: keep-all;
  flex-shrink: 0;
}
.bd-count {
  font-family: var(--font-mono);
  font-size: 10px;
  color: var(--ink-mute);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  white-space: nowrap;
  flex-shrink: 0;
}
.bd-err {
  color: var(--baobab);
  font-size: 12px;
  margin: 2px 0 6px;
  flex-shrink: 0;
}
.bd-muted {
  color: var(--ink-mute);
  font-size: 12px;
}
.bd-scroll {
  display: flex;
  gap: 10px;
  overflow-x: auto;
  padding-bottom: 4px;
  align-items: stretch;
  flex: 1 1 auto;
  min-height: 0;
  scrollbar-width: thin;
  scrollbar-color: var(--hairline) transparent;
}
.bd-col {
  flex: 1 1 0;
  min-width: 220px;
  background: var(--paper-2);
  border: 1px solid var(--hairline);
  border-radius: var(--ds-radius-sm);
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 0;
  overflow: hidden;
  box-shadow: 0 1px 3px rgba(14, 14, 12, 0.04);
}
.bd-col-h {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
  padding: 7px 10px;
  background: var(--ink);
  color: var(--paper);
  border-bottom: 1px solid var(--ink);
  border-radius: calc(var(--ds-radius-sm) - 1px) calc(var(--ds-radius-sm) - 1px) 0 0;
  position: sticky;
  top: 0;
  z-index: 2;
  flex-shrink: 0;
}
.bd-col-h-main {
  display: flex;
  align-items: center;
  gap: 6px;
  min-width: 0;
  flex: 1 1 auto;
}
.bd-col-t {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 700;
  color: var(--paper);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  line-height: 1.25;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.bd-col-n {
  font-family: var(--font-mono);
  font-size: 9px;
  font-weight: 600;
  color: var(--paper);
  background: transparent;
  border: 1px solid color-mix(in srgb, var(--paper) 40%, transparent);
  border-radius: 8px;
  padding: 0 5px;
  line-height: 1.3;
  flex-shrink: 0;
}
.bd-col-totals {
  display: flex;
  align-items: center;
  flex-shrink: 0;
  margin-left: auto;
}
.bd-col-total {
  font-family: var(--font-mono);
  font-size: 9px;
  color: color-mix(in srgb, var(--paper) 70%, transparent);
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.bd-col-b {
  padding: 8px 10px 12px 8px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  flex: 1 1 auto;
  overflow-y: auto;
  overflow-x: hidden;
  min-height: 0;
}
/* Physical paper stack card: top sheet + two offset sheet edges beneath it
   visible along bottom and right, with soft contact shadow */
.bd-card {
  position: relative;
  text-align: left;
  background: var(--paper);
  border: 1px solid rgba(26, 26, 26, 0.16);
  border-left: 3px solid var(--ink-faint);
  border-radius: 2px;
  padding: 8px 10px;
  cursor: pointer;
  display: flex;
  flex-direction: column;
  gap: 4px;
  flex-shrink: 0;
  margin-bottom: 8px;
  margin-right: 4px;
  box-shadow: 0 1px 2px rgba(26, 26, 26, 0.06);
  transition: transform var(--ds-motion-fast, 0.12s) ease, box-shadow var(--ds-motion-fast, 0.12s) ease, border-color var(--ds-motion-fast, 0.12s) ease;
}
/* Layer 1 under-sheet (peeking out bottom and right by 2.5px) */
.bd-card::before {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  right: -3px;
  bottom: -3px;
  background: var(--paper-2);
  border: 1px solid rgba(26, 26, 26, 0.12);
  border-radius: 2px;
  z-index: -1;
  pointer-events: none;
  box-shadow: 0 1px 2px rgba(26, 26, 26, 0.05);
  transition: transform var(--ds-motion-fast, 0.12s) ease;
}
/* Layer 2 under-sheet (peeking out further by 5.5px with soft contact shadow) */
.bd-card::after {
  content: "";
  position: absolute;
  top: 4px;
  left: 4px;
  right: -6px;
  bottom: -6px;
  background: var(--paper-3);
  border: 1px solid rgba(26, 26, 26, 0.09);
  border-radius: 2px;
  z-index: -2;
  pointer-events: none;
  box-shadow: 0 4px 10px rgba(26, 26, 26, 0.10), 0 1px 3px rgba(26, 26, 26, 0.06);
  transition: transform var(--ds-motion-fast, 0.12s) ease, box-shadow var(--ds-motion-fast, 0.12s) ease;
}
.bd-card:hover {
  transform: translateY(-2px);
  border-color: var(--ink-faint);
  box-shadow: 0 3px 6px rgba(26, 26, 26, 0.08);
}
.bd-card:hover::before {
  transform: translateY(0.5px);
}
.bd-card:hover::after {
  transform: translateY(1px);
  box-shadow: 0 6px 16px -2px rgba(26, 26, 26, 0.16), 0 2px 5px rgba(26, 26, 26, 0.08);
}
/* Left-edge accent is state-driven, not decorative: baobab (scarce accent) is
   reserved for exception states, matching the ds-tag-error convention used
   elsewhere (HubShell.tsx tagVariant). A normal in-flight case stays on the
   neutral hairline border above. */
.bd-card-waiting-for-user {
  border-left-color: var(--signal-amber);
}
.bd-card-completed,
.bd-card-approved,
.bd-card-done {
  border-left-color: var(--signal-grass);
}
.bd-card-error,
.bd-card-failed,
.bd-card-cancelled,
.bd-card-rejected {
  border-left-color: var(--baobab);
}
.bd-card-s {
  font-size: 11.5px;
  font-weight: 600;
  color: var(--ink);
  line-height: 1.3;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.bd-card-m {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 6px;
}
.bd-card-ref {
  font-family: var(--font-mono);
  font-size: 9px;
  color: var(--ink-mute);
  letter-spacing: 0.02em;
}
/* R7: calmed from a bright bordered chip to plain colour text -- the
   Comparison Builder register (see its "Variance" field) -- status stays
   legible via label + colour + weight, never a loud box on every card. */
.bd-badge {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--ink);
}
.bd-badge.waiting-for-user,
.bd-badge.in-progress,
.bd-badge.intake,
.bd-badge.open,
.bd-badge.draft {
  color: var(--ink);
}
.bd-badge.completed,
.bd-badge.approved,
.bd-badge.done {
  color: var(--signal-grass);
}
.bd-badge.error,
.bd-badge.failed,
.bd-badge.cancelled,
.bd-badge.rejected {
  color: var(--baobab);
}
.bd-id {
  font-family: var(--font-mono);
  font-size: 8.5px;
  color: var(--ink-faint);
}
.bd-empty {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 60px;
  padding: 12px 10px;
  border: 1px dashed var(--hairline);
  border-radius: var(--ds-radius-sm);
  color: var(--ink-mute);
  font-size: 11px;
  font-family: var(--font-ui);
  text-align: center;
  background: var(--paper);
  margin-top: 2px;
  margin-bottom: 8px;
  margin-right: 4px;
  flex: 1 1 auto;
}

/* Hub Shell My Queue — Opportunities-consistent Paper File Rows */
.hub-queue-section {
  width: 100%;
  max-width: 100%; /* R7: was 1200px, stranding the list a third short of the desk edge */
  margin: 0 0 24px 0;
  padding: 0;
}
.hub-queue-section .ds-table-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 12px;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--hairline);
}
.hub-queue-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
  width: 100%;
}
.hub-queue-folder {
  text-align: left;
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  margin-bottom: 12px;
}
.hub-queue-folder .ds-link-row-title {
  display: block;
  text-align: left;
  font-size: 14px;
  font-weight: 600;
  color: var(--ink);
  line-height: 1.3;
  margin-top: 3px;
}
.hub-queue-folder .ds-hint {
  display: block;
  text-align: left;
  font-size: 11.5px;
  color: var(--ink-mute);
  margin-top: 2px;
  margin-bottom: 6px;
}
.hub-queue-folder .ds-review-strip {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-start;
  gap: 6px 28px;
  width: 100%;
  box-sizing: border-box;
  margin-top: 4px;
  padding-top: 6px;
  border-top: 1px solid var(--hairline);
}
.hub-queue-folder .ds-review-field {
  flex: 0 1 auto;
  min-width: 110px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  text-align: left;
}
.hub-queue-folder .ds-review-label {
  display: block;
  text-align: left;
  font-family: var(--font-mono);
  text-transform: uppercase;
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.05em;
  line-height: 1.1;
  color: var(--ink-mute);
}
.hub-queue-folder .ds-review-value {
  display: block;
  text-align: left;
  color: var(--ink);
  font-size: 12.5px;
  font-weight: 500;
  line-height: 1.25;
}

/* --- from src/app/app/procurement/ProcEa2Renderer.tsx --- */
.lines-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 12px;
  margin-bottom: 8px;
}
.lines-table th,
.lines-table td {
  border: 1px solid var(--hairline);
  padding: 4px 6px;
  text-align: left;
}
.lines-table th {
  font-family: var(--font-mono);
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--ink-mute);
  background: var(--paper-2);
}
.lines-table-readonly td {
  color: var(--ink-soft);
}
.lines-table input.ds-input {
  width: 100%;
  min-width: 70px;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* UX-01/D19b round (verifier): text-bearing line columns rendered too
   narrow to read their own contents — give the wordy columns a real floor
   while numeric/code columns stay compact. */
.lines-table td:nth-child(3) input.ds-input,
.lines-table td:nth-child(4) input.ds-input {
  min-width: 180px;
}
.lines-table td:nth-child(2) input.ds-input {
  min-width: 110px;
}
/* HIRE-010: structured requirement editor (RequirementsEditor.tsx) is the
   first .lines-table consumer whose rows carry a <select> cell (priority)
   alongside the existing <input> cells — same full-width-in-cell treatment. */
.lines-table select.ds-select {
  width: 100%;
  min-width: 120px;
}

/* ===== FINREP dense financial-table numerics (2026-07-08) =====
   .ds-mono-num: right-aligned tabular-figure amount cell for td AND th — additive sibling
   to .ds-mono (which stays left-aligned for codes/hashes/ids elsewhere). Applied to numeric
   columns (opening/debit/credit/closing/balance/aging buckets) on GL reporting + FINREP
   report tables. .ds-mono-num-negative is a modifier (combine both classes) giving a
   negative amount the same "danger" ink the DS already uses for .ds-menu-item-danger. */
.ds-mono-num{font-family:var(--font-mono);font-weight:500;font-size:calc(11.5px * var(--fs-scale, 1));letter-spacing:0.02em;color:var(--ink-soft);text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.ds-mono-num-negative{color:var(--baobab)}
th.ds-mono-num{font-weight:500}

/* .ds-records-compact-sticky: opt-in modifier (combine with .ds-records-compact on the same
   <table>) that pins the header row to the top of the page as a long report table scrolls.
   Scoped to the modifier so every OTHER .ds-records-compact table in the app (which does not
   add this class) is completely unaffected. */
.ds-records-compact-sticky thead th{position:sticky;top:0;z-index:3;background:var(--paper);border-bottom:1px solid var(--ink);padding:8px 12px;text-align:left;font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.1em;text-transform:uppercase;color:var(--ink-mute)}
.ds-records-compact-sticky thead th.ds-mono-num{text-align:right}

/* ===== FINREP design-review fixes (2026-07-08, review C2 + I1) =====
   C2: `.module-workbench .ds-filterbar .ds-input{flex:0 1 200px}` assumes the input sits
   directly in the ROW-direction filterbar. Inside a `.ds-field` wrapper (COLUMN direction —
   the labeled-input pattern the reporting filter rows use) that 200px flex-basis applies to
   the vertical axis, blowing the input up to a 200px-tall card (verified via live computed
   styles: height:200px, flex:0 1 200px). Neutralize the basis in the ds-field context so the
   input keeps its natural compact height; width stays content-sized with the same 120px floor
   the row-direction rule uses. */
.module-workbench .ds-filterbar .ds-field .ds-input{flex:0 0 auto;min-width:120px}

/* I1: the union-merged file carries two conflicting `.ds-button-secondary:hover` rules — an
   earlier one sets {background:ink; color:paper}, a later one resets background to transparent
   but NOT color. Net computed hover state: paper-colored text on a transparent background =
   the button label disappears on hover (verified live: color rgb(250,250,246), bg transparent).
   Re-assert readable hover ink last so it wins; background/border keep the later rule's
   transparent/ink treatment. */
.ds-button-secondary:hover{color:var(--ink)}

/* ===== Reporting UX audit fixes (2026-07-09) =====
   ds-table-scroll: NEW opt-in wrapper (wrap `<div className="ds-table-scroll"><table ...>`)
   giving a report table a horizontal scrollbar when it's wider than its container. Review C3:
   Stock Valuation's Items table clipped 49.7px off the right edge of a 1440px viewport with
   `document.body.scrollWidth === window.innerWidth` exactly — i.e. there was NO scroll
   mechanism anywhere on the page; the overflow was simply unreachable, not just visually tight.
   `.ds-table-section`/`.ds-records-compact` never had an overflow rule at all, so ANY report
   table wider than its container has this same latent failure mode — applied across every
   report table in Reporting, not only the one the audit happened to catch.

   min-width:0 makes the wrapper a real overflow boundary: without it a grid/flex descendant
   defaults to min-width:auto and refuses to shrink below its table's intrinsic width, so
   overflow-x:auto has nothing to clip and never produces a scrollbar. */
.ds-table-scroll{overflow-x:auto;min-width:0}
/* Wave 6 UX finding 13 (bom-consumption: last column truncated mid-word,
   NO scrollbar, no gradient -- clip was total, not just visually tight).
   Root cause: `.ds-table-section` (the DIRECT child of `.module-workbench`,
   a `display:grid` container with one implicit auto track) is a grid ITEM.
   Per the CSS Grid "automatic minimum size" algorithm, a grid item that is
   not itself a scroll container keeps its content-based (min-content)
   minimum size regardless of any `minmax(0,1fr)` cap on the track --
   `[data-eid="reporting-section"] .module-workbench{grid-template-columns:
   minmax(0,1fr)}` above caps the TRACK, not this item's own auto minimum.
   A wide `.ds-records-compact` table (nowrap `.ds-mono-num` cells refusing
   to shrink) can still force `.ds-table-section` -- and so the grid track
   and `.module-workbench-reporting` itself -- wider than the viewport.
   `.module-workbench.module-workbench-reporting{overflow-x:clip}` then
   silently CROPS that overflow with zero affordance (no scrollbar, no
   shadow -- `clip` has neither) before `.ds-table-scroll`'s own
   overflow-x:auto below ever gets a bounded box to scroll. Giving
   `.ds-table-section` an explicit min-width:0 makes it a real shrinkable
   grid item, so `.ds-table-scroll` inside it is the one that overflows and
   scrolls -- with the visible scrollbar + edge-fade below -- instead of the
   ancestor silently clipping it. max-width:100% on `.ds-table-scroll`
   itself is belt-and-suspenders: the wrapper can never grow past its own
   containing block regardless of what its table child wants. */
.ds-table-section{min-width:0}
.ds-table-scroll{max-width:100%}

/* Review C3 (root cause): `.module-workbench` is `display:grid` with an IMPLICIT `auto`
   column. A grid item's default `min-width:auto` lets the single auto track grow to the
   widest item's min-content — so a report table wider than the page (Stock Valuation's Items
   table: intrinsic 1158px inside a 1080px `.page-inner`) forced the whole track to 1158px,
   breaking out of the page and pushing the last column ~50px off the right edge of the
   viewport with `document.body.scrollWidth === window.innerWidth` (no page scroll to reach
   it) — the exact unreachable-overflow the audit caught. Verified live post-first-deploy:
   the `.ds-table-scroll` wrapper alone was inert (clientWidth === scrollWidth === 1158, never
   scrolled) because this outer track was still growing under it. Capping the column at
   `minmax(0,1fr)` floors the track at 0 and caps it at the container width, so every table
   section stays page-width and the `.ds-table-scroll` wrapper inside finally has something to
   clip + scroll. The header defines its own inner grid and is unaffected.

   SCOPED to the reporting surface (`[data-eid="reporting-section"]`, the reporting layout
   wrapper) rather than `.module-workbench` globally: the same class backs OMS / procurement /
   other workbench pages, and capping their grid track could clip a wide table that today
   overflows-visibly on a page WITHOUT a `.ds-table-scroll` wrapper. Reporting is the only
   surface that (a) was audited for this and (b) wraps every table in `.ds-table-scroll`, so
   the cap is safe and complete here and touches nothing else. */
[data-eid="reporting-section"] .module-workbench{grid-template-columns:minmax(0,1fr)}

/* Review C2: two independently-reproduced cases of an ACTIVE filter chip rendering with
   identical text/background color (`color: rgb(14,14,12)` == `background-color:
   rgb(14,14,12)`, both --ink) instead of the correct paper-on-ink. components.css carries
   .ds-filter-chip/.ds-filter-chip-active defined 5 separate times at different points in this
   file (lines ~77, ~271, ~1796, ~1916, ~3281 as of this fix) — all currently agree on the
   paper/ink values, but that many duplicate definitions of the same class is exactly the kind
   of specificity/ordering hazard that produces a black-on-black bug the moment any ONE copy
   drifts (as already happened to `.ds-filter-chip` itself: the padding/border-radius already
   differ between copies). Re-assert the correct active-chip colors as the unconditionally last
   word in the cascade for the reporting surface, same pattern as the C2/I1 fix directly above.
   Review C1: the period-preset chips (This month/This quarter/YTD/Prior year) never computed
   an active class AT ALL — clicking correctly updated from/to but gave zero visual
   confirmation, which reads as a dead button (worst on days the quarter and month ranges
   coincide). Fixed at the source in ReportingFilterBar.tsx / SaleReportReport.tsx /
   StatementReport.tsx / SalesSummaryReport.tsx (now compute the active class the same way the
   country/currency chips already did) — this rule is the CSS-side backstop for that class. */
.module-workbench .ds-filterbar .ds-filter-chip-active{color:var(--paper);background:var(--ink);border-color:var(--ink)}

/* Review I1: without a fixed table-layout, a report table's column widths are content-driven —
   expanding the Trial Balance tree deep enough (5+ levels) changed the Name column's effective
   width, which reflowed UNRELATED sibling rows elsewhere in the same table (a root row wrapping
   to two lines with no change to its own content or the viewport). .ds-records-compact-fixed is
   an opt-in modifier (combine with .ds-records-compact on the same <table>, alongside an explicit
   <colgroup> giving each column a percentage width) that makes column widths independent of cell
   content, so one row's content can never perturb another row's layout. Scoped to the modifier so
   every OTHER .ds-records-compact table (no explicit colgroup) is unaffected. */
.ds-records-compact-fixed{table-layout:fixed}
/* --- TA Recruitment breadcrumb + kanban main nav (TaMainNav.tsx) —
   TAR-R-061 / TAR-R-062. 12-column dense board (11 live phases + Completed)
   sized to fit on screen without page scroll; each column scrolls
   internally instead. Breadcrumb crumbs double as a phase filter/focus
   toggle for the board below them. -------------------------------------- */
.ta-nav{display:flex;flex-direction:column;gap:8px}
.ta-crumbs{display:flex;flex-wrap:wrap;align-items:center;gap:2px;padding:6px 8px;background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm)}
.ta-crumb-wrap{display:inline-flex;align-items:center;gap:2px}
.ta-crumb-sep{color:var(--ink-faint);font-size:11px}
.ta-crumb{display:inline-flex;align-items:center;gap:5px;background:transparent;border:1px solid transparent;border-radius:3px;padding:3px 7px;font-family:var(--font-mono);font-size:10.5px;text-transform:uppercase;letter-spacing:0.03em;color:var(--ink-soft);cursor:pointer}
.ta-crumb:hover{background:var(--paper);border-color:var(--hairline)}
.ta-crumb-current{background:var(--baobab-bg);border-color:var(--baobab);color:var(--baobab)}
.ta-crumb-n{font-family:var(--font-mono);font-size:9px;color:var(--ink-mute);background:var(--paper);border:1px solid var(--hairline);border-radius:8px;padding:0 5px}
.ta-crumb-current .ta-crumb-n{border-color:var(--baobab);color:var(--baobab)}

/* ROOT-CAUSE FIX (2026-07-21, sideload-measured): this is the canonical,
   manifest-registered .ta-kanban rule. Two prior fix attempts edited a
   `kanban-2row` modifier class in the SHELL'S OWN globals.css instead of
   this file, so their 6-col/2-row grid never reliably won the cascade --
   this rule (equal specificity, loaded after globals.css on the page)
   always overrode it back to a stale 12-col single-row grid left over
   from an earlier board design. Fixed here, at the actual DS source of
   truth, and the app no longer needs a separate override class. */
/* R12 (2026-07-24) -- 10 live kanban phases (onboarding + completed moved
   out, R10/R11/R14) fit a clean 5-wide x 2-row grid -- wider columns than
   the old 6-wide/12-phase layout. */
.ta-kanban{display:grid;width:100%;grid-template-columns:repeat(5, minmax(0, 1fr));grid-auto-rows:minmax(220px, 1fr);gap:8px}
@media (max-width:900px){.ta-kanban{grid-template-columns:repeat(2, minmax(0, 1fr));grid-auto-rows:minmax(200px, 1fr)}}
/* R8 -- filter row above the board. */
.ta-filterbar{display:flex;gap:8px;margin-bottom:10px}
.ta-filterbar .ds-select{width:auto;min-width:160px}
/* R17 -- compact supplier-portal indicator on a card. */
.ta-badge-supplier{align-self:flex-start;font-family:var(--font-mono);font-size:8px;text-transform:uppercase;letter-spacing:.03em;color:var(--signal-amber);border:1px solid var(--signal-amber);border-radius:8px;padding:1px 5px;text-decoration:none;white-space:nowrap}
.ta-badge-supplier:hover{background:var(--signal-amber-bg)}
.ta-badge-supplier--on-dark{margin-left:8px;align-self:center}
/* R11/R14 -- Previous transactions: wider table-row layout, consistent
   (non-white) styling matching the kanban's own --paper-2/--ink vocabulary. */
.ta-prev{margin-top:16px;background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);overflow:hidden}
.ta-prev-h{display:flex;align-items:center;gap:6px;padding:8px 10px;background:var(--ink)}
.ta-prev-t{font-family:var(--font-mono);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--paper)}
.ta-prev-list{display:flex;flex-direction:column}
.ta-prev-row{display:grid;grid-template-columns:2.4fr 1fr 1fr 1fr 1fr;gap:10px;align-items:center;padding:8px 10px;background:var(--paper);border-bottom:1px solid var(--hairline);text-decoration:none;color:inherit}
.ta-prev-row:last-child{border-bottom:0}
.ta-prev-row:hover{background:var(--paper-2)}
.ta-prev-title{font-size:12px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ta-prev-meta{font-family:var(--font-mono);font-size:10px;color:var(--ink-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ta-prev-phase{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.03em;color:var(--ink-soft)}
.ta-prev-age{font-family:var(--font-mono);font-size:9px;color:var(--ink-faint);text-align:right}
.ta-col{min-width:0;display:flex;flex-direction:column;background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);overflow:hidden}
.ta-col-focused{border-color:var(--baobab);box-shadow:inset 0 0 0 1px var(--baobab)}
.ta-col-completed{background:var(--paper)}
.ta-col-dimmed{opacity:0.4}
.ta-col-drop-advance{border-color:var(--signal-grass);box-shadow:inset 0 0 0 2px var(--signal-grass);background:var(--signal-grass-bg)}
.ta-col-drop-demote{border-color:var(--signal-amber);box-shadow:inset 0 0 0 2px var(--signal-amber);background:var(--signal-amber-bg)}
.ta-card[draggable="true"]{cursor:grab}
.ta-card-dragging{opacity:0.45}
/* R13 (2026-07-24) -- column headers were the same weak --paper-2 tint as
   the body; strong dark band instead, matching the dialog dark titlebar
   treatment (var(--ink)). */
.ta-col-h{display:flex;align-items:center;gap:4px;padding:6px 6px;border-bottom:0;background:var(--ink)}
.ta-col-t{font-family:var(--font-mono);font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:0.03em;color:var(--paper);flex:1;line-height:1.2}
.ta-col-n{font-family:var(--font-mono);font-size:9px;color:var(--paper);background:transparent;border:1px solid color-mix(in srgb,var(--paper) 40%,transparent);border-radius:8px;padding:0 4px}
/* R7 (2026-07-24) -- board holds dozens of cards; tighter row rhythm. */
.ta-col-b{padding:4px;display:flex;flex-direction:column;gap:3px;overflow-y:auto;flex:1;min-height:0}
.ta-card{text-align:left;background:var(--paper);border:1px solid var(--hairline);border-left:2px solid var(--baobab);border-radius:3px;padding:4px 6px;cursor:pointer;display:flex;flex-direction:column;gap:1px}
.ta-card{transition:border-color 0.12s ease,background 0.12s ease}
.ta-card:hover{border-color:var(--ink-faint);background:var(--paper-2)}
/* R8 -- single-line truncation with ellipsis, not a 2-line wrap, so a long
   title never pushes a card taller than its neighbors. */
.ta-card-title{font-size:10.5px;color:var(--ink);line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ta-card-meta{display:flex;justify-content:space-between;align-items:center;gap:6px;margin-top:1px;padding-top:3px;border-top:1px solid var(--hairline)}
.ta-card-id{font-family:var(--font-mono);font-size:8px;text-transform:uppercase;letter-spacing:0.03em;color:var(--ink-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ta-card-age{font-family:var(--font-mono);font-size:8px;color:var(--ink-faint);flex:none}
.ta-col-empty{color:var(--ink-faint);font-size:10px;text-align:center;padding:4px 0}
.ta-col-note{display:block;width:100%;font-family:var(--font-mono);font-size:8px;color:var(--ink-mute);text-align:center;padding:3px 4px;border-top:1px solid var(--hairline);background:var(--paper-2)}
.ta-col-note-action{appearance:none;cursor:pointer;border-left:0;border-right:0;border-bottom:0}
.ta-col-note-action:hover{color:var(--baobab);background:var(--paper)}
.ta-nav-refresh{align-self:flex-end;font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:0.04em;color:var(--ink-mute);background:transparent;border:1px solid var(--hairline);border-radius:3px;padding:3px 8px;cursor:pointer}
.ta-nav-refresh:hover{color:var(--ink);border-color:var(--ink-faint)}
/* BA-R2-005/BA-R2-006/UX-R2-003: row for the refresh action + the
   synthetic-case visibility toggle so the data-hygiene control sits next
   to the control it's paired with, not stacked as its own bar. */
.ta-nav-footer{display:flex;justify-content:flex-end;align-items:center;gap:6px}
.ta-nav-footer .ta-nav-refresh{align-self:auto}

/* ===== Generic Kanban family 2026-08-03 (sales-crm-oms-merge): denser,
   domain-agnostic board primitives for any horizontally-scrolling column
   board (Sales CRM pipeline, OMS case board, etc.) that isn't the fixed
   5-column .ta-kanban grid or the HR-specific .h2r-* board. Composes only
   existing tokens (--ink/--paper/--paper-2/--hairline/--baobab/
   --signal-grass/--signal-grass-bg/--font-mono/--radius-sm). */
.ds-kanban{display:flex;gap:7px;overflow-x:auto;padding-bottom:8px;align-items:flex-start}
.ds-kanban-col{flex:0 0 188px;min-width:0;display:flex;flex-direction:column;background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);max-height:100%;overflow:hidden}
.ds-kanban-col-head{display:flex;flex-direction:column;gap:3px;padding:7px 10px;background:var(--paper-manila,#EDE6D2);border-bottom:2px solid var(--ink,#111110)}
.ds-kanban-col-head-row{display:flex;align-items:center;gap:5px}
.ds-kanban-col-title{font-family:var(--font-mono);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:0.04em;color:var(--ink,#111110);flex:1;line-height:1.25}
.ds-kanban-col-count{font-family:var(--font-mono);font-size:9px;font-weight:700;color:var(--ink,#111110);background:#DDD5BF;border:1px solid #B8AF98;border-radius:3px;padding:1px 5px}
/* Per-column value totals — one chip per currency present in that column, so
   a mixed-currency stage never sums two currencies into one misleading
   number (see .ds-kanban-col-total). Caller-computed; the board only lays
   them out. */
.ds-kanban-col-totals{display:flex;flex-wrap:wrap;gap:4px}
.ds-kanban-col-total{font-family:var(--font-mono);font-size:8.5px;font-weight:600;letter-spacing:0.02em;color:var(--ink-soft,#2E2D28)}
.ds-kanban-col-body{padding:5px;display:flex;flex-direction:column;gap:4px;overflow-y:auto;flex:1;min-height:0}
.ds-kanban-card{text-align:left;background:var(--paper);border:1px solid var(--hairline);border-left:3px solid var(--baobab);border-radius:var(--ds-radius-sm);padding:5px 8px;cursor:pointer;display:flex;flex-direction:column;gap:3px;transition:border-color .12s ease,background .12s ease}
.ds-kanban-card:hover{border-color:var(--ink-faint);background:var(--paper-2)}
.ds-kanban-card-title{font-size:11px;color:var(--ink);line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ds-kanban-card-meta{display:flex;justify-content:space-between;align-items:center;gap:5px}
.ds-kanban-card-chip{font-family:var(--font-mono);font-size:8.5px;text-transform:uppercase;letter-spacing:0.04em;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:3px;padding:1px 4px}
.ds-kanban-empty{color:var(--ink-faint);font-size:11px;text-align:center;padding:4px 0}
.ds-kanban-drop-active{border-color:var(--signal-grass);box-shadow:inset 0 0 0 2px var(--signal-grass);background:var(--signal-grass-bg)}
.ds-kanban-card-dragging{opacity:0.45}
/* Card meta line: one muted, single-line, ellipsised run of secondary facts
   (customer / owner / value) sitting left of the age chip in
   .ds-kanban-card-meta. Kept text, not chips, so the chip row below stays the
   only place carrying signal colour. */
.ds-kanban-card-metatext{flex:1;min-width:0;font-size:10px;line-height:1.3;color:var(--ink-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Chip tones. The base .ds-kanban-card-chip already reads as the muted tone;
   -muted only drops it a further step for genuinely inert values. */
.ds-kanban-card-chip-ok{color:var(--signal-grass);border-color:var(--signal-grass);background:var(--signal-grass-bg)}
.ds-kanban-card-chip-warn{color:var(--signal-amber);border-color:var(--signal-amber);background:var(--signal-amber-bg)}
.ds-kanban-card-chip-muted{color:var(--ink-faint)}
/* Closed — Lost strip: records that left the funnel without winning (a
   dropped lead or a lost opportunity), shown OUTSIDE the active board so
   they stop occupying a working column, but never hidden entirely. Reuses
   .ds-kanban-card at reduced emphasis rather than a second card skin. */
.ds-kanban-closed{margin-top:10px;padding-top:8px;border-top:1px solid var(--hairline)}
.ds-kanban-closed-head{display:flex;align-items:baseline;gap:8px;margin-bottom:6px}
.ds-kanban-closed-strip{display:flex;flex-wrap:wrap;gap:6px}
.ds-kanban-closed-strip>.ds-kanban-card{flex:0 0 188px;border-left-color:var(--ink-faint);opacity:0.88}
.ds-kanban-closed-strip>.ds-kanban-card:hover{opacity:1}
/* Full-height board region. .ds-kanban-col already declares max-height:100%
   and an internally scrolling body, which only bites inside a parent with a
   bounded height — without one the columns grow to their content and the
   whole page scrolls, so a long column pushes every other column's cards off
   screen. This wrapper is that bounded height: the board fills the shell's
   scrolling body (100vh less its 28px/64px padding and the .ds-page-head
   banner above the board), the columns stretch to it, and each column scrolls
   its own cards. Below the min-height the region stops shrinking and the
   page's own scroll takes over. */
.ds-kanban-fill{display:flex;height:calc(100vh - 168px);min-height:320px}
.ds-kanban-fill>.ds-kanban{flex:1;min-width:0;min-height:0;align-items:stretch}
/* The board component wraps its columns (and the optional drag-to drop zone)
   in .ds-kanban-frame; the fill region sizes the frame and the frame passes
   the bounded height through to the columns. */
.ds-kanban-frame{display:flex;flex-direction:column;min-width:0}
.ds-kanban-fill>.ds-kanban-frame{flex:1;min-width:0;min-height:0}
.ds-kanban-fill>.ds-kanban-frame>.ds-kanban{flex:1;min-width:0;min-height:0;align-items:stretch}
/* Below the shell's own layout breakpoint the body stops being a fixed-height
   scrolling region (it becomes height:auto and the page scrolls), so pinning
   the board to the viewport there would trap it in a short window under the
   stacked navigation. The board goes back to sizing to its tallest column and
   the page scrolls, which is the DS default. */
@media(max-width:820px){.ds-kanban-fill{display:block;height:auto;min-height:0}
.ds-kanban-fill>.ds-kanban{align-items:flex-start}
.ds-kanban-fill>.ds-kanban-frame>.ds-kanban{align-items:flex-start}}
/* Board-page bounded shell (Ben, 2026-08-09 3rd pipeline v2 rejection): a
   page that also renders a closed/lost bar below the board used to let that
   bar's own height simply add on top of .ds-kanban-fill's fixed viewport
   height, pushing the whole page past 100vh into scroll -- the board fit,
   the closed bar did not. This wraps head+ratenote+board+closed-bar in one
   flex column, still sized off the viewport (same 168px shell chrome budget
   .ds-kanban-fill already used), but now every child is FLEX inside that one
   fixed height instead of the fixed height living only on the board: the
   head/ratenote/closed-bar take their natural (flex:none) height and the
   board (.ds-kanban-fill) flexes to fill whatever's left, so the closed bar
   is guaranteed inside the same viewport, never pushed below it. */
.ds-crm-board-shell{display:flex;flex-direction:column;height:calc(100vh - 168px);min-height:320px}
.ds-crm-board-shell>.ds-page-head,
.ds-crm-board-shell>.ds-crm-ratenote,
.ds-crm-board-shell>.ds-hint,
.ds-crm-board-shell>.ds-empty-state{flex:none}
.ds-crm-board-shell>.ds-kanban-fill{flex:1 1 auto;min-height:120px;height:auto}
.ds-crm-board-shell>.ds-kanban-closed{flex:none}
/* If the user expands the closed strip, let IT scroll internally rather than
   grow the shell past the viewport -- the collapsed bar (the thing that must
   stay visible per the design contract) never moves. */
.ds-crm-board-shell>.ds-kanban-closed>.ds-kanban-closed-strip{max-height:180px;overflow-y:auto}
@media(max-width:820px){.ds-crm-board-shell{display:block;height:auto;min-height:0}
.ds-crm-board-shell>.ds-kanban-fill{height:auto}}
/* Uniform board mode (MMDB-2009): every column head is one fixed height —
   two rows always, title+count over the value line — so heads never grow or
   shrink with their content; the value line is the stage's money, set in
   display italics at a size a human reads without leaning in. */
.ds-kanban-uniform .ds-kanban-col-head{height:60px;overflow:hidden;display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:1fr 1fr;align-items:center;column-gap:8px;padding:6px 12px;background:var(--paper-manila,#EDE6D2);border-bottom:2px solid var(--ink,#111110)}
.ds-kanban-uniform .ds-kanban-col-head-row{display:contents}
.ds-kanban-uniform .ds-kanban-col-title{font-family:var(--font-mono);font-size:11px;font-weight:800;letter-spacing:.05em;color:var(--ink,#111110);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;grid-row:1;grid-column:1}
.ds-kanban-uniform .ds-kanban-col-count{grid-row:1;grid-column:2;justify-self:end;font-family:var(--font-mono);font-size:9.5px;font-weight:800;color:var(--ink,#111110);background:#DDD5BF;border:1px solid #B8AF98;border-radius:3px;padding:1px 5px}
.ds-kanban-uniform .ds-kanban-col-totals{grid-row:2;grid-column:1/-1;justify-self:end}
.ds-kanban-uniform .ds-kanban-col-total{font-family:var(--font-display);font-style:italic;font-weight:700;font-size:18px;letter-spacing:.01em;color:var(--ink,#111110);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;min-height:20px;text-align:right}
/* Equal-width working columns (design contract sales-pipeline-v2.html
   .board/.col): the pipeline always shows exactly 3 working stages, so they
   share the row evenly instead of the fixed-width scroll-strip columns the
   generic kanban (HR/IT boards) uses. */
.ds-kanban-uniform .ds-kanban{gap:9px}
.ds-kanban-uniform .ds-kanban-col{flex:1;min-width:0}
/* Uniform quadrant card grid (MMDB-2009, design contract sales-pipeline-v2.html
   .card): a true 2x2 grid — name+value share the top row (value is the
   loudest line on the card, set in display italics), marker+person / weight
   share the bottom row. An explicit dash renders where a slot is empty. */
.ds-kanban-uniform .ds-kanban-card{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:1fr 1fr;min-height:68px;column-gap:12px;row-gap:0;align-items:center;padding:8px 10px}
.ds-kanban-uniform .ds-kanban-card-title{display:block;font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;grid-row:1;grid-column:1;align-self:center}
.ds-kanban-uniform .ds-kanban-card-value{grid-row:1;grid-column:2;align-self:center;justify-self:end;font-size:16.5px;text-align:right;white-space:nowrap}
.ds-kanban-uniform .ds-kanban-card-sub{grid-row:2;grid-column:1;min-width:0;overflow:hidden;white-space:nowrap;flex:none}
.ds-kanban-uniform .ds-kanban-card-person{font-size:10.5px}
.ds-kanban-uniform .ds-kanban-card-weight{grid-row:2;grid-column:2;justify-self:end;font-size:10px}
.ds-kanban-card-value{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:13.5px;line-height:1.2;color:var(--ink)}
.ds-kanban-card-grid-foot{display:flex;justify-content:space-between;align-items:baseline;gap:6px}
.ds-kanban-card-person{flex:1;min-width:0;font-size:9.5px;color:var(--ink-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-kanban-card-weight{font-family:var(--font-mono);font-size:9px;color:var(--ink-mute);letter-spacing:.02em;white-space:nowrap}
/* Drag-to drop zone (MMDB-2011): appears under the board only while a card
   is in flight; dropping hands the card to the caller for confirmation. */
.ds-kanban-dropzone{margin-top:8px;border:1.5px dashed var(--baobab);border-radius:var(--ds-radius-sm);color:var(--baobab);background:var(--baobab-bg);font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;text-align:center;padding:13px 10px}
/* Closed — Lost collapsed bar (MMDB-2009): hundreds of closed records hide
   behind one line — count and lost value — until deliberately expanded. */
.ds-kanban-closedbar{display:flex;align-items:baseline;gap:10px;width:100%;background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:8px 12px;cursor:pointer;text-align:left;font-family:inherit}
.ds-kanban-closedbar:hover{border-color:var(--ink-faint)}
.ds-kanban-closedbar-title{font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-mute)}
.ds-kanban-closedbar-count{font-family:var(--font-mono);font-size:9px;color:var(--ink-faint)}
.ds-kanban-closedbar-value{margin-left:auto;font-family:var(--font-display);font-style:italic;font-size:13px;color:var(--ink-mute)}
.ds-kanban-closedbar-chev{font-family:var(--font-mono);font-size:9px;color:var(--ink-faint)}
/* Dialog lede (MMDB-2010): the record popup opens on its money — the deal
   volume as a display figure — beside the stage control, above the facts. */
.ds-dialog-lede{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;border-bottom:1px solid var(--hairline);padding-bottom:12px;margin-bottom:12px}
.ds-dialog-lede-lbl{font-family:var(--font-mono);font-size:9px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);display:block;margin-bottom:3px}
.ds-dialog-lede-fig{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:24px;line-height:1;color:var(--ink)}
.ds-dialog-lede-cur{font-size:13px;color:var(--ink-mute);margin-right:4px}
.ds-dialog-lede-field{min-width:200px}
/* Mono group label between fact groups inside a record dialog. */
.ds-dialog-sect{font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);margin:12px 0 4px}

/* --- UX-R1-001: message threads (candidate signals/notes, case notes,
   interview cockpit transcript) — .msg-item-in = agent/system-authored,
   .msg-item-out = human-authored, distinguished by accent-bar side/color so
   a thread reads left-to-right without needing to re-read the author line
   on every row. -------------------------------------------------------- */
.msg-thread{display:flex;flex-direction:column;gap:6px;margin-top:8px;max-height:320px;overflow-y:auto}
.msg-item{background:var(--paper);border:1px solid var(--hairline);border-left:3px solid var(--ink-faint);border-radius:var(--ds-radius-sm);padding:7px 10px}
.msg-item-in{border-left-color:var(--baobab)}
.msg-item-out{border-left-color:var(--ink-soft)}
.msg-item-meta{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:3px}
.msg-item-author{font-family:var(--font-mono);font-weight:600;font-size:calc(10px * var(--fs-scale, 1));text-transform:uppercase;letter-spacing:0.04em;color:var(--ink-soft)}
.msg-item-time{font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale, 1));color:var(--ink-faint);flex:none}
.msg-item-body{font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale, 1));line-height:1.45;color:var(--ink);white-space:pre-wrap;overflow-wrap:anywhere}

/* --- UX-R1-001: requirement checklist — candidate multi-select (TaCaseDetail)
   and interview requirement-coverage (TaInterviewCockpit) share this family.
   .req-item-{covered,partial,gap} apply to either the row (coverage, state
   already known) or directly to the .req-item-state dot (candidate toggle,
   selected = covered) — both combinations are styled below. ------------- */
.req-checklist{display:flex;flex-direction:column;gap:4px;margin-top:8px}
.req-item{display:flex;flex-direction:column;gap:3px;width:100%;text-align:left;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:7px 9px;font:inherit}
button.req-item{cursor:pointer}
button.req-item:hover{border-color:var(--ink-faint)}
.req-item-head{display:flex;align-items:center;gap:7px}
.req-item-state{width:8px;height:8px;flex:none;border-radius:50%;background:var(--paper-2);border:1px solid var(--hairline)}
.req-item-state.req-item-covered,.req-item.req-item-covered .req-item-state{background:var(--signal-grass);border-color:var(--signal-grass)}
.req-item.req-item-partial .req-item-state{background:var(--signal-amber);border-color:var(--signal-amber)}
.req-item.req-item-gap .req-item-state{background:transparent;border-color:var(--baobab)}
.req-item-label{flex:1;font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale, 1));color:var(--ink)}
.req-item-tag{font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale, 1));text-transform:uppercase;letter-spacing:0.05em;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px;padding:2px 6px;flex:none}
.req-item-evidence{font-family:var(--font-ui);font-size:calc(11.5px * var(--fs-scale, 1));line-height:1.4;color:var(--ink-mute);padding-left:15px}

/* --- UX-R1-001: inline supplier search (TaCaseDetail SupplierInlineSearch)
   — reuses the exact visual language ResolvingSelect's .rsel-* family
   already established (see below) rather than a third dropdown style. --- */
.inline-search{position:relative}
.inline-search-input{width:100%;font-family:var(--font-ui);font-size:13px;color:var(--ink);background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:7px 9px}
.inline-search-input:focus{outline:none;border-color:var(--baobab)}
.inline-search-results{position:absolute;z-index:20;top:calc(100% + 2px);left:0;right:0;max-height:260px;overflow-y:auto;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);box-shadow:0 4px 12px rgba(14,14,12,0.12)}
.inline-search-result{display:block;width:100%;text-align:left;padding:6px 9px;font-family:var(--font-ui);font-size:12.5px;color:var(--ink-soft);background:transparent;border:0;border-bottom:1px solid var(--hairline);cursor:pointer}
.inline-search-result:last-child{border-bottom:0}
.inline-search-result:hover{background:var(--paper-2);color:var(--ink)}
.inline-search-empty{padding:8px 9px;font-family:var(--font-ui);font-size:12px;color:var(--ink-faint)}

/* --- UX-R1-001: onboarding/contract document-request rows (TaOnboardingSection) --- */
.doc-request-row{display:flex;align-items:center;gap:10px;padding:6px 8px;border-bottom:1px solid var(--hairline)}
.doc-request-row:last-of-type{border-bottom:0}
.doc-request-type{flex:1;font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale, 1));color:var(--ink)}
.doc-request-state{font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale, 1));text-transform:uppercase;letter-spacing:0.05em;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px;padding:2px 6px;flex:none}
.doc-request-state-shared{color:var(--signal-grass);border-color:var(--signal-grass)}
.doc-request-state-received{color:var(--signal-grass);border-color:var(--signal-grass)}
.doc-request-state-pending{color:var(--signal-amber);border-color:var(--signal-amber)}
.doc-request-link{font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale, 1));color:var(--baobab);text-decoration:none;flex:none}
.doc-request-link:hover{text-decoration:underline}

/* --- UX-R1-001: interview cockpit live-hint strip (TaInterviewCockpit) --- */
.hint-strip{margin-top:6px;padding:8px 10px;background:var(--paper-2);border:1px solid var(--hairline);border-left:3px solid var(--baobab);border-radius:var(--ds-radius-sm);font-family:var(--font-ui);font-size:calc(12px * var(--fs-scale, 1));line-height:1.45;color:var(--ink-soft)}

/* --- TAR-R-056 resolving dropdown (ResolvingSelect.tsx / CountrySelect) —
   type-ahead + near-match suggestions + create-new, extends the existing
   .inline-search visual language rather than inventing a new one. --------- */
.rsel{position:relative}
/* R2 (2026-07-24) -- rsel-input must be IDENTICAL geometry to .ds-input/
.ds-select/.ds-textarea (same font-size/weight/line-height/padding/
border-radius/background) so a text field and a typeahead field are never
visually distinguishable by height/shape inside the same form. */
.rsel-input{width:100%;font-family:var(--font-ui);font-weight:500;font-size:calc(14.5px * var(--fs-scale, 1));line-height:1.4;color:var(--ink);background:var(--paper-2);border:1px solid var(--hairline);border-radius:3px;padding:10px 12px;transition:border-color 0.14s ease, background 0.14s ease}
.rsel-input:hover{border-color:var(--ink-mute)}
.rsel-input:focus{outline:none;border-color:var(--baobab)}
.rsel-input:disabled{background:var(--paper-2);color:var(--ink-faint)}
.rsel-note{display:block;font-size:10.5px;color:var(--ink-mute);margin-top:2px}
.rsel-note-err{color:var(--baobab)}
.rsel-results{position:absolute;z-index:20;top:calc(100% + 2px);left:0;right:0;max-height:260px;overflow-y:auto;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);box-shadow:0 4px 12px rgba(14,14,12,0.12)}
/* Dialog-safe variant (RselResults component, ResolvingSelect.tsx) -- fixed-position, coordinates from --rsel-x/--rsel-y/--rsel-w so the dropdown escapes any scrollable ancestor's clip (e.g. .ds-modal-dialog-body), same mechanism as .ds-hover-preview's --hp-x/--hp-y. */
.rsel-results--fixed{position:fixed;z-index:1200;top:var(--rsel-y,-9999px);left:var(--rsel-x,-9999px);right:auto;width:var(--rsel-w,auto)}
.rsel-option{display:flex;width:100%;text-align:left;justify-content:space-between;gap:8px;padding:6px 9px;font-size:12.5px;color:var(--ink-soft);background:transparent;border:0;border-bottom:1px solid var(--hairline);cursor:pointer}
.rsel-option:last-child{border-bottom:0}
.rsel-option:hover{background:var(--paper-2);color:var(--ink)}
/* Defect 2 (2026-07-28) -- keyboard highlight, same visual weight as :hover
   so ArrowDown navigation reads identically to a mouse hover (CountrySelect
   in ResolvingSelect.tsx: typing + Enter had no keyboard path at all). */
.rsel-option--active{background:var(--paper-2);color:var(--ink)}
.rsel-empty{padding:8px 9px;font-size:12px;color:var(--ink-faint)}
.rsel-create{border-top:1px solid var(--hairline)}
.rsel-warn{padding:6px 9px;font-size:10.5px;color:var(--signal-amber);background:var(--signal-amber-bg)}
.rsel-option-create{color:var(--baobab);font-weight:600}
.rsel-option-create:hover{background:var(--baobab-bg)}
.rsel-country-group{display:flex;flex-direction:column}
.rsel-country-head{font-weight:600}
.rsel-country-count{font-family:var(--font-mono);font-size:9px;color:var(--ink-mute)}
.rsel-entity-option{padding-left:20px;font-size:12px;color:var(--ink-soft)}

/* --- TAR-R-057 ASAP-or-date start-date control ------------------------- */
/* defect D2 (2026-07-24) -- keep the ASAP checkbox + date input on ONE
   line even in a narrow 3-col grid cell; without this the row wraps and
   blows the grid row height. */
.rsel-startdate{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;height:42px}
.rsel-startdate .ds-input{flex:1;min-width:0;height:100%}
.rsel-asap-toggle{flex:none;display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10.5px;text-transform:uppercase;letter-spacing:0.03em;color:var(--ink-soft);white-space:nowrap}
.rsel-startdate .ds-input{flex:1}

/* --- category-nav: collapsible left-nav category folders (IT Service Desk
   accordion, S9). Header is a real button (aria-expanded/aria-controls);
   body only mounts while open. Dense — no extra vertical padding beyond
   what a single-line category row needs. */
.category-nav-header{display:flex;align-items:center;gap:9px;width:100%;text-align:left;background:transparent;border:0;cursor:pointer;padding:12px 20px;font-family:var(--font-mono);font-weight:500;font-size:10px;letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute);transition:color .12s ease}
.category-nav-header:hover{color:var(--ink)}
.category-nav-header svg{width:13px;height:13px;color:var(--ink-faint);flex:none}
.category-nav-label{flex:1;min-width:0}
.category-nav-count{font-family:var(--font-mono);font-size:9.5px;color:var(--ink-faint);flex:none}
.category-nav-chevron{display:inline-flex;flex:none;transition:transform .14s ease}
.category-nav-chevron svg{width:12px;height:12px;color:var(--ink-faint)}
.category-nav-chevron[data-state="open"]{transform:rotate(90deg)}
.category-nav-body{padding-bottom:4px}

/* ===== FinancialMatrix — management reporting matrix (2026-07-10) ===== */
.ds-financial-matrix-wrap{max-width:100%;overflow:auto;border:1px solid var(--hairline);background:var(--paper)}
.ds-financial-matrix{width:max-content;min-width:100%;border-collapse:separate;border-spacing:0;font-family:var(--font-ui);font-size:12px;line-height:1.25}
.ds-financial-matrix-caption{text-align:left;padding:9px 12px;border-bottom:1px solid var(--hairline);font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);background:var(--paper-2)}
.ds-financial-matrix thead th{position:sticky;top:0;z-index:4;padding:9px 10px;border-bottom:1px solid var(--ink);background:var(--paper);color:var(--ink-mute);font-family:var(--font-mono);font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap}
.ds-financial-matrix tbody th,.ds-financial-matrix tbody td{padding:8px 10px;border-bottom:1px solid var(--hairline);background:var(--paper);white-space:nowrap}
.ds-financial-matrix tbody tr:last-child th,.ds-financial-matrix tbody tr:last-child td{border-bottom:0}
.ds-financial-matrix-row-label{position:sticky;left:0;z-index:2;min-width:230px;max-width:300px;text-align:left}
.ds-financial-matrix thead .ds-financial-matrix-row-label{z-index:6}
.ds-financial-matrix-row-parent th,.ds-financial-matrix-row-parent td{font-weight:700;background:var(--paper-2)}
.ds-financial-matrix-row-parent .ds-financial-matrix-row-label{background:var(--paper-2)}
.ds-financial-matrix-row-child .ds-financial-matrix-row-label{padding-left:32px;color:var(--ink-soft)}
.ds-financial-matrix-toggle{display:flex;align-items:flex-start;gap:8px;width:100%;padding:0;border:0;background:transparent;color:var(--ink);font:inherit;font-weight:700;text-align:left;cursor:pointer}
.ds-financial-matrix-toggle:hover{color:var(--baobab)}
.ds-financial-matrix-sub{display:block;margin-top:2px;color:var(--ink-mute);font-family:var(--font-mono);font-size:9.5px;font-weight:500;letter-spacing:.03em}
.ds-financial-matrix-cell{display:block;width:100%;min-width:62px;margin:-8px -10px;padding:8px 10px;border:0;background:transparent;color:inherit;font:inherit;text-align:right;cursor:pointer}
.ds-financial-matrix-cell:hover{background:var(--baobab-bg);color:var(--baobab)}
.ds-financial-matrix-cell:disabled{cursor:default;color:var(--ink-faint)}
.ds-financial-matrix-cell:disabled:hover{background:transparent;color:var(--ink-faint)}
.ds-financial-matrix-cell-selected{background:var(--baobab-bg);color:var(--baobab);box-shadow:inset 0 -2px 0 var(--baobab)}
.ds-financial-matrix-total{position:sticky;right:0;z-index:3;border-left:1px solid var(--hairline);background:var(--paper)}
.ds-financial-matrix thead .ds-financial-matrix-total{z-index:7}
.ds-financial-matrix-row-parent .ds-financial-matrix-total{background:var(--paper-2)}
.ds-financial-matrix-empty{padding:28px;text-align:center;color:var(--ink-mute)}
@media(max-width:640px){
  .ds-financial-matrix-row-label{min-width:180px;max-width:210px}
  .ds-financial-matrix tbody th,.ds-financial-matrix tbody td{padding-top:10px;padding-bottom:10px}
}

/* Reporting workbench modifiers: fixed-shell clearance and owned wide-content overflow. */
.module-workbench.module-workbench-reporting{grid-template-columns:minmax(0,1fr)}
.ds-page-below-topbar{padding-top:88px}
@media(max-width:640px){.ds-page-below-topbar{padding-top:72px}}
/* --- Our Values (STEEL) page (values/page.tsx) — paper hero, STEEL letter strip,
   value grid, culture band. Baobab red stays a SCARCE accent: only the framed
   baobab mark + the 5 STEEL strip letters carry it; the value-grid letter badges
   use ink/paper so red does not flood the page. ------ */
.values-topbar{margin-bottom:0}
.values-page{display:flex;flex-direction:column;gap:28px}
.values-hero{display:flex;justify-content:space-between;align-items:center;gap:32px;padding-bottom:24px;border-bottom:1px solid var(--hairline);flex-wrap:wrap}
.values-hero-copy{max-width:560px}
.values-hero-copy h1{font-family:var(--font-display);font-style:italic;font-weight:800;font-size:42px;letter-spacing:-0.02em;color:var(--ink);margin:6px 0 10px}
.values-hero-copy p{color:var(--ink-mute);font-size:14px;line-height:1.55;margin:0}
.values-baobab{display:flex;align-items:center;gap:16px;background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--radius);padding:16px 20px;max-width:360px}
.values-baobab-mark{flex:none;width:64px;height:64px;border-radius:50%;box-shadow:0 0 0 3px var(--paper),0 0 0 4px var(--hairline)}
.values-baobab span{display:block;font-size:13px;color:var(--ink);line-height:1.4}
.values-baobab strong{display:block;margin-top:4px;font-family:var(--font-display);font-style:italic;font-weight:700;font-size:13px;color:var(--ink-soft)}
.values-strip{display:flex;border:1px solid var(--hairline);border-radius:var(--radius);overflow:hidden}
.values-letter-card{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:18px 8px;border-right:1px solid var(--hairline);background:var(--paper)}
.values-letter-card:last-child{border-right:0}
.values-letter-card span{font-family:var(--font-display);font-style:italic;font-weight:800;font-size:32px;line-height:1;color:var(--baobab)}
.values-letter-card small{font-family:var(--font-mono);font-size:10px;letter-spacing:0.1em;color:var(--ink-faint)}
.values-grid{display:flex;flex-direction:column;border:1px solid var(--hairline);border-radius:var(--radius);overflow:hidden}
.values-card{display:grid;grid-template-columns:96px 1fr;gap:20px;align-items:center;background:var(--paper);padding:22px 24px;border-bottom:1px solid var(--hairline)}
.values-card:last-child{border-bottom:0}
.values-card-letter{display:flex;align-items:center;justify-content:center;font-family:var(--font-display);font-style:italic;font-weight:800;font-size:64px;line-height:1;color:var(--baobab);border-right:1px solid var(--hairline);min-height:76px}
.values-card h2{font-family:var(--font-display);font-weight:700;font-size:19px;color:var(--ink);letter-spacing:-0.01em;margin:4px 0 6px}
.values-card p{color:var(--ink-mute);font-size:13px;line-height:1.5;margin:0}
.values-culture{display:flex;justify-content:space-between;align-items:flex-end;gap:24px;padding-top:24px;border-top:1px solid var(--hairline);flex-wrap:wrap}
.values-culture h2{font-family:var(--font-display);font-style:italic;font-weight:700;font-size:21px;color:var(--ink);margin:6px 0}
.values-culture p{max-width:480px;color:var(--ink-mute);font-size:13px;line-height:1.55;margin:0}

/* Sticky-note launcher glyph: central CDS object, never page-owned styling. */
.win-launcher-sticky-icon{position:relative;display:block;width:15px;height:17px;margin:auto;background:var(--paper);border:1px solid currentColor;border-radius:2px}
.win-launcher-sticky-icon::after{content:"";position:absolute;right:-1px;top:-1px;width:6px;height:6px;background:var(--ink);border-left:1px solid var(--paper);border-bottom:1px solid var(--paper)}
@media(max-width:860px){.values-card{grid-template-columns:64px 1fr;padding:18px 16px;gap:14px}.values-card-letter{font-size:48px;min-height:60px}}

/* Reporting workbench overflow ownership at narrow widths. */
.module-workbench.module-workbench-reporting{overflow-x:clip}
/* Revised 2026-08-01: with the portal sidebar back on the reporting
   worksurface the one-row scrolling filterbar clipped its tail chips at
   1280px — the bar now wraps; chips never break internally. */
.module-workbench-reporting>.ds-filterbar{max-width:100%;flex-wrap:wrap}
.module-workbench-reporting .ds-filter-chip{white-space:nowrap}
.module-workbench-reporting .ds-datagrid-wrap{max-width:100%;min-width:0;overflow-x:auto}
.module-workbench-reporting .ds-financial-matrix-wrap{contain:inline-size}
/* Wave 6 UX finding 11a: report pages sit under a subnav that already names
   the report, so the title is a label, not a hero -- tighter title/header so
   the data table starts high on screen. Moved from app-level globals.css into
   the DS (was a non-allowlisted class styled outside the design system);
   combines with .module-workbench-reporting (grid/overflow layout), a
   distinct, non-overlapping concern. */
.module-workbench-report .module-title{font-size:clamp(20px,2vw,26px);line-height:1.1;letter-spacing:-0.01em}
.module-workbench-report .module-workbench-header{margin-bottom:10px;align-items:center}
.module-workbench-report .eyebrow{margin-bottom:2px}
main.body .module-workbench-report .module-title,.portal-main .module-workbench-report .module-title{font-size:clamp(19px,1.8vw,24px)!important;line-height:1.15!important}
/* Finance reporting has nine reports plus two utility panels. Keep that library
   as one compact working row at desktop widths and a deliberate horizontal
   scroller on narrow screens instead of wrapping a single orphaned tab. */
.ds-reporting-subnav{flex-wrap:nowrap!important;overflow-x:auto;scrollbar-width:thin}
.ds-reporting-subnav a,.ds-reporting-subnav button.subnav-item{flex:none;padding-inline:8px;font-size:calc(9.5px * var(--fs-scale, 1));letter-spacing:.06em}
.ds-reporting-subnav .subnav-sep{flex:none;margin-inline:3px}
.ds-reporting-subnav .spacer{min-width:8px}
/* Wave 6 UX finding 11b: the vertical stack of report filter/mode controls
   sitting directly under the module-workbench-header, above the data table.
   Replaces the bare `.col` utility-soup class (display:flex;flex-direction:
   column;gap:12px) that app code was using -- same visual rule, a real
   semantic DS name instead of an atom. */
.ds-report-filters{display:flex;flex-direction:column;gap:12px}
/* Business names are decision-critical data. Show the complete value instead
   of relying on hover-only ellipsis disclosure. */
.ds-records-name{display:block;max-width:260px;white-space:normal;overflow-wrap:anywhere;line-height:1.25}
/* A compact, explicit instruction for reports that need filter input before
   data can load. This is an idle state, not an error or a large dashboard. */
.ds-reporting-idle{margin:0;padding:12px 14px;border:1px solid var(--hairline);background:var(--paper);color:var(--ink-mute);font-family:var(--font-ui);font-size:calc(13px * var(--fs-scale, 1));line-height:1.35}

/* Finance Reporting R-014..018: compact working toolbar plus a left tree
   drawer. These are central DS objects because the app may not own layout,
   color, spacing, or state styling. */
.ds-reporting-toolbar{display:flex;align-items:center;gap:10px;min-height:48px;margin:0 0 10px;padding:6px 10px;border-bottom:1px solid var(--hairline);background:var(--paper)}
.ds-reporting-toolbar-current{display:flex;align-items:baseline;gap:7px;min-width:0;padding-right:10px;border-right:1px solid var(--hairline)}
.ds-reporting-toolbar-title{overflow:hidden;color:var(--ink);font-family:var(--font-ui);font-size:calc(14px * var(--fs-scale,1));font-weight:700;text-overflow:ellipsis;white-space:nowrap}
.ds-reporting-toolbar-source{display:flex;align-items:center;gap:8px;min-width:0;color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.02em;white-space:nowrap}
.ds-reporting-toolbar-source>span+span{padding-left:8px;border-left:1px solid var(--hairline)}
/* Wave 6 UX finding 11c: push the "Manage" link to the toolbar's right edge.
   Replaces `<span className="spacer" />`, which matched no rule inside
   `.ds-reporting-toolbar` (the only scoped `.spacer` rule targets
   `.ds-reporting-subnav .spacer` above, a different container) -- so the
   spacer was dead CSS and Manage sat immediately after the source-info block
   instead of right-aligning. Both a compliance fix and a real visual-bug fix. */
.ds-reporting-toolbar-spacer{flex:1 1 auto;min-width:8px}
.ds-reporting-drawer-backdrop{position:fixed;inset:0;z-index:210;display:flex;justify-content:flex-start;background:color-mix(in srgb,var(--ink) 34%,transparent)}
.ds-reporting-drawer{display:flex;flex-direction:column;width:min(390px,94vw);height:100dvh;overflow-y:auto;border-right:1px solid var(--ink);background:var(--paper);box-shadow:10px 0 28px color-mix(in srgb,var(--ink) 18%,transparent)}
.ds-reporting-drawer-header{position:sticky;top:0;z-index:1;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;border-bottom:1px solid var(--ink);background:var(--paper)}
.ds-reporting-drawer-title{margin:2px 0 0;color:var(--ink);font-family:var(--font-display);font-size:calc(19px * var(--fs-scale,1));letter-spacing:-.01em}
.ds-reporting-tree{display:flex;flex-direction:column;border-bottom:1px solid var(--ink)}
.ds-reporting-tree-domain{display:block;border-bottom:1px solid var(--hairline)}
.ds-reporting-tree-domain:last-child{border-bottom:0}
.ds-reporting-tree-domain-button{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-height:38px;padding:7px 14px;border:0;border-left:3px solid transparent;background:var(--paper);color:var(--ink);font-family:var(--font-ui);font-size:calc(13px * var(--fs-scale,1));font-weight:700;text-align:left;cursor:pointer}
/* Fix (MAJOR, round-2 adversarial UX review, 2026-07-31): ReportingNav.tsx
   used to combine this base class with a bare "active"/"pending" token that
   was never added to the manifest's allowed_classes -- a real, reproducible
   allowlist violation shipping in every reporting page's nav chrome.
   Renamed to component-scoped combined tokens (same convention as
   .ds-filter-chip-active / .ds-oms-nav-link-active / .ds-tabbar-item-active
   elsewhere in this file), each added to allowed_classes below. */
.ds-reporting-tree-domain-button:hover,.ds-reporting-tree-domain-button-active{border-left-color:var(--baobab);background:var(--paper-2)}
.ds-reporting-tree-children{display:flex;flex-direction:column;padding:0 0 4px 18px;background:var(--paper)}
.ds-reporting-tree-link{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:34px;padding:6px 14px;border-left:2px solid var(--hairline);color:var(--ink-soft);font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale,1));text-decoration:none}
.ds-reporting-tree-link:hover,.ds-reporting-tree-link-active,.ds-reporting-tree-link-pending{border-left-color:var(--baobab);background:var(--paper-2);color:var(--ink)}
.ds-reporting-tree-link-active{font-weight:700}
.ds-button-secondary-active{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.ds-reporting-drawer-section{padding:10px 0;border-bottom:1px solid var(--hairline)}
.ds-reporting-views{display:flex;flex-direction:column;gap:7px;padding:8px 14px 14px}
.ds-reporting-management-table th,.ds-reporting-management-table td{vertical-align:middle}
.ds-reporting-management-table .ds-input{min-width:76px;max-width:96px}
.ds-reporting-management-table .ds-select{min-width:155px}
.ds-reporting-access-add{padding:8px 10px;border-bottom:1px solid var(--hairline)}
.ds-reporting-access-add .ds-input{max-width:360px}
@media(max-width:900px){.ds-reporting-toolbar{align-items:flex-start;flex-wrap:wrap}.ds-reporting-toolbar-source{order:3;width:100%;overflow-x:auto}.ds-reporting-management-table{min-width:860px}}
/* =====================================================================   IT Service Desk — execution-first two-pane surface (sd-*) + ServiceFlow
   next-steps layer (sf-*). Ported from the approved v8 interaction reference.
   Uses ONLY central design-system tokens (globals.css :root); the ds-*
   component classes come from the central DS (public/_design-system/
   components.css). Candidate DS primitives: "app-shell", "category-nav",
   "assistant-video", "process-strip", "draft-note", "install-list",
   "request-strip".
   ============================================================================ */

.sd-app{display:flex;flex-direction:column;height:calc(100vh - 96px);min-height:520px;background:var(--paper-2);color:var(--ink-soft);font-family:var(--font-ui);font-weight:500;font-size:15px;line-height:1.5;-webkit-font-smoothing:antialiased;border:1px solid var(--ink)}

.sd-top{display:flex;align-items:center;gap:30px;padding:13px 26px;background:var(--paper);border-bottom:1px solid var(--ink);flex:none}
.sd-brand{display:flex;flex-direction:column;gap:2px;flex:none;max-width:none;cursor:pointer;background:transparent;border:0;text-align:left;padding:0}
.sd-title{font-family:var(--font-display);font-style:italic;font-weight:500;font-size:27px;line-height:1;letter-spacing:-0.02em;color:var(--ink);margin:0}

.sd-body{flex:1;display:flex;min-height:0}

.sd-menu{width:284px;flex:none;border-right:1px solid var(--ink);background:var(--paper);overflow-y:auto;padding:8px 0 34px}
.sd-group{border-bottom:1px solid var(--hairline)}
.sd-group:last-child{border-bottom:0}
/* S9: category header/count/chevron/body are central DS classes
   (category-nav-*, public/_design-system/components.css) — accordion nav. */
.sd-task{display:flex;align-items:center;gap:10px;width:100%;text-align:left;background:transparent;border:0;border-left:2px solid transparent;padding:8px 20px 8px 22px;font-family:var(--font-ui);font-weight:500;font-size:13.5px;color:var(--ink-soft);cursor:pointer;line-height:1.3;transition:background .12s ease,color .12s ease}
.sd-task:hover{background:var(--paper-2);color:var(--ink)}
.sd-task-active{background:var(--paper-2);color:var(--ink);border-left-color:var(--baobab);font-weight:600}
.sd-task-dot{width:5px;height:5px;border-radius:50%;background:var(--ink-faint);flex:none}
.sd-task-active .sd-task-dot{background:var(--baobab)}
.sd-menu-empty{padding:22px 20px;font-family:var(--font-ui);font-size:13px;color:var(--ink-mute)}

.sd-pane{flex:1;overflow-y:auto;background:var(--paper-2)}
.sd-detail{max-width:720px;margin:0 auto;padding:20px 36px 52px;animation:sd-fade .26s ease both}
@keyframes sd-fade{from{opacity:0;transform:translateY(7px)}to{opacity:1;transform:none}}

/* ServiceFlow video+voice panel. Video: the real ServiceFlow Video Agent
   LiveKit track (room "serviceflow-demo") renders into .sf-av-video once
   subscribed; the branded canvas presence is the idle/not-yet-connected
   state and is hidden once video arrives. There is exactly ONE recording
   control (.sf-mic-orb — central DS, see components.css); "Read aloud" and
   the assistant-voice mute button below are voice OUTPUT only and never
   touch the microphone. Avatar stage sized as the panel centrepiece (not a
   small tile) while staying inside the dense two-pane layout. */
/* Frameless: the video sits directly in the page, not inside a boxed card —
   no border/radius/background/padding on the outer wrapper or the video
   stage itself. Sized to hug the video + its status column instead of
   stretching the full .sd-detail width — the status/ON-toggle side has
   little content, so an unbounded flex:1 there used to leave a wide dead
   strip on the right. */
.sd-assistant{display:flex;gap:20px;align-items:stretch;max-width:560px}
/* Left column: avatar video stage stacked with the prominent live-mic orb
   (central DS .sf-mic-orb, see components.css) so the "press and talk"
   control always reads as centered directly under the avatar's face. */
.sd-avatar-col{display:flex;flex-direction:column;align-items:center;gap:10px;flex:none;width:400px}
/* No border/border-radius (that's the boxed-tile look Ben removed) — the
   radial-gradient stays as the idle-avatar canvas's own rendering surface
   (the canvas only strokes transparent rings/face, not a filled backdrop),
   not "frame chrome" around a finished video. */
.sd-avatar{position:relative;width:400px;height:300px;background:radial-gradient(circle at 50% 40%,var(--paper) 0%,var(--paper-2) 82%);overflow:hidden}
.sf-av-canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.sf-av-video{position:absolute;inset:0;width:100%;height:100%;display:block;object-fit:cover;background:var(--ink)}
.sd-avatar[data-has-video="true"] .sf-av-canvas{display:none}
.sd-avatar:not([data-has-video="true"]) .sf-av-video{display:none}
.sd-avatar-tag{position:absolute;bottom:0;left:0;right:0;background:var(--ink);color:var(--paper);font-family:var(--font-mono);font-size:7px;letter-spacing:0.1em;text-transform:uppercase;text-align:center;padding:2px 0;z-index:3}
.sd-assistant-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px;justify-content:center}
.sf-status{display:inline-flex;align-items:center;gap:7px;font-family:var(--font-mono);font-size:9.5px;letter-spacing:0.13em;text-transform:uppercase;color:var(--ink-mute)}
.sf-status b{color:var(--ink);font-weight:500}
.sf-status .sf-dot{width:6px;height:6px;border-radius:50%;background:var(--signal-grass);flex:none}
.sf-status .sf-state{color:var(--ink-mute)}
.sd-assistant[data-state="speaking"] .sf-dot{background:var(--baobab)}
.sd-assistant[data-state="speaking"] .sf-state{color:var(--baobab)}
.sd-assistant[data-state="listening"] .sf-dot{background:var(--signal-amber);animation:sd-micpulse 1.3s ease-in-out infinite}
.sd-assistant[data-state="listening"] .sf-state{color:var(--signal-amber)}
.sd-assistant[data-state="muted"] .sf-dot{background:var(--ink-faint)}
.sf-caption{font-family:var(--font-ui);font-size:13px;line-height:1.35;color:var(--ink-soft);margin:0;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.sf-caption q{font-style:italic;color:var(--ink)}
.sd-assistant-controls{display:flex;align-items:center;gap:8px;margin-top:2px;flex-wrap:wrap}
.sf-ctl{display:inline-flex;align-items:center;gap:6px;background:var(--paper-2);color:var(--ink-soft);border:1px solid var(--hairline);border-radius:22px;padding:6px 12px;font-family:var(--font-mono);font-size:9.5px;letter-spacing:0.06em;text-transform:uppercase;cursor:pointer;transition:border-color .14s ease,color .14s ease}
.sf-ctl:hover{border-color:var(--ink-mute);color:var(--ink)}
.sf-ctl svg{width:14px;height:14px}
.sf-ctl-off{color:var(--ink-faint);border-style:dashed}
.sf-speak-ind{display:inline-flex;align-items:flex-end;gap:2px;height:13px;margin-left:2px}
.sf-speak-ind i{width:2.5px;height:4px;background:var(--baobab);border-radius:1px;display:block}
.sd-assistant[data-state="speaking"] .sf-speak-ind i{animation:sf-eq .6s ease-in-out infinite}
.sf-speak-ind i:nth-child(2){animation-delay:.15s}
.sf-speak-ind i:nth-child(3){animation-delay:.3s}
.sf-speak-ind i:nth-child(4){animation-delay:.45s}
@keyframes sf-eq{0%,100%{height:4px}50%{height:12px}}
@keyframes sd-micpulse{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--baobab) 34%,transparent)}50%{box-shadow:0 0 0 5px transparent}}
@media (max-width:640px){.sd-avatar{display:none}}

.sd-taskhead{margin:14px 0 0}
.sd-task-title{font-family:var(--font-display);font-style:italic;font-weight:500;font-size:clamp(20px,2.1vw,27px);line-height:1.06;letter-spacing:-0.015em;color:var(--ink);margin:5px 0 0;text-wrap:balance}

.sd-stage{margin:24px 0 0}
.sd-cta-row{display:flex;gap:13px;align-items:center;flex-wrap:wrap}
.sd-primary{padding:13px 22px;font-size:12.5px}
.sd-primary svg{width:15px;height:15px}
.sd-cta-note{font-family:var(--font-mono);font-size:10px;letter-spacing:0.06em;text-transform:uppercase;color:var(--ink-mute);display:inline-flex;align-items:center;gap:6px}
.sd-cta-note svg{width:12px;height:12px;color:var(--ink-faint)}

.sd-run-line{display:flex;align-items:center;gap:12px;font-family:var(--font-ui);font-size:15px;color:var(--ink-soft);padding:6px 0 16px}
.sd-run-line b{color:var(--ink);font-weight:600}
.sd-spin{width:18px;height:18px;border:2px solid var(--hairline);border-top-color:var(--baobab);border-radius:50%;flex:none;animation:sd-spin .7s linear infinite}
@keyframes sd-spin{to{transform:rotate(360deg)}}
.sd-ok-glyph{width:20px;height:20px;border-radius:50%;background:var(--signal-grass);color:var(--paper);display:grid;place-items:center;flex:none}
.sd-ok-glyph svg{width:13px;height:13px}

.sd-field-labelrow{display:flex;align-items:center;justify-content:space-between;gap:8px}
.sd-dictate{display:inline-flex;align-items:center;gap:5px;background:transparent;border:0;cursor:pointer;font-family:var(--font-mono);font-size:9px;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-mute);padding:1px 3px}
.sd-dictate:hover{color:var(--baobab)}
.sd-dictate svg{width:12px;height:12px}
.sd-dictate-live{color:var(--baobab)}

.sd-prefill{display:inline-flex;align-items:center;align-self:flex-start;font-family:var(--font-mono);font-size:11px;letter-spacing:0.02em;color:var(--ink-mute);background:var(--paper-2);border:1px dashed var(--hairline);border-radius:3px;padding:3px 8px}

.sd-priority{display:inline-flex;align-items:center;gap:8px;font-family:var(--font-mono);font-size:10px;letter-spacing:0.08em;text-transform:uppercase;color:var(--baobab);background:var(--baobab-bg);border:1px solid color-mix(in srgb,var(--baobab) 28%,var(--hairline));border-radius:3px;padding:7px 11px;margin:15px 0 0}
.sd-priority svg{width:14px;height:14px;flex:none}

.sd-catalog{display:flex;flex-direction:column;border-top:1px solid var(--hairline);margin:16px 0 0}
.sd-cat-row{display:flex;align-items:center;gap:13px;padding:12px 4px;border-bottom:1px solid var(--hairline)}
.sd-cat-ico{width:26px;height:26px;flex:none;color:var(--ink-mute);display:grid;place-items:center}
.sd-cat-ico svg{width:19px;height:19px}
.sd-cat-h{flex:1;min-width:0}
.sd-cat-name{display:block;font-family:var(--font-ui);font-weight:600;font-size:14.5px;color:var(--ink);line-height:1.2}
.sd-cat-meta{display:block;font-family:var(--font-mono);font-size:10px;letter-spacing:0.03em;color:var(--ink-faint);margin-top:2px}
.sd-cat-state{display:inline-flex;align-items:center;gap:7px;font-family:var(--font-mono);font-size:10px;letter-spacing:0.06em;text-transform:uppercase;color:var(--signal-grass)}
.sd-cat-state svg{width:13px;height:13px}

.sd-done-title{display:flex;align-items:center;gap:10px;margin-bottom:5px}

.sd-reset{display:inline-flex;align-items:center;gap:7px;background:transparent;border:0;cursor:pointer;font-family:var(--font-mono);font-size:10px;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-mute);padding:0;margin-top:18px}
.sd-reset:hover{color:var(--baobab)}
.sd-reset svg{width:13px;height:13px}

/* validation flag (replaces the reference's inline borderColor set) */
.sd-flag-err{border-color:var(--baobab)}
.sf-action .ds-button:disabled{opacity:.45;pointer-events:none}

/* =====================================================================   next-steps layer — process strip + prefilled draft note.
   ============================================================================ */
.sf-preview{display:flex;flex-direction:column;gap:15px;margin:16px 0 0;animation:sd-fade .24s ease both}
.sf-target{display:flex;flex-direction:column;gap:11px}
.sf-target .ds-field{max-width:360px}
.sf-target .ds-field-row-2{max-width:440px}
.sf-chiprow{margin:0;padding:0;border:0}
.sf-chip.ds-filter-chip-active{color:var(--paper);background:var(--baobab);border-color:var(--baobab)}
.sf-more{display:flex;flex-direction:column;gap:6px;max-width:300px}
.sf-more .ds-label{color:var(--ink-faint)}

.sf-happens{display:flex;flex-direction:column;gap:9px}
.sf-happens-h{font-family:var(--font-mono);font-size:9.5px;letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-faint);margin:0}
.sf-strip{display:flex;align-items:flex-start;flex-wrap:wrap;max-width:560px}
.sf-node{display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;flex:0 0 auto;min-width:0;max-width:118px;padding:0 3px;transition:opacity .3s ease}
.sf-node-ico{width:25px;height:25px;border-radius:50%;display:grid;place-items:center;border:1.5px solid var(--hairline);background:var(--paper);font-family:var(--font-mono);font-size:11px;color:var(--ink-faint);transition:background .3s ease,border-color .3s ease,color .3s ease}
.sf-node-ico svg{width:15px;height:15px}
.sf-node-label{font-family:var(--font-ui);font-size:11.5px;line-height:1.22;color:var(--ink-mute);max-width:15ch;transition:color .3s ease}
.sf-conn{flex:0 0 30px;width:30px;min-width:16px;height:1.5px;background:var(--hairline);margin-top:12px;position:relative;overflow:hidden}
.sf-conn::after{content:'';position:absolute;inset:0;background:var(--ink);transform:scaleX(0);transform-origin:left;transition:transform .4s ease}
.sf-conn--on::after{transform:scaleX(1)}
.sf-node--here .sf-node-ico{border-color:var(--baobab);border-width:2px}
.sf-node--here .sf-node-label{color:var(--ink);font-weight:600}
.sf-here-dot{width:9px;height:9px;border-radius:50%;background:var(--baobab);animation:sf-hi 2.1s ease-in-out infinite}
@keyframes sf-hi{0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--baobab) 40%,transparent)}55%{box-shadow:0 0 0 5px transparent}}
.sf-here-tag{font-family:var(--font-mono);font-size:8px;letter-spacing:0.1em;text-transform:uppercase;color:var(--baobab);margin-top:-2px}
.sf-node--next{opacity:.55}
.sf-node--done .sf-node-ico{border-color:var(--ink);background:var(--ink);color:var(--paper)}
.sf-node--done .sf-node-label{color:var(--ink-soft)}
.sf-node--active .sf-node-ico{border-color:var(--baobab)}
.sf-node--active .sf-node-label{color:var(--ink);font-weight:600}
.sf-node-spin{width:15px;height:15px;border:2px solid var(--baobab-bg);border-top-color:var(--baobab);border-radius:50%;animation:sd-spin .7s linear infinite}
.sf-node--waiting .sf-node-ico{border-color:var(--signal-amber);color:var(--signal-amber)}
.sf-node--waiting .sf-node-label{color:var(--ink);font-weight:600}
.sf-wait-dot{width:9px;height:9px;border-radius:50%;background:var(--signal-amber);animation:sf-hi 2.1s ease-in-out infinite}

.sf-note,.sf-summary{padding:15px 17px;display:flex;flex-direction:column;gap:13px}
.sf-note-head{display:flex;flex-wrap:wrap;gap:6px 30px;padding-bottom:12px;border-bottom:1px solid var(--hairline)}
.sf-note-row{display:flex;align-items:baseline;gap:10px;min-width:0}
.sf-note-k{font-family:var(--font-mono);font-size:9px;letter-spacing:0.12em;text-transform:uppercase;color:var(--ink-faint);flex:none}
.sf-note-v{font-family:var(--font-ui);font-size:13.5px;color:var(--ink);display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}
.sf-note-v b{color:var(--ink-faint);font-weight:400}
.sf-msg{font-family:var(--font-ui);font-size:15.5px;line-height:1.6;color:var(--ink-soft);margin:0}
.sf-fill{color:var(--ink);font-weight:600;box-shadow:inset 0 -0.42em 0 var(--baobab-bg)}
.sf-blank{font-family:var(--font-mono);font-size:12.5px;color:var(--ink-mute);background:var(--paper-2);border:1px dashed var(--hairline);border-radius:3px;padding:1px 7px;white-space:nowrap}
.sf-reason{display:flex;flex-direction:column;gap:6px}
.sf-summary .sf-msg{font-size:15px}
.sf-prefill-line{display:flex}

.sf-agentq{display:flex;flex-direction:column;gap:13px}
.sf-agent-line{font-family:var(--font-ui);font-size:17px;line-height:1.45;color:var(--ink);margin:0;padding-left:13px;border-left:2px solid var(--baobab);text-wrap:balance;max-width:60ch}
.sf-ask-row{display:flex;gap:10px;align-items:center;max-width:540px;flex-wrap:wrap}
.sf-ask-in{flex:1;min-width:220px}
.sf-suggest{display:flex;flex-direction:column;gap:7px}
.sf-suggest-h{font-family:var(--font-mono);font-size:9px;letter-spacing:0.12em;text-transform:uppercase;color:var(--ink-faint)}
.sf-branch{display:flex;gap:11px;flex-wrap:wrap}
.sf-sample{font-family:var(--font-mono);font-size:10px;letter-spacing:0.02em;color:var(--ink-mute);background:var(--paper-2);border:1px dashed var(--hairline);border-radius:3px;padding:5px 9px;margin:0;align-self:flex-start;max-width:60ch;line-height:1.4}

.sf-action{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-top:2px}
.sf-hint{font-family:var(--font-ui);font-size:12.5px}
.sf-note-done{margin:2px 0 0}
.sf-note-done .sd-reset{margin-top:12px}

/* desk "My requests" — session-local + honest: only items started this
   session, each backed by a real ticket / process transaction. */
.sf-myreq{display:flex;flex-direction:column;gap:9px;margin:26px 0 0;padding-top:18px;border-top:1px solid var(--hairline)}
.sf-myreq .sf-happens-h{margin:0;display:flex;align-items:center;gap:8px}
.sf-myreq-n{font-family:var(--font-mono);font-size:9px;letter-spacing:0.06em;color:var(--paper);background:var(--ink);border-radius:20px;padding:1px 7px}
.sf-myreq-list{display:flex;flex-direction:column;border-top:1px solid var(--hairline)}
.sf-myreq-row{display:flex;align-items:center;gap:12px;padding:10px 2px;border-bottom:1px solid var(--hairline)}
.sf-myreq-t{font-family:var(--font-ui);font-weight:600;font-size:14px;color:var(--ink);flex:none}
.sf-myreq-s{flex:1;min-width:0;font-family:var(--font-mono);font-size:11px;letter-spacing:0.02em;color:var(--ink-mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sf-myreq-row .ds-tag{flex:none}

.sf-amend{display:flex;flex-direction:column;gap:6px;max-width:440px}
.sf-done-row{display:flex;gap:20px;flex-wrap:wrap;align-items:center}

@media (prefers-reduced-motion:reduce){
  .sd-detail,.sf-preview{animation:none}
  .sd-spin,.sf-node-spin,.sf-here-dot,.sf-wait-dot,.sf-speak-ind i,.sd-assistant[data-state="listening"] .sf-dot{animation:none}
  .sf-mic-orb[data-state="listening"]::after,.sf-mic-orb[data-state="speaking"]::after{animation:none}
}
@media (max-width:860px){
  .sd-body{flex-direction:column;overflow-y:auto}
  .sd-menu{width:100%;max-height:32vh;border-right:0;border-bottom:1px solid var(--ink);padding-bottom:0}
  .sd-pane{overflow:visible}
  .sd-detail{max-width:none;padding:16px 20px 28px}
  .sd-assistant{max-width:100%}
  .sd-avatar-col{width:min(400px,100%)}
  .sd-avatar{width:100%;max-width:400px;height:auto;aspect-ratio:4/3}
  .sd-app .ds-field-row-2{grid-template-columns:1fr}
}
@media (max-width:640px){
  .sd-menu{max-height:26vh}
  .sd-detail{padding:12px 14px 24px}
  .sd-assistant{flex-direction:column;gap:10px}
  .sd-avatar-col,.sd-assistant-body{width:100%}
}

/* Portal mobile navigation: compact trigger plus a scrollable CDS panel. */
.portal-mobile-nav-trigger{display:none}
/* Reporting worksurface (revised 2026-08-01, Ben: "you did not show me the
   nav"): the portal sidebar STAYS visible on /app/reporting — reports now
   size their tables to content (.ds-report-table) and genuinely wide ones
   scroll inside .ds-table-scroll, so the full-track takeover and its
   floating Menu trigger are retired. The workbench still spans its whole
   grid track rather than the 1080px page-inner column. */
.portal-shell-frame.portal-shell-reporting .module-workbench-reporting{width:100%;max-width:none;padding-inline:18px}
@media (max-width:860px){
  .portal-shell-frame.portal-shell-reporting .module-workbench-header .module-title-block{flex:0 0 auto}
  .portal-shell-frame>.portal-mobile-nav-trigger{display:inline-flex;position:fixed;top:10px;right:10px;z-index:121;width:auto}
  .portal-shell-frame.portal-mobile-nav-open>.sb{display:flex;position:fixed;inset:0;z-index:120;height:100vh;max-height:100vh;overflow-y:auto;flex-direction:column;align-items:stretch;flex-wrap:nowrap;padding:54px 12px 20px;background:var(--ink);border-right:0}
  .portal-shell-frame.portal-mobile-nav-open>.sb .sb-brand{padding:0 0 10px}
  .portal-shell-frame.portal-mobile-nav-open>.sb .sb-group-label{display:block}
  .portal-shell-frame.portal-mobile-nav-open>.sb .sb-folders{display:block}
  .portal-shell-frame.portal-mobile-nav-open>.sb .sb-nav{display:flex;flex-direction:column}
  /* .sb-nav is now always-mounted (Loop-3 accordion fix, 2026-07-18) and relies on the
     [hidden] attribute to hide collapsed folder bodies. The rule above unconditionally sets
     display:flex on every .sb-nav while the mobile drawer is open, which outranks the UA
     [hidden]{display:none} default and made every folder body show at once. Add the
     explicit [hidden] override at higher specificity, matching the codebase's own pattern
     (.ds-window[hidden]/.upload-list[hidden]) so a collapsed folder body stays hidden even
     while the drawer is open. */
  .portal-shell-frame.portal-mobile-nav-open>.sb .sb-nav[hidden]{display:none}
  .portal-shell-frame.portal-mobile-nav-open>.sb .sb-who{display:flex}
}

/* ===== Evidence-photo thumbnail (WBO capture, MMDB-0266 / WBO-R-007 AC2, 2026-07-11) =====
   A bounded preview of a captured evidence photo (weighbridge ticket) shown before submit,
   with an adjacent Retake control (.ds-button). The captured image is client-downscaled to
   <=1280px; this caps the on-screen preview to a legible-but-compact thumbnail so it never
   blows the mobile capture form. Token-only styling — no hardcoded color. */
.ds-evidence-thumb{display:block;max-width:220px;width:100%;height:auto;border:1px solid var(--hairline);border-radius:4px;background:var(--paper-2)}

/* Cowork mobile file attachment & folder mapping — CoFlow features */
.upload-list{max-width:720px;width:100%;margin:0 auto;display:flex;flex-wrap:wrap;gap:6px}
.upload-list[hidden]{display:none}
.upload-chip{display:inline-flex;align-items:center;max-width:100%;min-height:28px;border:1px solid var(--hairline);border-radius:6px;background:var(--paper-2);color:var(--ink-soft);font-family:var(--font-ui);font-weight:600;font-size:12px;line-height:1.2;padding:5px 8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.upload-input{display:none}
.chat-attach-sheet{position:absolute;left:0;bottom:calc(100% + 8px);z-index:46;display:flex;flex-direction:column;gap:6px;background:var(--paper);border:1px solid var(--hairline);border-radius:8px;box-shadow:0 12px 32px rgba(14,14,12,0.16);padding:6px;width:168px}
.chat-attach-sheet[hidden]{display:none}
.chat-attach-option{min-height:44px;text-align:left;border:1px solid transparent;border-radius:6px;background:transparent;color:var(--ink);font-family:var(--font-ui);font-weight:600;font-size:13px;padding:0 10px;cursor:pointer}
.chat-attach-option:hover{background:var(--paper-2);border-color:var(--hairline)}
.chat-attach-option:disabled{opacity:0.55}
.chat-upload{min-width:48px;min-height:48px;border:1px solid var(--hairline);border-radius:8px;background:var(--paper);color:var(--ink);font-family:var(--font-ui);font-weight:600;font-size:18px;letter-spacing:0.04em;padding:0}
.chat-upload:disabled{opacity:0.55}
.folder-chip{cursor:pointer}
.folder-chip:hover{border-color:var(--baobab);color:var(--baobab)}
.folder-unmap{display:inline-flex;align-items:center;justify-content:center;min-height:28px;border:1px solid var(--hairline);border-radius:6px;background:var(--paper);color:var(--ink-soft);font-family:var(--font-ui);font-weight:600;font-size:12px;line-height:1.2;padding:5px 8px;cursor:pointer}
.folder-unmap:hover{border-color:var(--baobab);color:var(--baobab)}
.artifact-save{display:inline-flex;align-items:center;justify-content:center;min-height:36px;border:1px solid var(--hairline);border-radius:6px;background:var(--paper);color:var(--ink);font-family:var(--font-ui);font-weight:600;font-size:13px;line-height:1.2;padding:8px 10px;cursor:pointer}
.artifact-save:hover{border-color:var(--baobab);color:var(--baobab)}
.artifact-save:disabled{opacity:0.6}

/* Expenses claim detail — receipt image preview (MMDB-0945/0952/0953). */
.ds-receipt-preview{max-width:320px;border:1px solid var(--hairline);border-radius:3px}

/* --- Flowchart canvas: process lanes of linked node cards ------------------
   Generic building block for any "swimlane of live screens" canvas (first
   used by the procurement process flowchart). A lane is a labelled row; each
   node is a plain <a> card so the whole card navigates to the live screen —
   no bespoke per-app styling, token-only. */
.ds-flowchart{overflow-x:auto;padding-bottom:4px}
.ds-flowchart-lane{display:flex;flex-direction:column;gap:8px;padding:10px 2px;border-bottom:1px solid var(--hairline)}
.ds-flowchart-lane:last-child{border-bottom:0}
/* Inner row for the label+track pair, so a lane can also carry a full-width ds-notice
   (hand-off banner) as a sibling block above it instead of the notice being squeezed
   into the same row (UX review 2026-07-18). Label stays top-anchored per PR #245. */
.ds-flowchart-lane-row{display:flex;align-items:stretch;gap:10px}
.ds-flowchart-lane-label{flex:0 0 132px;display:flex;align-items:flex-start;padding-top:2px;font-family:var(--font-mono);font-weight:600;font-size:calc(10.5px * var(--fs-scale, 1));letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-soft)}
.ds-flowchart-track{display:flex;align-items:stretch;gap:0;flex:1;width:max-content}
.ds-flow-node{display:flex;flex-direction:column;gap:6px;width:224px;flex:0 0 auto;padding:8px;background:var(--paper);border:1px solid var(--hairline);border-radius:4px;text-decoration:none;color:var(--ink);transition:border-color .14s ease,transform .14s ease}
.ds-flow-node:hover{border-color:var(--baobab);transform:translateY(-2px)}
.ds-flow-node:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}
/* Normalize native <button> UA chrome when .ds-flow-node lands on a button instead of an
   <a> (e.g. atlas cards with no live href) -- resets font/cursor/text-align/appearance so
   anchor- and button-rendered cards are pixel-identical (BA/UX review, 2026-07-18). */
button.ds-flow-node{appearance:none;-webkit-appearance:none;cursor:pointer;font:inherit;text-align:left;margin:0}
.ds-flow-node-index{font-family:var(--font-mono);font-weight:600;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.1em;color:var(--ink-mute)}
.ds-flow-node-thumb{display:block;width:100%;aspect-ratio:16/10;overflow:hidden;background:var(--paper-2);border:1px solid var(--hairline);border-radius:3px}
.ds-flow-node-thumb img{display:block;width:100%;height:100%;object-fit:cover;object-position:top left}
.ds-flow-node-label{font-family:var(--font-ui);font-weight:700;font-size:calc(12.5px * var(--fs-scale, 1));line-height:1.25;color:var(--ink)}
.ds-flow-node-purpose{font-family:var(--font-ui);font-weight:500;font-size:calc(11px * var(--fs-scale, 1));line-height:1.4;color:var(--ink-soft)}
.ds-flow-connector{flex:0 0 22px;display:flex;align-items:center;justify-content:center;align-self:center;color:var(--ink-faint);font-size:14px}
.ds-flow-connector::before{content:"→"}
/* ---- Flow node: step meta row + persona tag + agent/human context lines -----
   Added for the procurement process-flow atlas (2026-07-18): every node in a
   dense cross-process atlas needs to say, at a glance, WHO works the screen and
   WHAT is agent-assisted vs. human-gated, without turning into explainer chrome.
   Reuses .ds-tag for status (ds-tag-positive/progress/waiting = live/partial/
   design-only) — only the 4 classes below are new. */
.ds-flow-node-meta{display:flex;align-items:center;justify-content:space-between;gap:6px}
.ds-flow-node-role{align-self:flex-start;font-family:var(--font-mono);font-weight:500;font-size:calc(9.5px * var(--fs-scale, 1));letter-spacing:0.06em;color:var(--ink-mute);background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px;padding:2px 6px}
.ds-flow-node-context{display:flex;flex-direction:column;gap:3px;margin-top:2px;padding-top:6px;border-top:1px solid var(--hairline)}
.ds-flow-node-prefill,.ds-flow-node-gate{font-family:var(--font-ui);font-weight:500;font-size:calc(10.5px * var(--fs-scale, 1));line-height:1.35;color:var(--ink-soft)}
.ds-flow-node-prefill b,.ds-flow-node-gate b{font-family:var(--font-mono);font-weight:600;font-size:calc(9px * var(--fs-scale, 1));letter-spacing:0.06em;text-transform:uppercase;color:var(--ink-mute);margin-right:4px}
.ds-flow-node-gate b{color:var(--baobab)}
/* ===== Finance report-table total + section rows (2026-07-16) =====
   .ds-records-total: a sum/totalling <tr> inside a .ds-records-compact (or any
   records) table — heavier ink + a top rule so the foot/bold line reads as a
   total. .ds-records-section: a divider/section-header <tr> within the same table
   (e.g. costing block headers), rendered as a muted mono uppercase band so it is
   clearly a structural break, not a data row. Both are additive: apply to a <tr>.
   Token-only. Replaces the undefined .fin-total/.fin-num classes the finance
   pages had been using before the QA/UX review. */
.ds-records-compact tbody th:not(.ds-mono-num){font-family:var(--font-ui)!important;font-weight:500!important;font-size:calc(13px * var(--fs-scale, 1))!important;letter-spacing:0!important;text-transform:none!important;color:var(--ink)!important;text-align:left!important}
.ds-records-compact tbody th.ds-records-title{font-family:var(--font-display)!important;font-weight:700!important;font-size:calc(16px * var(--fs-scale, 1))!important;letter-spacing:-0.015em!important;line-height:1.2!important;color:var(--ink)!important;text-transform:none!important}
.ds-records-total td,.ds-records-total th{font-weight:700!important;color:var(--ink)!important;border-top:1px solid var(--ink)}
.ds-records-section td,.ds-records-section th{font-family:var(--font-mono)!important;font-weight:600!important;font-size:calc(10.5px * var(--fs-scale, 1))!important;letter-spacing:0.1em!important;text-transform:uppercase!important;color:var(--ink-mute)!important;background:var(--paper-2);border-top:1px solid var(--hairline)}

/* =====================================================================   TA supplier portal — review-fix wave 2 (2026-07-17)
   Closes a pre-existing drift: candidate-table/score-badge were added directly
   to mmd-ta-portal's VENDORED copy on 2026-07-08 and never landed here in the
   canonical DS. Migrating them in now (with the D2 fix already applied) so the
   "authored in shell, synced to app" rule holds going forward.
   ============================================================================ */

/* --- Candidate pipeline table --------------------------------------------- */
.candidate-table{width:100%;border-collapse:collapse;font-size:12.5px;min-width:640px}
.candidate-table thead tr{border-bottom:1px solid var(--ink)}
.candidate-table th{text-align:left;padding:6px 10px;font-family:var(--font-mono);font-size:9.5px;font-weight:500;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-mute);white-space:nowrap}
.candidate-row{border-top:1px solid var(--hairline);cursor:pointer;transition:background .1s ease}
.candidate-row:hover{background:var(--paper-2)}
.candidate-row:focus-visible{outline:2px solid var(--baobab);outline-offset:-2px}
.candidate-row td{padding:8px 10px;vertical-align:middle;color:var(--ink);line-height:1.35}
.candidate-row-select{width:15px;height:15px;accent-color:var(--baobab);cursor:pointer}

/* D2: single-line ellipsis truncation moved onto each text node individually.
   The old .candidate-cell{max-width:1px;overflow:hidden;text-overflow:ellipsis;
   white-space:nowrap} only ever worked for one line — candidate-name (inline)
   plus candidate-role (display:block) are two lines, so the second line was
   being hard-clipped with no ellipsis. */
.candidate-cell{width:26%;max-width:260px;min-width:180px}
.candidate-name{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-ui);font-weight:600;color:var(--ink)}
.candidate-role{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;color:var(--ink-mute);margin-top:1px}

.candidate-row-toggle{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border:0;background:transparent;color:var(--ink-faint);cursor:pointer;padding:0}
.candidate-row-toggle::before{content:"▸";font-size:9px;display:block;transition:transform .12s ease}
.candidate-row[data-expanded="true"] .candidate-row-toggle::before{transform:rotate(90deg);color:var(--ink)}
.candidate-row-detail{background:var(--paper-2)}
.candidate-row-detail td{padding:12px 16px 16px 34px;border-top:1px solid var(--hairline);font-size:12.5px;color:var(--ink-soft);line-height:1.55}

/* --- Score badge — 0-100, 3 severity steps on existing signal tokens ------ */
.score-badge{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:20px;padding:0 6px;font-family:var(--font-mono);font-weight:600;font-size:11px;letter-spacing:0.01em;border-radius:var(--ds-radius-sm);border:1px solid transparent;line-height:1}
.score-badge-high{color:var(--signal-grass);background:var(--signal-grass-bg);border-color:color-mix(in srgb, var(--signal-grass) 35%, transparent)}
.score-badge-mid{color:var(--signal-amber);background:var(--signal-amber-bg);border-color:color-mix(in srgb, var(--signal-amber) 35%, transparent)}
.score-badge-low{color:var(--baobab);background:var(--baobab-bg);border-color:color-mix(in srgb, var(--baobab) 35%, transparent)}

/* D4: recommendation-tag sentiment tones, consistent with score-badge-high/low.
   None of the existing ds-tag-* variants (open/progress/waiting/resolved/
   closed/error) express a positive/negative read — they're status-lifecycle
   tones. "Maybe" reuses the existing neutral ds-tag-waiting. */
.ds-tag-positive{color:var(--signal-grass);border-color:color-mix(in srgb, var(--signal-grass) 55%, transparent)}
.ds-tag-negative{color:var(--baobab);border-color:color-mix(in srgb, var(--baobab) 55%, transparent)}

/* D3: fixed topbar is 72px tall (position:fixed, z-index:50). In-page hash
   anchors (#screening, #messages, etc.) must not land their target under it.
   Generic rule — any id-carrying anchor target gets breathing room above. */
[id]{scroll-margin-top:80px}

/* D1: the 8-column candidate-table has expand/collapse row state
   (.candidate-row[data-expanded]) and a colspan detail row, so it doesn't
   survive the block-stacking transform used by `.module-table-section
   .ds-records` on narrow viewports. Reuse the existing `.ds-table-scroll`
   opt-in wrapper instead (already proven for the Reporting overflow fix) —
   app wraps `<table className="candidate-table">` in
   `<div className="ds-table-scroll">`. */

.ds-process-thumb-compact{height:120px}
.ds-process-node-static{opacity:1;background:var(--paper-2)}

/* =====================================================================   TA Supplier Admin modal chrome — TaSupplierEditModal.tsx (2026-07-21)
   Moved from src/app/globals.css into the canonical DS per adversarial
   review on PR #298: app-local CSS for a bespoke modal pattern (portal-user
   section divider, inline delete-confirm row, generated-password reveal +
   copy control) is a CDS violation even when TA-module-specific — every
   visual pattern is a named DS class, never authored in app code.
   ============================================================================ */
.ta-supplier-users-section{margin-top:24px;padding-top:20px;border-top:1px solid var(--hairline)}
.ta-supplier-confirm-row{display:flex;align-items:center;gap:10px;font-size:calc(12.5px * var(--fs-scale, 1));color:var(--ink)}
.ta-supplier-password-reveal{display:flex;align-items:center;gap:10px}
.ta-supplier-password-copy{font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-mute);background:transparent;border:1px solid var(--hairline);border-radius:2px;padding:4px 8px;cursor:pointer}
.ta-supplier-password-copy:hover{color:var(--ink);border-color:var(--ink)}
.ta-supplier-password-copy[data-copied="true"]{color:var(--signal-grass);border-color:var(--signal-grass)}

/* =====================================================================   Agent-approval components — ds-agent-card / ds-node-status / ds-node-who /
   ds-disclosure (2026-07-18)
   Agentic-approval model: for each human step an AGENT TASK pre-computes and
   pre-fills the proposed decision, the numbers, the routing, and plain-
   English reasoning; the human only APPROVES/REJECTS/ADJUSTS with all of
   that context visible on one screen. ds-agent-card is that single-screen
   approval surface; ds-node-status marks a step's approval state; ds-node-who
   attributes a field or action to the agent or the human; ds-disclosure holds
   the supporting context/reasoning collapsed by default so the proposal
   stays dense and scannable. Tokens only: --ink, --ink-mute, --paper-2,
   --hairline, --baobab, --signal-grass(-bg), --signal-amber(-bg),
   --font-mono. No new hex, no inline style.
   ============================================================================ */

/* --- ds-agent-card: the human-gated, agent-prepared approval surface ------ */
.ds-agent-card{background:var(--paper-2);border:1px solid var(--hairline);border-top:2px solid var(--ink);border-radius:4px;padding:20px 24px;display:flex;flex-direction:column;gap:14px}
.ds-agent-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;flex-wrap:wrap}
.ds-agent-card-reasoning{display:flex;flex-direction:column;gap:6px;font-family:var(--font-mono);font-size:calc(12.5px * var(--fs-scale, 1));line-height:1.5;color:var(--ink-mute)}
.ds-agent-card[data-readiness="blocked"]{border-top-color:var(--signal-amber)}
.ds-agent-card[data-readiness="partial"]{border-top-color:var(--signal-amber)}
.ds-agent-card-eyebrow{font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.16em;text-transform:uppercase;color:var(--ink-mute);display:block;margin:0 0 4px}
.ds-agent-card-title{font-family:var(--font-mono);font-weight:600;font-size:calc(16.5px * var(--fs-scale, 1));letter-spacing:-0.005em;line-height:1.25;color:var(--ink);margin:0}
.ds-agent-card-badges{display:flex;align-items:center;gap:8px;flex-wrap:wrap;flex:0 0 auto}
.ds-agent-card-proposal{border-top:1px solid var(--hairline);border-bottom:1px solid var(--hairline);padding:12px 0;display:flex;flex-direction:column;gap:5px}
.ds-agent-card-proposal-label{font-family:var(--font-mono);font-weight:500;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute)}
.ds-agent-card-proposal-value{font-family:var(--font-mono);font-weight:600;font-size:calc(21px * var(--fs-scale, 1));letter-spacing:-0.01em;color:var(--ink)}
.ds-agent-card-context{display:flex;flex-direction:column}
.ds-agent-card-context-row{display:flex;align-items:baseline;justify-content:space-between;gap:14px;padding:7px 0;border-bottom:1px solid var(--hairline)}
.ds-agent-card-context-row:last-child{border-bottom:0}
.ds-agent-card-context-label{font-family:var(--font-mono);font-weight:500;font-size:calc(10.5px * var(--fs-scale, 1));letter-spacing:0.1em;text-transform:uppercase;color:var(--ink-mute);flex:0 0 auto}
.ds-agent-card-context-value{font-family:var(--font-mono);font-weight:500;font-size:calc(13px * var(--fs-scale, 1));color:var(--ink);text-align:right}
.ds-agent-card-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding-top:2px}

/* --- ds-node-status: the step's approval state -------------------------- */
.ds-node-status{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-weight:600;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.1em;text-transform:uppercase;padding:3px 9px;border-radius:2px;border:1px solid var(--hairline);color:var(--ink-mute);background:var(--paper-2);line-height:1.4}
.ds-node-status::before{content:"";width:6px;height:6px;border-radius:50%;background:currentColor;flex:none}
.ds-node-status-prepared{color:var(--ink-mute);border-color:var(--hairline)}
.ds-node-status-pending{color:var(--signal-amber);border-color:var(--signal-amber);background:var(--signal-amber-bg)}
.ds-node-status-approved{color:var(--signal-grass);border-color:var(--signal-grass);background:var(--signal-grass-bg)}
.ds-node-status-adjusted{color:var(--signal-amber);border-color:var(--signal-amber);background:var(--signal-amber-bg)}
.ds-node-status-rejected{color:var(--baobab);border-color:var(--baobab)}

/* --- ds-node-who: attributes a field/action to the agent or the human ---- */
.ds-node-who{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-weight:500;font-size:calc(10.5px * var(--fs-scale, 1));letter-spacing:0.04em;color:var(--ink-mute)}
.ds-node-who-icon{width:15px;height:15px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-family:var(--font-mono);font-size:calc(8px * var(--fs-scale, 1));font-weight:700;flex:none;border:1px solid var(--hairline);color:var(--ink-mute);background:var(--paper-2)}
.ds-node-who-agent{color:var(--ink-mute)}
.ds-node-who-agent .ds-node-who-icon{color:var(--ink-mute);border-color:var(--hairline)}
.ds-node-who-human{color:var(--ink)}
.ds-node-who-human .ds-node-who-icon{color:var(--paper-2);background:var(--ink);border-color:var(--ink)}

/* --- ds-disclosure: supporting context/reasoning, collapsed by default --- */
.ds-disclosure{border-top:1px solid var(--hairline)}
.ds-disclosure-trigger{display:flex;align-items:center;justify-content:space-between;gap:10px;width:100%;padding:10px 0;background:transparent;border:0;cursor:pointer;font-family:var(--font-mono);color:var(--ink-mute);text-align:left}
.ds-disclosure-trigger:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}
.ds-disclosure-label{font-weight:500;font-size:calc(10.5px * var(--fs-scale, 1));letter-spacing:0.12em;text-transform:uppercase;color:inherit}
.ds-disclosure-icon{font-size:calc(9px * var(--fs-scale, 1));color:var(--ink-mute);transition:transform .12s ease;flex:none}
.ds-disclosure[data-open="true"] .ds-disclosure-icon{transform:rotate(90deg)}
.ds-disclosure-panel{display:none;padding:0 0 14px;font-family:var(--font-mono);font-weight:500;font-size:calc(12.5px * var(--fs-scale, 1));line-height:1.55;color:var(--ink-mute)}
.ds-disclosure[data-open="true"] .ds-disclosure-panel{display:block}

/* Process-owner review atlas (JML, 2026-07-18): the second column of
   .ds-process-modal-body is meant for either a live .ds-embed-frame iframe OR,
   where no live iframe embed is appropriate, a scrollable stack of real captured
   screens / honest BLOCKED cards. .ds-process-modal-main is that scrollable
   wrapper -- .ds-process-modal-body already sets overflow:hidden on itself so
   something inside must own the scroll. .ds-review-screenshot renders a real
   captured screenshot at full, uncropped width (unlike the existing
   .ds-process-thumb-img/.ds-preview-thumb crops, which are deliberately small
   thumbnails, not a complete-screen review surface). .ds-flowchart-lane-governance
   visually separates governance/oversight lanes (GLPI intake, GLPI Workbench)
   from the two numbered operational execution lanes in the same diagram. */
.ds-process-modal-main{overflow:auto;min-height:0;padding:20px;display:flex;flex-direction:column;gap:16px}
.ds-review-screenshot{display:block;width:100%;height:auto;border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper-2)}
.ds-flowchart-lane-governance{border-top:2px dashed var(--hairline);margin-top:8px;padding-top:16px;background:var(--paper-2)}

/* TA-R2607-1 — visible, space-efficient gap between the shell topbar/subnav
   and TA recruitment page content (the board sat flush under the subnav). */
[data-eid="ta-cases-list"]{margin-top:14px}

/* ===== TA step dialogs (Ben-approved designs 2026-07-22) =====
   Semantic classes mirroring the four approved mocks 1:1:
   JD, Approval, Supplier-assignment, Candidate-intake (+quick review).
   Consumed by src/app/app/ta-recruitment/stepDialogs/*. */
.ds-step-legend{display:flex;align-items:baseline;gap:10px;border-bottom:1px solid var(--ink);padding-bottom:8px;margin-bottom:16px}
.ds-step-legend-kicker{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-mute)}
.ds-step-legend-pos{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:19px}
.ds-step-legend-chip{margin-left:auto;font-family:var(--font-mono);font-size:9px;text-transform:uppercase;color:var(--ink-mute);border:1px solid var(--hairline);border-radius:8px;padding:1px 7px;background:var(--paper);white-space:nowrap}
/* R3 -- align-items:start so a field with a hint line (taller) doesn't
   stretch a shorter sibling field's input to fill the row, which read as
   a dead gap under the shorter field. */
.ds-step-row-3{display:grid;grid-template-columns:repeat(3,1fr);gap:14px 18px;margin-bottom:14px;align-items:start}
.ds-step-row-2{display:grid;grid-template-columns:1fr 1fr;gap:14px 18px;margin-bottom:14px;align-items:start}
.ds-step-row-full{margin-bottom:14px}
.ds-step-section{margin-bottom:22px}
.ds-step-section:last-of-type{margin-bottom:0}
/* R3 -- section headers must read stronger than field sub-labels
   (.ds-label: 12px/weight 600/var(--ink)). Bigger, bolder, heavier rule. */
.ds-step-section-title{display:flex;align-items:baseline;gap:8px;border-bottom:2px solid var(--ink);padding-bottom:8px;margin-bottom:16px;font-family:var(--font-mono);font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink)}
.ds-step-section-title-hint{margin-left:auto;font-family:var(--font-ui);font-size:11px;text-transform:none;letter-spacing:0;color:var(--ink-mute);white-space:nowrap}
.ds-modal.ds-modal--dialog.ds-modal--dialog-wide{width:min(clamp(880px,76vw,1800px),calc(100vw - 48px));max-width:calc(100vw - 48px)}
.ds-step-packet{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--hairline);border:1px solid var(--hairline);margin-bottom:14px}
.ds-step-fact{background:var(--paper);padding:8px 10px}
.ds-step-fact-k{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-mute);margin-bottom:3px}
.ds-step-fact-v{font-size:13px}
.ds-step-fact-sub{color:var(--ink-mute);font-size:11px}
.ds-step-fact--risk{background:var(--signal-amber-bg)}
.ds-step-fact--risk .ds-step-fact-v{color:var(--signal-amber);font-weight:600}
.ds-step-agentnote{display:flex;gap:10px;background:var(--paper);border:1px solid var(--hairline);border-left:3px solid var(--signal-amber);padding:10px 12px;margin-bottom:14px}
.ds-step-agentnote-tag{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--signal-amber);white-space:nowrap}
.ds-step-agentnote-body{font-size:12.5px;line-height:1.5}
.ds-step-refrow{display:flex;align-items:center;gap:10px;background:var(--paper);border:1px solid var(--hairline);padding:8px 12px;margin-bottom:14px}
.ds-step-refrow-tag{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft);white-space:nowrap}
.ds-step-refrow-excerpt{font-size:12px;color:var(--ink-mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}
.ds-step-actions{display:flex;justify-content:flex-end;align-items:center;gap:10px;margin-top:18px}
.ds-step-actions-spacer{flex:1}
.ds-step-table{border:1px solid var(--hairline);margin-bottom:4px;overflow-x:auto}
.ds-step-table table{width:100%;border-collapse:collapse}
.ds-step-table th{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-mute);text-align:left;padding:7px 9px;background:var(--paper-2);border-bottom:1px solid var(--hairline);white-space:nowrap;cursor:pointer}
.ds-step-table th.ds-num,.ds-step-table td.ds-num{text-align:right;font-variant-numeric:tabular-nums}
.ds-step-table td{font-size:12.5px;padding:7px 9px;background:var(--paper);border-bottom:1px solid var(--hairline);cursor:pointer;vertical-align:top}
.ds-step-table tr:last-child td{border-bottom:0}
.ds-step-table tr.ds-row-sel td{background:var(--signal-grass-bg)}
.ds-step-table tr.ds-row-sel td:first-child{box-shadow:inset 3px 0 0 var(--signal-grass)}
.ds-step-table tr.ds-row-dim td{opacity:.55}
.ds-step-table-nm{font-weight:600}
.ds-step-table-sub{color:var(--ink-mute);font-size:10.5px}
.ds-step-tickcell{width:30px;text-align:center;padding-left:8px;padding-right:2px}
.ds-tickmark{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border:1px solid var(--ink-faint);border-radius:2px;font-size:11px;color:transparent;background:var(--paper)}
.ds-tickmark--on{background:var(--signal-grass);border-color:var(--signal-grass);color:var(--paper)}
.ds-step-selall{display:flex;align-items:center;gap:8px;font-size:12.5px;padding:8px 10px;background:var(--signal-grass-bg);border:1px solid var(--hairline);border-top:0;margin-bottom:4px;cursor:pointer}
.ds-step-selall-count{margin-left:auto;font-family:var(--font-mono);font-size:9px;text-transform:uppercase;color:var(--signal-grass)}
.ds-step-tablehint{font-size:11px;color:var(--ink-mute);margin-bottom:14px}
.ds-step-agentbox{border:1px solid var(--hairline);border-left:3px solid var(--signal-amber);background:var(--paper);padding:10px 12px;margin-bottom:12px}
.ds-step-agentbox-hd{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.ds-step-agentbox-title{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--signal-amber)}
.ds-step-agentbox-saved{font-family:var(--font-mono);font-size:9px;color:var(--signal-grass)}
.ds-step-agentbox-btns{margin-left:auto;display:flex;gap:8px}
.ds-step-agentbox textarea{width:100%;font-family:var(--font-ui);font-size:12.5px;color:var(--ink);background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px;padding:8px 10px;resize:vertical;line-height:1.45}
.ds-step-uploadrow{display:flex;align-items:center;gap:12px;border:1px dashed var(--ink-faint);background:var(--paper);padding:8px 12px;margin-bottom:12px}
.ds-step-uploadrow-tag{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft)}
.ds-step-uploadrow-files{font-size:12px;color:var(--ink-mute);flex:1}
.ds-step-filters{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.ds-filterchip{font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.03em;border:1px solid var(--hairline);border-radius:10px;background:var(--paper);color:var(--ink-soft);padding:3px 11px;cursor:pointer}
.ds-filterchip--on{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.ds-step-filters-note{margin-left:auto;font-family:var(--font-mono);font-size:9px;text-transform:uppercase;color:var(--ink-mute)}
.ds-natexp{display:inline-block;font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.03em;border-radius:8px;padding:1px 7px;white-space:nowrap;background:var(--paper-2);color:var(--ink-soft);border:1px solid var(--hairline)}
.ds-natexp--expat{color:var(--baobab);border-color:var(--baobab)}
.ds-natexp--rejected{color:var(--ink-mute);border-color:var(--ink-mute)}
.ds-matchscore{display:inline-block;font-family:var(--font-mono);font-size:11px;font-weight:700;border-radius:2px;padding:2px 7px;min-width:34px;text-align:center}
.ds-matchscore--hi{background:var(--signal-grass-bg);color:var(--signal-grass)}
.ds-matchscore--mid{background:var(--signal-amber-bg);color:var(--signal-amber)}
.ds-matchscore--none{background:var(--paper-2);color:var(--ink-mute);border:1px solid var(--hairline)}
.ds-matchwhy{font-size:10.5px;color:var(--ink-mute);display:block;max-width:220px}
.ds-step-review{display:grid;grid-template-columns:1.2fr 1fr;gap:16px}
.ds-step-cv{border:1px solid var(--hairline);background:var(--paper);padding:14px 16px;font-size:12.5px;line-height:1.5;overflow-y:auto;max-height:60vh}
.ds-step-cv h3{font-family:var(--font-display);font-style:italic;font-size:16px;margin-bottom:2px}
.ds-step-cv-meta{font-family:var(--font-mono);font-size:10px;color:var(--ink-mute);margin-bottom:10px}
.ds-step-cv-sec{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-mute);margin:10px 0 3px}
.ds-step-matchpanel{display:flex;flex-direction:column;gap:10px}
.ds-step-matchhead{display:flex;align-items:center;gap:10px;border:1px solid var(--hairline);background:var(--paper);padding:10px 12px}
.ds-step-matchhead-big{font-family:var(--font-mono);font-size:22px;font-weight:700;color:var(--signal-grass)}
.ds-step-matchhead-lbl{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;color:var(--ink-mute)}
.ds-step-matchwhy{border:1px solid var(--hairline);border-left:3px solid var(--signal-grass);background:var(--paper);padding:10px 12px;font-size:12.5px;line-height:1.55}
.ds-step-matchwhy-t{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.05em;color:var(--signal-grass);margin-bottom:5px}
.ds-step-matchwhy ul{margin:0 0 0 16px}
.ds-step-matchwhy li{margin-bottom:3px}
.ds-step-matchwhy li.ds-neg{color:var(--baobab)}
.ds-step-facts{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--hairline);border:1px solid var(--hairline)}
.ds-step-facts-f{background:var(--paper);padding:7px 10px}
.ds-step-numstep{display:grid;grid-template-columns:1fr 44px;border:1px solid var(--hairline);border-radius:2px;background:var(--paper)}
.ds-step-numstep input{border:0;background:transparent;text-align:right;font-variant-numeric:tabular-nums;padding:8px 10px;font-size:13px;font-family:var(--font-ui);width:100%}
.ds-step-numstep-btns{display:grid;grid-template-rows:1fr 1fr;border-left:1px solid var(--hairline)}
.ds-step-numstep-btns button{font-family:var(--font-mono);font-size:8px;background:var(--paper-2);border:0;cursor:pointer;color:var(--ink-soft)}
.ds-step-numstep-btns button:first-child{border-bottom:1px solid var(--hairline)}
/* ===== ds-rag — red/amber/green compliance status chip (HR data-protection
   summary, reusable for any RAG compliance/health cell). Semantic DS object;
   app code must never recolor these. ===== */
.ds-rag{display:inline-block;font-family:var(--font-mono);font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.06em;padding:2px 8px;border-radius:var(--ds-radius-sm);border:1px solid transparent;cursor:default}
.ds-rag-red{color:var(--baobab);background:var(--baobab-bg);border-color:var(--baobab)}
.ds-rag-amber{color:var(--signal-amber);background:var(--signal-amber-bg);border-color:var(--signal-amber)}
.ds-rag-green{color:var(--signal-grass);background:var(--signal-grass-bg);border-color:var(--signal-grass)}
button.ds-rag{cursor:pointer}
button.ds-rag:hover{filter:brightness(0.94)}
/* ds-cell-link — in-table text trigger that opens a detail popup. */
.ds-cell-link{background:none;border:0;padding:0;font:inherit;color:var(--ink);text-decoration:underline;text-decoration-color:var(--ink-faint);text-underline-offset:2px;cursor:pointer;text-align:left}
.ds-cell-link:hover{text-decoration-color:var(--baobab);color:var(--baobab)}
/* ec-table-roomy — spread variant of ec-table for reading-heavy compliance/
   reference tables: larger type, taller rows, more cell air. */
.ec-table-roomy{font-size:13.5px;line-height:1.55}
.ec-table-roomy thead th{font-size:10px;padding:8px 14px}
.ec-table-roomy tbody th,.ec-table-roomy tbody td{padding:12px 14px;vertical-align:top}

/* ===== ds-toast — transient confirmation/error message for an action that
   just completed (e.g. "Candidate submitted"). Per the approved TA supplier
   portal artifact's own interaction contract: "zero window.prompt/confirm/
   alert -- in-page editor + toast instead". Fixed bottom-right, stacks
   multiple, JS owns mount/auto-dismiss timing; this file owns appearance
   only. Semantic variants only -- app code picks -ok or -error, never an
   inline color. ===== */
.ds-toast-stack{position:fixed;right:20px;bottom:20px;z-index:900;display:flex;flex-direction:column;gap:8px;pointer-events:none}
.ds-toast{pointer-events:auto;min-width:220px;max-width:360px;padding:10px 14px;border-radius:var(--ds-radius-sm);border:1px solid var(--hairline);background:var(--paper);box-shadow:0 4px 16px rgba(0,0,0,0.14);font-family:var(--font-mono);font-size:12.5px;font-weight:500;line-height:1.4;color:var(--ink)}
.ds-toast-ok{border-color:var(--signal-grass);background:var(--signal-grass-bg)}
.ds-toast-error{border-color:var(--baobab);background:var(--baobab-bg)}

/* ===== ds-page-head — kicker + italic title + right-aligned live count,
   border-bottom under it. Literal port of the approved TA supplier portal
   artifact's .page-head (kicker/h1/count on every page: Demand, Candidates,
   Interviews, Reporting, Account) -- every page in that artifact opens with
   this banner and none of the TA portal pages had it. Semantic DS object,
   reusable anywhere a page needs the same "kicker + title + live count"
   opening banner. ===== */
.ds-page-head{display:flex;align-items:baseline;gap:12px;border-bottom:1px solid var(--ink);padding-bottom:6px;margin-bottom:14px}
.ds-page-head-title{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:19px;color:var(--ink)}
.ds-page-head-count{margin-left:auto;font-family:var(--font-mono);font-size:10.5px;color:var(--ink-mute)}

/* ===== ds-urgency — urgency label color, ported from the approved TA
   artifact's .urg-high/.urg-normal. ===== */
.ds-urgency-high{color:var(--baobab)}
.ds-urgency-normal{color:var(--ink-mute)}

/* ===== ds-pill / ds-pill-fit — rounded inline chip for a role/country/
   status summary line, ported from the approved TA artifact's .pill/
   .pill-fit (Candidates page "Roles" column: "92% QA Engineer · Angola —
   Shortlisted"). Neutral border only -- the artifact's decorative
   per-country hue variants aren't backed by a real semantic distinction,
   so this stays one consistent style rather than an arbitrary color map. */
.ds-pill{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:10px;letter-spacing:0.02em;padding:4px 10px;border-radius:11px;border:1px solid var(--hairline);background:var(--paper)}
.ds-pill-fit{font-weight:600}

/* ===== ds-chip — small yes/no/unknown status pill for a prep checklist row
   (Interviews "Prep" column: Invite sent / Confirmed / CV shared / JD
   briefed), ported from the approved TA artifact's .chip/.chip-yes/
   .chip-no. -unknown is real: not every signal is tracked in FlowMaster
   yet, and this must read as "not tracked", never a fabricated no. ===== */
.ds-chip{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:0.03em;padding:2px 7px;border-radius:8px;border:1px solid var(--hairline);display:inline-block}
.ds-chip-yes{color:var(--signal-grass);border-color:var(--signal-grass);background:var(--signal-grass-bg)}
.ds-chip-no{color:var(--baobab);border-color:var(--baobab);background:var(--baobab-bg)}
.ds-chip-unknown{color:var(--ink-faint);border-color:var(--hairline);background:var(--paper-2)}

/* ===== ds-stage — colored pipeline-stage pills, literal port of the
   approved TA supplier artifact's .stage-*/.status-* (rounded 9px pills,
   tinted per stage: sourcing=red, screening=amber, interview=green,
   offer=neutral-dark, pool=muted, hired=solid green, outcome pass/fail =
   solid green/red). Ben's live complaint 2026-07-22: shipped pills were
   monochrome ds-tag variants — "they are not green!". These are the
   approved colored shapes. ===== */
.ds-stage{display:inline-block;font-family:var(--font-mono);font-size:9.5px;text-transform:uppercase;letter-spacing:0.04em;padding:3px 8px;border-radius:9px;border:1px solid var(--hairline)}
.ds-stage-sourcing{color:var(--baobab-deep, var(--baobab));border-color:var(--baobab-deep, var(--baobab));background:var(--baobab-bg)}
.ds-stage-screening{color:var(--signal-amber);border-color:var(--signal-amber);background:var(--signal-amber-bg)}
.ds-stage-interview{color:var(--signal-grass);border-color:var(--signal-grass);background:var(--signal-grass-bg)}
.ds-stage-offer{color:var(--ink-soft);border-color:var(--ink);background:var(--paper-3)}
.ds-stage-pool{color:var(--ink-mute);border-color:var(--hairline);background:var(--paper-3)}
.ds-stage-hired{color:#fff;border-color:var(--signal-grass);background:var(--signal-grass)}
.ds-stage-pass{color:#fff;border-color:var(--signal-grass);background:var(--signal-grass)}
.ds-stage-fail{color:#fff;border-color:var(--baobab-deep, var(--baobab));background:var(--baobab-deep, var(--baobab))}

/* ===== ds-app* — MOBILE-FIRST APPLICATION SHELL =====
   Authored for the OMS dealer app (dealer.baobab-ts.com + its Capacitor native
   shell), which is a phone-first product, not a desk surface: the existing
   module-workbench header + ds-filterbar "nav" collapsed into a ~600px dead gap
   at 390px wide and put a 5-way navigation into a wrapping row of buttons.
   Semantic app-shell objects, so app code points at a component instead of
   composing a phone layout out of table/filterbar atoms.

   Everything below is safe-area aware (iOS notch / Android gesture bar) and
   keeps every tap target at or above 44px. Above 720px the same markup centres
   in a reading column — one component, both form factors, no app-side media
   queries. */
.ds-app{display:flex;flex-direction:column;min-height:100vh;min-height:100dvh;background:var(--canvas, var(--paper-2))}
.ds-appbar{position:sticky;top:0;z-index:30;display:flex;align-items:center;gap:12px;padding:calc(10px + env(safe-area-inset-top)) 16px 10px;background:var(--paper);border-bottom:1px solid var(--hairline)}
/* The square group mark is deliberately NOT a themable token: THM-R-004/005 fix
   the themable set to accent + wide logo, and the monogram is the group mark, not
   a per-country asset. */
.ds-appbar-brand{display:block;width:96px;height:22px;flex:0 0 auto;background-image:var(--ds-logo-asset);background-repeat:no-repeat;background-position:left center;background-size:contain}
.ds-appbar-titles{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1 1 auto}
.ds-appbar-eyebrow{font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale, 1));letter-spacing:0.16em;text-transform:uppercase;color:var(--ink-mute)}
.ds-appbar-title{font-family:var(--font-ui);font-weight:700;font-size:calc(15px * var(--fs-scale, 1));line-height:1.2;color:var(--ink);margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-appbar-actions{display:flex;align-items:center;gap:8px;flex:0 0 auto}
.ds-appbar-back{display:inline-flex;align-items:center;justify-content:center;min-width:44px;min-height:44px;margin-left:-10px;border:0;background:transparent;color:var(--ink);font-family:var(--font-ui);font-weight:600;font-size:calc(13px * var(--fs-scale, 1));cursor:pointer}
.ds-appbar-back:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}

.ds-app-body{flex:1 1 auto;display:flex;flex-direction:column;gap:14px;padding:14px 16px calc(84px + env(safe-area-inset-bottom));width:100%;max-width:760px;margin:0 auto}
.ds-app-body>.ds-form{margin-top:0;gap:16px}
.ds-app-body>.ds-table-section,.ds-app-body>section{margin-top:0}

/* Bottom tab bar — the app's primary navigation on a phone. */
.ds-tabbar{position:fixed;left:0;right:0;bottom:0;z-index:40;display:grid;grid-auto-flow:column;grid-auto-columns:1fr;align-items:stretch;background:var(--paper);border-top:1px solid var(--hairline);padding-bottom:env(safe-area-inset-bottom)}
.ds-tabbar-item{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:52px;padding:6px 2px;border:0;border-top:2px solid transparent;background:transparent;color:var(--ink-mute);font-family:var(--font-ui);font-weight:600;font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.02em;cursor:pointer}
.ds-tabbar-item-active{color:var(--ink);border-top-color:var(--baobab)}
.ds-tabbar-item:focus-visible{outline:2px solid var(--baobab);outline-offset:-2px}
.ds-tabbar-glyph{font-size:17px;line-height:1}
.ds-tabbar-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}

/* Record list — the phone form of a records table. One tappable card per row. */
.ds-cardlist{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;list-style:none}
.ds-cardlist-item{display:flex;flex-direction:column;gap:6px;width:100%;min-height:44px;padding:12px 14px;text-align:left;background:var(--paper);border:1px solid var(--hairline);border-radius:4px;color:var(--ink);font-family:var(--font-ui);cursor:pointer}
.ds-cardlist-item:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}
.ds-cardlist-static{cursor:default}
.ds-cardlist-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.ds-cardlist-title{font-weight:700;font-size:calc(14px * var(--fs-scale, 1));line-height:1.25;color:var(--ink)}
.ds-cardlist-id{font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale, 1));color:var(--ink-mute);white-space:nowrap}
.ds-cardlist-meta{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;font-size:calc(12px * var(--fs-scale, 1));color:var(--ink-soft)}
.ds-cardlist-foot{display:flex;align-items:center;justify-content:space-between;gap:10px}
.ds-cardlist-price{font-family:var(--font-mono);font-size:calc(12.5px * var(--fs-scale, 1));color:var(--ink)}

/* Label/value display list — company information, order facts, app details. */
.ds-infolist{display:flex;flex-direction:column;background:var(--paper);border:1px solid var(--hairline);border-radius:4px}
.ds-infolist-row{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:11px 14px;border-bottom:1px solid var(--hairline)}
.ds-infolist-row:last-child{border-bottom:0}
.ds-infolist-label{font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale, 1));letter-spacing:0.12em;text-transform:uppercase;color:var(--ink-mute);flex:0 0 38%}
.ds-infolist-value{font-family:var(--font-ui);font-size:calc(13px * var(--fs-scale, 1));line-height:1.45;color:var(--ink);text-align:right;flex:1 1 auto;overflow-wrap:anywhere}
.ds-infolist-value-block{text-align:left}
.ds-infolist-link{color:var(--ink);text-decoration:underline;text-underline-offset:2px}

/* Sticky filter/search row that survives a scrolling list. */
.ds-searchbar{position:sticky;top:calc(54px + env(safe-area-inset-top));z-index:20;display:flex;gap:8px;padding:8px 0;background:var(--canvas, var(--paper-2))}
.ds-searchbar>.ds-input{flex:1 1 auto;min-width:0}
.ds-searchbar>.ds-select{flex:0 0 auto;max-width:44%}

/* Section heading inside the app body (replaces ds-table-header on phone). */
.ds-app-section{display:flex;flex-direction:column;gap:8px}
.ds-app-section-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px}
.ds-app-section-title{font-family:var(--font-ui);font-weight:700;font-size:calc(13.5px * var(--fs-scale, 1));letter-spacing:0.01em;color:var(--ink);margin:0}
.ds-app-section-count{font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale, 1));color:var(--ink-mute)}

/* Sticky primary action bar for long phone forms (submit stays reachable). */
.ds-app-actionbar{position:sticky;bottom:calc(60px + env(safe-area-inset-bottom));display:flex;gap:8px;padding:10px 0;background:var(--canvas, var(--paper-2))}
.ds-app-actionbar>.ds-button{flex:1 1 0;min-height:44px}

/* Full-bleed brand lockup for the sign-in screen. */
.ds-app-signin{display:flex;flex-direction:column;align-items:center;gap:6px;padding:24px 0 6px}
.ds-app-signin-mark{display:block;width:120px;height:44px;background-image:var(--ds-logo-asset);background-repeat:no-repeat;background-position:center;background-size:contain}
.ds-app-signin-title{font-family:var(--font-display);font-style:italic;font-weight:700;font-size:calc(21px * var(--fs-scale, 1));color:var(--ink);margin:0}
.ds-app-signin-sub{font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale, 1));color:var(--ink-soft);text-align:center;margin:0}

/* Phone-width overrides for atoms that were authored desk-first. */
@media (max-width: 560px){
  .ds-app-body>.ds-fieldset,.ds-app-body .ds-fieldset{padding:16px 14px;gap:14px}
  .ds-app-body .ds-field-row-2,.ds-app-body .ds-field-row-3{grid-template-columns:1fr}
  .ds-app-body .ds-actions{flex-wrap:wrap}
  .ds-app-body .ds-actions>.ds-button{flex:1 1 46%;min-height:44px}
  .ds-app-body .ds-input,.ds-app-body .ds-select,.ds-app-body .ds-textarea{min-height:44px;font-size:16px}
}
@media (min-width: 721px){
  .ds-tabbar{max-width:760px;left:50%;transform:translateX(-50%);border-left:1px solid var(--hairline);border-right:1px solid var(--hairline)}
}

/* ===== Remote canvas frame — in-flow host for an embedded remote module =====
   The <iframe> a shell route uses to mount a remote app inside the content column
   (/app, /app/project-planning, /app/learning, /app/procurement). It is an ordinary
   in-flow block that fills the column it sits in.
   It must never be position:fixed / inset:0 / pointer-events:none: a fixed overlay
   treatment lifts the frame above the shell navigation and, with height:auto in the
   flex body, collapses it to the browser default 150px iframe height, which is what
   broke all four of those pages between 2026-07-25 and 2026-07-27.
   A remote that needs a click-through overlay to host draggable .ds-window popups
   uses .ds-window-canvas below, not this class. */
.remote-canvas-frame{display:block;width:100%;min-height:calc(100vh - 56px);border:0;background:var(--paper-2)}

/* Click-through full-viewport layer a remote uses to host draggable .ds-window
   popups over its own content. Transparent; only the windows themselves take the
   pointer. This is what the fixed/overlay treatment above was actually meant for. */
.ds-window-canvas{position:fixed;inset:0;z-index:80;pointer-events:none}
.ds-window-canvas>*{pointer-events:auto}


/* ===== Line-level report ledger (2026-07-26, Sale Report) =====
   `.ds-records-ledger` (opt-in modifier, combine with `.ds-records-compact`)
   is the density a workbook-shaped report needs on screen: an invoice-line
   report carries 17 narrow columns, and at `.ds-records-compact` scale every
   date and document number wrapped onto a second line, tripling row height
   and pushing the money columns out of sight. Cells hold one line, padding
   drops to ledger scale, and the table keeps its natural width so the
   surrounding `.ds-table-scroll` scrolls it horizontally instead of crushing
   the columns. `.ds-records-clip` caps a free-text cell (customer, item
   description) and ellipsises the overflow so one long name cannot set the
   width of the whole table. */
.ds-records-ledger{width:max-content;min-width:100%;font-size:calc(12.5px * var(--fs-scale, 1))}
.ds-records-ledger td{padding:5px 10px;white-space:nowrap}
.ds-records-ledger thead th{padding:6px 10px;white-space:nowrap}
.ds-records-ledger tfoot td{padding:7px 10px;border-top:1px solid var(--ink);font-weight:600}
.ds-records-ledger .ds-records-clip{max-width:240px;overflow:hidden;text-overflow:ellipsis}

/* Tight case-view variants (Ben 2026-07-27: a transaction fits one screen).
   Semantic DS objects — app code points at these, never restyles locally. */
.ds-form-tight{display:flex;flex-direction:column;gap:12px;margin-top:10px}
.ds-fieldset-tight{background:var(--paper);border:1px solid var(--hairline);border-radius:4px;padding:10px 14px;display:flex;flex-direction:column;gap:8px;margin:0}
.ds-review-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:0 18px}
.ds-review-strip .ds-review-field{padding:3px 0;gap:2px;border-bottom:0}
.ds-review-strip .ds-review-value{font-size:calc(13px * var(--fs-scale, 1))}

/* Review-strip prose stays left-aligned; only numeric values right-align via
   ds-mono-num (UX audit 2026-07-27). */
.ds-review-strip .ds-review-value{text-align:left}
.ds-datagrid td.ds-mono-num,.ds-review-strip .ds-review-value.ds-mono-num{text-align:right;font-variant-numeric:tabular-nums}


/* =====================================================   OMS ground-up components (UX spec 2026-07-27): line-item cards,
   the two-tier line table, context/dealer strips, summary footer,
   segmented decisions, toned badges, order tracker, negative button.
   Semantic only — app code points at these, never composes atoms.
   ============================================================ */

/* LineItemCard — one transaction line as a stacked card. */
.ds-line-card{background:var(--paper-sheet,#FAF8F2);border:1.5px solid var(--hairline-dark,#B8AF98);border-radius:3px;padding:16px 20px;margin-bottom:16px;display:flex;flex-direction:column;gap:12px;box-shadow:0 2px 8px rgba(17,17,16,0.06)}
.ds-line-card-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;border-bottom:1px solid var(--hairline,#D8D1BE);padding-bottom:8px}
.ds-line-card-title{font-family:var(--font-display,"Fraunces",serif);font-weight:700;font-size:16px;color:var(--ink)}
.ds-line-card-math{font-family:var(--font-mono);font-size:11.5px;font-weight:600;color:var(--ink-mute);white-space:nowrap}
.ds-line-card-note{font-size:12px;color:var(--ink-soft);border-left:2px solid var(--royal-blue,#123B75);padding-left:10px;background:var(--paper-card,#F4EFE3);padding:6px 10px;border-radius:0 2px 2px 0}
.ds-line-card-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px}
.ds-line-card-actionrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ds-line-card-remove{margin-left:auto}

/* DecisionControl — segmented, mutually exclusive choice per line. */
.ds-seg{display:inline-flex;border:1px solid var(--ink);border-radius:2px;overflow:hidden}
.ds-seg button{background:var(--paper);border:0;border-left:1px solid var(--hairline);padding:6px 12px;font-family:var(--font-mono);font-size:11.5px;letter-spacing:.03em;text-transform:uppercase;color:var(--ink);cursor:pointer}
.ds-seg button:first-child{border-left:0}
.ds-seg button.ds-seg--on{background:var(--ink);color:var(--paper)}
.ds-seg button:disabled{color:var(--ink-faint);cursor:default}

/* PriceBadge tones — ds-pill stays the base; tone is the only variable. */
.ds-pill--good{border-color:var(--signal-grass);color:var(--signal-grass)}
.ds-pill--warn{border-color:var(--signal-amber);color:var(--signal-amber)}
.ds-pill--bad{border-color:var(--baobab);color:var(--baobab)}

/* Context strip: transaction facts (existing ds-review-strip family) stays.
   Dealer rail: the muted commercial-profile row beneath it. */
.ds-dealer-rail{display:flex;flex-wrap:wrap;gap:4px 18px;font-size:12px;color:var(--ink-mute);padding:6px 0 2px;border-bottom:1px solid var(--hairline)}
.ds-dealer-rail b{font-weight:600;color:var(--ink-soft)}

/* Summary footer — line-total math, once per screen, sticky in its scroll box. */
.ds-summary-footer{position:sticky;bottom:0;background:var(--paper);border-top:1px solid var(--ink);display:flex;flex-wrap:wrap;gap:4px 22px;justify-content:flex-end;padding:8px 2px;font-family:var(--font-mono);font-size:13px}
.ds-summary-footer .ds-summary-item{display:flex;gap:8px;align-items:baseline}
.ds-summary-footer .ds-summary-label{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute)}
.ds-summary-footer .ds-summary-total{font-weight:700}

/* LineTable — max-6-primary-column grid with a muted reference sub-row. */
.ds-line-table .ds-datagrid-row td{vertical-align:top}
.ds-line-table .ds-line-table-ref td{border-top:0;padding-top:0;font-size:11.5px;color:var(--ink-mute)}
.ds-line-table .ds-line-table-ref .ds-ref-item{display:inline-flex;gap:5px;margin-right:16px}
.ds-line-table .ds-line-table-ref .ds-ref-label{letter-spacing:.05em;text-transform:uppercase;font-size:10px}

/* MarginSummaryStrip — compact worst-line/overall margin readout above an
   approval card's line grid (MMDB-1872). Collapses when the caller renders
   nothing (no worst line, no overall figure). */
.ds-margin-strip{display:flex;flex-wrap:wrap;gap:6px 22px;align-items:center;padding:6px 2px 10px;border-bottom:1px solid var(--hairline)}
.ds-margin-strip-item{display:inline-flex;gap:8px;align-items:baseline}
.ds-margin-strip-label{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute)}

/* Order tracker — one-line dealer-facing progress stepper. */
.ds-order-track{display:flex;align-items:center;gap:0;flex-wrap:wrap;padding:4px 0 8px}
.ds-order-track .ds-track-node{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-faint)}
.ds-order-track .ds-track-node::before{content:"";width:9px;height:9px;border-radius:50%;border:1.5px solid var(--ink-faint);background:var(--paper)}
.ds-order-track .ds-track-node--past{color:var(--ink-mute)}
.ds-order-track .ds-track-node--past::before{background:var(--ink-mute);border-color:var(--ink-mute)}
.ds-order-track .ds-track-node--current{color:var(--ink);font-weight:700}
.ds-order-track .ds-track-node--current::before{background:var(--ink);border-color:var(--ink)}
.ds-order-track .ds-track-node--branch{color:var(--signal-amber)}
.ds-order-track .ds-track-node--branch::before{background:var(--signal-amber);border-color:var(--signal-amber)}
.ds-order-track .ds-track-sep{flex:1 1 18px;min-width:18px;height:1px;background:var(--hairline);margin:0 8px}
.ds-order-track{width:100%}

/* Third button token: ends/reverses the transaction. */
.ds-button-negative{background:var(--paper);border:1px solid var(--baobab);color:var(--baobab)}
.ds-button-negative:hover{background:var(--baobab);color:var(--paper)}

/* Narrow viewports: the line table yields to cards; the summary footer
   un-sticks so it never fights the keyboard. */
@media (max-width: 480px){
  .ds-line-table table, .ds-line-table thead, .ds-line-table tbody, .ds-line-table tr, .ds-line-table td, .ds-line-table th{display:block}
  .ds-line-table thead{display:none}
  .ds-line-table .ds-datagrid-row{border-top:1px solid var(--hairline);padding:8px 0}
  .ds-summary-footer{position:static}
}

/* Sortable/filterable work queues (Ben, 2026-07-27): every list header can
   sort, the queue can be text-filtered, and long lists scroll inside their
   own viewport with the header row pinned. */
.ds-th-sort{background:none;border:0;padding:0;font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;cursor:pointer;display:inline-flex;gap:4px;align-items:baseline}
.ds-th-sort:hover{text-decoration:underline}
.ds-th-sort .ds-sort-dir{font-size:9px;color:var(--ink-mute)}
.ds-table-viewport{max-height:62vh;overflow:auto}
.ds-table-viewport thead th{position:sticky;top:0;background:var(--paper);z-index:2}
.ds-filter-input{max-width:220px}

/* Process navigation — where this case sits in the flow (Ben, 2026-07-27).
   Reuses the order-track dot grammar for the full step sequence. */
.ds-process-nav{display:flex;align-items:center;flex-wrap:wrap;gap:2px 0;padding:2px 0 10px;border-bottom:1px solid var(--hairline);margin-bottom:10px;width:100%}

/* Merged report filter row (reporting redesign, 2026-07-27): ALL of a
   report's filters (country · period · currency) in ONE dense wrapping row,
   groups separated by hairline dividers, instead of three stacked
   ds-filterbar rows each paying its own margin + border-bottom. */
.ds-filterbar-merged{align-items:center;margin:4px 0 12px;padding-bottom:10px;row-gap:6px}
.ds-filterbar-sep{width:1px;height:18px;background:var(--hairline);margin:0 6px;align-self:center}

/* ===== Reporting BA/UX round-1 fixes (2026-07-28) ===== */

/* I1: `.ds-filter-chip:hover`/`.ds-filter-chip-active` are defined 5+ times
   across this merged file at different points; the LAST `:hover` copy in
   source order only reset color (not background), and the last background-
   setting copy sits earlier — net computed hover state on ANY filter chip
   in the app was ink-colored text on an ink-colored background (invisible),
   exactly the "solid black rectangle, no visible label" the costing-summary
   period chips were caught rendering (round-1 UX 10-U1/BA 10-B1: the chip
   itself was never even marked active, the black block was a frozen hover
   state). Reassert a correct, unconditional last-word hover as paper-2 fill
   with ink text/border (round-8b fix, 2026-07-30): this used to reassert the
   IDENTICAL ink-fill styling as `.ds-filter-chip-active`, which fixed the
   invisibility but created a new defect — deselecting a unit chip in
   UnitModeBar (or any other `.module-workbench .ds-filterbar` chip) left the
   cursor resting on the same button, so `:hover` kept rendering the
   dark/pressed look even though the React active class + aria-pressed had
   correctly flipped to false. Hover must stay clearly legible (no
   black-on-black regression) but must never render identically to the
   pressed/active state, or a deselect reads as if it didn't take. */
.module-workbench .ds-filterbar .ds-filter-chip:hover{color:var(--ink);background:var(--paper-2);border-color:var(--ink-mute)}
.module-workbench .ds-filterbar .ds-filter-chip-active:hover{color:var(--paper);background:var(--ink);border-color:var(--ink)}

/* C3 follow-up: `.ds-table-scroll{overflow-x:auto}` genuinely scrolls, but
   macOS/Gecko auto-hide the scrollbar until the pointer is over the track —
   a wide report table just reads as silently clipped (round-1 BA/UX
   01-U1/02-U1/03-U1/05-U1: "numbers overlap", "column clipped, only a
   stray digit visible"). Force a persistent, visible thin scrollbar so the
   cut-off edge is a legible invitation to scroll, not a dead end. */
.ds-table-scroll{scrollbar-width:thin;scrollbar-color:var(--ink-mute) transparent}
.ds-table-scroll::-webkit-scrollbar{height:8px}
.ds-table-scroll::-webkit-scrollbar-track{background:transparent}
.ds-table-scroll::-webkit-scrollbar-thumb{background:var(--ink-mute);border-radius:4px}
/* Belt-and-suspenders: OS/engine scrollbar rendering is not reliable enough
   on its own (verified headless — a thin native scrollbar did not paint at
   all in a Camoufox render even with the rules above) to be the ONLY
   discoverability signal that a table has more columns off-screen. The
   classic pure-CSS "scroll shadow" — two edge gradients that scroll WITH
   the content (`background-attachment:local`) layered under two that stay
   fixed to the viewport (`background-attachment:scroll`) — shows a soft
   dark edge only on whichever side still has unscrolled content, and
   disappears once that edge is fully scrolled into view. No JS, works in
   every engine, never lies about scroll state. */
.ds-table-scroll{
  background-color:var(--paper);
  background-image:
    linear-gradient(to right, var(--paper) 30%, rgba(0,0,0,0)),
    linear-gradient(to left, var(--paper) 30%, rgba(0,0,0,0)),
    linear-gradient(to right, rgba(14,14,12,.14), rgba(0,0,0,0)),
    linear-gradient(to left, rgba(14,14,12,.14), rgba(0,0,0,0));
  background-repeat:no-repeat;
  background-position:left center, right center, left center, right center;
  background-size:28px 100%, 28px 100%, 10px 100%, 10px 100%;
  background-attachment:local, local, scroll, scroll;
}

/* A `table-layout:fixed` column can only ever be as wide as its colgroup
   percentage of the CURRENT container — on a narrow container that crushes
   9-13 digit financial figures into their neighbor (round-1 01-U1/02-U1:
   "53,856,088.62157,838,095.5..." one illegible run-on string). Give the
   fixed reporting tables a real minimum pixel width so every numeric column
   keeps enough room for a full figure; `.ds-table-scroll` then supplies the
   horizontal scroll (with the now-visible scrollbar above) once the
   viewport is narrower than that minimum, instead of the columns silently
   shrinking below readable width. */
.ds-records-compact-fixed{min-width:1100px}
/* The 17-column Sale-Report / ledger-style tables need much more room —
   scoped to the modifier that already caps free-text cells (see
   .ds-records-ledger .ds-records-clip below) so this never affects the
   6-column Trial Balance table above. */
.ds-records-ledger{min-width:1700px}

/* I4 follow-up: `.ds-records-clip` was scoped to only work inside
   `.ds-records-ledger` (the Sale Report table). Round-1 03-U4/05-U4/08-U2
   flag the identical long-name row-height raggedness on AR/AP Aging and
   Sales Summary, which use plain `.ds-records-compact` — generalize the
   clip utility so any report table's name cell can opt in, one line +
   ellipsis + a `title` attribute carrying the full text. */
.ds-records-clip{display:block;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 13-U1/01-U4: a plain (non -merged) `.ds-filterbar` reused as a one-line
   read-only stat strip (e.g. "Opening / Closing / N lines" above a table)
   inherited the real filter row's bottom margin + padding + hairline
   (meant to separate filters from data) — on a stat strip that reads as an
   unexplained blank spacer row before the table heading. Modifier resets
   the reserved space to a single tight rule-less gap. */
.ds-filterbar-stats{margin:4px 0 8px;padding-bottom:0;border-bottom:0}

/* 11-U2/12-U1: the "Close the panel or pick a report above…" prompt
   (ReportingLayout) previously reused `.ds-empty-row`, which — depending on
   what data row happened to sit directly above it (a bordered `ds-link-row`
   list vs. a plain `<table>`) — visually boxed itself into looking like one
   more list item on the Views panel but rendered as bare unboxed text on
   the Access panel: the SAME element, two different apparent treatments.
   One dedicated, context-independent style: small muted mono caption, never
   a box, applied identically regardless of what precedes it. */
/* 12-U2: the previous unboxed rendering sat ~15px above the viewport's own
   bottom edge with nothing below it — genuine bottom padding on the prompt
   itself so the panel never reads as clipped. */
.ds-panel-close-hint{margin-top:10px;padding:10px 2px 28px;font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.02em;color:var(--ink-mute);border:0;background:transparent}

/* 03-U3/05-U3/07-U1/02-U3/04-U1/06-U1/08-U1: several report filter rows put a
   labeled field (AS OF, slow-moving days, code, FC currency) into a
   `.ds-field` — which stacks its label ABOVE the control (`flex-direction:
   column`) — inside an otherwise single-row `.ds-filterbar-merged`. Each one
   reads as its own tiny two-line form glued onto the chip row instead of one
   merged row. `.ds-field-inline` keeps `.ds-field`'s label+control pairing
   but lays them out side by side on the SAME baseline the chips sit on. */
.ds-field-inline{flex-direction:row;align-items:center;gap:6px}
.ds-field-inline .ds-label{margin:0;white-space:nowrap}
/* MMDB-1984: related controls inside a wrapping `.ds-filterbar-merged` (the
   Max-rows + Rows/page pair) must wrap as ONE unit — without this, flex
   wrapping splits the pair across rows on any report whose extra filters
   crowd the line (item-codes' search box, cost-per-ton's period fields),
   leaving one select stranded alone on its own row. */
.ds-filterbar-group{display:flex;align-items:center;gap:8px;flex-wrap:nowrap}
/* Scroll buttons for report tables wider than the frame (Ben 2026-08-03).
   A `.ds-table-scrollnav` wraps a `.ds-table-scroll`; each edge carries a
   full-height rail whose button is position:sticky, so the control stays
   in view while the page scrolls down a tall table. Buttons only render
   when that direction actually has hidden columns (JS-managed). */
.ds-table-scrollnav{position:relative}
.ds-table-scrollnav-rail{position:absolute;top:0;bottom:0;width:28px;pointer-events:none;z-index:2}
.ds-table-scrollnav-rail[data-dir="left"]{left:0}
.ds-table-scrollnav-rail[data-dir="right"]{right:0}
.ds-table-scrollnav-btn{position:sticky;top:45vh;display:inline-flex;align-items:center;justify-content:center;width:28px;height:56px;padding:0;border:1px solid var(--ink);border-radius:0;background:var(--paper);color:var(--ink);font-family:var(--font-mono);font-size:calc(15px * var(--fs-scale, 1));font-weight:700;cursor:pointer;pointer-events:auto;box-shadow:0 4px 12px rgba(14,14,12,0.12);transition:background 120ms ease,color 120ms ease}
.ds-table-scrollnav-btn:hover{background:var(--ink);color:var(--paper)}
.ds-oms-shell{display:grid;grid-template-columns:minmax(0,1fr);min-height:100%;background:var(--paper-2);color:var(--ink-soft)}
.ds-oms-main{min-width:0;background:var(--paper-2)}
.ds-oms-header{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--ds-space-24);padding:var(--ds-space-24) var(--ds-space-30) var(--ds-space-16);background:var(--paper)}
.ds-oms-header-copy{min-width:0;max-width:var(--ds-oms-copy-max)}
.ds-oms-tabs{display:flex;min-width:0;overflow-x:auto;padding:0 var(--ds-space-30);border-bottom:var(--ds-rule) solid var(--hairline);background:var(--paper)}
.ds-oms-tab{display:inline-flex;align-items:center;min-height:var(--ds-control-tab);padding:0 var(--ds-space-14);border-bottom:var(--ds-rule-active) solid transparent;color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale, 1));font-weight:600;letter-spacing:.1em;text-decoration:none;text-transform:uppercase;white-space:nowrap;transition:border-color var(--ds-motion-fast) ease-out,color var(--ds-motion-fast) ease-out}
.ds-oms-tab:hover{color:var(--ink)}
.ds-oms-tab-active{border-bottom-color:var(--baobab);color:var(--baobab)}
.ds-oms-subtabs{display:flex;gap:var(--ds-space-10);min-width:0;overflow-x:auto;padding:var(--ds-space-6) var(--ds-space-30);border-bottom:var(--ds-rule) solid var(--hairline);background:var(--paper-2)}
.ds-oms-subtab{display:inline-flex;align-items:center;font-family:var(--font-ui);font-size:calc(11.5px * var(--fs-scale, 1));color:var(--ink-mute);text-decoration:none;white-space:nowrap}
.ds-oms-subtab-active{color:var(--ink);font-weight:600}
.ds-oms-canvas{min-width:0;padding:var(--ds-space-24) var(--ds-space-30) var(--ds-space-30)}
.ds-oms-screen{display:flex;flex-direction:column;min-width:0;gap:var(--ds-oms-screen-gap)}
.ds-process-thumb.ds-process-thumb-placeholder{height:var(--ds-oms-process-thumb-size)}
.ds-process-thumb-placeholder-frame{width:100%;height:100%;background:repeating-linear-gradient(var(--ds-oms-process-thumb-stripe-angle),var(--ds-oms-process-thumb-stripe-base) 0,var(--ds-oms-process-thumb-stripe-base) var(--ds-oms-process-thumb-stripe-base-stop),var(--ds-oms-process-thumb-stripe-line) var(--ds-oms-process-thumb-stripe-base-stop),var(--ds-oms-process-thumb-stripe-line) var(--ds-oms-process-thumb-stripe-line-stop))}
.ds-oms-workspace{display:flex;align-items:stretch;min-width:0}
.ds-oms-workspace>.ds-oms-card{flex:1}
.ds-oms-card{min-width:0;padding:var(--ds-space-16);border:var(--ds-rule) solid var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper)}
.ds-oms-table{width:100%;border-collapse:collapse;background:var(--paper);font-variant-numeric:tabular-nums}
.ds-oms-table th{padding:var(--ds-space-10) var(--ds-space-14);border-bottom:var(--ds-rule) solid var(--hairline);background:var(--paper-2);color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale, 1));letter-spacing:.1em;text-align:left;text-transform:uppercase}
.ds-oms-table td{padding:var(--ds-space-12) var(--ds-space-14);border-bottom:var(--ds-rule) solid var(--hairline);vertical-align:middle}
.ds-oms-table tbody tr{transition:background var(--ds-motion-fast) ease-out}
.ds-oms-table tbody tr:hover{background:var(--paper-2)}
.ds-oms-form-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--ds-space-14) var(--ds-space-16)}
.ds-oms-section-rail{width:var(--ds-oms-section-rail-width);flex:none;display:flex;flex-direction:column;gap:var(--ds-space-2);padding:var(--ds-space-8) 0;border-right:var(--ds-rule) solid var(--hairline);background:var(--paper-2)}
.ds-oms-section-link{display:flex;align-items:center;justify-content:space-between;gap:var(--ds-space-10);min-height:var(--ds-control-compact);padding:var(--ds-space-8) var(--ds-space-12);border-left:var(--ds-rule-active) solid transparent;color:var(--ink-mute);text-decoration:none;transition:background var(--ds-motion-fast) ease-out,border-color var(--ds-motion-fast) ease-out,color var(--ds-motion-fast) ease-out}
.ds-oms-section-link:hover{background:var(--paper);color:var(--ink)}
.ds-oms-section-link-active{border-left-color:var(--baobab);background:var(--paper);color:var(--ink)}
.ds-oms-gateway-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--ds-space-16);min-width:0;padding:var(--ds-space-10) var(--ds-space-14);border:var(--ds-rule) solid var(--hairline);background:var(--paper-2);font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale, 1));letter-spacing:.08em;text-transform:uppercase}
.ds-oms-state{display:grid;justify-items:start;gap:var(--ds-space-10);padding:var(--ds-space-24);border:var(--ds-rule) solid var(--hairline);border-left:var(--ds-rule-emphasis) solid var(--baobab);background:var(--paper)}
.ds-oms-state-actions{display:flex;flex-wrap:wrap;gap:var(--ds-space-10);margin-top:var(--ds-space-4)}
.ds-oms-confirmation{padding:var(--ds-space-16);border:var(--ds-rule) solid var(--hairline);border-left:var(--ds-rule-emphasis) solid var(--baobab);background:var(--baobab-bg)}
.ds-oms-tab:focus-visible,.ds-oms-section-link:focus-visible{outline:var(--ds-rule-active) solid var(--baobab);outline-offset:var(--ds-focus-offset)}
.ds-oms-shell :is(.ds-input,.ds-select,.ds-textarea,.ds-button):focus-visible{outline:var(--ds-rule-active) solid var(--baobab);outline-offset:var(--ds-focus-offset)}
@media(max-width:760px){
  .ds-oms-header{align-items:flex-start;flex-direction:column;padding:var(--ds-space-18) var(--ds-space-16) var(--ds-space-12)}
  .ds-oms-tabs{padding:0 var(--ds-space-8)}
  .ds-oms-subtabs{padding:var(--ds-space-6) var(--ds-space-8)}
  .ds-oms-canvas{padding:var(--ds-space-18) var(--ds-space-16) var(--ds-space-24)}
  .ds-oms-workspace{flex-direction:column}
  .ds-oms-form-grid{grid-template-columns:minmax(0,1fr)}
  .ds-oms-section-rail{width:auto;overflow-x:auto;flex-direction:row;border-right:0;border-bottom:var(--ds-rule) solid var(--hairline)}
  .ds-oms-section-link{flex:none;border-left:0;border-bottom:var(--ds-rule-active) solid transparent}
  .ds-oms-section-link-active{border-bottom-color:var(--baobab)}
}
@media(prefers-reduced-motion:reduce){
  .ds-oms-tab,.ds-oms-table tbody tr,.ds-oms-section-link{transition-duration:var(--ds-motion-none)}
}

/* Search picker — the field for choosing ONE record out of thousands
   (Senegal carries 2,326 business partners and 990 finished goods). A native
   select cannot be searched, so the control is a text input that queries the
   source and offers the matches it got back, with the count it did not show.
   Chosen state reads as a settled value, not as a search box. */
.ds-picker{position:relative;display:flex;flex-direction:column;gap:3px}
.ds-picker .ds-picker-input{width:100%}
.ds-picker .ds-picker-chosen{display:flex;align-items:baseline;gap:8px;justify-content:space-between;border:1px solid var(--hairline);padding:5px 7px;background:var(--paper)}
.ds-picker .ds-picker-chosen-name{font-weight:600}
.ds-picker .ds-picker-chosen-meta{font-family:var(--font-mono);font-size:11px;color:var(--ink-mute)}
.ds-picker .ds-picker-change{background:none;border:0;padding:0;font:inherit;font-size:11px;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-mute);cursor:pointer;text-decoration:underline}
.ds-picker .ds-picker-list{position:absolute;top:100%;left:0;right:0;z-index:30;max-height:240px;overflow:auto;background:var(--paper);border:1px solid var(--ink);box-shadow:0 6px 18px rgba(0,0,0,.12)}
.ds-picker .ds-picker-option{display:flex;flex-direction:column;gap:1px;width:100%;text-align:left;background:none;border:0;border-bottom:1px solid var(--hairline);padding:6px 8px;font:inherit;cursor:pointer}
.ds-picker .ds-picker-option:hover,.ds-picker .ds-picker-option:focus-visible{background:var(--wash)}
.ds-picker .ds-picker-option-name{font-size:12.5px}
.ds-picker .ds-picker-option-meta{font-family:var(--font-mono);font-size:10.5px;color:var(--ink-mute)}
.ds-picker .ds-picker-note{font-size:11px;color:var(--ink-mute)}
.ds-picker .ds-picker-error{font-size:11px;color:var(--baobab);display:flex;gap:8px;align-items:baseline}
.ds-picker .ds-picker-retry{background:none;border:0;padding:0;font:inherit;font-size:11px;color:var(--baobab);text-decoration:underline;cursor:pointer}

/* Case facts on a dark dialog titlebar. The plain pill is paper-on-paper
   there and rendered as three blank boxes (design review, 2026-07-27). */
.ds-modal-dialog-titlebar .ds-fact{font-family:var(--font-mono);font-size:10px;letter-spacing:.04em;color:var(--paper);border:1px solid color-mix(in srgb,var(--paper) 35%,transparent);border-radius:8px;padding:1px 7px;background:transparent;white-space:nowrap}

/* Terms & conditions on a quote — the binding text a dealer accepts with the
   offer. Take it or leave it; no negotiation affordance (2026-07-28). */
.ds-terms{border:1px solid var(--hairline);background:var(--wash);padding:8px 10px;margin:10px 0}
.ds-terms .ds-terms-title{font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute);margin-bottom:4px}
.ds-terms .ds-terms-text{font-size:11.5px;white-space:pre-wrap;max-height:180px;overflow:auto}
.ds-terms .ds-terms-bind{font-size:10.5px;font-weight:700;margin-top:6px}

/* Quantity in kilograms — figures read from the right, no browser spinner
   chrome (Ben, 2026-07-29: tonnes confused users; arrows useless). */
.ds-qty-kg{text-align:right;font-variant-numeric:tabular-nums}
.ds-qty-kg::-webkit-outer-spin-button,.ds-qty-kg::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}
.ds-qty-kg{-moz-appearance:textfield;appearance:textfield}

/* The dialog's process rail breathes on its own row — it was crushed against
   the dark titlebar (Ben, 2026-07-29). */
.ds-modal--dialog .ds-process-nav{margin:6px 0 12px;padding:6px 0 12px}

/* Row-level enable/disable switch — a curated allow-list toggle inside a
   datagrid row (Sellable catalog, MMDB-1870: mark a SAP item sellable, or
   retire it). Reads as a settled ON/OFF state, not a button waiting on a
   verdict, so a dense table of hundreds of items scans at a glance. */
.ds-row-switch{display:inline-flex;align-items:center;gap:6px;background:none;border:1px solid var(--hairline);border-radius:11px;padding:2px 10px 2px 4px;font-family:var(--font-mono);font-size:10px;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-mute);cursor:pointer;white-space:nowrap}
.ds-row-switch:hover{border-color:var(--ink)}
.ds-row-switch:disabled{cursor:default;opacity:.55}
.ds-row-switch-dot{width:7px;height:7px;border-radius:50%;background:var(--ink-faint);flex:none}
.ds-row-switch--on{border-color:var(--signal-grass);color:var(--signal-grass)}
.ds-row-switch--on .ds-row-switch-dot{background:var(--signal-grass)}
.ds-row-switch--off{color:var(--ink-mute)}

/* Required field awaiting a value: amber attention border (MMDB-1860 item 10). */
.ds-input--attention,
select.ds-select.ds-input--attention,
input.ds-input.ds-input--attention{border-color:var(--signal-amber);background:var(--signal-amber-bg)}

/* ── OMS revamp (2026-07-30 handoff) ─────────────────────────────────────── */

.ds-oms-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:var(--ds-space-12)}
.ds-oms-stat-tile{display:flex;flex-direction:column;gap:var(--ds-space-4);padding:var(--ds-space-12) var(--ds-space-14);background:var(--paper);border:1px solid var(--hairline);border-radius:6px}
.ds-oms-stat-tile-alert{border-left:var(--ds-rule-active) solid var(--baobab)}
.ds-oms-stat-value{font-family:var(--font-display);font-size:22px;line-height:1;color:var(--ink)}
.ds-oms-stat-tile-alert .ds-oms-stat-value{color:var(--baobab)}
.ds-oms-stat-label{font-family:var(--font-mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-mute)}

.ds-oms-phase-rail{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;border:1px solid var(--hairline);border-radius:7px;overflow:hidden;background:var(--paper)}
.ds-oms-phase-cell{display:flex;flex-direction:column;gap:var(--ds-space-2);padding:var(--ds-space-10) var(--ds-space-12);border-right:1px solid var(--hairline);font-family:var(--font-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute)}
.ds-oms-phase-cell:last-child{border-right:0}
.ds-oms-phase-cell-current{background:var(--ink);color:var(--paper)}

.ds-oms-node-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--ds-space-12)}
.ds-oms-node-card{display:flex;flex-direction:column;gap:var(--ds-space-8);padding:var(--ds-space-12);background:var(--paper);border:1px solid var(--hairline);border-radius:8px}
.ds-oms-actor-chip-human{align-self:flex-start;padding:var(--ds-space-2) var(--ds-space-6);border-radius:4px;background:var(--signal-amber-bg);color:var(--signal-amber);font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase}
.ds-oms-actor-chip-system{align-self:flex-start;padding:var(--ds-space-2) var(--ds-space-6);border-radius:4px;background:var(--signal-grass-bg);color:var(--signal-grass);font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase}

.ds-oms-toolbar{display:flex;align-items:center;gap:var(--ds-space-8);flex-wrap:nowrap}
.ds-oms-segment{padding:var(--ds-space-6) var(--ds-space-10);border:1px solid var(--hairline);border-radius:16px;background:transparent;color:var(--ink-mute);font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;cursor:pointer}
.ds-oms-segment-active{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.ds-oms-segment-alert{color:var(--baobab)}
.ds-oms-search{flex:1 1 auto;min-width:0}
.ds-oms-select{flex:0 0 auto}

.ds-oms-cell-primary{font-size:13px;font-weight:500;color:var(--ink)}
.ds-oms-cell-meta{font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute)}
.ds-oms-cell-numeric{font-family:var(--font-mono);font-size:12px;text-align:right}

.ds-oms-sla-bar{height:3px;border-radius:4px;background:var(--paper-3);overflow:hidden}
.ds-oms-sla-bar-fill{height:100%}
.ds-oms-sla-ok{color:var(--signal-grass)}
.ds-oms-sla-ok .ds-oms-sla-bar-fill{background:var(--signal-grass)}
.ds-oms-sla-warn{color:var(--signal-amber)}
.ds-oms-sla-warn .ds-oms-sla-bar-fill{background:var(--signal-amber)}
.ds-oms-sla-breach{color:var(--baobab)}
.ds-oms-sla-breach .ds-oms-sla-bar-fill{background:var(--baobab)}

.ds-oms-stage-chip{display:inline-block;padding:var(--ds-space-2) var(--ds-space-6);border:1px solid var(--hairline);border-radius:4px;font-family:var(--font-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-soft)}
.ds-oms-next-verb{font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--baobab)}
.ds-oms-owner-unassigned{color:var(--baobab)}

.ds-oms-stepper{display:flex;align-items:center;gap:var(--ds-space-8)}
.ds-oms-step{display:flex;align-items:center;gap:var(--ds-space-6);font-family:var(--font-mono);font-size:10px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-faint)}
.ds-oms-step+.ds-oms-step::before{content:"";display:inline-block;width:var(--ds-space-16);height:0;border-top:var(--ds-rule) solid var(--hairline)}
.ds-oms-step-done{color:var(--ink)}
.ds-oms-step-current{color:var(--baobab)}

.ds-oms-context-panel{display:flex;flex-direction:column;gap:var(--ds-space-14);width:320px;flex:0 0 320px;padding:var(--ds-space-14);background:var(--paper-2);border:1px solid var(--hairline);border-radius:8px}
.ds-oms-context-block{display:flex;flex-direction:column;gap:var(--ds-space-4)}
.ds-oms-quote-block{padding-left:var(--ds-space-10);border-left:var(--ds-rule-active) solid var(--hairline);color:var(--ink-soft);font-size:12px;line-height:1.5}
.ds-oms-meter{height:5px;border-radius:4px;background:var(--paper-3);overflow:hidden}
.ds-oms-meter-fill{height:100%;background:var(--signal-amber)}

.ds-oms-footer-bar{position:sticky;bottom:0;display:flex;align-items:center;justify-content:space-between;gap:var(--ds-space-16);padding:var(--ds-space-12) var(--ds-space-16);background:var(--paper-2);border-top:1px solid var(--hairline)}
.ds-oms-footer-metric{display:flex;flex-direction:column;gap:var(--ds-space-2);font-family:var(--font-display);font-size:17px;color:var(--ink)}
.ds-oms-footer-metric-warn{color:var(--signal-amber)}

.ds-oms-pill{padding:var(--ds-space-4) var(--ds-space-10);border:1px solid var(--hairline);border-radius:16px;font-family:var(--font-mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);cursor:pointer}
.ds-oms-pill-active{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.ds-oms-totals-card{display:flex;flex-direction:column;gap:var(--ds-space-6);padding:var(--ds-space-12);background:var(--paper);border:1px solid var(--hairline);border-radius:7px}
.ds-oms-row-urgent{background:var(--baobab-bg)}
.ds-oms-badge-act-now{display:inline-block;padding:var(--ds-space-2) var(--ds-space-6);border-radius:4px;background:var(--baobab);color:var(--baobab-on);font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase}

.ds-oms-toggle{padding:var(--ds-space-6) var(--ds-space-12);border:1px solid var(--hairline);border-radius:5px;background:transparent;color:var(--ink-soft);cursor:pointer}
.ds-oms-toggle-selected{background:var(--ink);border-color:var(--ink);color:var(--paper)}
/* A disabled toggle (e.g. credit's tab row before a dealer is picked) must still say which tab
   is current — dim + not-allowed on top of the existing selected/unselected background, never a
   flat collapse to one washed-out grey (that collapse, on .ds-button-primary/secondary:disabled,
   was the actual defect this role replaced: an active AND an inactive disabled tab looked
   identical). */
.ds-oms-toggle:disabled{cursor:not-allowed;opacity:.5}

.ds-oms-state-loading{display:flex;flex-direction:column;gap:var(--ds-space-8);padding:var(--ds-space-24);color:var(--ink-mute)}
.ds-oms-state-denied{display:flex;flex-direction:column;gap:var(--ds-space-8);padding:var(--ds-space-24);color:var(--ink-soft)}
.ds-oms-state-too-narrow{display:none}
@media (max-width:1180px){
  .ds-oms-state-too-narrow{display:flex;flex-direction:column;gap:var(--ds-space-8);padding:var(--ds-space-24);color:var(--ink-soft)}
}

/* meter fill buckets — attribute-driven width, no inline styles */
.ds-oms-meter-fill[data-fill="0"]{width:0%}
.ds-oms-meter-fill[data-fill="5"]{width:5%}
.ds-oms-meter-fill[data-fill="10"]{width:10%}
.ds-oms-meter-fill[data-fill="15"]{width:15%}
.ds-oms-meter-fill[data-fill="20"]{width:20%}
.ds-oms-meter-fill[data-fill="25"]{width:25%}
.ds-oms-meter-fill[data-fill="30"]{width:30%}
.ds-oms-meter-fill[data-fill="35"]{width:35%}
.ds-oms-meter-fill[data-fill="40"]{width:40%}
.ds-oms-meter-fill[data-fill="45"]{width:45%}
.ds-oms-meter-fill[data-fill="50"]{width:50%}
.ds-oms-meter-fill[data-fill="55"]{width:55%}
.ds-oms-meter-fill[data-fill="60"]{width:60%}
.ds-oms-meter-fill[data-fill="65"]{width:65%}
.ds-oms-meter-fill[data-fill="70"]{width:70%}
.ds-oms-meter-fill[data-fill="75"]{width:75%}
.ds-oms-meter-fill[data-fill="80"]{width:80%}
.ds-oms-meter-fill[data-fill="85"]{width:85%}
.ds-oms-meter-fill[data-fill="90"]{width:90%}
.ds-oms-meter-fill[data-fill="95"]{width:95%}
.ds-oms-meter-fill[data-fill="100"]{width:100%}

/* =====================================================================   Reporting redesign 2026-08-01 (Ben): content-width report tables, column
   headers that sort AND filter, honest disabled unit chips, and a reporting
   worksurface that keeps the portal sidebar visible. Central DS objects --
   app code points at these classes only.
   ============================================================================ */
/* Report tables size to their content instead of stretching numeric columns
   across the full track; a genuinely wide table still scrolls inside
   .ds-table-scroll. Applied WITH .ds-records-compact (cell styling stays). */
.ds-report-table{width:auto;max-width:none;min-width:0}
/* Denser cells than the generic records table -- a 6-column ledger fits the
   1280px track beside the sidebar without horizontal scroll. The thead
   selector needs thead-level specificity to beat the sticky variant's own
   th padding rule. */
/* Top-aligned: a tall structured cell (check lists) must not push the row's
   other values below the fold — middle-align made the unit column look
   empty on the month-close consolidated view. */
.ds-report-table td,.ds-report-table thead th{white-space:nowrap;padding:7px 8px;vertical-align:top}
/* The wrapping text column is CAPPED, not just floored: in an auto-layout
   table the browser otherwise grants it its full unwrapped width, and long
   account names alone pushed the Closing column off the 1280px track. */
.ds-report-table .ds-cell-wrap{white-space:normal;min-width:160px;max-width:240px}
/* MMDB-1991: long free-text cells (month-close checklist detail strings
   listing dozens of GL accounts) used to render nowrap, inflating the table
   to ~11,000px. Wider cap than ds-cell-wrap so a paragraph reads as a
   paragraph, not a 240px ribbon. */
.ds-report-table .ds-cell-wrap-wide{white-space:normal;min-width:280px;max-width:520px;overflow-wrap:anywhere}
/* Numeric ledger cells run one step smaller and without tracking so a
   6-column ledger fits the 1280px track beside the sidebar (measured 72px
   over at the default size). Tabular numerals keep columns aligned. */
.ds-report-table .ds-mono-num{font-size:calc(11px * var(--fs-scale,1));letter-spacing:0}
.ds-report-table td.ds-mono{font-size:calc(11px * var(--fs-scale,1));letter-spacing:0.02em}
/* Interactive column header: the label itself is the control -- click opens
   a popover holding sort direction + a column filter; indicators mark the
   active sort arrow and a filter dot so state is visible with it closed. */
th.ds-th-host{position:relative}
.ds-th-button{display:inline-flex;align-items:center;gap:5px;max-width:100%;padding:0;border:0;background:transparent;color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit;cursor:pointer}
.ds-th-button:hover{color:var(--ink)}
.ds-th-indicator{font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1));color:var(--baobab)}
.ds-th-popover{position:absolute;top:calc(100% + 2px);left:0;z-index:80;display:flex;flex-direction:column;gap:8px;min-width:216px;padding:10px;border:1px solid var(--ink);background:var(--paper);box-shadow:0 8px 24px color-mix(in srgb,var(--ink) 20%,transparent);color:var(--ink);font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale,1));font-weight:500;letter-spacing:0;text-transform:none;text-align:left;white-space:normal}
th.ds-mono-num .ds-th-popover{left:auto;right:0}
.ds-th-popover-row{display:flex;align-items:center;gap:6px}
.ds-th-popover-row .ds-input{min-width:0;width:100%}
.ds-th-popover-actions{display:flex;justify-content:flex-end;gap:6px;padding-top:2px;border-top:1px solid var(--hairline)}
/* Unit chip for a group unit with no data feed landed yet -- present and
   honest, never hidden, never clickable into a fabricated view. */
.ds-filter-chip:disabled{color:var(--ink-faint);background:transparent;border-color:var(--hairline);cursor:not-allowed}
/* Engine/feed provenance line, moved from the per-page toolbar into the
   report drawer (stated once, where the library lives, not on every page). */
.ds-reporting-drawer-note{margin:0;padding:8px 16px;border-bottom:1px solid var(--hairline);color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.02em;line-height:1.5}
/* Structured check-list cell (MMDB-1957): a list of {label,status,detail}
   checks renders as one compact line per check, never a serialized blob. */
.ds-cell-checks{display:flex;flex-direction:column;gap:3px;min-width:340px;max-width:640px;padding:2px 0;white-space:normal}
.ds-cell-check{display:flex;align-items:baseline;gap:7px;font-size:calc(12px * var(--fs-scale,1));line-height:1.35}
.ds-cell-check-status{flex:none;min-width:56px;color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.08em;text-transform:uppercase}
.ds-cell-check-status[data-status="warning"],.ds-cell-check-status[data-status="fail"]{color:var(--baobab);font-weight:700}
.ds-cell-check-detail{color:var(--ink-mute)}

/* =====================================================================   Reporting top-level nav (MMDB-1958/1960, 2026-08-01): toolbar anchor for
   dropdown panels, the 2-tier file-style Reports menu (L1 domains always
   visible, selected domain's reports in the adjacent L2 column), and the
   Saved Views panel. Central DS objects -- app code points at these only.
   ============================================================================ */
.ds-reporting-toolbar{position:relative}
.ds-toolbar-anchor{position:relative;display:inline-flex}
.ds-menu2{position:absolute;top:calc(100% + 5px);left:0;z-index:230;display:flex;align-items:stretch;min-width:540px;max-width:min(760px,92vw);border:1px solid var(--ink);background:var(--paper);box-shadow:0 10px 28px color-mix(in srgb,var(--ink) 22%,transparent)}
.ds-menu2-l1{display:flex;flex-direction:column;flex:0 0 auto;min-width:200px;padding:4px 0;border-right:1px solid var(--hairline);background:var(--paper)}
.ds-menu2-l1-item{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:7px 14px;border:0;border-left:3px solid transparent;background:transparent;color:var(--ink-soft);font-family:var(--font-ui);font-size:calc(13px * var(--fs-scale,1));font-weight:600;text-align:left;cursor:pointer}
.ds-menu2-l1-item:hover,.ds-menu2-l1-item-active{border-left-color:var(--baobab);background:var(--paper-2);color:var(--ink)}
.ds-menu2-l2{display:flex;flex-direction:column;flex:1 1 auto;min-width:280px;max-height:min(70vh,560px);padding:4px 0 0;overflow-y:auto}
.ds-menu2-l2-link{display:block;padding:6px 14px;border-left:2px solid transparent;color:var(--ink-soft);font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale,1));text-decoration:none}
.ds-menu2-l2-link:hover,.ds-menu2-l2-link-active{border-left-color:var(--baobab);background:var(--paper-2);color:var(--ink)}
.ds-menu2-l2-link-active{font-weight:700}
.ds-menu2 .ds-reporting-drawer-note{margin-top:auto;border-top:1px solid var(--hairline);border-bottom:0}
.ds-views-popover{position:absolute;top:calc(100% + 5px);left:0;z-index:230;width:min(460px,92vw);max-height:min(70vh,560px);overflow-y:auto;border:1px solid var(--ink);background:var(--paper);box-shadow:0 10px 28px color-mix(in srgb,var(--ink) 22%,transparent)}
@media (max-width:860px){
  .ds-menu2{flex-direction:column;min-width:min(320px,92vw)}
  .ds-menu2-l1{border-right:0;border-bottom:1px solid var(--hairline)}
}

/* New Procurement Workbench DS Classes */
.ds-confidence-tag {
  display: inline-flex;
  align-items: center;
  padding: 2px 6px;
  border-radius: var(--radius-xs, 4px);
  font-family: var(--font-mono, monospace);
  font-size: 11px;
  font-weight: 700;
  line-height: 1;
}
.ds-confidence-tag.high {
  background: color-mix(in srgb, var(--baobab, #00875a) 15%, transparent);
  color: var(--baobab, #00875a);
  border: 1px solid color-mix(in srgb, var(--baobab, #00875a) 40%, transparent);
}
.ds-confidence-tag.medium {
  background: color-mix(in srgb, #ffab00 18%, transparent);
  color: #b78103;
  border: 1px solid color-mix(in srgb, #ffab00 45%, transparent);
}
.ds-confidence-tag.low {
  background: color-mix(in srgb, #de350b 15%, transparent);
  color: #de350b;
  border: 1px solid color-mix(in srgb, #de350b 40%, transparent);
}

.ds-button-disabled {
  opacity: 0.45;
  cursor: not-allowed !important;
  pointer-events: auto !important;
}

.ds-button-reset {
  background: transparent;
  border: none;
  color: var(--ink-soft);
  cursor: pointer;
  padding: 0 4px;
  font-size: 14px;
  line-height: 1;
}
.ds-button-reset:hover {
  color: var(--baobab);
}

/* =====================================================================   Data-gap note (2026-08-02). A standing gap in the data behind a screen --
   a unit that has never loaded -- is worth stating once, quietly, above the
   surface it affects. It is NOT an alarm: an alarm that is permanently true
   is one users learn to ignore. Pairs with .ds-textlink for its escalation
   action, because a link that is styled exactly like the sentence around it
   is not discoverable as an action at all.
   ============================================================================ */
.ds-data-gap-note{margin:0 0 10px;padding:0 18px;color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale,1));letter-spacing:.02em;line-height:1.5}
/* Inline text link: the central DS had no such object, so app code had to
   emit a bare <a> that inherited body text and read as prose. */
.ds-textlink{color:var(--ink);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px;cursor:pointer}
.ds-textlink:hover{color:var(--baobab)}

/* ===== Procurement Workbench CDS Additions ===== */
.ds-workbench-grid {
  display: grid;
  grid-template-columns: 280px 1fr;
  gap: 16px;
  align-items: start;
}

.ds-workbench-sidebar {
  background: var(--paper);
  border: 1px solid var(--hairline);
  border-radius: 4px;
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.ds-case-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.ds-case-card {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 10px 12px;
  background: transparent;
  border: 1px solid var(--hairline);
  border-radius: 4px;
  text-align: left;
  cursor: pointer;
  transition: border-color 0.14s ease, background 0.14s ease;
}

.ds-case-card:hover, .ds-case-card.is-active {
  border-color: var(--ink);
  background: var(--paper-2);
}

.ds-case-card.is-active {
  border-left: 3px solid var(--baobab);
}

.ds-sticky-header-bar {
  position: sticky;
  top: 0;
  z-index: 90;
  background: var(--paper);
  border-bottom: 1px solid var(--hairline);
  padding: 12px 16px;
  margin-bottom: 14px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  box-shadow: 0 2px 8px color-mix(in srgb, var(--ink) 6%, transparent);
}

.ds-owner-tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--ink-mute);
}

.ds-owner-tag strong {
  color: var(--ink);
  padding: 2px 6px;
  background: var(--paper-2);
  border: 1px solid var(--hairline);
  border-radius: 3px;
}

.ds-download-group {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
}

.ds-stepper-9step {
  display: grid;
  grid-template-columns: repeat(9, 1fr);
  gap: 6px;
  margin-bottom: 16px;
  min-width: 960px;
  overflow-x: auto;
}

.ds-step-pill {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 8px 10px;
  background: var(--paper-2);
  border: 1px solid var(--hairline);
  border-radius: 4px;
  font-size: 11px;
  line-height: 1.2;
  transition: all 0.14s ease;
}

.ds-step-pill.is-complete {
  border-color: var(--ink-mute);
  background: var(--paper);
  opacity: 0.85;
}

.ds-step-pill.is-current {
  border-color: var(--baobab);
  border-width: 2px;
  background: var(--paper);
  box-shadow: 0 0 0 1px var(--baobab);
}

.ds-step-pill .step-num {
  font-family: var(--font-mono);
  font-weight: 700;
  font-size: 10px;
  color: var(--ink-mute);
}

.ds-step-pill .step-name {
  font-family: var(--font-ui);
  font-weight: 600;
  color: var(--ink);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ds-step-pill .step-role {
  font-family: var(--font-mono);
  font-size: 9px;
  letter-spacing: 0.02em;
  color: var(--ink-mute);
}

.ds-qty-input-group {
  display: flex;
  align-items: center;
  gap: 6px;
}

.ds-diff-pill {
  display: inline-flex;
  align-items: center;
  padding: 2px 6px;
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 700;
  background: color-mix(in srgb, #ffab00 15%, transparent);
  color: #b78103;
  border: 1px solid color-mix(in srgb, #ffab00 40%, transparent);
}

.ds-table tfoot tr {
  background: var(--paper-2);
  border-top: 2px solid var(--ink);
  font-weight: 700;
}

.ds-table tfoot td {
  padding: 10px 12px;
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--ink);
}

.ds-modal-card {
  background: var(--paper);
  border: 1px solid var(--ink);
  border-radius: 4px;
  width: min(640px, 92vw);
  max-height: 90vh;
  overflow-y: auto;
  padding: 24px;
  box-shadow: 0 12px 36px color-mix(in srgb, var(--ink) 25%, transparent);
}

.ds-modal-actions {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  margin-top: 24px;
  padding-top: 16px;
  border-top: 1px solid var(--hairline);
}

.ds-card-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 16px;
}

.ds-status-badge {
  display: inline-flex;
  align-items: center;
  padding: 3px 8px;
  border-radius: 3px;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.05em;
}

.ds-status-badge.pending_signoff {
  background: color-mix(in srgb, #ffab00 15%, transparent);
  color: #b78103;
  border: 1px solid color-mix(in srgb, #ffab00 40%, transparent);
}

.ds-status-badge.approved {
  background: color-mix(in srgb, var(--baobab) 15%, transparent);
  color: var(--baobab);
  border: 1px solid color-mix(in srgb, var(--baobab) 40%, transparent);
}

.ds-status-badge.rejected {
  background: color-mix(in srgb, #de350b 15%, transparent);
  color: #de350b;
  border: 1px solid color-mix(in srgb, #de350b 40%, transparent);
}

/* Dealer-book pager (MMDB-1587): page controls under a paged datagrid.
   Buttons are the standard .ds-button; this object only owns layout and
   the position read-out. */
.ds-pager {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 10px;
}
.ds-pager-info {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--ink-mute);
}

/* Embedded location map (MMDB-1588): bounded OSM iframe with its own
   border — the only sanctioned way to show a map pin inside a DS form. */
.ds-map-embed {
  display: block;
  margin-top: 8px;
}
.ds-map-embed iframe {
  display: block;
  width: 100%;
  height: 260px;
  border: 1px solid var(--hairline);
  border-radius: 4px;
}
.ds-map-embed .ds-hint {
  display: block;
  margin-top: 4px;
}

/* Filter bar above a paged datagrid (MMDB-1587): a search field and its
   actions on ONE row — the search grows but stays readable, buttons keep
   their natural width and sit on the field's baseline. */
.ds-filterbar {
  display: flex;
  align-items: flex-end;
  gap: 10px;
  margin-bottom: 10px;
}
.ds-filterbar .ds-field {
  flex: 0 1 380px;
  min-width: 220px;
}

/* Drill panel — an inline expandable detail block (e.g. a SAP line-item
   drill-down opened directly under a table row). ds-drill-panel is the
   containing cell/area (paper-2 wash to separate it from the record
   grid); ds-drill-panel-card is the raised card inside it; -head/-title/
   -sub are its header row, heading text, and mono sub-caption; -groups is
   a bordered label+chips block used above a drill table (MMDB-1596). */
.ds-drill-panel {
  padding: 16px;
  background: var(--paper-2);
}
.ds-drill-panel-card {
  background: var(--paper);
  border: 1px solid var(--hairline);
  border-radius: var(--ds-radius-sm);
  padding: 16px;
}
.ds-drill-panel-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 12px;
}
.ds-drill-panel-title {
  font-family: var(--font-ui);
  font-weight: 600;
  font-size: calc(15px * var(--fs-scale, 1));
  color: var(--ink);
}
.ds-drill-panel-sub {
  display: block;
  margin-top: 3px;
  font-family: var(--font-mono);
  font-size: calc(11.5px * var(--fs-scale, 1));
  color: var(--ink-mute);
}
.ds-drill-panel-groups {
  padding: 12px 16px;
  border-bottom: 1px solid var(--hairline);
}

/* Nested/child table row indent (MMDB-1596) — first-cell indent for a row
   that reads as a child of the row above it (e.g. a cost center listed
   under its expanded plant area). */
.ds-row-indent {
  padding-left: 2rem;
}

/* ===== Sales Pipeline v2 (MMDB-2015..2019) — quadrant cards, currency switch,
   ask/partner/next-action blocks, graph-walk linked row. Sales-scoped classes
   only touch the pipeline board + its popups; every figure they render is a
   value the /api/crm gateway actually returned (server-converted currency,
   never client-side rate math). ===== */

/* -- Page head: currency switch + converted total (MMDB-2015) -- */
.ds-crm-curswitch{display:inline-flex;border:1px solid var(--ink);border-radius:4px;overflow:hidden}
.ds-crm-curswitch-btn{font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.05em;padding:6px 12px;background:var(--paper);color:var(--ink);border:0;border-left:1px solid var(--ink);cursor:pointer}
.ds-crm-curswitch-btn:first-child{border-left:0}
.ds-crm-curswitch-btn-on{background:var(--ink);color:var(--paper)}
.ds-crm-headvalue{text-align:right}
.ds-crm-headvalue-lbl{font-family:var(--font-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);display:block;margin-bottom:2px}
.ds-crm-headvalue-fig{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:26px;line-height:1;color:var(--ink)}
.ds-crm-ratenote{font-family:var(--font-mono);font-size:8.5px;color:var(--ink-faint);text-align:right;margin:2px 0 12px}

/* -- Quadrant card marker slot (lead qualification / proposal sub-stage /
   contract type) -- three distinct treatments, never interchangeable. -- */
.ds-kanban-card-sub{display:flex;align-items:center;gap:6px;min-width:0;flex:1}
.ds-kanban-card-marker{font-family:var(--font-mono);font-size:7.5px;letter-spacing:.06em;text-transform:uppercase;border:1px solid var(--hairline);border-radius:2px;padding:0 3px;color:var(--ink-faint);white-space:nowrap;flex:none}
.ds-kanban-card-marker-ok{color:var(--signal-grass);border-color:var(--signal-grass);background:var(--signal-grass-bg)}
.ds-kanban-card-marker-stage{font-family:var(--font-display);font-style:italic;font-size:10px;color:var(--signal-amber);border:0;background:none;padding:0}
.ds-kanban-card-marker-chip{font-family:var(--font-mono);font-size:7.5px;letter-spacing:.06em;text-transform:uppercase;background:var(--ink);color:var(--paper);border-radius:2px;padding:1px 4px;border:0}

/* -- Stack overflow: a column shows a bounded number of cards, then one
   collapsed bar that expands/collapses in place. -- */
.ds-kanban-stackbar{border:1px dashed var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper);color:var(--ink-mute);font-family:var(--font-mono);font-size:9px;letter-spacing:.05em;text-transform:uppercase;text-align:center;padding:6px;cursor:pointer;width:100%}
.ds-kanban-stackbar:hover{border-color:var(--ink-faint);color:var(--ink)}

/* -- The ask: the dominant block on both record popups. -- */
.ds-crm-ask{border:1px solid var(--hairline);border-left:3px solid var(--baobab);border-radius:4px;background:var(--paper-2);padding:10px 12px;margin-bottom:12px}
.ds-crm-ask-lbl{font-family:var(--font-mono);font-size:8.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--baobab);display:block;margin-bottom:4px}
.ds-crm-ask-line{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:17px;line-height:1.3;color:var(--ink)}
.ds-crm-ask-sub{font-size:11px;color:var(--ink-mute);margin-top:3px}
.ds-crm-ask-money{display:flex;align-items:baseline;gap:10px;margin-top:8px;flex-wrap:wrap}
.ds-crm-ask-fig{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:22px;color:var(--ink)}
.ds-crm-ask-native{font-family:var(--font-mono);font-size:9px;color:var(--ink-faint)}

/* -- Product-line rows inside an opportunity's ask (MMDB-2017). -- */
.ds-crm-askline{display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:5px 0;border-bottom:1px solid var(--hairline-soft, var(--hairline))}
.ds-crm-askline:last-child{border-bottom:0}
.ds-crm-askline-prod{font-weight:600;color:var(--ink);font-size:11.5px}
.ds-crm-askline-spec{font-family:var(--font-mono);font-size:9px;color:var(--ink-faint);margin-left:6px}
.ds-crm-askline-qty{font-family:var(--font-mono);font-size:10px;color:var(--ink-mute);white-space:nowrap}
.ds-crm-askline-val{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:12px;white-space:nowrap;color:var(--ink)}
.ds-crm-askmeta{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px}
.ds-crm-askmeta-chip{font-family:var(--font-mono);font-size:8px;letter-spacing:.05em;text-transform:uppercase;border:1px solid var(--hairline);border-radius:2px;padding:1px 5px;color:var(--ink-mute)}
.ds-crm-askmeta-chip-hot{color:var(--baobab);border-color:var(--baobab);background:var(--baobab-bg)}

/* -- Partner history block (fed by GET .../partner-summary). -- */
.ds-crm-partner{border:1px solid var(--hairline);border-radius:4px;background:var(--paper);padding:9px 11px;margin-bottom:12px}
.ds-crm-partner-hd{display:flex;align-items:baseline;gap:8px;margin-bottom:5px}
.ds-crm-partner-nm{font-weight:600;font-size:12px;color:var(--ink)}
.ds-crm-partner-facts{font-size:10.5px;color:var(--ink-mute);line-height:1.55}

/* -- Next-action strip: an amber-bordered fact, editable in place. -- */
.ds-crm-nextact{display:flex;align-items:baseline;gap:8px;border:1px solid var(--signal-amber);background:var(--signal-amber-bg);border-radius:4px;padding:7px 10px;margin-bottom:12px;font-size:11.5px}
.ds-crm-nextact-k{font-family:var(--font-mono);font-size:8px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--signal-amber);white-space:nowrap;flex:none}
.ds-crm-nextact-form{display:flex;align-items:center;gap:8px;flex:1;min-width:0}
.ds-crm-nextact-form>.ds-input{flex:1;min-width:0}

/* -- Linked row: the graph-walk chips (company/person/quote/orders). -- */
.ds-crm-linkrow{display:flex;flex-wrap:wrap;gap:6px}
.ds-crm-lk{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--hairline);border-radius:3px;background:var(--paper);padding:3px 8px;font-family:var(--font-ui);font-size:10.5px;color:var(--ink);cursor:pointer}
.ds-crm-lk:hover{border-color:var(--baobab);color:var(--baobab)}
.ds-crm-lk-k{font-family:var(--font-mono);font-size:7.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-faint);margin-right:2px}
.ds-crm-lk-static{cursor:default}
.ds-crm-lk-static:hover{border-color:var(--hairline);color:var(--ink)}

/* -- Explicit-save bar under an editable field grid (never autosave). -- */
.ds-crm-savebar{display:flex;align-items:center;gap:10px;margin-top:-4px;margin-bottom:12px}

/* -- Products & terms: the editable product/price line table (MMDB-2046).
   One .ds-line-card per row (the existing OMS line-item object) — this
   class is only the list wrapper's own spacing, never a re-styling of
   .ds-line-card itself. Used in the lead popup, the opportunity popup and
   the new-lead form. -- */
.ds-crm-productlines{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}
.ds-crm-productlines .ds-line-card{margin-bottom:0}

/* -- MMDB-2016/2045: the Leads/Opportunities working-list pages, restyled to
   the sales-pipeline-v2 mock's "pagecard" card language (2px ink rule under
   the head, tighter mono column headers, denser rows) INSTEAD OF the plain
   generic .ds-table-section/.ds-datagrid look every other list page still
   uses. Every rule here is scoped under .ds-crm-worklist (an ADDITIONAL
   class TableSection accepts alongside its own .ds-table-section, never a
   replacement) or .ds-crm-worklist-valc, so no other .ds-table-section or
   .ds-datagrid consumer anywhere else in the portal is touched. */
.ds-crm-worklist{border:1px solid var(--hairline);border-top:1px solid var(--hairline);border-radius:var(--radius-sm,4px);overflow:hidden;box-shadow:0 8px 22px rgba(14,14,12,.08);margin-top:14px}
.ds-crm-worklist .ds-table-header{border-bottom:2px solid var(--ink);padding:11px 14px 9px;background:var(--paper)}
.ds-crm-worklist .ds-datagrid-wrap{overflow-x:auto}
.ds-crm-worklist .ds-datagrid{font-size:11px}
.ds-crm-worklist .ds-datagrid thead tr{border-bottom:2px solid var(--ink)}
.ds-crm-worklist .ds-datagrid-th{font-size:8px;padding:6px 10px}
.ds-crm-worklist .ds-datagrid td{padding:6px 10px}
.ds-crm-worklist .ds-datagrid-row:hover{background:var(--paper-2)}
/* Value column money figure, one notch louder than the row it sits in —
   the mock's table.opps .valc (Fraunces italic, not the row's plain text). */
.ds-crm-worklist-valc{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:12.5px;color:var(--ink);white-space:nowrap}

/* -- CRM popup density (Ben, 2026-08-09 3rd pipeline v2 rejection): the
   shared .ds-modal--dialog/.ds-field/.ds-input/.ds-select/.ds-button
   defaults are sized for the portal's general full-height record dialogs
   (min-width 560px, 14px/28px titlebar padding, 19px title, 0/28px/20px body
   padding, 12px/28px/18px footer padding, 14.5px/10px-12px inputs, 12.5px/
   11px-18px buttons) -- correct for those, but the sales-pipeline popup is a
   small graph-walk card and inheriting that scale is exactly why it read as
   "portal-huge" against the design contract. Every value below is copied
   from mmd01:/var/lib/mmd/wireframes/hr-h2r/design/sales-pipeline-v2.html
   and scoped to .ds-modal--crm (set via RowPopup's className prop, consumed
   only by the lead/opportunity CRM popups) so no other RowPopup consumer in
   the portal changes size. -- */
/* Specificity note: the base dialog sizing lives on .ds-modal.ds-modal--dialog
   (two classes) -- a bare .ds-modal--crm{width:...} loses that cascade (its
   min-width:560px keeps winning regardless of source order) and the popup
   silently renders at 560px even for the narrow 470px variant. Match the
   base rule's own two-class selector, same pattern as the existing
   .ds-modal.ds-modal--dialog.ds-modal--dialog-wide rule above. */
.ds-modal.ds-modal--dialog.ds-modal--crm{width:470px;min-width:0;max-width:calc(100vw - 48px)}
.ds-modal.ds-modal--dialog.ds-modal--crm.ds-modal--crm-wide{width:560px}
.ds-modal--crm .ds-modal-dialog-titlebar{padding:10px 14px;gap:10px}
.ds-modal--crm .ds-modal-dialog-titlebar-kicker{font-size:9px;letter-spacing:.08em}
.ds-modal--crm .ds-modal-dialog-titlebar-pos{font-size:17px}
.ds-modal--crm .ds-modal-dialog-body{padding:14px}
.ds-modal--crm .ds-modal-dialog-foot{padding:10px 14px}
.ds-modal--crm .ds-modal-dialog-foot .ds-actions{gap:8px}
.ds-modal--crm .ds-modal-dialog-foot .ds-button{font-size:10.5px;padding:8px 13px}

/* Fields grid: 2 columns, tight gap, small mono labels, small controls —
   mock's .fields{gap:8px 12px} / .field .lbl{8.5px mono} / .field input,
   select{12px, padding 6px 8px}. Also used for the opportunity's lede stage
   control (.ds-crm-ask-stage below), which reuses .ds-field/.ds-label. */
.ds-modal--crm .ds-field-row-2{gap:8px 12px;margin-bottom:12px}
.ds-modal--crm .ds-field-row-3{gap:8px 12px;margin-bottom:12px}
.ds-modal--crm .ds-label{font-family:var(--font-mono);font-weight:400;font-size:8.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute)}
.ds-modal--crm .ds-input,
.ds-modal--crm .ds-select{font-size:12px;padding:6px 8px;line-height:1.3}

/* Next-action strip input inherits the strip's own compact scale (mock:
   7px 10px padding, 11.5px row, 8px k-label) -- not the portal's 42px hero
   input. Background stays paper so it reads inline with the amber strip
   rather than as a heavier paper-2 control. */
.ds-modal--crm .ds-crm-nextact-form .ds-input{font-size:11.5px;padding:5px 7px;background:var(--paper)}

/* Linked-row + partner-block spacing already match the contract at the base
   .ds-crm-lk/.ds-crm-partner/.ds-crm-ask values above; nothing CRM-scoped
   needed there beyond the shared padding fix already applied to .ds-crm-lk. */

/* -- Opportunity popup lede (MMDB-2018, mock v2 popup-lede): money left,
   stage/sub-stage/contract-type control right, min-width ~200px, replacing
   the old money-only row + a separate stage-controls section further down
   the popup. -- */
.ds-modal--crm .ds-crm-ask-lede{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-top:8px;flex-wrap:wrap}
.ds-modal--crm .ds-crm-ask-lede>.ds-crm-ask-money{margin-top:0;flex:1 1 auto;min-width:0}
.ds-modal--crm .ds-crm-ask-stage{display:flex;gap:8px;flex:0 0 auto;min-width:200px}
.ds-modal--crm .ds-crm-ask-stage>.ds-field{flex:1;min-width:0}

/* -- A third .ds-tag tone: solid ink, for a state that is decided rather than
   merely flagged (contract type once signed). -- */
.ds-tag-solid{background:var(--ink);color:var(--paper);border-color:var(--ink)}
/* === OMS nav redesign v2 (Ben, 2026-08-08) — semantic extensions ===
   ds-oms-table--nowrap: Ben rule "no line breaks at all in tables" — every
   cell one line, overflow reads via ellipsis + the row's record dialog.
   ds-th-sort-mark / --active: every column header sortable, current sort in
   the scarce accent.
   ds-oms-topbar-unit: the operating unit lives IN the horizontal navigation.
   ds-filterbar-spacer: pushes the row's one primary action to the right end
   of the toolbar instead of floating in the page header. */
.ds-oms-table--nowrap th,.ds-oms-table--nowrap td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:420px}
.ds-th-sort-mark{font-family:var(--font-mono);font-size:9px;color:var(--ink-faint)}
.ds-th-sort--active,.ds-th-sort--active .ds-th-sort-mark{color:var(--baobab)}
.ds-oms-topbar-unit{display:inline-flex;align-items:center;gap:8px}
.ds-oms-topbar-unit-label{font-family:var(--font-mono);font-weight:500;font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--paper);opacity:.55}
.ds-oms-topbar-unit-select{background:transparent;border:1px solid var(--hairline-on-ink);border-radius:6px;color:var(--paper);font-family:var(--font-mono);font-size:11px;letter-spacing:.04em;padding:6px 26px 6px 8px}
.ds-filterbar-spacer{flex:1 1 auto}
/* Navigation labels never wrap (same no-line-breaks rule as tables); the
   seven-destination OMS topnav tightens its gap so the row fits one line. */
.topnav-link,.topnav-link-active{white-space:nowrap}
.topbar .topnav{gap:14px}
.brand{white-space:nowrap}

/* === OMS Design v3 (Ben round-6, 2026-08-08) === */
/* Condensed top bar: seven destinations fit one line at 1280. */
.topnav-link,.topnav-link-active{font-size:12px}
.topbar .topnav{gap:12px}
/* Currency toggle: local currency vs USD, independent of operating unit. */
.ds-oms-currency{display:inline-flex;border:1px solid var(--hairline-on-ink);border-radius:6px;overflow:hidden;margin-left:8px}
.ds-oms-currency-opt{background:transparent;border:0;color:var(--paper);opacity:.55;font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;padding:6px 9px;cursor:pointer}
.ds-oms-currency-opt--on{opacity:1;background:rgba(250,250,246,.14)}
/* The ONE second-level row: view tabs left, quiet controls right. Nothing
   else stands between the top bar and the table (Ben round-6). */
.ds-oms-viewbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px;row-gap:6px;border-bottom:1px solid var(--hairline);background:var(--paper);padding:4px 0;margin-bottom:0}
.ds-oms-viewbar .ds-oms-tabs{border-bottom:0;padding:0;background:transparent;flex:0 1 auto}
.ds-oms-viewbar-controls{display:flex;align-items:center;flex-shrink:0;gap:8px;margin-left:auto}
.ds-oms-viewbar-controls .ds-input{width:230px;padding:7px 10px;font-size:12.5px}
.ds-oms-viewbar-controls .ds-select{padding:7px 8px;font-size:12px}
/* Tables must never cut a column at the page edge: tighter cells. */
.ds-oms-table--nowrap th,.ds-oms-table--nowrap td{max-width:250px}
.ds-oms-table--nowrap td:first-child,.ds-oms-table--nowrap th:first-child{padding-left:2px}
/* Open-record header: identity once, serif, chip + meta on the same line. */
.ds-oms-record-head{display:flex;align-items:baseline;gap:14px;padding:16px 0 10px;min-width:0}
.ds-oms-record-id{font-family:var(--font-mono);font-size:12px;color:var(--ink-mute);white-space:nowrap}
.ds-oms-record-title{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:24px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-oms-record-meta{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.06em;color:var(--ink-mute);white-space:nowrap;margin-left:auto}
/* v4: record dialogs share one wide format — no small floaters lost in a
   dark backdrop (Ben round-7: popups 10-12 "get really pretty dark"). */
.ds-oms-dialog{min-width:min(940px,calc(100vw - 48px));max-width:1100px}

:root{--radius:4px}
/* === OMS v5: record-popup anatomy ported 1:1 from the ACCEPTED sales-pipeline-v2 mock (Ben's contract) === */
.ds-pop-sample{font-family:var(--font-mono);font-size:7.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--amber);border:1px solid var(--amber);border-radius:2px;padding:0 3px;vertical-align:middle}
.head-value .ds-pop-lbl{font-family:var(--font-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);display:block;margin-bottom:2px}
.head-value .ds-pop-fig{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:30px;line-height:1}
.omlink .ds-pop-k{font-family:var(--font-mono);font-size:7.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-faint);margin-right:5px}
.ds-pop{width:470px;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--radius);box-shadow:0 18px 50px rgba(14,14,12,.28);overflow:hidden;align-self:flex-start}
.ds-pop-band{background:var(--ink);display:flex;align-items:center;gap:10px;padding:10px 14px}
.ds-pop-kicker{font-family:var(--font-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:rgba(250,250,246,.6);white-space:nowrap}
.ds-pop-title{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:17px;color:var(--paper);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-pop-x{background:none;border:1px solid var(--baobab);color:#E14A5E;border-radius:3px;width:20px;height:20px;font-size:11px;line-height:1;cursor:pointer;flex:none}
.ds-pop-body{padding:14px}
/* THE ASK — dominant block */
  .ds-pop-ask{border:1px solid var(--hairline);border-left:3px solid var(--baobab);border-radius:var(--radius);background:var(--paper-2);padding:10px 12px;margin-bottom:12px}
.ds-pop-ask .ds-pop-lbl{font-family:var(--font-mono);font-size:8.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--baobab);display:block;margin-bottom:4px}
.ds-pop-ask .ds-pop-line{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:17px;line-height:1.3}
.ds-pop-ask .ds-pop-sub{font-size:11px;color:var(--ink-mute);margin-top:3px}
.ds-pop-ask .ds-pop-money{display:flex;align-items:baseline;gap:10px;margin-top:8px}
.ds-pop-ask .ds-pop-money .ds-pop-fig{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:22px}
.ds-pop-ask .ds-pop-money .ds-pop-native{font-family:var(--font-mono);font-size:9px;color:var(--ink-faint)}
/* editable fields */
  .ds-pop-fields{display:grid;grid-template-columns:1fr 1fr;gap:8px 12px;margin-bottom:12px}
.ds-pop-field .ds-pop-lbl{font-family:var(--font-mono);font-size:8.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute);display:block;margin-bottom:2px}
.ds-pop-field input,.ds-pop-field select{width:100%;font-family:var(--font-ui);font-size:12px;padding:6px 8px;border:1px solid var(--hairline);border-radius:var(--radius);background:var(--paper);color:var(--ink)}
.ds-pop-field input:focus,.ds-pop-field select:focus{outline:2px solid var(--baobab);outline-offset:1px}
/* linked objects — the graph row */
  .ds-pop-links .ds-pop-lbl{font-family:var(--font-mono);font-size:8.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute);display:block;margin-bottom:5px}
.ds-pop-linkrow{display:flex;flex-wrap:wrap;gap:6px}
.ds-pop-lk{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--hairline);border-radius:3px;background:var(--paper);padding:3px 8px;font-size:10.5px;color:var(--ink);cursor:pointer;text-decoration:none}
.ds-pop-lk:hover{border-color:var(--baobab);color:var(--baobab)}
.ds-pop-lk .ds-pop-k{font-family:var(--font-mono);font-size:7.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-faint)}
.ds-pop-lk.add{border-style:dashed;color:var(--ink-faint)}
.ds-pop-actions{display:flex;justify-content:flex-end;gap:8px;border-top:1px solid var(--hairline);padding:10px 14px;background:var(--paper-2)}
.btn{font-family:var(--font-ui);font-size:10.5px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;padding:8px 13px;border-radius:var(--radius);border:1px solid transparent;cursor:pointer;line-height:1}
.pp .rel .ds-pop-lbl{font-family:var(--font-mono);font-size:8.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute);display:block;margin:8px 0 4px}
/* rich opportunity popup */
  .ds-pop.wide{width:560px}
.nextact .ds-pop-k{font-family:var(--font-mono);font-size:8px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--amber);white-space:nowrap}
table.opps .ds-pop-askt{color:var(--ink-mute);max-width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-pop{width:min(880px,calc(100vw - 48px))}
.ds-pop-wrap{position:fixed;inset:0;background:rgba(14,14,12,.55);display:flex;align-items:center;justify-content:center;padding:24px;z-index:1000}
.ds-pop-grid{margin:0 0 12px}
.ds-pop-grid .ds-datagrid td,.ds-pop-grid .ds-datagrid th{white-space:nowrap}
.ds-pop-grid .ds-price-input{width:110px;font-family:var(--font-mono);font-size:12px;padding:5px 7px;border:1px solid var(--hairline);border-radius:4px;background:var(--paper);color:var(--ink);text-align:right}

/* v6 (Ben round-9, 2026-08-09): dialogs fit the screen and scroll; the OMS
   bar lives INSIDE the portal shell as a module bar, not a page frame. */
.ds-pop{max-height:calc(100vh - 48px);display:flex;flex-direction:column}
.ds-pop-body{overflow-y:auto;min-height:0}
.ds-oms-modulebar{display:flex;align-items:stretch;gap:14px;background:var(--paper-manila,#EDE6D2);border:1.5px solid var(--hairline-dark,#B8AF98);border-bottom:2px solid var(--ink,#111110);border-radius:4px 4px 0 0;padding:8px 16px 0;margin-bottom:14px;min-width:0;box-shadow:0 2px 6px rgba(17,17,16,0.06)}
.ds-oms-modulebar .topnav-link{background:#DDD5BF;color:var(--ink-soft,#2E2D28);border:1px solid var(--hairline-dark,#B8AF98);border-bottom:none;font-family:var(--font-mono);font-weight:700;font-size:11px;letter-spacing:.04em;text-transform:uppercase;padding:8px 16px;border-radius:4px 4px 0 0;white-space:nowrap;transition:background .12s ease,color .12s ease}
.ds-oms-modulebar .topnav-link:hover{background:var(--paper-sheet,#FAF8F2);color:var(--ink)}
.ds-oms-modulebar .topnav-link-active{background:var(--paper-sheet,#FAF8F2);color:var(--royal-blue,#123B75);border:1px solid var(--hairline-dark,#B8AF98);border-top:2.5px solid var(--royal-blue,#123B75);border-bottom:1px solid var(--paper-sheet,#FAF8F2);font-family:var(--font-mono);font-weight:700;font-size:11px;letter-spacing:.04em;text-transform:uppercase;padding:8px 16px;border-radius:4px 4px 0 0;white-space:nowrap;position:relative;bottom:-1px;z-index:2}
.ds-oms-modulebar-nav{display:flex;align-items:flex-end;gap:6px;min-width:0;overflow-x:auto;flex:1}
.ds-oms-modulebar-actions{display:flex;align-items:center;gap:10px;flex:none;padding-bottom:6px}
/* Combined two-row OMS navigation bar (Ben, 2026-08-10): row one = main
   sections + unit/currency, row two = the active section's secondary
   destinations. Manila folder bar with sheet subrow. */
.ds-oms-modulebar--stacked{flex-direction:column;align-items:stretch;gap:0;padding:8px 16px 0}
.ds-oms-modulebar-row{display:flex;align-items:flex-end;gap:14px;min-width:0;padding:0;flex-wrap:wrap}
/* The funnel row grew a seventh destination and the last one was cut in
   half against the unit selector. The row wraps rather than clipping a
   destination nobody can then read (2026-08-22). */
.ds-oms-modulebar-nav{flex:1 1 auto}
.ds-oms-modulebar-subrow{display:flex;align-items:center;gap:16px;min-width:0;overflow-x:auto;background:var(--paper-sheet,#FAF8F2);border-top:1px solid var(--hairline,#D8D1BE);padding:8px 16px;margin:0 -16px}
.ds-oms-subnav-link{font-family:var(--font-mono);font-weight:600;font-size:11px;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap;color:var(--ink-mute,#6A675C);transition:color .14s ease}
.ds-oms-subnav-link:hover{color:var(--ink)}
.ds-oms-subnav-link--active{color:var(--royal-blue,#123B75);font-weight:800;border-bottom:2px solid var(--royal-blue,#123B75);padding-bottom:2px}
/* Dealer Workspace is an outbound (dealer-facing) link — set it apart from the
   in-app section links: a typewriter button outline in royal-blue + an external glyph, pushed to
   the end of the row. */
.ds-oms-nav-external{display:inline-flex;align-items:center;gap:6px;margin-left:auto;font-family:var(--font-mono);font-weight:700;font-size:11px;letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;color:var(--royal-blue,#123B75);background:var(--paper-sheet,#FAF8F2);border:1.5px solid var(--royal-blue,#123B75);border-radius:3px;padding:3px 10px;box-shadow:1px 1px 0 rgba(0,0,0,0.08);transition:background .14s ease}
.ds-oms-nav-external:hover{background:var(--paper-card,#F4EFE3)}
.ds-oms-nav-external-glyph{width:12px;height:12px;flex:none;opacity:.9}
/* Ben round-9 (2026-08-09): the queue tables read cramped — give the OMS
   datagrid comfortable, consistent cell padding on both header and body. */
.ds-datagrid.ds-oms-table--nowrap th{padding:10px 14px}
.ds-datagrid.ds-oms-table--nowrap td{padding:11px 14px;vertical-align:middle}
/* Ben round-9 test finding (2026-08-09): in-shell the content column is
   narrower than the old full-bleed frame, so the 6-column queue clipped Stage
   + Updated at the right edge. Clamp the wide free-text column and guarantee
   the queue scrolls within its own viewport instead of clipping. */
.ds-datagrid.ds-oms-table--nowrap{width:100%}
.ds-datagrid.ds-oms-table--nowrap td{max-width:220px}
.ds-datagrid.ds-oms-table--nowrap td.ds-oms-cell-wide{max-width:280px}
.ds-table-viewport{overflow:auto}
/* Reporting redesign 2026-08-08 — slim in-report utility bar (.ds-repbar)
   and the report hub / index page (.ds-rephub). The hub reads like a
   chart-of-accounts for reports: mono domain codes, Fraunces italic count
   numerals, hairline ledger rows. Red stays scarce: section-label tick,
   hover underline, active markers only. */
.ds-repbar{position:relative;display:flex;align-items:center;gap:12px;min-height:36px;margin:0 0 12px;padding:0 2px;border-bottom:1px solid var(--hairline)}
.ds-repbar-link{display:inline-flex;align-items:center;gap:5px;padding:9px 0 8px;border:0;background:transparent;color:var(--ink-soft);font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale,1));letter-spacing:.06em;text-transform:uppercase;text-decoration:none;white-space:nowrap;cursor:pointer}
.ds-repbar-link:hover{color:var(--ink);box-shadow:inset 0 -2px 0 0 var(--baobab)}
.ds-repbar-link:focus-visible,.ds-repbar-switch:focus-visible{outline:1px solid var(--baobab);outline-offset:2px}
.ds-repbar-switch{display:inline-flex;align-items:center;gap:6px;padding:8px 0 7px;border:0;background:transparent;color:var(--ink);font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale,1));font-weight:600;cursor:pointer}
.ds-repbar-switch:hover{box-shadow:inset 0 -2px 0 0 var(--baobab)}
.ds-repbar-chevron{color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(9px * var(--fs-scale,1))}
.ds-repbar-sep{align-self:stretch;width:1px;margin:8px 0;background:var(--hairline)}
.ds-repbar-spacer{flex:1 1 auto;min-width:8px}
.ds-repbar-admin{color:var(--ink-mute)}
.ds-repbar-menu{position:absolute;top:calc(100% + 5px);right:0;left:auto;z-index:230;display:flex;flex-direction:column;min-width:200px;padding:4px 0;border:1px solid var(--hairline);background:var(--paper);box-shadow:0 10px 28px color-mix(in srgb,var(--ink) 14%,transparent)}
.ds-pop-right{right:0;left:auto}
.ds-rephub{max-width:1180px;margin:0 auto;padding:2px 2px 28px}
.ds-rephub-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin:0 0 16px}
.ds-rephub-eyebrow{margin:0 0 2px;color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale,1));letter-spacing:.08em;text-transform:uppercase}
.ds-rephub-title{margin:0;color:var(--ink);font-family:var(--font-display);font-size:calc(34px * var(--fs-scale,1));font-style:italic;font-weight:600;line-height:1.05}
.ds-rephub-provenance{margin:6px 0 0;color:var(--ink-soft);font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale,1))}
.ds-rephub-admin{display:flex;gap:14px;padding-top:8px}
.ds-rephub-label{display:flex;align-items:center;gap:8px;margin:0 0 8px;color:var(--ink);font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale,1));font-weight:600;letter-spacing:.08em;text-transform:uppercase}
.ds-rephub-label::before{content:"";width:14px;height:2px;background:var(--baobab)}
.ds-rephub-popular{margin:0 0 18px}
.ds-rephub-popular-list{border:1px solid var(--hairline);background:var(--paper)}
.ds-rephub-popular-row{display:flex;align-items:baseline;gap:12px;padding:9px 14px;border-bottom:1px solid var(--hairline);color:var(--ink);text-decoration:none}
.ds-rephub-popular-row:last-child{border-bottom:0}
.ds-rephub-popular-row:hover{background:var(--paper-2)}
.ds-rephub-popular-row:hover .ds-rephub-popular-name{box-shadow:inset 0 -2px 0 0 var(--baobab)}
.ds-rephub-popular-row:focus-visible{outline:1px solid var(--baobab);outline-offset:-1px}
.ds-rephub-popular-num{color:var(--ink-faint);font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1))}
.ds-rephub-popular-name{font-family:var(--font-ui);font-size:calc(14px * var(--fs-scale,1));font-weight:600}
.ds-rephub-popular-tag{margin-left:auto;color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.05em;text-transform:uppercase}
.ds-rephub-grid{columns:2;column-gap:14px}
.ds-rephub-card{display:block;break-inside:avoid;margin:0 0 14px;border:1px solid var(--hairline);background:var(--paper)}
.ds-rephub-card-hot{border-color:var(--ink)}
.ds-rephub-card-head{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:10px 14px;border-bottom:1px solid var(--hairline)}
.ds-rephub-card-code{color:var(--ink-soft);font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale,1));font-weight:600;letter-spacing:.07em;text-transform:uppercase}
.ds-rephub-card-count{color:var(--ink);font-family:var(--font-display);font-size:calc(21px * var(--fs-scale,1));font-style:italic;line-height:1}
.ds-rephub-card-list{margin:0;padding:0;list-style:none}
.ds-rephub-card-link{display:block;padding:7px 14px;border-bottom:1px solid var(--hairline);border-left:2px solid transparent;color:var(--ink-soft);font-family:var(--font-ui);font-size:calc(13px * var(--fs-scale,1));text-decoration:none}
.ds-rephub-card-list li:last-child .ds-rephub-card-link{border-bottom:0}
.ds-rephub-card-link:hover{border-left-color:var(--baobab);background:var(--paper-2);color:var(--ink)}
.ds-rephub-card-link:focus-visible{outline:1px solid var(--baobab);outline-offset:-1px}
@media(max-width:900px){.ds-rephub-grid{columns:1}.ds-rephub-head{flex-direction:column}.ds-repbar{flex-wrap:wrap}}

/* Ops consumables & process variance report (MMDB reporting redesign 2026-08-08) --
   the country group card, its dark header bar/total figure, hardware-spec sub-bar,
   process-stage badges and pos/neg variance color accents used only by that page. */
.ds-opsvar-filterbar-action{margin-left:auto}
.ds-opsvar-country-card{background:var(--paper);border:1px solid var(--hairline);overflow:hidden}
.ds-opsvar-country-header{background:var(--ink);color:var(--paper);padding:14px 16px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:12px}
.ds-opsvar-country-title{font-family:var(--font-display);font-weight:700;font-size:calc(15px * var(--fs-scale,1));display:flex;align-items:center;gap:8px;margin:0;color:var(--paper)}
.ds-opsvar-country-title-count{font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1));font-weight:500;text-transform:uppercase;letter-spacing:0.04em;color:var(--paper);border:1px solid color-mix(in srgb,var(--paper) 35%,transparent);border-radius:8px;padding:1px 7px;background:transparent;white-space:nowrap}
.ds-opsvar-country-hw{font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale,1));color:color-mix(in srgb,var(--paper) 70%,transparent);display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:4px}
.ds-opsvar-country-total{text-align:right}
.ds-opsvar-country-total-label{font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:0.08em;text-transform:uppercase;color:color-mix(in srgb,var(--paper) 60%,transparent)}
.ds-opsvar-country-total-value{font-family:var(--font-mono);font-weight:700;font-size:calc(14px * var(--fs-scale,1));color:var(--paper);margin-top:2px}
.ds-opsvar-country-total-var{font-weight:600;margin-left:6px;font-size:calc(11px * var(--fs-scale,1))}
.ds-opsvar-var-pos{color:var(--baobab)}
.ds-opsvar-var-neg{color:var(--signal-grass)}
.ds-opsvar-var-strong{font-weight:700}
.ds-opsvar-country-specs{background:var(--paper-2);border-bottom:1px solid var(--hairline);padding:8px 16px;font-family:var(--font-ui);font-size:calc(11px * var(--fs-scale,1));color:var(--ink-soft);display:flex;flex-wrap:wrap;gap:4px 20px}
.ds-opsvar-stage{display:inline-block;font-family:var(--font-mono);font-weight:600;font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:0.05em;text-transform:uppercase;padding:2px 7px;border-radius:2px;border:1px solid var(--hairline);color:var(--ink-soft);background:var(--paper-2)}
.ds-opsvar-stage--aod{color:var(--signal-amber);border-color:var(--signal-amber)}
.ds-opsvar-stage--ccm{color:var(--ink);border-color:var(--ink)}
.ds-opsvar-cell-center{text-align:center}

/* Reporting redesign 2026-08-09 — deployed (non-3D) iteration: portal-style
   one-view subnav on report pages, Unit dropdown replacing country chips,
   hub search + folder-card expanders + live highlight lines. */
.ds-subnav1{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 8px}
.ds-subnav1-item{padding:5px 10px;border:1px solid var(--hairline);background:var(--paper);color:var(--ink-soft);font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.05em;text-transform:uppercase;text-decoration:none;cursor:pointer}
.ds-subnav1-item:hover{border-color:var(--ink);color:var(--ink)}
.ds-subnav1-item-active{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.ds-subnav1-item-active:hover{color:var(--paper)}
.ds-subnav1-back{margin-right:4px}
.ds-subnav2{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:16px;row-gap:4px;margin:0 0 10px;padding:0 2px 8px;border-bottom:1px solid var(--hairline)}
.ds-subnav2-link{color:var(--ink-soft);font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale,1));text-decoration:none}
.ds-subnav2-link:hover{color:var(--ink);box-shadow:inset 0 -2px 0 0 var(--baobab)}
.ds-subnav2-link-active{color:var(--ink);font-weight:700;box-shadow:inset 0 -2px 0 0 var(--baobab)}
.ds-unitsel{display:inline-flex;align-items:center;gap:8px;padding:6px 11px;border:1px solid var(--ink);background:var(--paper);color:var(--ink);font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1));letter-spacing:.05em;text-transform:uppercase;cursor:pointer}
.ds-unitsel b{font-weight:700}
.ds-unitsel-label{color:var(--ink-mute)}
.ds-unitsel-chev{color:var(--ink-mute);font-size:calc(9px * var(--fs-scale,1))}
.ds-unitmenu{position:absolute;top:calc(100% + 5px);left:0;z-index:230;min-width:210px;display:flex;flex-direction:column;padding:4px 0;border:1px solid var(--ink);background:var(--paper);box-shadow:0 10px 28px color-mix(in srgb,var(--ink) 22%,transparent)}
.ds-unitmenu-item{display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:6px 14px;border:0;border-left:2px solid transparent;background:transparent;color:var(--ink-soft);font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale,1));text-align:left;cursor:pointer}
.ds-unitmenu-item:hover{border-left-color:var(--baobab);background:var(--paper-2);color:var(--ink)}
.ds-unitmenu-item-active{border-left-color:var(--baobab);color:var(--ink);font-weight:700}
.ds-unitmenu-item-disabled,.ds-unitmenu-item-disabled:hover{border-left-color:transparent;background:transparent;color:var(--ink-faint);cursor:default}
.ds-unitmenu-item-disabled i{font-style:normal;font-family:var(--font-mono);font-size:calc(9px * var(--fs-scale,1))}
.ds-rephub-search{margin:0 0 12px}
.ds-rephub-searchbox{display:flex;align-items:center;gap:9px;padding:9px 13px;border:1px solid var(--ink);background:var(--paper)}
.ds-rephub-searchbox input{flex:1;border:0;outline:0;background:transparent;color:var(--ink);font-family:var(--font-ui);font-size:calc(13.5px * var(--fs-scale,1))}
.ds-rephub-search-glass{color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(12px * var(--fs-scale,1))}
.ds-rephub-popular-hl{flex:1 1 auto;min-width:0;overflow:hidden;color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1));white-space:nowrap;text-overflow:ellipsis}
.ds-rephub-popular-row:hover .ds-rephub-popular-hl{color:var(--ink-soft)}
.ds-rephub-expander{display:flex;align-items:center;gap:8px;width:100%;padding:7px 14px;border:0;border-top:1px solid var(--hairline);background:var(--paper-2);color:var(--ink-soft);font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1));letter-spacing:.06em;text-transform:uppercase;text-align:left;cursor:pointer}
.ds-rephub-expander:hover{color:var(--ink);box-shadow:inset 2px 0 0 0 var(--baobab)}
.ds-rephub-popular-row{align-items:baseline}

/* CR-13: black two-tier file-menu navigation for the reporting space */
.ds-repnav{display:flex;flex-wrap:wrap;align-items:center;gap:2px;margin:0 0 8px;padding:4px 6px;background:var(--ink)}
.ds-repnav-tab{padding:6px 12px;border:0;background:transparent;color:var(--paper-2);font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1));letter-spacing:.06em;text-transform:uppercase;text-decoration:none;cursor:pointer}
.ds-repnav-tab:hover{color:var(--paper);box-shadow:inset 0 -2px 0 0 var(--baobab)}
.ds-repnav-tab-active{background:var(--paper);color:var(--ink)}
.ds-repnav-tab-active:hover{color:var(--ink);box-shadow:none}
.ds-repnav-link{padding:6px 10px;border:0;background:transparent;color:var(--ink-faint);font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.06em;text-transform:uppercase;cursor:pointer}
.ds-repnav-link:hover{color:var(--paper)}
.ds-cinematic-frame{height:calc(100vh - 160px);min-height:520px}

/* CR-13 (Ben 2026-08-09): report tables readable + full width + one-line rows */
.ds-report-table{width:100%}
.ds-report-table td{font-size:calc(13px * var(--fs-scale,1));vertical-align:middle}
.ds-report-table thead th{font-size:calc(10.5px * var(--fs-scale,1))}
.ds-report-table .ds-mono-num{font-size:calc(12.5px * var(--fs-scale,1))}
.ds-report-table .ds-records-title{font-size:calc(14px * var(--fs-scale,1))}
.ds-report-table .ds-cell-wrap,.ds-report-table .ds-cell-wrap-wide{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:360px}
.ds-report-table .ds-cell-wrap-wide{max-width:520px}
/* column width buckets — resize applies one of these to a <col>; app code
   only swaps semantic classes, never inline styles */
.ds-colw-1{width:56px}.ds-colw-2{width:72px}.ds-colw-3{width:88px}.ds-colw-4{width:104px}.ds-colw-5{width:120px}.ds-colw-6{width:140px}.ds-colw-7{width:160px}.ds-colw-8{width:180px}.ds-colw-9{width:200px}.ds-colw-10{width:224px}.ds-colw-11{width:248px}.ds-colw-12{width:272px}.ds-colw-13{width:300px}.ds-colw-14{width:330px}.ds-colw-15{width:360px}.ds-colw-16{width:400px}.ds-colw-17{width:440px}.ds-colw-18{width:480px}.ds-colw-19{width:520px}.ds-colw-20{width:560px}
.ds-colgrip{position:absolute;top:0;right:-4px;width:8px;height:100%;cursor:col-resize;user-select:none}
.ds-colgrip:hover{background:var(--baobab-bg)}
.ds-th-resizable{position:relative}
.ds-hiddencols{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:0 0 8px}
.ds-hiddencols-chip{padding:4px 10px;border:1px dashed var(--hairline);background:var(--paper);color:var(--ink-mute);font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.05em;text-transform:uppercase;cursor:pointer}
.ds-hiddencols-chip:hover{border-color:var(--ink);color:var(--ink)}

/* CR-13 drill popups */
.ds-drillpop{width:min(980px,94vw);max-height:86vh;display:flex;flex-direction:column}
.ds-drillpop-body{overflow:auto}
.ds-drillpop-actions{display:flex;align-items:center;gap:10px}

/* CR-15 (Ben, 2026-08-08): report-table typography rebalance -- headers/sums/
   numbers were tiny while item codes/names rendered huge (see the historical
   .ds-report-table block above: td 13px, .ds-mono-num 12.5px, thead th
   10.5px, .ds-records-title 14px serif). This LATER block wins by source
   order and does not edit those historical lines. Numbers must read
   equal-weight to text (not smaller), headers must stop being tiny, sums
   must never look lighter than the body, and item-code/name titles inside a
   report table must stop rendering as oversized serif display text -- the
   serif .ds-records-title look is kept everywhere ELSE in the product
   (records lists, cards), only overridden inside .ds-report-table. */
.ds-report-table td{font-size:calc(13.5px * var(--fs-scale,1))}
.ds-report-table .ds-mono-num{font-size:calc(13px * var(--fs-scale,1))}
.ds-report-table thead th{font-size:calc(11.5px * var(--fs-scale,1))}
.ds-report-table tfoot td,.ds-report-table tr.ds-records-total td{font-size:calc(13px * var(--fs-scale,1));font-weight:700}
.ds-report-table .ds-records-title{font-family:var(--font-ui);font-size:calc(13.5px * var(--fs-scale,1));font-weight:600;letter-spacing:0;line-height:1.3}
.ds-rowcount{font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale,1));letter-spacing:.03em;color:var(--ink-soft);margin:0 0 8px}

/* CR-15 follow-up (Ben, 2026-08-09): "only one row within a row, no
   multi-line rows. If it needs another column, then so be it." A cell that
   used to stack a name over its code (.ds-records-name + .ds-records-sub,
   display:block each) is now always two separate columns -- Code (mono) and
   Name -- and the Name cell ellipsizes instead of wrapping or stacking, so
   every data row renders as exactly one text line regardless of how long
   the name is. */
.ds-report-table .ds-cell-ellipsis{max-width:320px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* =====================================================================   Finance surface polish (2026-08-08) — scoped visual refinement for the
   Finance section (/app/finance*, /app/expenses*, /app/travel*).
   Pages opt in by adding `fin-surface` to the module-workbench root; every
   rule below is scoped under it so no other module shifts. Plus the fin-*
   components (stat strip, step rail, empty state) shared by these pages.
   ========================================================================= */

/* --- header band: editorial title block over a strong ink rule ----------- */
.fin-surface.module-workbench{gap:12px}
.fin-surface .module-workbench-header{align-items:flex-end;padding:6px 0 16px;border-bottom:2px solid var(--ink);margin-bottom:0}
.fin-surface .module-title-block{display:flex;flex-direction:column;gap:5px}
.fin-surface .module-workbench-header .eyebrow{color:var(--ink-mute);letter-spacing:0.18em}
.fin-surface.module-workbench .module-title{font-family:var(--font-display);font-weight:500;font-size:clamp(24px,2.6vw,30px);line-height:1.05;letter-spacing:-0.015em;margin:0}
.fin-surface .module-title-block .ds-mono{color:var(--ink-mute);font-size:calc(11px * var(--fs-scale,1))}
.fin-surface .module-actions{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;justify-content:flex-end}
.fin-surface .module-actions .ds-field{display:flex;flex-direction:column;gap:3px}
.fin-surface .module-actions .ds-label{font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:0.14em}
.fin-surface .module-actions .ds-select{padding:9px 10px;font-size:13px;min-width:150px}

/* --- section rhythm: aligned hairlines, baseline headers ------------------ */
.fin-surface .ds-table-section{margin-top:0;border:1px solid var(--hairline);background:var(--paper);padding:2px 16px 14px;border-radius:0}
.fin-surface .ds-table-section+.ds-table-section{margin-top:8px}
.fin-surface .ds-table-header{align-items:baseline;padding:12px 0 9px;margin-bottom:0;border-bottom:1px solid var(--hairline)}
.fin-surface .ds-table-header .ds-mono{font-size:calc(10.5px * var(--fs-scale,1));letter-spacing:0.08em;color:var(--ink-mute)}
.fin-surface .ds-table-title{font-family:var(--font-display);font-weight:500;font-size:calc(18px * var(--fs-scale,1));line-height:1.15;margin:2px 0 0}
.fin-surface .ds-table-header .ds-actions{display:flex;gap:8px;align-items:center}

/* --- filter rows: quiet chip rails, no floating controls ------------------ */
.fin-surface .ds-filterbar{margin:0;padding:4px 0 2px;border-bottom:0;gap:6px;align-items:center}
.fin-surface .ds-filterbar+.ds-filterbar{border-top:0;padding-top:2px}
.fin-surface .ds-filterbar .ds-filter-chip,
.fin-surface .ds-filterbar .ds-button{padding:6px 11px;font-size:calc(10.5px * var(--fs-scale,1));letter-spacing:0.08em;border-radius:2px}
.fin-surface .ds-filterbar .ds-label{margin-right:2px}

/* --- tables: dense editorial rows with a real click affordance ------------ */
.fin-surface .ds-records-compact td{padding:9px 10px;font-size:calc(13.5px * var(--fs-scale,1));font-variant-numeric:tabular-nums}
.fin-surface .ds-records-compact thead th{padding:7px 10px}
.fin-surface .ds-records-compact .ds-records-id{color:var(--ink-mute)}
.fin-surface .ds-row-click{cursor:pointer}
.fin-surface .ds-row-click:hover td,.fin-surface .ds-row-click:hover th{background:var(--paper-2)}
.fin-surface .ds-row-click:focus-visible{outline:2px solid var(--baobab);outline-offset:-2px}

/* --- notices: compact, framed, no page-wide margins ----------------------- */
.fin-surface .ds-notice{margin:0;padding:11px 14px;background:var(--paper);border:1px solid var(--hairline);border-left:3px solid var(--baobab);border-radius:0;gap:12px;align-items:center}
.fin-surface .ds-notice-rule{display:none}
.fin-surface .ds-notice-label{margin-bottom:2px}
.fin-surface .ds-notice-text{font-size:calc(13px * var(--fs-scale,1))}

/* --- fin-stat-strip: counts that read at a glance ------------------------- */
.fin-stat-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));background:var(--paper);border:1px solid var(--hairline)}
.fin-stat{display:flex;flex-direction:column;gap:1px;padding:12px 16px 11px;border-left:1px solid var(--hairline);min-width:0}
.fin-stat:first-child{border-left:0}
.fin-stat-label{font-family:var(--font-mono);font-weight:500;font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute)}
.fin-stat-value{font-family:var(--font-display);font-weight:500;font-size:calc(26px * var(--fs-scale,1));line-height:1.1;color:var(--ink)}
a.fin-stat-value{text-decoration:none}
a.fin-stat-value:hover{color:var(--baobab)}
.fin-stat-sub{font-size:calc(11.5px * var(--fs-scale,1));color:var(--ink-mute);line-height:1.3}
.fin-stat-alert .fin-stat-value{color:var(--baobab)}
@media (max-width:720px){.fin-stat-strip{grid-template-columns:repeat(2,1fr)}.fin-stat:nth-child(odd){border-left:0}}

/* --- fin-steps: the R2R step rail (navigation, not explainer cards) ------- */
.fin-steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));background:var(--paper);border:1px solid var(--hairline)}
.fin-step{display:flex;gap:12px;align-items:flex-start;padding:13px 16px;border-left:1px solid var(--hairline);text-decoration:none;color:inherit;min-width:0;transition:background 0.14s ease}
.fin-step:first-child{border-left:0}
.fin-step:hover{background:var(--paper-2)}
.fin-step:focus-visible{outline:2px solid var(--baobab);outline-offset:-2px}
.fin-step-n{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:1px solid var(--ink);border-radius:2px;font-family:var(--font-mono);font-size:11px;font-weight:500;color:var(--ink);margin-top:1px}
.fin-step:hover .fin-step-n{background:var(--ink);color:var(--paper)}
.fin-step-body{display:flex;flex-direction:column;gap:1px;min-width:0}
.fin-step-title{font-family:var(--font-ui);font-weight:600;font-size:calc(13.5px * var(--fs-scale,1));color:var(--ink);line-height:1.25}
.fin-step-role{font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:0.12em;text-transform:uppercase;color:var(--ink-mute)}
.fin-step-text{font-size:calc(12px * var(--fs-scale,1));color:var(--ink-soft);line-height:1.4;margin:2px 0 0}

/* --- fin-empty: quiet framed empty state ---------------------------------- */
.fin-empty{display:flex;flex-direction:column;gap:3px;padding:14px 16px;background:transparent;border:1px dashed var(--ink-faint);margin-top:10px}
.fin-empty-label{font-family:var(--font-mono);font-weight:500;font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:0.14em;text-transform:uppercase;color:var(--ink-mute)}
.fin-empty-text{font-size:calc(13px * var(--fs-scale,1));color:var(--ink-soft);line-height:1.5;max-width:64ch;margin:0}
.fin-empty-text a{color:var(--ink);text-decoration:underline;text-underline-offset:2px}
.fin-empty-text a:hover{color:var(--baobab)}

/* --- fin two-column review layout (travel) -------------------------------- */
.fin-surface .ds-review-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(240px,0.42fr);gap:14px;align-items:start}
@media (max-width:900px){.fin-surface .ds-review-grid{grid-template-columns:1fr}}
.fin-surface .ds-review-block{background:var(--paper);border:1px solid var(--hairline);padding:14px 16px;display:flex;flex-direction:column;gap:8px}
.fin-surface .ds-review-block .ds-table-header{padding-top:0}
.fin-surface .ds-review-aside{display:flex;flex-direction:column;gap:14px}
.fin-foot-link{display:inline-block;font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale,1));letter-spacing:0.06em;color:var(--ink);text-decoration:none;border-bottom:1px solid var(--hairline);padding:2px 0;margin-top:4px}
.fin-foot-link:hover{color:var(--baobab);border-color:var(--baobab)}

/* --- dropzone (receipts intake) — refined ds-process-dropzone ------------- */
.fin-surface .ds-process-dropzone-area{min-height:88px;border:1px dashed var(--ink-mute);background:var(--paper);flex-direction:column;gap:4px;text-align:center}
.fin-surface .ds-process-dropzone-area:hover{border-color:var(--ink);background:var(--paper-2)}
.fin-surface .ds-process-dropzone-hint{font-size:calc(11px * var(--fs-scale,1));letter-spacing:0.06em}
.fin-dropzone-title{font-family:var(--font-ui);font-weight:600;font-size:calc(13.5px * var(--fs-scale,1));color:var(--ink)}

/* --- fin-surface form rhythm ---------------------------------------------- */
.fin-surface .ds-form{margin-top:0;gap:14px}
.fin-surface .ds-fieldset{padding:18px 20px;gap:12px;border-radius:0}
.fin-surface .ds-legend{color:var(--ink);letter-spacing:0.14em}
.fin-surface .ds-legend .ds-mono{color:var(--ink-mute);margin-right:8px}

/* --- fin-surface empty + loading states ----------------------------------- */
.fin-surface .ds-empty-state{border:1px dashed var(--ink-faint);background:transparent;padding:16px 18px;font-size:calc(13px * var(--fs-scale,1));color:var(--ink-soft);margin-top:10px}

/* --- fin-intake: compact receipts intake (2026-08-08 Ben review round 1) --- */
.fin-intake .ds-field-row-2{grid-template-columns:repeat(2,minmax(0,320px));justify-content:start}
.fin-intake .ds-field .ds-input,.fin-intake .ds-field .ds-select{max-width:460px}
.fin-intake .ds-process-dropzone-area{min-height:60px;max-width:640px}
.fin-receipt-list{display:flex;flex-direction:column;gap:8px;margin-top:10px;max-width:640px}
.fin-receipt{display:flex;align-items:center;gap:12px;padding:8px 10px;border:1px solid var(--hairline);background:var(--paper)}
.fin-receipt-thumb{width:52px;height:52px;object-fit:cover;border:1px solid var(--hairline);background:var(--paper-2);flex:0 0 auto}
.fin-receipt-pdf{display:inline-flex;align-items:center;justify-content:center;width:52px;height:52px;border:1px solid var(--hairline);background:var(--paper-2);font-family:var(--font-mono);font-size:10px;letter-spacing:0.1em;color:var(--ink-mute);flex:0 0 auto}
.fin-receipt-body{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
.fin-receipt-name{font-family:var(--font-ui);font-weight:600;font-size:calc(13px * var(--fs-scale,1));color:var(--ink);word-break:break-all;line-height:1.3}
.fin-receipt-meta{font-family:var(--font-mono);font-size:calc(10.5px * var(--fs-scale,1));color:var(--ink-mute)}

/* travel/claims tables: first/last cells align flush with the card edge */
.fin-surface .ds-table-section .ds-records-compact th:first-child,
.fin-surface .ds-table-section .ds-records-compact td:first-child{padding-left:0}
.fin-surface .ds-table-section .ds-records-compact th:last-child,
.fin-surface .ds-table-section .ds-records-compact td:last-child{padding-right:0}

/* inside fin-surface cards the card is the frame — strip the app-level
   ds-table-scroll box (border/radius/bg/viewport cap from globals.css) */
.fin-surface .ds-table-section .ds-table-scroll{border:0;border-radius:0;background:transparent;max-height:none;overflow-y:visible}

/* PKG-A1 / R01: stream tables opt in to a window-fit pane. Claims/travel
   keep the overflow-y:visible rule above (no .fin-table-viewport). */
.fin-surface .ds-table-section .ds-table-scroll.fin-table-viewport{
  max-height: calc(100vh - 280px);
  overflow: auto;
  scrollbar-width: thin;
}

/* FIX-A1: finance stream workbench. Title/tabs stay in view; only the
   table pane scrolls. .page-inner padding-bottom:96px plus main.body
   padding-bottom:64px used to force an outer scroll at short viewports.
   Opt-in via .fin-stream-fit so other module-workbench routes are unchanged. */
.fin-stream-fit.page-inner.module-workbench{
  padding-bottom:8px;
  display:flex;
  flex-direction:column;
  min-height:0;
}
.shell:has(> .body .fin-stream-fit) > .body{
  display:flex;
  flex-direction:column;
  min-height:0;
}
@media (min-width:861px){
  .shell:has(> .body .fin-stream-fit) > .body{overflow:hidden}
  .fin-stream-fit.page-inner.module-workbench{
    flex:1 1 auto;
    max-height:100%;
    overflow:hidden;
  }
  .fin-stream-fit > .ds-table-section{
    flex:1 1 auto;
    min-height:0;
    display:flex;
    flex-direction:column;
    overflow:hidden;
  }
  .fin-surface.fin-stream-fit .ds-table-section .ds-table-scroll.fin-table-viewport{
    flex:1 1 auto;
    min-height:0;
    max-height:none;
    overflow:auto;
  }
}
@media (max-width:860px){
  /* globals.css leaves .shell at height:100vh and main.body overflow:visible
     at this breakpoint, so documentElement max-scroll is 0 and rows below
     the fold are unreachable. Let this route grow and scroll; also cap the
     pane so wheel/touch on the table still moves rows. */
  .shell:has(> .body .fin-stream-fit){
    height:auto;
    min-height:100vh;
    overflow:visible;
  }
  .shell:has(> .body .fin-stream-fit) > .body{
    height:auto;
    overflow:visible;
    min-height:0;
  }
  .fin-surface.fin-stream-fit .ds-table-section .ds-table-scroll.fin-table-viewport{
    max-height:min(62dvh, calc(100dvh - 180px));
    overflow:auto;
  }
}
.fin-table-viewport .ds-records-compact-sticky thead th{
  background: var(--paper);
}
.fin-table-viewport .ds-records-compact-sticky thead tr.fin-colfilter th{
  position: static;
  top: auto;
  z-index: auto;
}

/* --- v3 design-review fixes (Ben 2026-08-08 18:47) ---------------------- */
/* Row hairline was broken under row-title th cells (td-only border) — the
   "decorative dashes" defect. Unify every body cell. */
.fin-surface .ds-records-compact tbody th{padding:9px 10px;border-bottom:1px solid var(--hairline);vertical-align:middle}
.fin-surface .ds-records-compact tbody tr:last-child th{border-bottom:0}
/* Country selector lives in the dark top bar */
.topbar-actions{display:flex;align-items:center;gap:10px}
.topbar-actions .ds-select{padding:7px 10px;font-size:13px;background:var(--paper);color:var(--ink);border:1px solid var(--hairline);min-width:150px}
/* Record modal: constrained width; read-only facts as text rows, not inputs */
.fin-modal{max-width:720px;margin:24px auto}
.fin-surface .ds-review-field{display:flex;flex-direction:row;gap:10px;padding:5px 0;border-bottom:0}
.fin-surface .ds-review-label{flex:0 0 150px;font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);padding-top:2px}
.fin-surface .ds-review-value{font-size:13.5px;color:var(--ink);font-variant-numeric:tabular-nums}
/* Intake fields: full-width two-column grid aligned with card content */
.fin-intake .ds-field-row-2{grid-template-columns:repeat(2,minmax(0,1fr));max-width:760px;justify-content:stretch}
.fin-intake .ds-field .ds-input,.fin-intake .ds-field .ds-select{max-width:none}
.fin-intake .ds-process-dropzone-area{max-width:760px}
.fin-intake .fin-receipt-list{max-width:760px}
.fin-intake .ds-table-section > .ds-field,.fin-intake .ds-table-section > .ds-form > .ds-field{max-width:760px}

/* --- v4 design round 2 (Ben 2026-08-09) ---------------------------------- */
/* right-aligned numeric/id body cells */
.fin-surface .ds-records-compact td.ds-mono-num,.fin-surface .ds-records-compact th.ds-mono-num{text-align:right}
/* column-filter row under table headers */
.fin-colfilter th{padding:4px 10px 8px;border-bottom:1px solid var(--ink)}
.fin-colfilter .ds-input,.fin-colfilter .ds-select{width:100%;padding:4px 7px;font-size:11.5px;font-family:var(--font-ui);border-radius:2px}
/* compact two-column fact grid in record popups */
.fin-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:28px;row-gap:2px;margin:2px 0 10px}
.fin-facts .ds-review-field{padding:4px 0}
.fin-facts .ds-review-label{flex:0 0 120px}
/* searchable combobox mock (GL accounts etc.) */
.fin-combo{position:relative;display:flex;flex-direction:column;gap:0}
.fin-combo-panel{border:1px solid var(--ink-mute);border-top:0;background:var(--paper);display:flex;flex-direction:column}
.fin-combo-item{padding:6px 10px;font-size:13px;border-bottom:1px solid var(--hairline);display:flex;justify-content:space-between;gap:12px}
.fin-combo-item:last-child{border-bottom:0}
.fin-combo-item.fin-combo-active{background:var(--paper-2)}
.fin-combo-more{padding:5px 10px;font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;color:var(--ink-mute)}
/* receipt-driven form states */
.fin-extracted{display:inline-block;font-family:var(--font-mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);margin-top:2px}
.fin-missing .ds-input,.fin-missing .ds-select{border-color:var(--baobab)}
.fin-missing .fin-extracted{color:var(--baobab)}

/* --- v5 modern claim intake (Ben 2026-08-09 04:05) ----------------------- */
.fin-sources{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px;max-width:900px}
.fin-source{display:flex;flex-direction:column;gap:4px;padding:16px;border:1px dashed var(--ink-mute);background:var(--paper);cursor:pointer;text-align:left}
.fin-source:hover{border-color:var(--ink);background:var(--paper-2)}
.fin-source-title{font-family:var(--font-ui);font-weight:600;font-size:calc(14px * var(--fs-scale,1));color:var(--ink)}
.fin-source-hint{font-size:calc(12px * var(--fs-scale,1));color:var(--ink-mute);line-height:1.45}
.fin-source-on{align-self:flex-start;margin-top:2px}
/* auto-created line items: editable cells inside the table */
.fin-lineitems td .ds-select,.fin-lineitems td .ds-input{padding:5px 8px;font-size:12.5px;width:100%;min-width:120px}
.fin-lineitems td.fin-missing .ds-select,.fin-lineitems td.fin-missing .ds-input{border-color:var(--baobab)}
/* DXG case header: title and step stacked, never inline (WP-A1 2026-08-24).
   Consumed via the DXG CDS manifest (case.header / case.step-title) on every
   DXG case surface. */
.fin-case-header{display:flex;flex-direction:column;gap:2px;margin-bottom:18px}
.fin-case-step{font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale,1));letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-soft)}

/* ---------------------------------------------------------------------------
   Sales CRM deal popup as a WORKING SURFACE (design v5, MMDB-2158, Ben
   2026-08-10). The xl dialog splits into a working main column and a fixed
   account rail; every block below is editable in place — the line table, the
   term/date grids, the owned next action. Satellite records (account,
   person, proposal) open their OWN dialogs; nothing here reports read-only.
   --------------------------------------------------------------------------- */
.ds-modal.ds-modal--dialog.ds-modal--crm.ds-modal--crm-xl{width:1120px}
.ds-modal--crm-xl .ds-modal-dialog-body{padding:0}
.ds-crm-popgrid{display:grid;grid-template-columns:minmax(0,1fr) 320px}
.ds-crm-popmain{padding:14px 18px;min-width:0}
.ds-crm-poprail{border-left:1px solid var(--hairline);background:var(--paper-2);padding:14px 16px;min-width:0}
@media(max-width:1180px){.ds-crm-popgrid{grid-template-columns:1fr}
.ds-crm-poprail{border-left:0;border-top:1px solid var(--hairline)}}
.ds-crm-sectrow{display:flex;align-items:center;gap:8px;margin:12px 0 6px}
.ds-crm-sectrow:first-child{margin-top:0}
.ds-crm-sect{font-family:var(--font-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute)}
.ds-crm-linetable{width:100%;border-collapse:collapse;margin-bottom:6px}
.ds-crm-linetable th{font-family:var(--font-mono);font-size:8.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint);text-align:left;padding:0 6px 5px 0;border-bottom:1px solid var(--ink)}
.ds-crm-linetable th.ds-crm-linetable-num{text-align:right}
.ds-crm-linetable td{font-size:12px;padding:4px 6px 4px 0;border-bottom:1px solid var(--hairline-soft);vertical-align:middle}
.ds-crm-linetable td .ds-select,.ds-crm-linetable td .ds-input{width:100%;padding:5px 7px;font-size:12px}
.ds-crm-linetable td.ds-crm-linetable-num{text-align:right;font-family:var(--font-mono);font-size:11.5px;white-space:nowrap}
.ds-crm-linetable td.ds-crm-linetable-num .ds-input{text-align:right;font-family:var(--font-mono);font-size:11.5px}
.ds-crm-linetable td.ds-crm-linetable-rm{width:26px;text-align:center}
.ds-crm-linetable tr.ds-crm-linetable-total td{border-bottom:0;padding-top:7px;font-weight:600}
.ds-crm-linetable tr.ds-crm-linetable-total td.ds-crm-linetable-num{font-family:var(--font-display);font-style:italic;font-size:15px}
.ds-crm-linetable-rmbtn{background:none;border:0;color:var(--ink-faint);cursor:pointer;font-size:13px;line-height:1;padding:0}
.ds-crm-linetable-rmbtn:hover{color:var(--baobab)}
.ds-crm-addline{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--baobab);background:none;border:1px dashed var(--hairline);border-radius:var(--ds-radius-sm);padding:5px 10px;cursor:pointer;margin-bottom:10px}
.ds-crm-addline:hover{border-color:var(--baobab)}
.ds-crm-termgrid{display:grid;grid-template-columns:1fr 1fr 90px 1fr;gap:8px;margin-bottom:10px}
.ds-crm-dategrid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-bottom:10px;background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);padding:9px 10px}
.ds-crm-nextgrid{display:grid;grid-template-columns:minmax(0,1fr) 128px 130px;gap:8px;margin-bottom:10px}
.ds-crm-trail{display:flex;align-items:center;flex-wrap:wrap}
.ds-crm-trail-step{display:flex;align-items:center;gap:6px}
.ds-crm-trail-dot{width:7px;height:7px;border-radius:50%;background:var(--signal-grass)}
.ds-crm-trail-dot-now{background:var(--signal-amber)}
.ds-crm-trail-dot-next{background:var(--hairline)}
.ds-crm-trail-lbl{font-family:var(--font-mono);font-size:9px;color:var(--ink-mute);white-space:nowrap}
.ds-crm-trail-sep{width:24px;height:1px;background:var(--hairline);margin:0 7px}
.ds-crm-standing{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--hairline);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);overflow:hidden;margin-bottom:11px}
.ds-crm-standing-cell{background:var(--paper);padding:7px 10px}
.ds-crm-standing-k{font-family:var(--font-mono);font-size:8px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint);display:block;margin-bottom:2px}
.ds-crm-standing-v{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:13.5px;white-space:nowrap}
.ds-crm-standing-note{font-family:var(--font-mono);font-style:normal;font-weight:400;font-size:8.5px;color:var(--ink-mute)}
.ds-crm-histlist{list-style:none;margin:0 0 11px;padding:0}
.ds-crm-histrow{display:flex;align-items:baseline;gap:7px;padding:5px 0;border-bottom:1px solid var(--hairline-soft);width:100%;background:none;border-left:0;border-right:0;border-top:0;text-align:left;cursor:pointer;font:inherit;color:inherit}
.ds-crm-histrow:last-child{border-bottom:0}
.ds-crm-histrow:hover .ds-crm-histrow-ref{color:var(--baobab)}
.ds-crm-histrow-static{cursor:default}
.ds-crm-histrow-ref{font-family:var(--font-mono);font-size:10.5px}
.ds-crm-histrow-state{font-family:var(--font-mono);font-size:8.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-mute)}
.ds-crm-histrow-state-ok{color:var(--signal-grass)}
.ds-crm-histrow-state-warn{color:var(--signal-amber)}
.ds-crm-histrow-state-bad{color:var(--baobab)}
.ds-crm-histrow-spacer{flex:1}
.ds-crm-histrow-val{font-family:var(--font-mono);font-size:10.5px;white-space:nowrap}
.ds-crm-histrow-age{font-family:var(--font-mono);font-size:8.5px;color:var(--ink-faint);min-width:24px;text-align:right}
/* --- HR reports (2026-08-10) — semantic objects the HR reporting surfaces
   point at: the quiet coverage/provenance line under a report header, the
   permit due-date marker, the country share bar, the group total row, and the
   row-click affordance the standing table rule requires. --------------- */
.ds-hrrep-note{font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale,1));letter-spacing:.02em;line-height:1.5;color:var(--ink-soft);margin:0 0 10px;max-width:120ch}
.ds-hrrep-note a{color:var(--baobab);text-decoration:none;border-bottom:1px solid var(--hairline)}
.ds-hrrep-note a:hover{border-bottom-color:var(--baobab)}
.ds-hrrep-due{display:inline-block;font-family:var(--font-mono);font-weight:600;font-size:calc(10.5px * var(--fs-scale,1));padding:1px 6px;border-radius:2px;border:1px solid var(--hairline);color:var(--ink-soft)}
.ds-hrrep-due--soon{color:var(--signal-amber);border-color:var(--signal-amber)}
.ds-hrrep-due--expired{color:var(--baobab-on);background:var(--baobab);border-color:var(--baobab)}
.ds-hrrep-bar{display:inline-block;width:64px;height:6px;margin-right:8px;background:var(--paper);border:1px solid var(--hairline);vertical-align:middle}
.ds-hrrep-bar-fill{display:block;height:100%;background:var(--ink)}
.ds-hrrep-bar-fill--max{background:var(--baobab)}
.ds-hrrep-bar-fill[data-share="0"]{width:2%}
.ds-hrrep-bar-fill[data-share="1"]{width:10%}
.ds-hrrep-bar-fill[data-share="2"]{width:20%}
.ds-hrrep-bar-fill[data-share="3"]{width:30%}
.ds-hrrep-bar-fill[data-share="4"]{width:40%}
.ds-hrrep-bar-fill[data-share="5"]{width:50%}
.ds-hrrep-bar-fill[data-share="6"]{width:60%}
.ds-hrrep-bar-fill[data-share="7"]{width:70%}
.ds-hrrep-bar-fill[data-share="8"]{width:80%}
.ds-hrrep-bar-fill[data-share="9"]{width:90%}
.ds-hrrep-bar-fill[data-share="10"]{width:100%}
.ds-hrrep-total>td{border-top:2px solid var(--ink);font-weight:700;background:var(--paper-2)}
.ds-rowclick tbody tr{cursor:pointer}
.ds-rowclick tbody tr:hover{background:var(--paper-2)}
.ds-hrrep-rowopen>td{background:var(--paper-2);box-shadow:inset 2px 0 0 var(--baobab)}

/* ============================================================================
   HR REPORTING VISUAL LAYER — record card, urgency marker, share bar, totals,
   reporting-table rhythm and filter-band hierarchy.
   Branch design/hr-reports-visual-20260810. Appended last so these rules win
   on cascade order without raising specificity anywhere.
   ========================================================================= */

/* --- Record card -----------------------------------------------------------
   The shared RowPopup body laid out as a designed record instead of a flat
   run of ~20 label/value pairs. Consumed only through the DS objects exported
   by RowPopup.tsx (PopupLead / PopupGroup / PopupRecordField); every existing
   RowPopup consumer uses .row-popup-field and is untouched by all of this. */
.ds-modal.ds-modal--dialog.ds-modal--record{width:min(760px,calc(100vw - 48px));min-width:0;max-width:calc(100vw - 48px)}
.ds-modal--record .ds-modal-dialog-titlebar{padding:11px 22px}
.ds-modal--record .ds-modal-dialog-body{padding:0 22px 16px}
.ds-modal--record .ds-modal-dialog-foot{padding:10px 22px 12px}

.ds-record{display:block;padding-top:14px}

/* Lead: what the reader came for. Identity and posting on the left, the one
   date that drives action (permit expiry) on the right, and a left rule that
   carries the urgency so the whole card is readable at a glance. */
.ds-record-lead{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;padding:10px 14px;background:var(--paper);border:1px solid var(--hairline);border-left:3px solid var(--ink)}
.ds-record-lead--warn{border-left-color:var(--signal-amber)}
.ds-record-lead--alert{border-left-color:var(--baobab)}
.ds-record-lead-id{min-width:0}
.ds-record-lead-main{display:block;font-family:var(--font-ui);font-weight:650;font-size:calc(16px * var(--fs-scale,1));line-height:1.2;color:var(--ink)}
.ds-record-lead-sub{display:block;margin-top:5px;font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1));letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute);line-height:1.4}
.ds-record-lead-flag{flex:none;text-align:right;white-space:nowrap}
.ds-record-lead-flag-l{display:block;font-family:var(--font-mono);font-size:calc(9px * var(--fs-scale,1));letter-spacing:.12em;text-transform:uppercase;color:var(--ink-mute)}
.ds-record-lead-flag-v{display:block;margin-top:3px;font-family:var(--font-mono);font-weight:600;font-size:calc(13.5px * var(--fs-scale,1));font-variant-numeric:tabular-nums;letter-spacing:.02em;color:var(--ink)}
.ds-record-lead-flag-n{display:block;margin-top:5px}

/* Groups: three named sections instead of one undifferentiated list. */
.ds-record-group{margin-top:13px}
.ds-record-group-h{display:flex;align-items:center;gap:10px;margin:0 0 5px;font-family:var(--font-mono);font-weight:500;font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute)}
.ds-record-group-h::after{content:"";flex:1 1 auto;height:1px;background:var(--hairline)}
.ds-record-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:28px;row-gap:0}
.ds-record-field{display:grid;grid-template-columns:98px minmax(0,1fr);gap:10px;align-items:baseline;padding:4px 0;border-bottom:1px solid color-mix(in srgb,var(--hairline) 60%,transparent);min-width:0}
.ds-record-field--wide{grid-column:1 / -1}
.ds-record-field-l{font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);line-height:1.5}
.ds-record-field-v{font-family:var(--font-ui);font-size:calc(13px * var(--fs-scale,1));line-height:1.4;color:var(--ink);min-width:0;overflow-wrap:anywhere}
.ds-record-field-v--mono{font-family:var(--font-mono);font-size:calc(11.5px * var(--fs-scale,1));letter-spacing:.04em;color:var(--ink-soft);font-variant-numeric:tabular-nums}
.ds-record-field--empty .ds-record-field-v{color:var(--ink-mute)}
@media (max-width:640px){
  .ds-record-fields{grid-template-columns:minmax(0,1fr)}
}

/* Foot: provenance on the left, actions on the right. Scoped with :has() so a
   RowPopup rendered without a footnote keeps exactly its current foot. */
.ds-modal-dialog-foot:has(> .ds-modal-dialog-footnote){display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}
.ds-modal-dialog-footnote{font-family:var(--font-mono);font-size:calc(9.5px * var(--fs-scale,1));letter-spacing:.05em;line-height:1.4;color:var(--ink-mute);min-width:0;overflow-wrap:anywhere}

/* --- Permit urgency marker -------------------------------------------------
   Was a bordered chip in every row of a numeric column, which broke the
   column's rhythm and made 41 expired rows a wall of solid red. Now the
   number stays a number; urgency is carried by weight plus a tinted ground,
   and the wording ("41 overdue") still states it without relying on colour. */
.ds-hrrep-due{display:inline-block;padding:1px 0;border:0;border-radius:0;background:none;font-family:var(--font-mono);font-weight:500;font-size:calc(11.5px * var(--fs-scale,1));letter-spacing:.02em;font-variant-numeric:tabular-nums;color:var(--ink-soft)}
.ds-hrrep-due--soon{padding:1px 6px;border-radius:2px;font-weight:600;color:var(--signal-amber);background:color-mix(in srgb,var(--signal-amber) 15%,transparent)}
.ds-hrrep-due--expired{padding:1px 6px;border-radius:2px;font-weight:700;color:var(--baobab);background:color-mix(in srgb,var(--baobab) 13%,transparent);border:0}

/* --- Country share bar -----------------------------------------------------
   Borderless track so the fill length is the only thing the eye measures, and
   the percentage next to it is tabular and right-aligned so the numbers form
   a real column instead of drifting with the bar. */
.ds-hrrep-bar{width:78px;height:7px;margin-right:10px;border:0;border-radius:1px;background:color-mix(in srgb,var(--ink) 9%,transparent)}
.ds-hrrep-bar-fill{border-radius:1px;background:var(--ink)}
.ds-hrrep-bar-fill--max{background:var(--baobab)}
.ds-hrrep-bar + .ds-mono{display:inline-block;min-width:4ch;text-align:right;font-variant-numeric:tabular-nums;color:var(--ink)}

/* --- Total row -------------------------------------------------------------
   Sits on plain paper so it separates from the zebra instead of matching the
   even rows, one ink rule above it, label as a quiet caption, figures in full
   ink so the group line is the strongest number row on the page. */
.ds-hrrep-total > td{padding-top:9px;padding-bottom:9px;border-top:1px solid var(--ink);border-bottom:0;background:var(--paper);font-weight:600;color:var(--ink)}
.ds-hrrep-total > td:first-child{font-family:var(--font-mono);font-size:calc(10px * var(--fs-scale,1));letter-spacing:.14em;text-transform:uppercase;color:var(--ink-mute)}
.ds-hrrep-total > td.ds-mono-num{color:var(--ink);font-weight:600}
.ds-hrrep-total > td.ds-mono{color:var(--ink);font-weight:600}

/* --- Coverage note ---------------------------------------------------------
   Tighter leading and margin: this is a provenance line above a work list,
   not body copy. */
.ds-hrrep-note{margin:0 0 5px;line-height:1.45;max-width:110ch}
.ds-rowcount{margin:0 0 6px}

/* --- Reporting table rhythm ------------------------------------------------
   Scoped to .ds-report-table, i.e. the reporting tables only. Rows lose 6px of
   dead height, the leading column (the record's name) carries weight, headers
   read one step darker than the muted body identifiers, and a clickable row
   now has a hover state that is actually distinguishable from the zebra it
   sits in — previously hover and the even-row tint were the same value, so
   hovering an even row changed nothing. */
.ds-report-table thead th{padding-top:7px;padding-bottom:7px;color:var(--ink-soft)}
.ds-report-table tbody td{padding-top:7px;padding-bottom:7px}
.ds-report-table tbody td:first-child{font-weight:600;color:var(--ink)}
.ds-report-table tbody td.ds-empty-row{font-weight:500;color:var(--ink-mute)}
.ds-report-table tbody td.ds-mono,.ds-report-table tbody td .ds-mono{font-variant-numeric:tabular-nums}

/* --- Filter band hierarchy -------------------------------------------------
   A .ds-filterbar-group whose children are all chips IS a segmented control —
   one choice, several options — so it now renders as one joined control
   instead of N free-standing buttons. That alone makes the band's structure
   readable (scope | window | unit | search) without adding any chrome. */
.ds-filterbar-group:not(:has(> :not(.ds-filter-chip))){gap:0}
.ds-filterbar-group:not(:has(> :not(.ds-filter-chip))) > .ds-filter-chip{position:relative;margin-left:-1px;border-radius:0}
.ds-filterbar-group:not(:has(> :not(.ds-filter-chip))) > .ds-filter-chip:first-child{margin-left:0;border-top-left-radius:2px;border-bottom-left-radius:2px}
.ds-filterbar-group:not(:has(> :not(.ds-filter-chip))) > .ds-filter-chip:last-child{border-top-right-radius:2px;border-bottom-right-radius:2px}
.ds-filterbar-group > .ds-filter-chip-active{z-index:1}
/* Hover was styled identically to the selected chip, so on a segmented control
   the selection was ambiguous the moment the pointer entered the group. */
.ds-filterbar .ds-filter-chip:hover:not(.ds-filter-chip-active){color:var(--ink);background:color-mix(in srgb,var(--ink) 7%,transparent);border-color:var(--ink-mute)}
/* The first group is the report's scope — the choice everything else hangs
   off — so it carries a definite border while the later groups stay quiet. */
.ds-filterbar > .ds-filterbar-group:first-child > .ds-filter-chip{border-color:var(--ink-mute)}
.ds-filterbar-sep{margin:0 10px}
.module-workbench-reporting > .ds-filterbar{row-gap:6px;margin:6px 0 12px;padding-bottom:12px}
/* Twelve facet selects drawn with a solid ink border read as twelve equally
   loud commands. Hairline at rest, ink on hover, value still in full ink. */
.ds-filterbar .ds-unitsel{padding:6px 10px;border-color:var(--hairline);color:var(--ink-soft)}
.ds-filterbar .ds-unitsel:hover{border-color:var(--ink);color:var(--ink)}
.ds-filterbar .ds-unitsel b{color:var(--ink)}
.ds-filterbar .ds-filter-input{max-width:240px;font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale,1))}

/* --- Reporting page title --------------------------------------------------
   A 30px display title on a working list is a hero header. Reporting titles
   come down to the size .module-workbench-report already uses, which returns
   roughly one more table row per screen. */
main.body .module-workbench-reporting .module-title,
.portal-main .module-workbench-reporting .module-title{font-size:calc(22px * var(--fs-scale,1));line-height:1.16;letter-spacing:-0.01em}
.module-workbench-reporting .module-workbench-header{margin-bottom:2px}

/* --- Round 2: rules that the app-level `globals.css` layer was winning ------
   Three of the round-1 rules above never reached the page, and the reason is
   worth recording rather than repeating: `src/app/globals.css` carries a bare
   `h1{font-size:clamp(26px,2.6vw,34px)!important}` heading cap and a set of
   `tr:nth-child(2n) > td{background:…!important}` zebra/hover rules. Anything
   the design system says about a report title or a report row's ground has to
   be stated at that weight to be heard. (The row-hover ground itself is fine —
   globals already gives it `color-mix(paper-2 66%, ink 10%)`, clearly above
   the band — so the design system only adds the click affordance.) */

/* Reporting titles: a 33px display heading over a work list is a hero. */
main.body .module-workbench-reporting .module-title,
.portal-main .module-workbench-reporting .module-title,
.module-workbench-dense.module-workbench-reporting .module-title{font-size:calc(22px * var(--fs-scale,1))!important;line-height:1.16!important;letter-spacing:-0.01em}

/* The workbench is a grid, so the space between the title, the filter band,
   the coverage note, the row count and the table is grid row-gap, not the
   margins those blocks declare. On a report that stack costs a fifth of the
   first screen before a single row of data appears. */
.module-workbench.module-workbench-reporting{row-gap:6px}
.module-workbench-reporting .module-workbench-header{padding-top:2px;padding-bottom:4px}

/* Row rhythm: the padding was already 7px — the height was in the leading.
   1.32 on a 13.5px cell takes the row pitch from 36px to ~31px, which is two
   more employees per screen on every reporting table. */
.ds-report-table tbody td{padding-top:6px;padding-bottom:6px;line-height:1.32}
.ds-report-table thead th{padding-top:6px;padding-bottom:6px;line-height:1.32}
/* A solid zebra band AND a hairline under every row is the same boundary drawn
   twice. Keep the band, keep one rule under the header, drop the rest. */
.ds-report-table tbody td{border-bottom:0}
.ds-report-table thead th{border-bottom:1px solid var(--ink)}
/* Click affordance the zebra cannot express: the row the pointer is on grows a
   baobab edge. background:!important in globals owns the ground, so this rides
   on box-shadow instead of fighting it. */
.ds-report-table.ds-rowclick tbody tr:hover > td:first-child{box-shadow:inset 2px 0 0 var(--baobab)}

/* Search sits at the end of the band whichever row it wraps onto. */
.ds-filterbar .ds-filter-input{margin-left:auto;min-width:210px;max-width:260px}
.ds-filterbar-spacer{flex:1 1 0}

/* Record card: the footnote and the actions share the footer row instead of
   the provenance line pushing the action onto a line of its own. */
.ds-modal-dialog-foot:has(> .ds-modal-dialog-footnote) > .ds-modal-dialog-footnote{flex:1 1 240px}
.ds-modal-dialog-foot:has(> .ds-modal-dialog-footnote) > .ds-actions{flex:0 0 auto;margin-left:auto}

/* --- Round 3 --------------------------------------------------------------
   Found by scrolling the deployed preview rather than reading the markup:
   `.ds-table-scroll` sets overflow-x:auto, which makes overflow-y compute to
   auto as well, so a reporting table taller than its box scrolls INSIDE that
   box. Three rows down and the column headers are gone — on a ten-column
   numeric table that is the difference between reading a figure and guessing
   which column it is in. The design system already solves this for
   .ds-records-compact-sticky; reporting tables get the same treatment. */
.ds-table-scroll .ds-report-table thead th{position:sticky;top:0;z-index:2;background:var(--paper);box-shadow:inset 0 -1px 0 var(--ink)}
/* The group total is the line the reader is comparing every country against,
   so it stays on screen while the list scrolls under it. */
.ds-table-scroll .ds-report-table tfoot .ds-hrrep-total > td{position:sticky;bottom:0;z-index:2;background:var(--paper);box-shadow:inset 0 1px 0 var(--ink)}
.ds-table-scroll .ds-report-table tfoot .ds-hrrep-total > td{border-top:0}

/* Share bar: the longest bar was drawn in baobab. On a headcount table red
   reads as "this one is a problem", which is not what "Angola has the most
   employees" means. Length carries the comparison; the largest simply gets
   full ink and the rest sit one step back. */
.ds-hrrep-bar-fill{background:color-mix(in srgb,var(--ink) 62%,transparent)}
.ds-hrrep-bar-fill--max{background:var(--ink)}

/* The scope line belongs to the same quiet meta band as the coverage note and
   the row count, not to body copy. */
.ds-filterbar-stats{font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale,1));letter-spacing:.03em;color:var(--ink-soft)}

/* Fifteen dashed outlines above a table is the loudest thing on the employee
   report and it is a column picker. Solid hairline, tighter, quieter. */
.ds-hiddencols{gap:5px;margin:0 0 4px}
.ds-hiddencols-chip{padding:3px 8px;border:1px solid var(--hairline);font-size:calc(9px * var(--fs-scale,1))}

/* Record card title bar: the identifier chip sat marooned in the middle
   because both it and the dismiss button claimed the auto margin. */
.ds-modal--record .ds-modal-dialog-titlebar-chip{margin-left:auto}
.ds-modal--record .ds-modal-dialog-titlebar-chip + .ds-modal-dialog-dismiss{margin-left:14px}

/* A group where the master holds nothing states that once instead of drawing
   six em dashes. */
.ds-record-none{grid-column:1 / -1;padding:4px 0;font-family:var(--font-ui);font-size:calc(12.5px * var(--fs-scale,1));color:var(--ink-mute)}

/* DXG2 presentation overlay support (2026-08-11): sticky step-form action bar
   and highlight-rule row tint. Same tokens as the shell globals. */
.ds-actions-sticky { position: sticky; bottom: 0; background: var(--paper, #FAFAF6); border-top: 1px solid var(--hairline, #E4E0D2); padding: 10px 0; margin-bottom: 0; z-index: 5; }
.ds-row-warn td { background: var(--signal-amber-bg, #FBF0D6); }

/* --- Odoo workbench additions (2026-08-15, MMDB-2193 round 2) -------------
   Semantic components authored centrally so app code stays a pure pointer.
   ds-modal-wide: workbench modals where a data table owns the height.
   ds-meta-strip/-item: one-row label/value metadata (NOT readonly inputs).
   ds-cell-sub: muted secondary line inside a table cell (dirty-master email,
   staged-edit annotation). ds-input-cell: compact numeric cell editor.
   ds-button-ghost: quiet tertiary action. Modal-header buttons get paper
   ink because the header is dark (fixes invisible Close). */
/* The shell's globals.css restyles .ds-modal-body as a small fixed-centered
   dialog, which detaches it from this full-screen modal column and leaves the
   dark header stranded across the viewport top (live defect, 2026-08-15).
   For the wide workbench variant the body goes back into the column flow,
   centered by margins, scrolling under a sticky header. */
.ds-modal-wide .ds-modal-body {
  position: static; top: auto; left: auto; transform: none;
  width: min(1160px, 96vw); max-height: none; margin: 0 auto; align-self: center;
  flex: 1; overflow-y: auto;
  border: 0; border-radius: 0; box-shadow: none; background: var(--paper);
}
.ds-modal-wide { position: fixed; inset: 0; z-index: 210; }
.ds-input-cell-edited { border-left: 3px solid var(--baobab); }
.ds-modal-wide .module-actions-bottom { position: sticky; bottom: 0; background: var(--paper); padding-top: 10px; border-top: 1px solid var(--hairline); }
.ds-meta-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 26px; padding: 8px 0; }
.ds-meta-item { display: inline-flex; align-items: baseline; gap: 8px; }
.ds-meta-item .ds-label { margin: 0; }
.ds-cell-sub { display: block; font-size: calc(10.5px * var(--fs-scale, 1)); color: var(--ink-mute); margin-top: 2px; }
.ds-input-cell { width: 104px; padding: 5px 8px; text-align: right; font-family: var(--font-mono); font-size: calc(12px * var(--fs-scale, 1)); }
.ds-button-ghost { background: transparent; color: var(--ink-soft); border-color: transparent; }
.ds-button-ghost:hover { border-color: var(--hairline); color: var(--ink); }
.ds-modal-header .ds-button-secondary { color: var(--paper); border-color: var(--paper); background: transparent; }
/* Best price in a comparison — emphasis by ink weight, deliberately NOT
   baobab (red = negative/destructive across this DS; see ds-hrrep-bar-fill
   precedent). */
.ds-cell-best { background: var(--paper-2); font-weight: 700; box-shadow: inset 2px 0 0 var(--ink); }

/* TASK-FLOW-01 cross-process linkage chip: a downstream case shows what it
   came from as one dense inline link on the case header. */
.ds-chain-link{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.03em;text-decoration:none;color:var(--ink-mute);border:1px solid var(--hairline);border-radius:3px;padding:2px 7px;background:var(--paper-2);transition:border-color var(--ds-motion-fast, .12s) ease,color var(--ds-motion-fast, .12s) ease}
.ds-chain-link:hover{border-color:var(--ink-faint);color:var(--ink)}
.ds-chain-link-label{text-transform:uppercase;color:var(--ink-faint)}
.ds-chain-link-ref{color:var(--ink)}

/* === Order document dialog =================================================
   Ben, 2026-08-12: every Lead-to-Cash and Order-Management popup is ONE sheet
   — a pro-forma that starts as a request and fills in as the order moves.
   Same geometry at every stage (parties top-left, document meta top-right,
   lines in the middle, totals bottom-right), ink on paper only: stage is said
   in words, never in colour. Red is reserved for something that blocks the
   document. Presentation only — FlowMaster owns every field, option, total
   and stage transition.
   Consumed through .ds-modal--doc on the shared RowPopup/ds-modal--dialog. */
.ds-modal.ds-modal--dialog.ds-modal--doc{width:min(840px,calc(100vw - 32px)) !important;min-width:0;max-width:calc(100vw - 32px) !important;height:auto !important;max-height:calc(100vh - 32px) !important;background:var(--paper,#FAF8F2) !important;border:1.5px solid var(--hairline-dark,#B8AF98);border-radius:2px;box-shadow:0 20px 60px rgba(17,17,16,0.35),0 2px 8px rgba(17,17,16,0.12);overflow:hidden;resize:none !important;box-sizing:border-box}
.ds-modal.ds-modal--dialog.ds-modal--doc-md{width:min(840px,calc(100vw - 32px)) !important;min-width:0;max-width:calc(100vw - 32px) !important;height:auto !important;max-height:calc(100vh - 32px) !important;background:var(--paper,#FAF8F2) !important;border:1.5px solid var(--hairline-dark,#B8AF98);border-radius:2px;box-shadow:0 20px 60px rgba(17,17,16,0.35),0 2px 8px rgba(17,17,16,0.12);overflow:hidden;resize:none !important;box-sizing:border-box}
.ds-modal--doc .ds-modal-dialog-titlebar,
.ds-modal--doc-md .ds-modal-dialog-titlebar{padding:14px 24px 10px;align-items:center;background:var(--paper,#FAF8F2) !important;color:var(--ink,#111110);border-bottom:2px solid var(--ink,#111110);flex:none}
.ds-modal--doc .ds-modal-dialog-titlebar-kicker,
.ds-modal--doc-md .ds-modal-dialog-titlebar-kicker{color:var(--ink-mute,#6A675C);font-weight:700;letter-spacing:.08em;font-size:10px}
.ds-modal--doc .ds-modal-dialog-titlebar-pos,
.ds-modal--doc-md .ds-modal-dialog-titlebar-pos{font-size:20px;font-style:italic;font-weight:700;color:var(--ink,#111110)}
.ds-modal--doc .ds-modal-dialog-titlebar-chip,
.ds-modal--doc-md .ds-modal-dialog-titlebar-chip{color:var(--ink,#111110);border:1.5px solid var(--hairline-dark,#B8AF98);background:var(--paper-card,#F4EFE3);font-weight:700;border-radius:2px;padding:2px 8px}
.ds-modal--doc .ds-modal-dialog-dismiss,
.ds-modal--doc-md .ds-modal-dialog-dismiss{color:var(--ink,#111110);background:transparent;font-weight:700;font-size:18px;border:1px solid var(--hairline-dark,#B8AF98);border-radius:2px;cursor:pointer}
.ds-modal--doc .ds-modal-dialog-dismiss:hover,
.ds-modal--doc-md .ds-modal-dialog-dismiss:hover{background:var(--paper-card,#F4EFE3);color:var(--baobab)}
.ds-modal--doc .ds-modal-dialog-body,
.ds-modal--doc-md .ds-modal-dialog-body{padding:20px 24px;display:flex;flex-direction:column;flex:1 1 auto;min-height:0 !important;height:auto !important;max-height:calc(100vh - 140px);overflow-y:auto;background:var(--paper,#FAF8F2) !important;background-image:none !important;box-sizing:border-box}
.ds-modal--doc .ds-modal-dialog-foot,
.ds-modal--doc-md .ds-modal-dialog-foot{padding:12px 24px 16px;background:var(--paper,#FAF8F2) !important;border-top:1.5px solid var(--hairline-dark,#B8AF98);display:flex;align-items:center;gap:9px;flex:none}
.ds-modal--doc .ds-modal-dialog-foot .ds-actions,
.ds-modal--doc-md .ds-modal-dialog-foot .ds-actions{margin-left:auto;display:flex;gap:9px;align-items:center}
.ds-doc-foot-hint{font-size:12px;color:var(--ink-mute)}
.ds-doc-ref{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.07em;color:var(--ink,#111110);border:1px solid var(--hairline-dark,#B8AF98);background:var(--paper-card,#F4EFE3);border-radius:2px;padding:3px 8px;white-space:nowrap}

/* stage line — words only, never colour-coded */
.ds-doc-stages{display:flex;align-items:center;gap:0;padding:8px 16px;border-bottom:1px solid var(--hairline);background:var(--paper-2);overflow-x:auto;flex:none;scrollbar-width:thin;scrollbar-color:var(--hairline) transparent;-webkit-mask-image:linear-gradient(90deg,#000 82%,transparent);mask-image:linear-gradient(90deg,#000 82%,transparent)}
.ds-doc-stage{font-family:var(--font-mono);font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint);white-space:nowrap;padding-right:10px;display:flex;align-items:center;gap:7px}
.ds-doc-stage::before{content:"";width:7px;height:7px;border:1px solid var(--ink-faint);border-radius:50%;flex:none}
.ds-doc-stage::after{content:"";width:16px;height:1px;background:var(--hairline);margin-left:3px}
.ds-doc-stage:last-child::after{display:none}
.ds-doc-stage--done{color:var(--ink-mute)}
.ds-doc-stage--done::before{background:var(--ink-mute);border-color:var(--ink-mute)}
.ds-doc-stage--now{color:var(--ink);font-weight:700}
.ds-doc-stage--now::before{background:var(--ink);border-color:var(--ink)}

.ds-doc-cols{display:block;width:100%;min-height:0}
.ds-doc-sheet{width:100%;min-width:0;overflow:visible;background:var(--paper)}
.ds-doc-rail{display:none !important}

/* the sheet */
.ds-pf{padding:16px 20px 22px}
.ds-pf-top{display:flex;justify-content:space-between;gap:26px;border-bottom:1px solid var(--ink);padding-bottom:12px;margin-bottom:14px;flex-wrap:wrap}
.ds-pf-party{min-width:0}
.ds-pf-party-k{font-family:var(--font-mono);font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-mute);display:block;margin-bottom:3px}
.ds-pf-party-n{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:17px;line-height:1.2}
.ds-pf-party-a{font-size:12px;color:var(--ink-soft);margin-top:3px;line-height:1.4}
/* TASK-31 defect 2 (2026-08-14, root-caused by live DOM inspection, not by
   the two geometry guesses that preceded it): this was `flex:none;
   min-width:250px`. Inside a .ds-pf-top that is itself narrow -- the lead
   popup's .ds-doc-sheet squeezed beside the fixed 326px .ds-doc-rail leaves it
   about 240px -- flex:none forbade shrinking and the 250px floor exceeded the
   container, so the block wrapped to its own row and STILL rendered ~359px
   wide. The 119px of overflow ran under the opaque .ds-doc-rail sibling, which
   painted over it: elementFromPoint at the clipped text returned .ds-doc-rail.
   `flex:0 1 auto` with `min-width:0` lets it shrink to the space available
   instead of overflowing, while still refusing to GROW -- so the wide
   consumers (the OMS case dialog, the dealer cockpit, chain-11's field blocks)
   keep the content-width right-hand column they render today rather than
   stretching. Shared class, eight call sites, all the same shape: a doctype
   and/or key/value rows opposite .ds-pf-party. */
.ds-pf-meta{flex:0 1 auto;min-width:0}
.ds-pf-doctype{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:22px;text-align:right;margin-bottom:6px}
.ds-pf-doctype-sub{display:inline-block;font-family:var(--font-mono);font-style:normal;font-weight:700;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink);border:1.5px solid var(--ink);border-radius:2px;padding:2px 8px;margin-top:4px;background:var(--paper-2);box-shadow:1px 1px 0 rgba(0,0,0,0.12)}
.ds-paper-status-stamp{display:inline-block;font-family:var(--font-mono);font-style:normal;font-weight:700;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink);background:var(--paper-2);border:1.5px solid var(--ink);padding:2px 8px;border-radius:2px;margin-top:4px;box-shadow:1px 1px 0 rgba(0,0,0,0.12);text-align:center}
.ds-paper-status-stamp--ink{color:var(--royal-blue,#123B75);border-color:var(--royal-blue,#123B75)}
.ds-pf-meta-row{display:flex;justify-content:space-between;gap:16px;font-size:12px;padding:2px 0}
.ds-pf-meta-k{font-family:var(--font-mono);font-size:9px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);flex:0 0 auto}
.ds-pf-meta-v{font-family:var(--font-mono);font-size:12px;font-variant-numeric:tabular-nums;text-align:right;overflow-wrap:anywhere;word-break:break-word;max-width:320px}

.ds-pf-block{margin:0 0 16px}
.ds-pf-block-h{display:flex;align-items:center;gap:9px;margin:0 0 7px}
.ds-pf-block-h>b,.ds-pf-block-t{font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-soft)}
.ds-pf-block-h::after{content:"";flex:1 1 auto;height:1px;background:var(--hairline)}
.ds-pf-block-meta{font-family:var(--font-mono);font-size:9px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);white-space:nowrap;order:3}
.ds-pf-block-act{font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute,#6A675C);border:none;border-bottom:1px dashed var(--hairline-dark,#B8AF98);background:transparent;padding:1px 4px;cursor:pointer;border-radius:0}
.ds-pf-block-act:hover{color:var(--baobab,#9E2A2B);border-bottom-color:var(--baobab,#9E2A2B)}
.ds-pf-block--waiting .ds-pf-block-h>b,.ds-pf-block--waiting .ds-pf-block-t{color:var(--ink-faint)}
.ds-pf-waiting{border:1px dashed var(--hairline);border-radius:var(--ds-radius-sm);padding:9px 12px;font-size:12px;color:var(--ink-mute)}
.ds-pf-empty{font-size:12px;color:var(--ink-mute);font-style:italic;padding:6px 0}

/* lines — dense, natural flow with zero inner scroll trapping */
.ds-pf-linebox{border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper);max-height:none !important;overflow:visible !important}
.ds-pf-linebox--tall{max-height:none !important}
.ds-pf-lines{width:100%;border-collapse:collapse;font-size:12px}
.ds-pf-lines thead th{position:sticky;top:0;z-index:2;background:var(--paper-2);font-family:var(--font-mono);font-size:9px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);font-weight:400;text-align:left;padding:4px 6px;border-bottom:1px solid var(--ink);white-space:nowrap}
.ds-pf-lines td{padding:4px 6px;border-bottom:1px solid var(--paper-3);vertical-align:middle}
.ds-pf-lines tbody tr:last-child td{border-bottom:0}
.ds-pf-lines th.ds-pf-num,.ds-pf-lines td.ds-pf-num{text-align:right;font-family:var(--font-mono);font-variant-numeric:tabular-nums}
.ds-pf-line-code{font-family:var(--font-mono);font-size:10px;color:var(--ink-mute);display:block;margin-top:1px}
.ds-modal--doc .ds-pf-lines .ds-input,
.ds-modal--doc .ds-pf-lines .ds-select,
.ds-modal--doc-md .ds-pf-lines .ds-input,
.ds-modal--doc-md .ds-pf-lines .ds-select{font-family:var(--font-mono);font-size:11px;padding:3px 5px;height:24px;line-height:1.2;background:var(--paper)}
.ds-modal--doc .ds-pf-lines .ds-input,
.ds-modal--doc-md .ds-pf-lines .ds-input{font-family:var(--font-mono);text-align:right;min-width:70px;font-variant-numeric:tabular-nums}
.ds-modal--doc .ds-pf-lines .ds-input--text,
.ds-modal--doc-md .ds-pf-lines .ds-input--text{font-family:var(--font-mono);text-align:left;min-width:120px}
.ds-modal--doc .ds-pf-lines .ds-select,
.ds-modal--doc-md .ds-pf-lines .ds-select{min-width:90px;font-family:var(--font-mono)}
.ds-pf-rowx{color:var(--ink-faint);border:1px solid var(--hairline);border-radius:3px;background:var(--paper);width:20px;height:20px;line-height:18px;text-align:center;display:inline-block;cursor:pointer;font-size:11px}
.ds-pf-lines thead th{position:sticky;top:0;z-index:2;background:var(--paper-2);font-family:var(--font-mono);font-size:9px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);font-weight:400;text-align:left;padding:6px 10px;border-bottom:1px solid var(--ink);white-space:nowrap}
.ds-pf-lines td{padding:6px 10px;border-bottom:1px solid var(--paper-3);vertical-align:middle;white-space:nowrap}
.ds-pf-lines tbody tr:last-child td{border-bottom:0}
.ds-pf-lines th.ds-pf-num,.ds-pf-lines td.ds-pf-num{text-align:right;font-family:var(--font-mono);font-variant-numeric:tabular-nums}
.ds-pf-line-code{font-family:var(--font-mono);font-size:11px;color:var(--ink-mute);display:block;margin-top:2px}
.ds-pf-lines .rsel-input{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}
.ds-modal--doc .ds-pf-lines .ds-input,
.ds-modal--doc .ds-pf-lines .ds-select,
.ds-modal--doc-md .ds-pf-lines .ds-input,
.ds-modal--doc-md .ds-pf-lines .ds-select{font-size:12.5px;padding:5px 8px;height:auto;line-height:1.3;background:var(--paper);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}
.ds-modal--doc .ds-pf-lines .ds-input,
.ds-modal--doc-md .ds-pf-lines .ds-input{font-family:var(--font-mono);text-align:right;min-width:48px;font-variant-numeric:tabular-nums}
.ds-modal--doc .ds-pf-lines .ds-input--text,
.ds-modal--doc-md .ds-pf-lines .ds-input--text{font-family:var(--font-ui);text-align:left;min-width:80px}
.ds-modal--doc .ds-pf-lines .ds-select,
.ds-modal--doc-md .ds-pf-lines .ds-select{min-width:64px}
.ds-pf-lines td:last-child,.ds-pf-lines th:last-child{width:28px;padding:6px 4px;text-align:center}
.ds-pf-rowx{color:var(--ink-faint);border:1px solid var(--hairline);border-radius:3px;background:var(--paper);width:22px;height:22px;line-height:20px;text-align:center;display:inline-block;cursor:pointer;font-size:12px;box-sizing:border-box}
.ds-pf-rowx:hover{color:var(--baobab);border-color:var(--baobab)}
.ds-pf-addline{display:flex;justify-content:flex-end;margin-top:6px}

/* totals — where an invoice puts them */
.ds-pf-totals{display:flex;justify-content:flex-end;margin-top:10px}
.ds-pf-totals-box{min-width:320px}
.ds-pf-tot-row{display:flex;justify-content:space-between;gap:20px;padding:3px 0;font-size:12px;border-bottom:1px solid var(--paper-3)}
.ds-pf-tot-k{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute)}
.ds-pf-tot-v{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
.ds-pf-tot-row--grand{border-bottom:0;border-top:1px solid var(--ink);margin-top:4px;padding-top:8px;align-items:baseline}
.ds-pf-tot-row--grand .ds-pf-tot-k{font-size:10px;color:var(--ink)}
.ds-pf-tot-row--grand .ds-pf-tot-v{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:22px}
.ds-pf-tot-note{font-family:var(--font-mono);font-size:10px;color:var(--ink-faint);text-align:right;margin-top:3px}

/* fields on the sheet — 13px type, 32px controls */
.ds-pf-fields{display:grid;gap:10px 16px;grid-template-columns:minmax(0,1fr)}
.ds-pf-fields--2{grid-template-columns:repeat(2,minmax(0,1fr))}
.ds-pf-fields--3{grid-template-columns:repeat(3,minmax(0,1fr))}
/* TASK-P2-10.2 (2026-08-15, root-caused by live box measurement, not
   guessed): the lead popup's .ds-doc-sheet sits beside the fixed-326px
   .ds-doc-rail (:9265, same structural cause TASK-31 defect 2 already
   documented at .ds-pf-meta above) and is left only ~176-240px wide on
   THIS consumer -- a fixed repeat(4,...) then divides that into ~22px
   columns, clipping every value ("62,50" of "62,500", "750 p" of "750
   pcs"). The wide consumers this class was authored for (OMS case dialog,
   dealer cockpit) have no rail sibling and plenty of room, so a
   viewport-width media query can't distinguish them -- the constraint is
   the FIELD'S OWN CONTAINER, not the viewport. auto-fit responds to
   container width directly: unchanged at 4-across whenever >=~650px is
   available (every wide consumer, verified unaffected), wraps to fewer
   columns -- down to 1 -- as the container narrows, so a value never
   renders in a column too narrow to hold it. */
.ds-pf-fields--4{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}
.ds-pf-field{min-width:0}
.ds-pf-field--wide{grid-column:1 / -1}
.ds-pf-label{font-family:var(--font-mono);font-size:9px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);display:block;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-modal--doc .ds-pf-field .ds-input,
.ds-modal--doc .ds-pf-field .ds-select,
.ds-modal--doc .ds-pf-field .ds-textarea,
.ds-modal--doc-md .ds-pf-field .ds-input,
.ds-modal--doc-md .ds-pf-field .ds-select,
.ds-modal--doc-md .ds-pf-field .ds-textarea{width:100%;font-size:13px;padding:7px 9px;line-height:1.3;background:var(--paper);text-overflow:ellipsis;overflow:hidden;white-space:nowrap}
.ds-modal--doc .ds-pf-field .ds-textarea,
.ds-modal--doc-md .ds-pf-field .ds-textarea{min-height:64px}
.ds-pf-value{font-size:13px;padding:7px 9px;border:1px dashed var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper-2);color:var(--ink-soft);min-height:32px;display:flex;align-items:center;overflow-wrap:anywhere}
.ds-pf-value--num{font-family:var(--font-mono);justify-content:flex-end;font-variant-numeric:tabular-nums}
.ds-pf-hint{font-size:11px;color:var(--ink-faint);margin-top:3px}
.ds-pf-note{border:1px solid var(--hairline);border-left:3px solid var(--ink);background:var(--paper-2);border-radius:var(--ds-radius-sm);padding:8px 11px;font-size:12.5px;margin-bottom:12px}
.ds-pf-note-t{font-family:var(--font-mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-soft);display:block;margin-bottom:3px}
.ds-pf-note--stop{border-left-color:var(--baobab)}
.ds-pf-note--stop .ds-pf-note-t{color:var(--baobab)}

/* context rail */
.ds-doc-card{border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper);padding:10px 11px}
.ds-doc-card-k{font-family:var(--font-mono);font-size:9px;letter-spacing:.09em;text-transform:uppercase;color:var(--ink-mute);display:block;margin-bottom:6px}
.ds-doc-card-t{font-weight:600;font-size:13px}
.ds-doc-card-sub{font-size:11.5px;color:var(--ink-mute);margin-top:2px}
.ds-doc-row{display:flex;justify-content:space-between;gap:10px;align-items:baseline;padding:5px 0;border-bottom:1px solid var(--paper-3);font-size:12px}
.ds-doc-row:last-child{border-bottom:0}
.ds-doc-row-m{font-family:var(--font-mono);font-size:11px;color:var(--ink-mute);font-variant-numeric:tabular-nums;white-space:nowrap}
.ds-doc-stats{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--hairline);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);overflow:hidden}
.ds-doc-stat{background:var(--paper);padding:8px 10px}
.ds-doc-stat-k{font-family:var(--font-mono);font-size:8.5px;letter-spacing:.07em;text-transform:uppercase;color:var(--ink-mute);display:block}
.ds-doc-stat-v{font-family:var(--font-display);font-style:italic;font-weight:600;font-size:16px;margin-top:2px;font-variant-numeric:tabular-nums;display:block}
@media (max-width:1100px){
  .ds-doc-cols{flex-direction:column}
  .ds-doc-rail{width:auto;border-left:0;border-top:1px solid var(--hairline)}
  .ds-pf-fields--3,.ds-pf-fields--4{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* selected repeating row inside a document line table (was scoped to
   .ds-step-table only, so a row moved onto .ds-pf-lines lost its shading) */
.ds-pf-lines tr.ds-row-sel td{background:var(--paper-3)}
.ds-modal--doc .ds-modal-dialog-titlebar-chip,
.ds-modal--doc-md .ds-modal-dialog-titlebar-chip{margin-left:0}
.ds-modal--doc .ds-modal-dialog-titlebar-pos,
.ds-modal--doc-md .ds-modal-dialog-titlebar-pos{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* Order-document round-3 corrections, from the live signed-in review on
   2026-08-13: a long document reference must not stretch the title bar; a
   lone rail statistic must not leave a dead half-tile; the customer name and
   its role tag must sit on one baseline without colliding; and the line
   table needs room for the product name before it starts truncating. */
.ds-modal--doc .ds-modal-dialog-titlebar-chip,
.ds-modal--doc-md .ds-modal-dialog-titlebar-chip{max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-doc-stats>.ds-doc-stat:only-child{grid-column:1 / -1}
.ds-pf-party-n{display:flex;flex-wrap:wrap;align-items:baseline;gap:8px}
.ds-pf-party-a,.ds-doc-card-sub,.ds-doc-row{overflow-wrap:anywhere}
/* R7 AGPOPUP: same overflow class of bug as the line above, on a different
   field -- .ds-cardlist-meta (the "Active deals in pipeline"/"Related
   deals" card's salesperson-or-email line) has no break opportunity, so a
   long unbroken address ran past the fixed-326px .ds-doc-rail's edge
   instead of wrapping inside its own card (Leads popup, "over-fill" mark).
   .ds-cardlist-meta is private to this popup family (PipelineCardPopups.tsx
   only), so this is a plain bug fix, not a scoped override. */
.ds-cardlist-meta{overflow-wrap:anywhere}
.ds-modal--doc .ds-pf-lines td:first-child,
.ds-modal--doc .ds-pf-lines th:first-child{min-width:140px}
.ds-modal--doc .ds-pf-lines .ds-input--text{min-width:80px}
.ds-pf-linebox{scrollbar-width:thin}
/* A line table wider than the sheet scrolls sideways; without a hint the cut
   column reads as a broken layout, so the right edge fades while more remains. */
.ds-pf-linebox{position:relative;background-image:linear-gradient(to left,var(--paper-2),transparent 26px);background-repeat:no-repeat;background-position:right top;background-size:26px 100%;background-attachment:local}
.ds-pf-lines td:first-child{overflow-wrap:anywhere}
.ds-pf-line-code{white-space:nowrap}
/* Per-line choices (partial / substitute / backorder / cancel) are a compact
   wrapping group inside their cell — full-size buttons stacked one per line
   turned a single order line into a half-screen block. */
.ds-pf-lines .ds-actions{flex-wrap:wrap;gap:4px;justify-content:flex-start}
.ds-pf-lines .ds-actions .ds-button{font-size:9.5px;letter-spacing:.05em;padding:4px 8px}

/* ===== Paper file — desk / file / sheet / floating controls (ds-paper-*) =====
   Structural chrome only (TASK-00.1). Fold/back/staple/tab states are TASK-00.2;
   slip/card/dealersheet are TASK-00.3; @media print is TASK-00.4.
   TASK-00.6 (chain-00 reopening, 2026-08-14): .ds-paper-sheet is position:absolute;
   inset:0 inside .ds-paper-file{min-height:520px} -- absolutely-positioned children
   never grow their offset parent, so a tall sheet (full step form + line tables,
   found on real OMS case sheets, never exercised by the specimen fixtures) spilled
   past the 520px box with no overflow rule. Fix: cap the sheet at a viewport-aware
   max-height and let it scroll internally rather than spill or push the fanned
   stack's depth geometry around. Print overrides this back to unscrolled/full-height
   on the raised sheet (see @media print below) -- printed output must never be cut
   off mid-scroll.
   CORRECTION 2026-08-14: 00.6's first push regressed the S-7 round-2 fix
   (shell branch sha a9a36590, "dealer-card slide-out clipped") because this
   CDS branch was cut before that fix existed on the shell branch -- both the
   .ds-paper-desk bottom padding below (calc(--ds-space-30 * 8), the room the
   opened dealer card slides into so .ds-paper-desk{overflow:hidden} doesn't
   clip it) AND this chunk's own .ds-paper-sheet scroll fix are independently
   required; caught by chain-20's builder during merge, restored here. See
   INTEGRATION-PLAN-20260814.md for the merge-order note recording this.
   RECONCILIATION 2026-08-14: this CDS branch was cut before every S-7 fix
   round landed on the shell branch, so several selectors it shares with
   shell (.ds-paper-controls, the @media print hide-list) carried stale
   pre-S-7 values forward independently of this branch's own later chunks
   touching neighboring selectors. Merged origin/feat/paper-file-shell-
   20260814's tip into this branch to reconcile: .ds-paper-controls takes
   shell's round-2 centered/below-sheet rule (see that rule's own comment
   below); the print hide-list takes shell's superset (adds tabrail/pin/
   slip/card/dealersheet, which this branch's own earlier list omitted).
   See INTEGRATION-PLAN-20260814.md for the full conflict record. */
.ds-paper-file{position:relative;transform-style:preserve-3d;width:100%;max-width:640px;min-height:auto;margin:0 auto}
.ds-modal--doc .ds-paper-file,
.ds-modal--doc-md .ds-paper-file{max-width:100% !important;min-height:auto !important;margin:0 !important}
.ds-modal--doc .ds-paper-desk,
.ds-modal--doc-md .ds-paper-desk{padding:0 !important;border-radius:0 !important;perspective:none !important;background:transparent !important;background-image:none !important;min-height:auto !important;height:auto !important}
.ds-modal--doc .ds-paper-sheet,
.ds-modal--doc-md .ds-paper-sheet{position:static !important;inset:auto !important;min-height:auto !important;height:auto !important;background:transparent !important;border:none !important;box-shadow:none !important;padding:0 !important;overflow:visible !important}

.ds-modal--dialog .ds-paper-desk{background:transparent !important;border:none !important;box-shadow:none !important;padding:0 !important;margin:0 !important;min-height:0 !important;width:100% !important}
.ds-modal--dialog .ds-paper-file{background:transparent !important;border:none !important;box-shadow:none !important;padding:0 !important;margin:0 !important;min-height:0 !important;width:100% !important}
.ds-modal--dialog .ds-paper-sheet{position:relative !important;inset:auto !important;background:transparent !important;border:none !important;box-shadow:none !important;padding:0 !important;min-height:0 !important;transform:none !important;width:100% !important}
.ds-modal--dialog .ds-paper-sheet:not([data-raised="true"]){display:none !important}
.ds-modal--dialog .ds-paper-tabrail,
.ds-modal--dialog .ds-paper-pin,
.ds-modal--dialog .ds-paper-controls,
.ds-modal--dialog .ds-paper-card,
.ds-modal--dialog .ds-paper-staple,
.ds-modal--dialog .ds-doc-rail{display:none !important}

.ds-paper-file[data-single="true"]{min-height:220px}
.ds-paper-file[data-single="true"] .ds-paper-sheet{position:relative;inset:auto}

.ds-paper-desk[data-dealer-card="true"]{padding-bottom:calc(var(--ds-space-30) * 8)}

.ds-paper-sheet{position:absolute;inset:0;background:var(--paper);border:var(--ds-rule) solid var(--hairline);border-radius:var(--ds-radius-sm);box-shadow:0 16px 30px -10px var(--ink),0 2px 6px 0 var(--hairline);transform-origin:14px 14px;transition:transform var(--ds-motion-fast) ease,filter var(--ds-motion-fast) ease,box-shadow var(--ds-motion-fast) ease;padding:calc(var(--ds-space-30) + var(--ds-space-8)) calc(var(--ds-space-30) * 4) var(--ds-space-16) var(--ds-space-16);overflow-y:visible;overflow-x:hidden}
.ds-paper-sheet[data-raised="true"]{position:relative !important;inset:auto !important;min-height:500px !important;z-index:5 !important;transform:translate(0,0) translateZ(0) rotate(0deg) !important;filter:brightness(1) !important}
.ds-paper-sheet:not([data-raised="true"]){position:absolute !important;inset:0 !important}

.ds-paper-file[data-rail-reserve="sm"] .ds-paper-sheet{padding-right:calc(var(--ds-space-30) * 3)}
.ds-paper-file[data-rail-reserve="md"] .ds-paper-sheet{padding-right:calc(var(--ds-space-30) * 3 + var(--ds-space-24))}
.ds-paper-sheet::after{content:"";position:absolute;inset:0;border-radius:inherit;background:linear-gradient(135deg,var(--paper) 0%,var(--paper-2) 8%,transparent 24%);opacity:.6;pointer-events:none}
.ds-paper-sheet[data-depth="0"]{z-index:5}
.ds-paper-sheet[data-depth="1"]{transform:translate(-6px,9px) translateZ(-18px) rotate(-.6deg);filter:brightness(.97);z-index:4}
.ds-paper-sheet[data-depth="2"]{transform:translate(-12px,18px) translateZ(-36px) rotate(.9deg);filter:brightness(.94);z-index:3}
.ds-paper-sheet[data-depth="3"]{transform:translate(-18px,27px) translateZ(-54px) rotate(-1.3deg);filter:brightness(.91);z-index:2}
.ds-paper-sheet[data-depth="4"]{transform:translate(-24px,36px) translateZ(-72px) rotate(1.7deg);filter:brightness(.88);z-index:1}
.ds-paper-sheet[data-depth="5"]{transform:translate(-30px,45px) translateZ(-90px) rotate(-1.1deg);filter:brightness(.85);z-index:0}
.ds-paper-sheet[data-depth="6"]{transform:translate(-36px,54px) translateZ(-108px) rotate(1.1deg);filter:brightness(.82);z-index:-1}
.ds-paper-sheet[data-depth="7"]{transform:translate(-42px,63px) translateZ(-126px) rotate(-1.1deg);filter:brightness(.79);z-index:-2}
.ds-paper-sheet[data-depth="8"],.ds-paper-sheet[data-depth="9"],.ds-paper-sheet[data-depth="10"],.ds-paper-sheet[data-depth="11"],.ds-paper-sheet[data-depth="12"],.ds-paper-sheet[data-depth="13"],.ds-paper-sheet[data-depth="14"],.ds-paper-sheet[data-depth="15"],.ds-paper-sheet[data-depth="16"],.ds-paper-sheet[data-depth="17"],.ds-paper-sheet[data-depth="18"],.ds-paper-sheet[data-depth="19"],.ds-paper-sheet[data-depth="20"],.ds-paper-sheet[data-depth="21"],.ds-paper-sheet[data-depth="22"],.ds-paper-sheet[data-depth="23"],.ds-paper-sheet[data-depth="24"],.ds-paper-sheet[data-depth="25"],.ds-paper-sheet[data-depth="26"],.ds-paper-sheet[data-depth="27"],.ds-paper-sheet[data-depth="28"],.ds-paper-sheet[data-depth="29"],.ds-paper-sheet[data-depth="30"]{transform:translate(-48px,72px) translateZ(-144px) rotate(1.1deg);filter:brightness(.76);z-index:-3}
.ds-paper-controls{position:absolute;left:0;right:0;bottom:calc(-1 * var(--ds-space-30) * 2);z-index:15;display:flex;justify-content:center;gap:var(--ds-space-8);pointer-events:auto}
.ds-paper-ctl{display:inline-flex;align-items:center;justify-content:center;gap:var(--ds-space-6);height:var(--ds-control-compact);padding:0 var(--ds-space-14);border-radius:3px;border:1.5px solid var(--hairline-dark,#A8A08A);background:var(--paper);color:var(--ink);font-family:var(--font-mono);font-weight:700;font-size:11px;letter-spacing:.06em;text-transform:uppercase;cursor:pointer;box-shadow:1px 1px 0 rgba(0,0,0,0.1);transition:background var(--ds-motion-fast) ease,color var(--ds-motion-fast) ease,border-color var(--ds-motion-fast) ease}
.ds-paper-ctl:hover{border-color:var(--ink-mute)}
.ds-paper-ctl:focus-visible{outline:2px solid var(--baobab);outline-offset:var(--ds-focus-offset)}
.ds-paper-ctl--primary{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.ds-paper-ctl--primary:hover{background:var(--ink-soft);border-color:var(--ink-soft)}
.ds-paper-ctl--danger{background:var(--paper);border-color:var(--baobab);color:var(--baobab)}
.ds-paper-ctl--danger:hover{background:var(--baobab-bg)}

.ds-paper-sheet--folded{transform:none !important;opacity:1 !important;z-index:6}
.ds-paper-sheet--folded>:not(.ds-paper-back){opacity:1 !important}
.ds-paper-back{display:none !important}
.ds-paper-sheet--folded>.ds-paper-back{display:none !important}
.ds-paper-staple{position:absolute;top:var(--ds-space-8);left:var(--ds-space-8);width:22px;height:22px;border-radius:var(--ds-radius-sm);background:var(--paper-3);border:var(--ds-rule) solid var(--hairline);z-index:10;pointer-events:none}
.ds-paper-staple::before,.ds-paper-staple::after{content:"";position:absolute;top:50%;left:50%;width:14px;height:2px;background:var(--ink-mute)}
.ds-paper-staple::before{transform:translate(-50%,-60%) rotate(45deg)}
.ds-paper-staple::after{transform:translate(-50%,-40%) rotate(45deg)}
/* Edge-on tab rail: ds-paper-tabrail is the positioning wrapper (S-7 fix --
   the tablist previously had no container styling at all and fell into
   normal document flow below the file, reading as "tabs at the bottom");
   ds-paper-tab is the individual pill, unchanged. The rail is a child of
   ds-paper-file, pinned along its right edge, z-index above every sheet
   depth (max 6) and the folded state (6) so it is never occluded. */
/* P2-01.2 (2026-08-15). The rail is absolutely positioned, so it is out of
   flow and its siblings reserve it ZERO space -- measured: at 11 sheets it is
   126.667x522px and reaches 110.67px INWARD over the sheet's own content
   (file right edge 831, rail left edge 720.33), painting over the quote total
   and the meta rows via z-index 15. At 2 sheets it is 74x90px and overlaps
   nothing. The defect is driven by the rail's SIZE, i.e. sheet count, not by
   viewport -- it reproduces at all five tested widths because .ds-paper-file
   is a fixed 640px box at every one of them.

   Two halves to the fix. First, BOUND the rail: its width is content-driven,
   so a longer sheet title would silently widen it and outgrow whatever
   reserve is set below. max-width caps it at the measured worst case, and the
   tab is allowed to grow DOWNWARD instead (min-height, wrapping text) so a
   long title is never truncated -- vertical growth is free here, horizontal
   growth is what collides. */
.ds-paper-tabrail{position:absolute;top:var(--ds-space-30);right:calc(-1 * var(--ds-space-16));display:flex;flex-direction:column;align-items:flex-end;gap:var(--ds-space-6);z-index:15;max-width:calc(var(--ds-space-16) * 8)}
.ds-paper-tab{display:inline-flex;align-items:center;gap:var(--ds-space-6);min-height:var(--ds-control-tab);max-width:100%;padding:var(--ds-space-4) var(--ds-space-10);background:var(--paper-manila,#EDE6D2);border:1.5px solid var(--hairline-dark,#B8AF98);border-right:none;border-radius:var(--ds-radius-sm) 0 0 var(--ds-radius-sm);font-family:var(--font-mono);font-weight:700;font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-mute,#6A675C);cursor:pointer;transition:background var(--ds-motion-fast) ease,color var(--ds-motion-fast) ease,border-color var(--ds-motion-fast) ease,transform var(--ds-motion-fast) ease}
.ds-paper-tab:hover{border-color:var(--ink,#111110);color:var(--ink,#111110);background:var(--paper-2)}
.ds-paper-tab--on{background:var(--paper-sheet,#FAF8F2);border-color:var(--ink,#111110);color:var(--ink,#111110);font-weight:800;transform:translateX(-4px);box-shadow:-3px 2px 8px rgba(0,0,0,0.12);z-index:2}
.ds-paper-tab:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}

@media (prefers-reduced-motion: reduce){
  .ds-paper-sheet,.ds-paper-sheet--folded,.ds-paper-sheet>*,.ds-paper-back,.ds-paper-controls,.ds-paper-ctl,.ds-paper-tab{transition:none}
}

/* ===== Paper file — slip / dealer card / dealer sheet / pin (ds-paper-*),
   TASK-00.3 (S-7 fix pass, 2026-08-14: ds-paper-slip and ds-paper-pin are
   now absolutely positioned so they pin to a line of the raised sheet that
   contains them, rather than falling into normal flow below the whole
   file -- "attached to nothing" was the exact defect. ds-paper-pin--dealer
   is a second pin position so the slip's Detail pin and the dealer sheet's
   own pin can both sit on the raised sheet without colliding. ds-paper-
   dealersheet gets a max-width so it reads as a sheet, not a full-width
   strip.
   S-7 fix round 2, 2026-08-14: ds-paper-slip moved from right:16 to
   left:16 -- at right:16/top:30 it shared the exact corner ds-paper-tabrail
   occupies (right:-16/top:30, z-index 15 over the slip's z-index 9), so the
   rail always rendered on top and clipped the slip's text. Anchoring the
   slip to the file's LEFT edge instead guarantees zero overlap with the
   right-edge tab rail regardless of viewport width, with no z-index
   arms race. ds-paper-desk's bottom padding raised from 3x to 8x
   --ds-space-30 (90px -> 240px) for the same round: ds-paper-card sits at
   bottom:-24px and translates a further +150px when open (data-open="true"),
   so its open position's top edge is ~174px below the file's own box before
   the card's own rendered height is added -- the prior 90px reserve was
   inside that travel distance, so the desk's overflow:hidden clipped the
   opened card into total invisibility. 240px clears the full travel plus
   the card's own height with margin.) ===== */
.ds-paper-slip{position:absolute;top:var(--ds-space-30);left:var(--ds-space-16);z-index:9;display:inline-block;max-width:220px;background:var(--paper-warm-slip);border:var(--ds-rule) solid var(--hairline);border-radius:var(--ds-radius-sm);padding:var(--ds-space-10) var(--ds-space-12);transform:rotate(-1.4deg);box-shadow:0 6px 14px -6px var(--ink);font-family:var(--font-ui);font-weight:500;font-size:12px;color:var(--ink-soft)}
.ds-paper-slip::before{content:"";position:absolute;top:-6px;left:50%;transform:translateX(-50%);width:10px;height:10px;border-radius:50%;background:var(--baobab);border:var(--ds-rule) solid var(--ink)}
.ds-paper-card{position:absolute;left:var(--ds-space-16);right:var(--ds-space-16);bottom:calc(-1 * var(--ds-space-24));background:var(--paper-warm-card);border:var(--ds-rule) solid var(--hairline);border-radius:var(--ds-radius-sm);padding:var(--ds-space-12) var(--ds-space-16);transform:rotate(2deg) translateY(0);box-shadow:0 10px 20px -8px var(--ink);transition:transform .4s cubic-bezier(.2,.7,.2,1);z-index:0}
.ds-paper-card[data-open="true"]{transform:rotate(2deg) translateY(150px)}
.ds-paper-dealersheet{position:relative;width:100%;max-width:640px;margin:var(--ds-space-16) auto 0;background:var(--paper-warm-card);border:var(--ds-rule) solid var(--hairline);border-radius:var(--ds-radius-sm);padding:var(--ds-space-24);display:grid;grid-template-columns:repeat(3,1fr);gap:var(--ds-space-16) var(--ds-space-24);box-shadow:0 16px 34px -12px var(--ink)}
.ds-paper-pin{position:absolute;top:var(--ds-space-12);right:var(--ds-space-12);z-index:9;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;border:var(--ds-rule) solid var(--hairline);background:var(--paper);color:var(--ink-mute);cursor:pointer;transition:background var(--ds-motion-fast) ease,color var(--ds-motion-fast) ease,border-color var(--ds-motion-fast) ease}
.ds-paper-pin:hover{border-color:var(--baobab);color:var(--baobab)}
.ds-paper-pin:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}
.ds-paper-pin--dealer{right:calc(var(--ds-space-12) + 30px)}

/* Slip-pin strip (product-line facts companion strip, TASK-10.5, chain A1) --
   P2-40.1 orphan sweep: .ds-pf-slippins/.ds-paper-pin-btn resolved to no rule
   anywhere, authored below. FOLLOW-UP (2026-08-15, mmd-projects-ed static
   analysis, conclusive): the per-line wrapper originally reused the
   dealer-badge .ds-paper-pin class (position:absolute, top:12/right:12) --
   every pin in this flex strip would land on the same coordinate, only the
   last visible, container collapsing to the 22px circle. .ds-paper-pin is
   its own object (a single corner badge) and stays untouched for the dealer
   card that owns it; PipelineCardPopups.tsx:257 now consumes the distinct
   .ds-pf-slippin object below instead -- static, inline-flex, sized for its
   text label, part of the horizontal wrapped strip. */
.ds-pf-slippins{display:flex;flex-wrap:wrap;gap:var(--ds-space-10);margin-top:var(--ds-space-10)}
.ds-pf-slippin{position:relative;display:inline-flex;align-items:center;border:var(--ds-rule) solid var(--hairline);border-radius:var(--ds-radius-sm);background:var(--paper);padding:var(--ds-space-4) var(--ds-space-10);transition:border-color var(--ds-motion-fast) ease}
.ds-pf-slippin:hover{border-color:var(--baobab)}
.ds-paper-pin-btn{all:unset;cursor:pointer;font-family:var(--font-ui);font-size:11px;color:inherit}
.ds-paper-pin-btn:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}

/* ===== Paper file — print (@media print, ds-paper-page/ds-pg-*), TASK-00.4 =====
   NEW scope: no prior print rule existed to extend. Prints the RAISED sheet
   ([data-raised="true"], the state-machine output attribute TASK-02.1 sets)
   alone at A4 width; hides desk/tab-rail/controls/backs/staple. ds-pf-*
   invoice geometry (fields/lines/totals) is reused by composition inside
   the printed sheet's own markup, not re-declared here; ds-paper-page and
   ds-pg-header/ds-pg-footer are the paper-specific page-wrapper additions
   the existing ds-pf-* rules don't already provide standalone. */
@page{size:A4;margin:12mm}
@media print{
  .ds-paper-desk{background:none;perspective:none;overflow:visible;border-radius:0;padding:0}
  .ds-paper-controls,.ds-paper-tab,.ds-paper-tabrail,.ds-paper-back,.ds-paper-staple,.ds-paper-pin,.ds-paper-slip,.ds-paper-card,.ds-paper-dealersheet{display:none}
  .ds-paper-file{transform-style:flat;width:auto;max-width:none;min-height:0;margin:0}
  .ds-paper-sheet{display:none}
  .ds-paper-sheet[data-raised="true"]{display:block;position:static;width:210mm;max-width:210mm;transform:none;filter:none;box-shadow:none;border-radius:0;background:var(--paper);max-height:none;overflow:visible;padding:0}  /* the screen padding exists to clear the staple/pin badges, which print hides -- on paper the page block owns its own margins */
  .ds-pf-lines tr{break-inside:avoid}
}
.ds-paper-page{width:210mm;margin:0 auto;background:var(--paper);padding:var(--ds-space-24)}
.ds-pg-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--ds-space-16);border-bottom:var(--ds-rule) solid var(--hairline);padding-bottom:var(--ds-space-12);margin-bottom:var(--ds-space-16)}
.ds-pg-footer{border-top:var(--ds-rule) solid var(--hairline);padding-top:var(--ds-space-8);margin-top:var(--ds-space-16);font-family:var(--font-mono);font-size:9px;color:var(--ink-mute)}

/* ===== R7 AGPOPUP (2026-08-15): record-popup fill/legibility fixes, scoped
   per surface. .ds-paper-desk/.ds-paper-file/.ds-paper-sheet/.ds-paper-tab*
   and .ds-doc-cols/.ds-doc-sheet/.ds-doc-stages are the shared PaperShell/
   doc-popup base rules -- also consumed by DealerCockpit, ferri-oms-3,
   paper-specimen and, inside PipelineCardPopups.tsx, by the ACCEPTED
   Opportunities popup itself (same OpportunityCardPopup function, sibling
   render branch). None of those may change, so every rule below is an
   additive override keyed to one popup's own data-eid, never an edit to
   the shared base declarations above. */

/* Customers popup (CustomerC360Page, data-eid="sales-c360"): the fixed
   520px .ds-paper-file left the sheet a band across the middle of the
   overlay with the bottom third dead ("So much emptiness" / "larger" /
   "use the overlay it sits in"). Sized to the same min(vh,px) idiom
   .ds-paper-sheet already uses for its own max-height, so file and sheet
   stay congruent. The tab rail floated outside the sheet's own edge at an
   8.5px font -- illegible, and read as debris on the desk ("Clean these
   up"): pulled flush to the sheet's edge, given real padding/hit-target
   height, and a lighter (--paper, not --paper-2) background so it doesn't
   disappear against the desk it sits on. */
[data-eid="sales-c360"] .ds-paper-desk{width:100%;max-width:100%;padding-bottom:calc(var(--ds-space-30) * 3 + var(--ds-space-16))}
[data-eid="sales-c360"] .ds-paper-file{min-height:min(75vh, 720px);width:100%;max-width:100%}
[data-eid="sales-c360"] .ds-paper-file[data-rail-reserve="sm"] .ds-paper-sheet{padding-right:calc(var(--ds-space-30) * 4)}
[data-eid="sales-c360"] .ds-paper-tabrail{right:0;gap:var(--ds-space-8);max-width:calc(var(--ds-space-30) * 4)}
[data-eid="sales-c360"] .ds-paper-tab{font-size:11px;padding:var(--ds-space-6) var(--ds-space-12);min-height:36px;letter-spacing:.05em;background:var(--paper-2);color:var(--ink-mute);border:1px solid var(--ink-faint);box-shadow:0 1px 3px rgba(26,26,26,.08)}
[data-eid="sales-c360"] .ds-paper-tab:hover{color:var(--ink-solid);border-color:var(--ink-mute)}
[data-eid="sales-c360"] .ds-paper-tab--on{background:var(--ink);border-color:var(--ink);color:var(--paper);font-weight:600}
[data-eid="sales-c360"] .ds-paper-controls{position:absolute;left:0;right:0;bottom:calc(-1 * var(--ds-space-30) * 2 + 6px);display:flex;justify-content:center;gap:var(--ds-space-8)}
[data-eid="sales-c360"] .ds-paper-ctl{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.06em;font-weight:600;text-transform:uppercase;height:26px;padding:0 var(--ds-space-12);background:var(--paper-2);color:var(--ink-soft);border:1px solid var(--ink-faint);border-radius:var(--ds-radius-sm);box-shadow:0 1px 3px rgba(26,26,26,.08);transition:all var(--ds-motion-fast) ease}
[data-eid="sales-c360"] .ds-paper-ctl:hover{background:var(--paper);color:var(--ink);border-color:var(--ink-mute)}

/* Leads popup (LeadCardPopup, data-eid="pipeline-lead-sheet-inquiry"): a
   Lead's sheet legitimately has less to show than an Opportunity's (no
   Dates/Deal trail -- TASK-P2-10.3 above), but .ds-doc-cols is a flex row
   with default stretch, so the short left .ds-doc-sheet was force-stretched
   to match the taller right rail, leaving a large blank --paper-colored
   region below the Next Action field ("Empty — fix it" / "empty?"). The
   record context that fills the reference popups' rails (stat cards,
   account facts, active deals with owner emails) is already rendered here
   in .ds-doc-rail -- nothing to duplicate, only the artificial stretch to
   remove, so the sheet ends where its own content ends instead of
   stretching into a hole. */
[data-eid="pipeline-lead-sheet-inquiry"] .ds-doc-sheet{align-self:stretch}
[data-eid="pipeline-lead-sheet-inquiry"] .ds-cardlist-meta{overflow-wrap:anywhere;word-break:break-word}

/* Pipeline & Leads popup context rails (ROUND 8 #4, #5, #8): tightened card
   spacing and authentic multi-sheet stacked paper edges on cards. */
.ds-doc-rail{gap:7px!important}
.ds-cardlist{gap:6px!important}
.ds-doc-rail .ds-doc-card,
.ds-doc-rail .ds-cardlist-item{position:relative!important;isolation:isolate!important;background:var(--paper,#FAF9F5)!important;border:1px solid rgba(26,26,26,.12)!important;border-radius:2px!important;box-shadow:0 1px 3px rgba(26,26,26,.04),0 4px 10px -2px rgba(26,26,26,.06)!important;padding:8px 10px!important}
.ds-doc-rail .ds-doc-card::before,
.ds-doc-rail .ds-cardlist-item::before{content:""!important;position:absolute!important;inset:0!important;border-radius:2px!important;background:#F8F6EE!important;border:1px solid rgba(26,26,26,0.11)!important;z-index:-1!important;transform:translate(-2px,3px) rotate(-.25deg)!important;box-shadow:0 1px 3px rgba(26,26,26,0.04),0 3px 8px -2px rgba(26,26,26,0.05)!important;pointer-events:none!important}
.ds-doc-rail .ds-doc-card::after,
.ds-doc-rail .ds-cardlist-item::after{content:""!important;position:absolute!important;inset:0!important;border-radius:2px!important;background:#F3EFE2!important;border:1px solid rgba(26,26,26,0.10)!important;z-index:-2!important;transform:translate(-4px,6px) rotate(.35deg)!important;box-shadow:-2px 3px 0 0 #ECE6D5,-2px 3px 0 1px rgba(26,26,26,0.09),0 4px 12px -2px rgba(26,26,26,0.07)!important;pointer-events:none!important}

/* Pipeline popup, lead-stage variant only (data-eid=
   "pipeline-opportunity-lead-stages" — the Request/Pricing/Order strip
   OpportunityCardPopup renders for a still-lead-stage record). Its sibling
   proposal/contract-stage strip (data-eid="pipeline-opportunity-stages")
   is the ACCEPTED Opportunities popup's own band and is untouched. Flat
   --paper-2 read as no shading ("Shading pls!") -- given a top-to-bottom
   tonal gradient into the sheet's own --paper body instead of a flat fill. */
[data-eid="pipeline-opportunity-lead-stages"]{background:linear-gradient(180deg,var(--paper-2) 0%,var(--paper) 100%);border-bottom:1px solid var(--ink-faint,rgba(26,26,26,0.12))}

/* People popup (PersonPopup, data-eid="sales-person-shell"): a Person
   record is genuinely one sheet -- no second/third sheet to fan out, and
   none is fabricated here. .ds-paper-desk's top padding is 0 (its bottom/
   side desk margin exists, the top doesn't), so the sheet sat flush under
   the title bar with no desk visible above it, plus a shadow subtle enough
   to read as a flat panel ("Make it look like a paper stack"). Desk top
   padding + a deeper shadow + a slightly darker border give the one sheet
   real separation from its desk, matching the other record surfaces. */
[data-eid="sales-person-shell"] .ds-paper-desk{padding-top:var(--ds-space-16)}
[data-eid="sales-person-shell"] .ds-paper-sheet{box-shadow:0 14px 30px -6px rgba(26,26,26,.20),0 3px 10px 0 rgba(26,26,26,.10);border-color:var(--ink-mute);position:relative}
[data-eid="sales-person-shell"] .ds-paper-sheet::before{content:"";position:absolute;inset:4px -3px -4px 3px;background:var(--paper-2);border:1px solid var(--ink-faint);z-index:-1;border-radius:var(--ds-radius-sm,2px);pointer-events:none}
[data-eid="sales-person-shell"] .ds-paper-sheet::after{content:"";position:absolute;inset:8px -6px -8px 6px;background:var(--paper-3,#eae6d9);border:1px solid var(--ink-faint);z-index:-2;border-radius:var(--ds-radius-sm,2px);pointer-events:none}

/* ===== Paper file — ink-on-paper explicit class (ds-paper-ink), TASK-00.7
   (chain-00 reopening, 2026-08-14). Chain 21 (feat/oms-step-forms-paper-
   20260814) already authored a CONTAINER-scoped ink-on-paper rule for
   fields rendered inside .ds-paper-sheet ("Paper file — ink-on-paper field
   treatment (ds-paper-sheet scoped), TASK-21.01"): every .ds-input/
   .ds-select/.ds-textarea/.ds-pf-value automatically picks it up just by
   being a descendant of .ds-paper-sheet, no per-field className needed.
   That rule cannot reach controls OUTSIDE a .ds-paper-sheet container --
   e.g. TASK-11.1/11.2's ProductLinesEditor and shared field components
   (salesUi.tsx), which render inside sales popups, not the paper shell.
   This class is the explicit complement those consumers apply themselves
   (`className="ds-input ds-paper-ink"` pattern, additive, never a class
   replacement, per TASK-11.1's own instruction) -- SAME properties as
   chain 21's container rule, verified by direct comparison against
   origin/feat/oms-step-forms-paper-20260814's components.css at authoring
   time, so a field looks byte-identical whether it inherited the look from
   being inside a paper sheet or was explicitly told to look that way.
   Extends the same treatment to .rsel-input (the product-picker's search
   field, TASK-11.1's own flagged case: "apply the ink treatment to
   rsel-input itself, do not convert it to a plain ds-input") -- chain 21's
   container rule has no rsel-input case since no step form uses that
   control, so this is new coverage, not a duplicate. */
.ds-input.ds-paper-ink,
.ds-select.ds-paper-ink,
.ds-textarea.ds-paper-ink,
.rsel-input.ds-paper-ink{background:transparent;border:0;border-bottom:var(--ds-rule) solid var(--hairline);border-radius:0;padding:4px 2px;font-family:var(--font-ui);color:var(--ink);transition:border-color var(--ds-motion-fast) ease}
.ds-input.ds-paper-ink:hover,
.ds-select.ds-paper-ink:hover,
.ds-textarea.ds-paper-ink:hover,
.rsel-input.ds-paper-ink:hover{border-bottom-color:var(--ink-mute)}
.ds-input.ds-paper-ink:focus-visible,
.ds-select.ds-paper-ink:focus-visible,
.ds-textarea.ds-paper-ink:focus-visible{outline:2px solid var(--baobab);outline-offset:2px;border-bottom-color:var(--ink)}
.rsel-input.ds-paper-ink:focus{outline:2px solid var(--baobab);outline-offset:2px;border-bottom-color:var(--ink)}
.ds-input--attention.ds-paper-ink{border-bottom-color:var(--baobab)}
.ds-picker-chosen.ds-paper-ink{background:transparent;border:0;border-bottom:var(--ds-rule) solid var(--hairline);border-radius:0;padding:4px 2px}
.ds-picker-change.ds-paper-ink{color:var(--baobab)}
.ds-pf-value.ds-paper-ink{background:transparent;border:0;border-radius:0;padding:4px 2px 4px 0;color:var(--ink)}

/* ===== Paper file — card-scale folder object (ds-paper-folder), TASK-00.8
   (chain-00 reopening, 2026-08-14). The chain-12/13/15 gap: ds-paper-file/
   ds-paper-sheet are PAGE-scale only (position:absolute;inset:0 inside a
   min-height:520px ancestor -- an "absolute inset trap" that only works
   when the consumer commits to that whole page-scale layout). Pipeline
   Kanban cards (TASK-12.1) and list-page rows (TASK-13.1/13.2/13.3) need a
   SMALL folder-of-sheets look inside an ordinary grid/list flow -- normal
   document flow, sized by its own content like any other card, never
   position:absolute. Two objects: ds-paper-folder (the closed folder body,
   with peeking sheet-edge pseudo-elements suggesting sheets tucked inside,
   and a lift-on-hover affordance) and ds-paper-folder-tab (the small
   file-tab label riding the folder's top edge, echoing ds-paper-tab's
   look at a smaller scale without sharing its raised-pile state machine --
   a folder card has no raise/fold interaction, it is a static row/card that
   opens the existing popup on click, per TASK-12.1/13.1's own click-path-
   unchanged requirement). Reduced-motion drops the hover-lift transition.
   Print renders the closed folder as a plain text row -- no 3D paper chrome
   belongs on a printed page for what is, on paper, just a list. */
.ds-paper-folder{position:relative!important;isolation:isolate!important;z-index:1!important;display:flex!important;flex-direction:column!important;flex-shrink:0!important;box-sizing:border-box!important;width:100%!important;max-width:100%!important;gap:2px!important;background:var(--paper,#FAF9F5)!important;border:1px solid rgba(26,26,26,0.12)!important;border-radius:2px!important;padding:6px 12px 6px 12px!important;box-shadow:0 1px 3px rgba(26,26,26,0.04),0 4px 14px -2px rgba(26,26,26,0.07)!important;cursor:pointer!important;text-align:left!important;align-items:flex-start!important;transform-origin:14px 14px!important;transition:transform var(--ds-motion-fast,0.15s) ease,box-shadow var(--ds-motion-fast,0.15s) ease!important;margin-bottom:12px!important}
.ds-paper-folder:hover{transform:translate(-1px,-1px)!important;box-shadow:0 2px 6px rgba(26,26,26,0.06),0 6px 16px rgba(26,26,26,0.10)!important}
.ds-paper-folder::before,
.ds-paper-folder::after{content:""!important;position:absolute!important;inset:0!important;border-radius:2px!important;pointer-events:none!important;transition:transform var(--ds-motion-fast,0.15s) ease!important}
.ds-paper-folder::before{background:#F8F6EE!important;border:1px solid rgba(26,26,26,0.11)!important;z-index:-1!important;transform:translate(-3px,4px) rotate(-.35deg)!important;box-shadow:0 1px 3px rgba(26,26,26,0.04),0 4px 10px -2px rgba(26,26,26,0.05)!important}
.ds-paper-folder::after{background:#F3EFE2!important;border:1px solid rgba(26,26,26,0.10)!important;z-index:-2!important;transform:translate(-6px,8px) rotate(.25deg)!important;box-shadow:-3px 4px 0 0 #ECE6D5,-3px 4px 0 1px rgba(26,26,26,0.09),0 4px 14px -2px rgba(26,26,26,0.08),0 1px 4px rgba(26,26,26,0.04)!important}
.bd-col-b .ds-paper-folder::before,.bd-col .ds-paper-folder::before,.bd-scroll .ds-paper-folder::before,.ds-kanban-col-body .ds-paper-folder::before,.ds-kanban-card .ds-paper-folder::before,.ds-kanban .ds-paper-folder::before{transform:translate(-2px,3px) rotate(-1.4deg)!important}
.bd-col-b .ds-paper-folder::after,.bd-col .ds-paper-folder::after,.bd-scroll .ds-paper-folder::after,.ds-kanban-col-body .ds-paper-folder::after,.ds-kanban-card .ds-paper-folder::after,.ds-kanban .ds-paper-folder::after{transform:translate(-4px,6px) rotate(1.2deg)!important}
.ds-kanban-board .ds-paper-folder,.ds-kanban-col-body > .ds-paper-folder{margin-bottom:12px!important}
.ds-paper-folder:focus-visible{outline:2px solid var(--baobab);outline-offset:2px}
.ds-paper-folder.paper-alt-even,.ds-paper-folder:nth-child(even){background:var(--paper-2,#F3F0E6)!important}
.ds-paper-folder.paper-alt-even::before,.ds-paper-folder:nth-child(even)::before{background:#ECE7D9!important}
.ds-paper-folder.paper-alt-even::after,.ds-paper-folder:nth-child(even)::after{background:#E5DFCF!important;box-shadow:-3px 4px 0 0 #DED7C4,-3px 4px 0 1px rgba(26,26,26,0.09),0 4px 14px -2px rgba(26,26,26,0.08),0 1px 4px rgba(26,26,26,0.04)!important}
.ds-paper-folder.paper-alt-odd,.ds-paper-folder:nth-child(odd){background:var(--paper,#FAF9F5)!important}
.ds-paper-folder.paper-alt-odd::before,.ds-paper-folder:nth-child(odd)::before{background:#F8F6EE!important}
.ds-paper-folder.paper-alt-odd::after,.ds-paper-folder:nth-child(odd)::after{background:#F3EFE2!important}
.ds-paper-folder-tab{display:inline-flex;align-items:center;align-self:flex-start;height:15px;padding:0 6px;margin-bottom:2px;background:var(--ink);color:var(--paper);font-family:var(--font-mono);font-weight:600;font-size:8px;letter-spacing:.05em;text-transform:uppercase;border-radius:2px;line-height:1}
.ds-paper-folder .ds-review-strip{display:flex;flex-wrap:wrap;justify-content:space-between;gap:4px 16px;width:100%;box-sizing:border-box;margin-top:1px}
.ds-paper-folder .ds-review-field{flex:1 1 0;min-width:100px;display:flex;flex-direction:column;gap:1px;padding:0}
.ds-paper-folder .ds-review-label{display:block;text-align:left;font-family:var(--font-mono);text-transform:uppercase;font-size:8.5px;font-weight:600;letter-spacing:.04em;line-height:1.1;color:var(--ink-mute);width:100%}
.ds-paper-folder .ds-review-value,
.ds-paper-folder .ds-review-value.ds-mono-num{display:block;text-align:left;color:var(--ink);font-size:12px;line-height:1.25;width:100%}
.ds-paper-folder-hangtab{display:flex;align-items:center;justify-content:space-between;gap:8px;background:var(--paper-card,#EDE6D2);border-bottom:1.5px solid var(--hairline-dark,#B8AF98);border-radius:3px 3px 0 0;padding:6px 10px}
.ds-paper-folder-hangtab-title{font-family:var(--font-mono);font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink,#111110);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-paper-folder-hangtab-marker{font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;padding:2px 6px;border-radius:2px;border:1px solid var(--ink,#111110);background:var(--paper,#FAF8F2);color:var(--ink,#111110);white-space:nowrap}
.ds-paper-folder-sheet{padding:10px 12px;display:flex;flex-direction:column;gap:6px}
.ds-paper-folder-sub{font-size:12px;color:var(--ink-soft,#3A3832);line-height:1.3}
.ds-paper-folder-row-main{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-top:2px}
.ds-paper-folder-value{font-family:var(--font-display);font-style:italic;font-weight:700;font-size:20px;color:var(--ink,#111110);line-height:1.1}
.ds-paper-folder-weight{font-family:var(--font-mono);font-size:11.5px;font-weight:700;color:var(--ink-mute,#6A675C)}
.ds-paper-folder-foot{display:flex;align-items:center;justify-content:space-between;font-family:var(--font-mono);font-size:10.5px;color:var(--ink-mute,#6A675C);border-top:1px dashed var(--hairline,#D6CEBE);padding-top:5px;margin-top:3px}

.ds-datagrid-card-bar{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px 16px;padding:6px 10px;margin-bottom:8px;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);box-shadow:0 1px 2px rgba(26,26,26,0.04);width:100%;box-sizing:border-box}
.ds-datagrid-card-bar-group{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px}
.ds-datagrid-card-bar-label{font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-mute);margin-right:2px}
.ds-datagrid-filter-chips-row,.ds-datagrid-sort-chips-row{display:flex;flex-wrap:wrap;align-items:center;gap:5px}
.ds-datagrid-filter-pill-wrap{position:relative}
.ds-filter-pill-btn,.ds-sort-pill-btn{display:inline-flex;align-items:center;gap:4px;padding:2px 7px;height:22px;font-family:var(--font-ui);font-size:11px;font-weight:500;color:var(--ink);background:var(--paper-2);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);cursor:pointer;transition:all var(--ds-motion-fast) ease;line-height:1}
.ds-filter-pill-btn:hover,.ds-sort-pill-btn:hover{background:var(--paper);border-color:var(--ink-mute)}
.ds-filter-pill-btn-active,.ds-sort-pill-btn-active{background:var(--ink);color:var(--paper);border-color:var(--ink);font-weight:600}
.ds-filter-pill-arrow,.ds-sort-pill-dir{font-size:8.5px;opacity:.8}
.ds-sort-pill-dir-dim{opacity:.35}
.ds-filter-pill-badge{display:inline-flex;align-items:center;justify-content:center;min-width:13px;height:13px;padding:0 3px;font-size:8.5px;font-weight:700;background:var(--baobab);color:#FFF;border-radius:6px}
.ds-filter-pill-clear{padding:2px 5px;font-size:10px;font-family:var(--font-ui);color:var(--ink-mute);background:transparent;border:0;text-decoration:underline;cursor:pointer}
.ds-filter-pill-clear:hover{color:var(--ink)}
.ds-datagrid-filter-popover{position:absolute;top:calc(100% + 4px);left:0;z-index:50;min-width:180px;max-width:280px;padding:8px;background:var(--paper);border:1px solid var(--hairline);border-radius:var(--ds-radius-sm);box-shadow:0 4px 12px rgba(26,26,26,0.12)}
@media (prefers-reduced-motion: reduce){
  .ds-paper-folder{transition:none}
}
@media print{
  .ds-paper-folder{background:var(--paper);box-shadow:none;border-radius:0;border:0;border-bottom:var(--ds-rule) solid var(--hairline);padding:var(--ds-space-8) 0;transform:none}
  .ds-paper-folder::before,
  .ds-paper-folder::after,
  .ds-paper-folder-hangtab,
  .ds-paper-folder-tab{display:none}
}

/* ===== Paper file — ink-on-paper field treatment (ds-paper-sheet scoped),
   TASK-21.01 (chain B2, 2026-08-14). Every step form's editable fields
   (StaticStepForms.tsx) already use the shared .ds-input/.ds-select/
   .ds-textarea/.ds-picker classes -- PRESOLVE-03's THE LAW requires
   restyling those EXISTING classed elements with paper-family CSS bound to
   their SAME handlers, never adding new markup or React state. Following
   the codebase's own established pattern for scoping a field's look to its
   container (see .ds-modal--doc .ds-pf-field .ds-input above), this scopes
   ink-on-paper styling to any .ds-pf field rendered inside .ds-paper-sheet
   -- one rule set, picked up automatically by every one of the 11 step
   forms and every later chunk in this chain, no per-field className
   changes, so PRESOLVE-04's eid diff for this and every later TASK-21.x
   chunk stays genuinely empty. Underline-only, transparent background,
   ink-colored text -- reads as filled-in type on paper, not a UI form. */
.ds-paper-sheet .ds-input,
.ds-paper-sheet .ds-select,
.ds-paper-sheet .ds-textarea{background:transparent;border:0;border-bottom:var(--ds-rule) solid var(--hairline);border-radius:0;padding:4px 2px;font-family:var(--font-ui);color:var(--ink);transition:border-color var(--ds-motion-fast) ease}
.ds-paper-sheet .ds-input:hover,
.ds-paper-sheet .ds-select:hover,
.ds-paper-sheet .ds-textarea:hover{border-bottom-color:var(--ink-mute)}
.ds-paper-sheet .ds-input:focus-visible,
.ds-paper-sheet .ds-select:focus-visible,
.ds-paper-sheet .ds-textarea:focus-visible{outline:2px solid var(--baobab);outline-offset:2px;border-bottom-color:var(--ink)}
.ds-paper-sheet .ds-input--attention{border-bottom-color:var(--baobab)}
.ds-paper-sheet .ds-picker-chosen{background:transparent;border:0;border-bottom:var(--ds-rule) solid var(--hairline);border-radius:0;padding:4px 2px}
.ds-paper-sheet .ds-picker-change{color:var(--baobab)}
.ds-paper-sheet table.ds-pf-lines{background:transparent}
.ds-paper-sheet table.ds-pf-lines td .ds-input{padding:3px 2px}
/* Read-only fact echoes (PfField's .ds-pf-value) -- these render prior-stage
   facts (approval stamps, committed totals, gate/weighbridge readings) on
   sheets throughout chain B2 (TASK-21.05 onward); the base .ds-pf-value is a
   dashed UI card (components.css ~9327), which reads as an editable-looking
   placeholder box on a printed document. Ink-on-paper equivalent: plain
   text, no border/background, matching how a typed-in fact reads on paper. */
.ds-paper-sheet .ds-pf-value{background:transparent;border:0;border-radius:0;padding:4px 2px 4px 0;color:var(--ink)}

/* SCOPE RULE for .ds-dealer-*: never guard these with a
   .dealer-standalone-shell ancestor. The chrome is gated in the component
   by `isStandalone`, which comes from a QUERY PARAM, not the route --
   and .dealer-standalone-shell is emitted only by src/app/dealer/page.tsx.
   On /app/oms-dealer?standalone=1 the markup renders and an
   ancestor-scoped rule would not match, which is the defect fixed twice
   already (PR #679, PR #684). The component's conditional IS the gate.
   Keep these selectors bare. */

/* ===== Dealer standalone chrome (TASK-P2-30.2a) =====
   DealerCockpit.tsx renders this chrome ONLY when the surface is standalone
   (?standalone=1/?popup=1) -- embedded in the portal shell it gets OmsFrame
   instead (the normal MMD module bar). This is chrome for a dealer's OWN
   external-facing shell, not general portal chrome. Selectors here are
   bare (see the SCOPE RULE just above) -- the ONLY ancestor-scoped rule
   left in this family is `.dealer-standalone-shell{min-height:100dvh}`
   itself, which legitimately targets the wrapper element and is defined
   elsewhere in this file (search for that exact selector), not here.

   Before this chunk: 46 inline style={} props, plus classNames the consumer
   referenced with no CDS definition (public/_design-system/*.css or the
   manifest) -- the standalone-only topbar/footer/brand/unit/identity/
   sign-out/toolbar/colfilter/pager objects genuinely had no definition
   anywhere and are new below. A separate set (nav/tab/panel/admin-wrap/
   form-grid/form-actions, plus fullbleed-page) WAS already defined, in
   src/app/globals.css -- see the REWORK note just above the fullbleed-page
   rule for what that means and why those are unscoped. Every color below
   maps the file's foreign palette onto MMD tokens only -- --ink (topbar/
   footer black), --paper (text on ink), --ink-faint (muted text on ink,
   replaces the foreign slate-gray), --baobab (brand tile, sign-out, and the
   active-tab treatment -- MMD's own red, not a near-miss shade of the
   foreign ones this surface used), --ink-soft/--ink-quiet (raised controls
   and secondary text), --hairline-on-ink (borders on ink), --paper-2/
   --hairline (the light toolbar/pager/panel strips), --signal-grass/-bg
   (the status badge, an unrelated orphan found in the same file, genuinely
   undefined everywhere including globals.css -- checked before authoring).

   This chunk authors objects only -- P2-30.2b is the one that edits
   DealerCockpit.tsx to consume them; nothing here is wired to a consumer
   yet, and the ratchet does not move until that chunk lands. */

/* REWORK 2026-08-15: 12 of the classNames this chunk originally authored
   (admin-wrap/form-actions/form-grid/fullbleed-page/nav-groups/nav-wrap/
   panel/panel-desc/panel-title/tab/tab--active/tab-count) were ALREADY
   DEFINED, with real rules including :hover and a compound active-count
   selector, in src/app/globals.css:4861-5125 -- a false premise in the
   task file (checked "neither this file, the manifest, nor globals.css";
   globals.css was in fact never checked for this specific set, though it
   correctly was for a different set of names flagged the same pass -- an
   inconsistently-applied check, not a deliberate omission, corrected here
   because mmd-projects-ed's pre-consumption diff caught it, not because
   this session's own gate did). REMOVED from globals.css in this same PR
   (chain-00 authority extended to that file for this migration) so there
   is one definition, not two competing ones.
   Of those 12, only ds-dealer-fullbleed-page is genuinely standalone-only
   (DealerCockpit.tsx:895 gates it on isStandalone explicitly). The other 11
   render in BOTH the standalone and embedded views -- DealerCockpit.tsx's
   isStandalone branch (:792) only gates the header/footer, not the nav/tab/
   panel/form markup below it. Scoping those 11 under .dealer-standalone-shell
   (as this chunk originally did) would have silently unstyled the embedded
   dealer view the moment 30.2b deleted the globals.css originals. They are
   UNSCOPED below, matching their real usage. */
.ds-dealer-fullbleed-page{width:100%;max-width:100%;margin:0;padding:16px 24px;box-sizing:border-box;background:var(--paper-2);min-height:calc(100vh - 56px);display:flex;flex-direction:column}
.ds-dealer-fullbleed-page .module-workbench{width:100%;max-width:100%;margin:0}

/* -- Topbar (was the inline <header> at DealerCockpit.tsx:795) -- */
.ds-dealer-topbar{width:100%;height:56px;min-height:56px;background:var(--ink);color:var(--paper);display:flex;align-items:center;justify-content:space-between;padding:0 24px;box-sizing:border-box;border-bottom:1px solid var(--hairline-on-ink);z-index:100}
.ds-dealer-topbar-brand{display:flex;align-items:center;gap:12px}
.ds-dealer-brand-tile{width:34px;height:34px;border-radius:6px;background:var(--baobab);color:var(--baobab-on);display:flex;align-items:center;justify-content:center;font-weight:900;font-size:15px;letter-spacing:-0.5px}
.ds-dealer-brand-text{display:flex;flex-direction:column}
.ds-dealer-brand-name{color:var(--paper);font-weight:800;font-size:14px;letter-spacing:.05em;line-height:1.1}
.ds-dealer-brand-eyebrow{color:var(--ink-faint);font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase}
.ds-dealer-topbar-unit{display:flex;align-items:center;gap:8px}
.ds-dealer-unit-label{font-size:11px;color:var(--ink-faint);font-weight:600}
.ds-dealer-unit-select{background:var(--ink-soft);color:var(--paper);border:1px solid var(--hairline-on-ink);border-radius:4px;padding:5px 10px;font-size:12px;font-weight:600;cursor:pointer}
.ds-dealer-topbar-identity{display:flex;align-items:center;gap:16px}
.ds-dealer-identity-block{display:flex;flex-direction:column;text-align:right}
.ds-dealer-identity-name{font-size:12px;color:var(--paper);font-weight:700}
.ds-dealer-identity-sub{font-size:10px;color:var(--ink-faint)}
/* Sign-out: MMD's own danger token (--baobab) on a raised-on-ink chip,
   matching the treatment .ds-paper-ctl--danger already gives on paper --
   the foreign red-tint literal never was a real ramp, it was one
   more invented hex this surface never had a token for. */
.ds-dealer-signout{color:var(--baobab);text-decoration:none;font-size:11px;font-weight:600;background:var(--ink-soft);padding:6px 14px;border-radius:4px;border:1px solid var(--hairline-on-ink)}
.ds-dealer-signout:hover{background:var(--ink);border-color:var(--baobab)}

/* -- Nav row: transaction/admin tab groups + the primary action (was
   :900-991). UNSCOPED -- renders in both standalone and embedded views. -- */
.ds-dealer-nav-wrap{display:flex;flex-direction:column;background:var(--paper);border-bottom:1px solid var(--hairline);margin-bottom:16px;border-radius:4px 4px 0 0}
/* gap:12px + flex-wrap here (not the 24px/nowrap globals.css originally
   shipped) matches the inline override the consumer already carried at
   :901 -- narrower gap + wrap keeps the primary action button from
   overflowing at the 768/900px widths PRESOLVE-01 governs. Folded into the
   base rule rather than a variant: one consumer, one context, no reason to
   split it. */
.ds-dealer-nav-groups{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;padding:8px 16px 0 16px;gap:12px;width:100%}
/* Inner cluster (was :902's anonymous style block) -- the two nav-groups
   (Transactions / Account & Admin) side by side, separate from the primary
   action button ds-dealer-nav-groups positions on the far right. */
.ds-dealer-nav-groups-left{display:flex;align-items:center;gap:24px}
.ds-dealer-tab{display:inline-flex;align-items:center;gap:6px;padding:8px 14px;font-size:12px;font-weight:600;color:var(--ink-soft);background:transparent;border:0;border-bottom:2px solid transparent;cursor:pointer;white-space:nowrap}
.ds-dealer-tab:hover{color:var(--ink);background:var(--paper-2)}
.ds-dealer-tab--active{color:var(--baobab);border-bottom-color:var(--baobab);font-weight:700}
.ds-dealer-tab-count{font-family:var(--font-mono,monospace);font-size:10px;padding:1px 6px;border-radius:10px;background:var(--hairline);color:var(--ink-soft)}
.ds-dealer-tab--active .ds-dealer-tab-count{background:var(--baobab-bg);color:var(--baobab)}

/* REWORK 2 (2026-08-15): same scoping defect as the globals.css rework,
   not fully applied past the nav/tab/panel/form set the first time. Verified
   directly this round: `isStandalone` appears exactly 3 times in
   DealerCockpit.tsx (788 declaration, 792 the header conditional's open,
   893 its close, 895 the page-wrapper className) -- it gates ONLY the
   header and the wrapper class. The toolbar (:1000-1027), column-filter row
   (:1224-1233), pager (:1343-1377), footer (:1746, a sibling AFTER the
   conditional closes at 893, not inside it) and the summary separators all
   render unconditionally, in both views. Un-scoping all of them below. */

/* -- Toolbar strip under the nav (was :1000-1027). UNSCOPED. -- */
.ds-dealer-toolbar{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;background:var(--paper-2);border-top:1px solid var(--hairline)}
.ds-dealer-toolbar-left{display:flex;align-items:center;gap:12px}
.ds-dealer-toolbar-search{width:260px}
.ds-dealer-toolbar-search-btn{padding:4px 10px;font-size:12px;height:30px}
.ds-dealer-toolbar-filters{display:flex;align-items:center;gap:16px}
.ds-dealer-toolbar-filter-label{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ink-soft);font-weight:600}
.ds-dealer-toolbar-pagesize{padding:4px 8px;font-size:12px;height:30px;width:70px;background:var(--paper)}

/* -- Column-filter row inside the table head (was :1224-1233). UNSCOPED. -- */
.ds-dealer-colfilter-row{background:var(--paper-2)}
.ds-dealer-colfilter-cell{padding:4px 8px}
.ds-dealer-colfilter-cell .ds-input{width:100%;font-size:11px;height:26px}

/* -- Bottom pagination bar (was :1344-1377). UNSCOPED. -- */
.ds-dealer-pager{display:flex;align-items:center;justify-content:center;gap:16px;padding:12px 16px;background:var(--paper-2);border-top:1px solid var(--hairline);margin-top:8px;border-radius:0 0 6px 6px}
.ds-dealer-pager-btn{padding:6px 14px;font-size:12px;font-weight:700}
.ds-dealer-pager-status{font-size:12px;font-weight:700;color:var(--ink-soft)}

/* -- Footer (was the inline <footer> at :1746-1774 -- a sibling AFTER the
   isStandalone conditional closes, confirmed by grep, so it is NOT
   standalone-only despite being visually part of the "dark chrome" family
   with the topbar). UNSCOPED. -- */
.ds-dealer-footer{width:100%;height:40px;min-height:40px;background:var(--ink);color:var(--ink-faint);display:flex;align-items:center;justify-content:space-between;padding:0 24px;box-sizing:border-box;border-top:1px solid var(--hairline-on-ink);font-size:11px;margin-top:auto}
.ds-dealer-footer-brand{display:flex;align-items:center;gap:12px}
.ds-dealer-footer-copyright{color:var(--paper);font-weight:700;letter-spacing:.05em}
.ds-dealer-footer-links{display:flex;align-items:center;gap:16px}
.ds-dealer-footer-link{background:none;border:none;color:var(--ink-faint);cursor:pointer;padding:0;font-size:11px}
.ds-dealer-footer-link:hover{color:var(--paper)}

/* -- Admin panels: Credit / Vehicles / Team views (was :1879-2084).
   UNSCOPED -- renders in both standalone and embedded views. -- */
.ds-dealer-admin-wrap{display:flex;flex-direction:column;gap:20px;padding:16px 0}
.ds-dealer-panel{background:var(--paper);padding:20px;border-radius:var(--radius-sm,4px);border:1px solid var(--hairline)}
.ds-dealer-panel-title{font-size:14px;font-weight:700;margin:0 0 6px;color:var(--ink)}
.ds-dealer-panel-desc{font-size:12px;color:var(--ink-quiet,var(--ink-soft));margin:0 0 16px}
.ds-dealer-form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px}
.ds-dealer-form-actions{grid-column:1/-1;display:flex;justify-content:flex-end}
.ds-dealer-summary-sep{height:14px;border-left:1px solid var(--hairline)}

/* ===== Generic status badge (orphan, not dealer-specific -- found in the
   same file at DealerCockpit.tsx:1918,2023, defined nowhere; authored here
   rather than left inline since it is exactly as real a gap as the dealer
   objects above). Portal-wide, not scoped to .dealer-standalone-shell. ===== */
.ds-badge{display:inline-flex;align-items:center;font-size:11px;font-weight:600;padding:2px 8px;border-radius:999px;background:var(--paper-2);color:var(--ink-soft)}
.ds-badge--good{background:var(--signal-grass-bg);color:var(--signal-grass)}

/* --- Odoo workbench additions (2026-08-15, MMDB-2193 round 2) -------------
   Semantic components authored centrally so app code stays a pure pointer.
   ds-modal-wide: workbench modals where a data table owns the height.
   ds-meta-strip/-item: one-row label/value metadata (NOT readonly inputs).
   ds-cell-sub: muted secondary line inside a table cell (dirty-master email,
   staged-edit annotation). ds-input-cell: compact numeric cell editor.
   ds-button-ghost: quiet tertiary action. Modal-header buttons get paper
   ink because the header is dark (fixes invisible Close). */
/* The shell's globals.css restyles .ds-modal-body as a small fixed-centered
   dialog, which detaches it from this full-screen modal column and leaves the
   dark header stranded across the viewport top (live defect, 2026-08-15).
   For the wide workbench variant the body goes back into the column flow,
   centered by margins, scrolling under a sticky header. */
.ds-modal-wide .ds-modal-body {
  position: static; top: auto; left: auto; transform: none;
  width: min(1160px, 96vw); max-height: none; margin: 0 auto; align-self: center;
  flex: 1; overflow-y: auto;
  border: 0; border-radius: 0; box-shadow: none; background: var(--paper);
}
.ds-modal-wide { position: fixed; inset: 0; z-index: 210; }
.ds-input-cell-edited { border-left: 3px solid var(--baobab); }
.ds-modal-wide .module-actions-bottom { position: sticky; bottom: 0; background: var(--paper); padding-top: 10px; border-top: 1px solid var(--hairline); }
.ds-meta-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 26px; padding: 8px 0; }
.ds-meta-item { display: inline-flex; align-items: baseline; gap: 8px; }
.ds-meta-item .ds-label { margin: 0; }
.ds-cell-sub { display: block; font-size: calc(10.5px * var(--fs-scale, 1)); color: var(--ink-mute); margin-top: 2px; }
.ds-input-cell { width: 104px; padding: 5px 8px; text-align: right; font-family: var(--font-mono); font-size: calc(12px * var(--fs-scale, 1)); }
.ds-button-ghost { background: transparent; color: var(--ink-soft); border-color: transparent; }
.ds-button-ghost:hover { border-color: var(--hairline); color: var(--ink); }
.ds-modal-header .ds-button-secondary { color: var(--paper); border-color: var(--paper); background: transparent; }

/* TASK-FLOW-01 cross-process linkage chip: a downstream case shows what it
   came from as one dense inline link on the case header. */
.ds-chain-link{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);font-size:calc(11px * var(--fs-scale, 1));letter-spacing:0.03em;text-decoration:none;color:var(--ink-mute);border:1px solid var(--hairline);border-radius:3px;padding:2px 7px;background:var(--paper-2);transition:border-color var(--ds-motion-fast, .12s) ease,color var(--ds-motion-fast, .12s) ease}
.ds-chain-link:hover{border-color:var(--ink-faint);color:var(--ink)}
.ds-chain-link-label{text-transform:uppercase;color:var(--ink-faint)}
.ds-chain-link-ref{color:var(--ink)}


/* ==========================================================================
   MMD CENTRAL DESIGN SYSTEM · PHYSICAL PAPER & TYPEWRITER ARCHITECTURE
   Canonical Specimen: CANONICAL-PAPER-SYSTEM-COMPLETE-20260815
   ========================================================================== */

/* ==========================================================================
   MMD CENTRAL DESIGN SYSTEM · PAPER OPERATIONS & DISPATCH STYLE SYSTEM
   Derived from letterbox-v1 & physical operations dispatch mental models.
   Authored: 2026-08-15 | Signed-off by Ben Hippler (Group CIO)
   ========================================================================== */

:root {
  /* --- 1. Authentic MMD Paper & Ink Token Spectrum ------------------------ */
  --paper: #FAFAF6;           /* Pure document sheet surface */
  --paper-2: #F3F0E6;         /* Secondary warm paper / slotted bay surface */
  --paper-3: #ECE6D0;         /* Tertiary warm paper / desk background */
  --paper-stamp: #EDEFEA;     /* Muted neutral stamp background */

  --ink: #0E0E0C;             /* Deep charcoal primary typography & dark headers */
  --ink-soft: #2B2A26;        /* Secondary reading text & dense body copy */
  --ink-mute: #6E6B62;        /* Muted metadata, field labels, annotations */
  --ink-faint: #A6A39A;       /* Subtle stamps, watermark cues, faint hairlines */
  --ink-header: #1C1E1B;      /* Solid dark ink header container */

  --hairline: #D6CFB6;        /* Crisp beige hairline border */
  --hairline-dark: #B5AD94;   /* Focused / active hairline border */
  --hairline-on-ink: rgba(250, 250, 246, 0.16);

  --baobab: #C8102E;          /* MMD / Fabrimetal signature red */
  --baobab-bg: #FBE9EC;       /* Red accent tint surface */
  --baobab-on: #FAFAF6;       /* High-contrast text on baobab red */

  --signal-grass: #2F6B43;    /* Audit passed / approved green */
  --signal-grass-bg: #E2EEDA; /* Approved stamp background */
  --signal-amber: #B7791F;    /* Attention / review required amber */
  --signal-amber-bg: #FBF0D6; /* Amber stamp background */
  --signal-info: #3D6B94;     /* Muted logistics / corridor blue */
  --signal-info-bg: #E4EDF4;

  /* --- 2. Typography Hierarchy -------------------------------------------- */
  --font-serif: "Fraunces", Georgia, serif;
  --font-mono: "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;
  --font-ui: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;

  /* --- 3. Physical Paper Elevation & Shadow Physics ----------------------- */
  --shadow-slip: 0 1px 3px rgba(14, 14, 12, 0.06), 0 2px 5px rgba(14, 14, 12, 0.04), 0 0 0 1px rgba(214, 207, 182, 0.6);
  --shadow-slip-hover: 0 6px 14px rgba(14, 14, 12, 0.10), 0 2px 4px rgba(14, 14, 12, 0.06), 0 0 0 1px var(--hairline-dark);
  --shadow-drag: 0 18px 36px rgba(14, 14, 12, 0.24), 0 8px 16px rgba(14, 14, 12, 0.14);
  --shadow-sheet-window: 0 24px 50px rgba(14, 14, 12, 0.22), 0 6px 16px rgba(14, 14, 12, 0.12), 0 0 0 1px var(--hairline-dark);
  --shadow-sheet-focus: 0 28px 64px rgba(14, 14, 12, 0.28), 0 0 0 1.5px var(--ink);
}

/* ==========================================================================
   FOUNDATIONAL LAYOUTS & NAVIGATION SYSTEMS
   ========================================================================== */

/* Full-Desk Surface */
.ds-paper-desk {
  background-color: var(--paper-3);
  color: var(--ink);
  font-family: var(--font-ui);
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  -webkit-font-smoothing: antialiased;
}

/* Top Masthead Command Bar */
.ds-paper-masthead {
  background: var(--ink);
  color: var(--paper);
  padding: 10px 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  border-bottom: 2px solid #000000;
  flex-shrink: 0;
}

.ds-paper-masthead-brand {
  display: flex;
  align-items: baseline;
  gap: 12px;
}

.ds-paper-brand-badge {
  background: var(--baobab);
  color: var(--baobab-on);
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  padding: 2px 6px;
  letter-spacing: 0.6px;
  border-radius: 2px;
  text-transform: uppercase;
}

.ds-paper-masthead-title {
  font-family: var(--font-serif);
  font-size: 16px;
  font-weight: 700;
  letter-spacing: 0.2px;
  color: var(--paper);
}

.ds-paper-masthead-sub {
  font-family: var(--font-mono);
  font-size: 11px;
  color: var(--ink-faint);
}

.ds-paper-masthead-metrics {
  display: flex;
  align-items: center;
  gap: 24px;
  font-family: var(--font-mono);
}

.ds-paper-metric-item {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
}

.ds-paper-metric-lbl {
  font-size: 9.5px;
  color: var(--ink-faint);
  letter-spacing: 0.5px;
  text-transform: uppercase;
}

.ds-paper-metric-val {
  font-size: 14.5px;
  font-weight: 700;
  color: var(--paper);
}

/* Multi-Channel Wall Bay Grid */
.ds-paper-wall-bay {
  display: grid;
  grid-template-columns: repeat(var(--bay-cols, 6), minmax(280px, 1fr));
  gap: 14px;
  padding: 16px 20px 48px;
  align-items: start;
  flex: 1;
}

/* Slotted Channel Column */
.ds-paper-rack-bay {
  background: var(--paper-2);
  border: 1px solid var(--hairline);
  border-radius: 3px;
  display: flex;
  flex-direction: column;
  min-height: calc(100vh - 125px);
  box-shadow: inset 0 1px 3px rgba(14, 14, 12, 0.04), 0 1px 1px rgba(250, 250, 246, 0.8);
  position: relative;
}

/* Large Stack Volume Channel Header */
.ds-paper-bay-header {
  background: var(--ink);
  color: var(--paper);
  padding: 12px 14px 10px;
  border-top-left-radius: 2px;
  border-top-right-radius: 2px;
  border-bottom: 2px solid #000000;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

.ds-paper-bay-title {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  font-family: var(--font-mono);
  font-size: calc(11px * var(--fs-scale, 1));
  font-weight: 700;
  letter-spacing: 0.6px;
  text-transform: uppercase;
  color: var(--hairline);
  border-bottom: 1px solid #2B2A26;
  padding-bottom: 4px;
}

.ds-paper-bay-count {
  background: #1C1C18;
  color: var(--paper);
  padding: 2px 7px;
  border-radius: 2px;
  font-size: calc(11px * var(--fs-scale, 1));
  font-weight: 700;
  border: 1px solid #3E3B34;
}

.ds-paper-bay-volume {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  font-family: var(--font-mono);
  padding-top: 2px;
}

.ds-paper-bay-tonnage {
  font-size: calc(17.5px * var(--fs-scale, 1));
  font-weight: 700;
  color: var(--paper);
  letter-spacing: -0.2px;
}

.ds-paper-bay-value {
  font-size: calc(13.5px * var(--fs-scale, 1));
  font-weight: 600;
  color: var(--ink-faint);
}

.ds-paper-slot-rack {
  padding: 10px 8px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1;
  min-height: 250px;
  transition: background 0.15s ease;
}

.ds-paper-slot-rack.drag-over {
  background: #E2DDCC;
  outline: 2px dashed var(--ink-mute);
  outline-offset: -4px;
}

/* ==========================================================================
   THE 3D TACTILE PAPER SLIP (CARD OBJECT)
   ========================================================================== */

.ds-paper-slip {
  background: var(--paper);
  border: 1px solid var(--hairline);
  border-radius: 2px;
  padding: 10px 12px;
  box-shadow: var(--shadow-slip);
  cursor: grab;
  position: relative;
  transition: transform 0.15s cubic-bezier(0.2, 0, 0, 1), box-shadow 0.15s ease, border-color 0.15s ease;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* 3D Paper Stack Underside Fold */
.ds-paper-slip::after {
  content: "";
  position: absolute;
  bottom: -3px;
  right: 4px;
  left: 4px;
  height: 3px;
  background: #EFECE1;
  border: 1px solid var(--hairline);
  border-top: none;
  border-radius: 0 0 2px 2px;
  z-index: -1;
}

.ds-paper-slip:hover {
  box-shadow: var(--shadow-slip-hover);
  border-color: var(--hairline-dark);
  transform: translateY(-2px);
  background: #FFFFFF;
}

.ds-paper-slip:active {
  cursor: grabbing;
}

.ds-paper-slip.dragging {
  opacity: 0.35;
  transform: scale(0.96) rotate(-1deg);
  box-shadow: var(--shadow-drag);
}

/* Slip Header: Account Code & Entity Badge */
.ds-paper-slip-top {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-family: var(--font-mono);
  font-size: calc(11px * var(--fs-scale, 1));
  border-bottom: 1px solid var(--hairline);
  padding-bottom: 5px;
}

.ds-paper-slip-account {
  font-weight: 700;
  color: var(--ink);
  letter-spacing: 0.3px;
}

.ds-paper-slip-entity {
  font-size: calc(10px * var(--fs-scale, 1));
  font-weight: 600;
  color: var(--ink-soft);
  background: var(--paper-2);
  border: 1px solid var(--hairline);
  padding: 1px 5px;
  border-radius: 2px;
}

/* Metrics Row: Commercial Value + Physical Tonnage */
.ds-paper-slip-metrics {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  font-family: var(--font-mono);
  background: var(--paper-2);
  border: 1px solid var(--hairline);
  padding: 6px 8px;
  border-radius: 2px;
}

.ds-paper-slip-value {
  font-size: calc(13.5px * var(--fs-scale, 1));
  font-weight: 700;
  color: var(--ink);
}

.ds-paper-slip-tonnage {
  font-size: calc(13.5px * var(--fs-scale, 1));
  font-weight: 700;
  color: var(--ink);
}

.ds-paper-slip-vendor {
  font-size: calc(12px * var(--fs-scale, 1));
  font-weight: 700;
  color: var(--ink);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ds-paper-slip-desc {
  font-size: calc(11px * var(--fs-scale, 1));
  color: var(--ink-soft);
  line-height: 1.35;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.ds-paper-slip-foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-family: var(--font-mono);
  font-size: calc(10px * var(--fs-scale, 1));
  color: var(--ink-mute);
  border-top: 1px dashed var(--hairline);
  padding-top: 5px;
}

/* Step Shift Action Buttons on Hover */
.ds-paper-slip-shift-btns {
  position: absolute;
  top: 6px;
  right: 6px;
  display: none;
  gap: 3px;
  z-index: 2;
}

.ds-paper-slip:hover .ds-paper-slip-shift-btns {
  display: flex;
}

.ds-paper-btn-step {
  background: var(--ink);
  color: var(--paper);
  border: 1px solid #000000;
  font-family: var(--font-mono);
  font-size: 10px;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 2px;
  cursor: pointer;
}

.ds-paper-btn-step:hover {
  background: #000000;
}

/* Empty Channel Indicator */
.ds-paper-empty-channel {
  border: 1px dashed var(--hairline-dark);
  border-radius: 2px;
  padding: 30px 10px;
  text-align: center;
  color: var(--ink-mute);
  font-family: var(--font-mono);
  font-size: 11px;
  background: rgba(250, 250, 246, 0.4);
}

/* ==========================================================================
   MOVABLE, RESIZABLE, FLUID-SCALED PAPER WINDOWS
   ========================================================================== */

.ds-paper-window-layer {
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 500;
}

.ds-paper-window {
  position: absolute;
  background: var(--paper);
  border: 1px solid var(--hairline-dark);
  border-radius: 3px;
  box-shadow: var(--shadow-sheet-window);
  pointer-events: auto;
  display: flex;
  flex-direction: column;
  min-width: 460px;
  min-height: 380px;
  resize: none;
  overflow: hidden;
  z-index: 501;
  container-type: inline-size;
}

.ds-paper-window.active-focus {
  z-index: 550;
  border-color: var(--ink);
  box-shadow: var(--shadow-sheet-focus);
}

.ds-paper-window.minimized {
  display: none;
}

.ds-paper-window-clamp {
  background: var(--ink);
  color: var(--paper);
  padding: 8px 12px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  cursor: move;
  border-bottom: 2px solid #000000;
  flex-shrink: 0;
  user-select: none;
}

.ds-paper-window-title {
  font-family: var(--font-mono);
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 0.5px;
  text-transform: uppercase;
  display: flex;
  align-items: center;
  gap: 8px;
}

.ds-paper-window-actions {
  display: flex;
  align-items: center;
  gap: 8px;
}

.ds-paper-win-btn {
  background: #2B2A26;
  color: var(--paper);
  border: 1px solid #3E3B34;
  font-family: var(--font-mono);
  font-size: 10px;
  padding: 2px 7px;
  border-radius: 2px;
  cursor: pointer;
}

.ds-paper-win-btn:hover {
  background: #3E3B34;
}

.ds-paper-win-close {
  background: var(--baobab);
  color: var(--baobab-on);
  border: none;
  font-family: var(--font-mono);
  font-size: 10px;
  padding: 2px 7px;
  border-radius: 2px;
  cursor: pointer;
}

.ds-paper-win-close:hover {
  background: #A00D24;
}

/* Document Sheet Body with Automatic Fluid Font Scaling */
.ds-paper-sheet-content {
  padding: 24px 28px;
  flex: 1;
  overflow-y: auto;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-mono);
  font-size: var(--doc-font-size, 12.5px);
  line-height: 1.45;
}

.ds-paper-sheet-head {
  display: flex;
  justify-content: space-between;
  border-bottom: 2px solid var(--ink);
  padding-bottom: 12px;
  margin-bottom: 16px;
}

.ds-paper-sheet-title {
  font-family: var(--font-serif);
  font-size: calc(var(--doc-font-size, 12.5px) * 1.45);
  font-weight: 700;
  letter-spacing: 0.2px;
  color: var(--ink);
}

.ds-paper-sheet-sub {
  color: var(--ink-mute);
  font-size: calc(var(--doc-font-size, 12.5px) * 0.85);
  font-family: var(--font-mono);
}

.ds-paper-meta-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 12px;
  border-bottom: 1px solid var(--hairline);
  padding-bottom: 16px;
  margin-bottom: 16px;
}

.ds-paper-meta-item .lbl {
  font-size: calc(var(--doc-font-size, 12.5px) * 0.8);
  color: var(--ink-mute);
  text-transform: uppercase;
  font-weight: 600;
}

.ds-paper-meta-item .val {
  font-weight: 700;
  font-size: calc(var(--doc-font-size, 12.5px) * 1.05);
  color: var(--ink);
}

/* In-Place Seamless "Click & Write" Editable Elements */
.ds-paper-editable {
  outline: none;
  border-bottom: 1px dashed transparent;
  transition: background 0.15s ease, border-color 0.15s ease;
  padding: 1px 2px;
  border-radius: 1px;
  cursor: text;
}

.ds-paper-editable:hover {
  background: var(--paper-2);
  border-bottom-color: var(--hairline-dark);
}

.ds-paper-editable:focus {
  background: #FFFFFF;
  border-bottom: 1px solid var(--ink);
  box-shadow: 0 1px 3px rgba(14, 14, 12, 0.08);
}

/* Master Itemization Data Table */
.ds-paper-table {
  width: 100%;
  border-collapse: collapse;
  margin: 14px 0 12px;
  font-size: calc(var(--doc-font-size, 12.5px) * 0.95);
}

.ds-paper-table th, .ds-paper-table td {
  border: 1px solid var(--hairline);
  padding: 6px 10px;
  text-align: left;
}

.ds-paper-table th {
  background: var(--paper-2);
  font-weight: 700;
  text-transform: uppercase;
  font-size: calc(var(--doc-font-size, 12.5px) * 0.85);
}

.ds-paper-btn-add {
  background: var(--paper-2);
  color: var(--ink-soft);
  border: 1px dashed var(--hairline-dark);
  font-family: var(--font-mono);
  font-size: calc(var(--doc-font-size, 12.5px) * 0.85);
  font-weight: 600;
  padding: 4px 10px;
  border-radius: 2px;
  cursor: pointer;
  margin-bottom: 16px;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

.ds-paper-btn-add:hover {
  background: var(--paper);
  color: var(--ink);
  border-color: var(--ink);
}

/* Price Variance & Audit Callout Box */
.ds-paper-variance-box {
  background: var(--paper-2);
  border: 1px solid var(--hairline);
  padding: 10px 12px;
  border-radius: 2px;
  margin-top: 12px;
  font-size: calc(var(--doc-font-size, 12.5px) * 0.9);
}

.ds-paper-variance-title {
  font-weight: 700;
  font-size: calc(var(--doc-font-size, 12.5px) * 0.85);
  color: var(--ink-mute);
  text-transform: uppercase;
  margin-bottom: 6px;
  display: flex;
  justify-content: space-between;
}

/* Official Rubber Stamps & Audit Seals */
.ds-paper-stamp-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 14px;
  margin-top: 16px;
  border-top: 1px solid var(--hairline);
  padding-top: 14px;
}

.ds-paper-stamp-box {
  border: 2px dashed var(--hairline-dark);
  padding: 8px 12px;
  border-radius: 3px;
  font-size: calc(var(--doc-font-size, 12.5px) * 0.85);
}

.ds-paper-stamp-box .st-title {
  font-weight: 700;
  color: var(--ink-soft);
  margin-bottom: 2px;
}

.ds-paper-stamp-passed {
  color: var(--signal-grass);
  font-weight: 700;
}

/* Bottom Minimized Desk Dock Tray */
.ds-paper-dock-tray {
  position: fixed;
  bottom: 0;
  left: 20px;
  right: 20px;
  height: 34px;
  background: var(--ink);
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
  border: 1px solid #3E3B34;
  border-bottom: none;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 12px;
  z-index: 600;
  box-shadow: 0 -4px 12px rgba(14, 14, 12, 0.15);
}

.ds-paper-dock-label {
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 700;
  color: var(--ink-faint);
  text-transform: uppercase;
  margin-right: 6px;
}

.ds-paper-dock-item {
  background: #2B2A26;
  color: var(--paper);
  border: 1px solid #3E3B34;
  font-family: var(--font-mono);
  font-size: 11px;
  padding: 3px 10px;
  border-radius: 2px;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 6px;
}

.ds-paper-dock-item:hover {
  background: #3E3B34;
}

.ds-paper-dock-item.active {
  background: var(--paper);
  color: var(--ink);
  font-weight: 700;
  border-color: var(--paper);
}

/* In-place dashed editing affordance & handwritten notes */
.ds-paper-editable, .paper-edit {
  outline: none;
  background: transparent;
  border: 0;
  border-bottom: 1.5px dashed var(--hairline-dark, #A8A08A);
  padding: 1px 4px;
  border-radius: 2px;
  cursor: text;
  font-family: var(--font-mono);
  color: var(--ink);
  transition: border-color var(--ds-motion-fast, 0.12s) ease, background var(--ds-motion-fast, 0.12s) ease;
}

.ds-paper-editable:hover, .paper-edit:hover {
  background: #FFFFFF;
  border-bottom-color: var(--royal-blue, #123B75);
}

.ds-paper-editable:focus, .paper-edit:focus {
  background: #FFFFFF;
  border-bottom: 1.5px solid var(--royal-blue, #123B75);
  box-shadow: 0 1px 4px rgba(18, 59, 117, 0.15);
  color: var(--royal-blue, #123B75);
}

.hand-note {
  font-family: "Kalam", cursive;
  font-weight: 700;
  color: var(--royal-blue, #123B75);
}

.hand-underline {
  text-decoration: underline wavy var(--royal-blue, #123B75) 1.5px;
}

/* ==========================================================================
   PHYSICAL PAPER SYSTEM — LEAD-TO-CASH & ORDER MANAGEMENT SYSTEM (CDS)
   Zero black buttons, zero black modal headers, zero black filter chips.
   Authentic manila folder tabs, Fraunces serif headings, typewriter bracketed
   action affordances, and rubber stamps across all sub-forms and views.
   ========================================================================== */

.ds-scope-sales .ds-button,
.ds-scope-sales .ds-button-secondary,
.ds-scope-sales.module-workbench .ds-button,
.ds-scope-sales.module-workbench .ds-button-secondary,
.ds-modal .ds-button,
.ds-modal .ds-button-secondary,
.ds-modal--doc .ds-button,
.ds-modal--doc .ds-button-secondary,
.ds-paper-desk .ds-button,
.ds-paper-desk .ds-button-secondary,
.module-actions-bottom .ds-button,
.module-actions-bottom .ds-button-secondary,
[data-eid*="ferri-oms-3"] .ds-button,
[data-eid*="ferri-oms-3"] .ds-button-secondary {
  background: var(--paper-manila, #EDE6D2) !important;
  color: var(--ink, #111110) !important;
  border: 1.5px solid var(--hairline-dark, #B8AF98) !important;
  font-family: var(--font-mono) !important;
  font-weight: 700 !important;
  font-size: 11px !important;
  letter-spacing: 0.04em !important;
  text-transform: uppercase !important;
  border-radius: 3px !important;
  padding: 6px 14px !important;
  box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.08) !important;
  transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease !important;
}

.ds-scope-sales .ds-button:hover,
.ds-scope-sales .ds-button-secondary:hover,
.ds-scope-sales.module-workbench .ds-button:hover,
.ds-scope-sales.module-workbench .ds-button-secondary:hover,
.ds-modal .ds-button:hover,
.ds-modal .ds-button-secondary:hover,
.ds-modal--doc .ds-button:hover,
.ds-modal--doc .ds-button-secondary:hover,
.ds-paper-desk .ds-button:hover,
.ds-paper-desk .ds-button-secondary:hover,
.module-actions-bottom .ds-button:hover,
.module-actions-bottom .ds-button-secondary:hover,
[data-eid*="ferri-oms-3"] .ds-button:hover,
[data-eid*="ferri-oms-3"] .ds-button-secondary:hover {
  background: var(--paper-sheet, #FAF8F2) !important;
  border-color: var(--ink, #111110) !important;
  color: var(--ink, #111110) !important;
}

.ds-scope-sales.module-workbench .module-workbench-header .module-actions .ds-button-primary,
.ds-scope-sales .module-workbench-header .module-actions .ds-button-primary,
.ds-scope-sales .module-actions .ds-button-primary,
.ds-scope-sales .ds-button-primary,
.ds-scope-sales.module-workbench .ds-button-primary,
.ds-modal .ds-button-primary,
.ds-modal--doc .ds-button-primary,
.ds-paper-desk .ds-button-primary,
.module-actions-bottom .ds-button-primary,
[data-eid*="ferri-oms-3"] .ds-button-primary {
  background: var(--paper-sheet, #FAF8F2) !important;
  color: var(--ink, #111110) !important;
  border: 1.5px solid var(--ink, #111110) !important;
  font-family: var(--font-mono) !important;
  font-weight: 800 !important;
  font-size: 11px !important;
  letter-spacing: 0.04em !important;
  text-transform: uppercase !important;
  border-radius: 3px !important;
  padding: 6px 16px !important;
  box-shadow: 1.5px 1.5px 0 var(--ink, #111110) !important;
  transition: background 0.12s ease, border-color 0.12s ease, transform 0.08s ease, box-shadow 0.08s ease !important;
}

.ds-scope-sales.module-workbench .module-workbench-header .module-actions .ds-button-primary:hover,
.ds-scope-sales .module-workbench-header .module-actions .ds-button-primary:hover,
.ds-scope-sales .module-actions .ds-button-primary:hover,
.ds-scope-sales .ds-button-primary:hover,
.ds-scope-sales.module-workbench .ds-button-primary:hover,
.ds-modal .ds-button-primary:hover,
.ds-modal--doc .ds-button-primary:hover,
.ds-paper-desk .ds-button-primary:hover,
.module-actions-bottom .ds-button-primary:hover,
[data-eid*="ferri-oms-3"] .ds-button-primary:hover {
  background: #EDE6D2 !important;
  border-color: var(--ink, #111110) !important;
  color: var(--ink, #111110) !important;
  box-shadow: 2px 2px 0 var(--ink, #111110) !important;
}

.ds-scope-sales .ds-button-primary:active,
.ds-scope-sales.module-workbench .ds-button-primary:active,
.ds-modal .ds-button-primary:active,
.ds-modal--doc .ds-button-primary:active,
.ds-paper-desk .ds-button-primary:active,
.module-actions-bottom .ds-button-primary:active,
[data-eid*="ferri-oms-3"] .ds-button-primary:active {
  transform: translate(1px, 1px) !important;
  box-shadow: 0.5px 0.5px 0 var(--ink, #111110) !important;
}

.ds-scope-sales .ds-button-danger,
.ds-scope-sales .ds-button-negative,
.ds-scope-sales.module-workbench .ds-button-danger,
.ds-scope-sales.module-workbench .ds-button-negative,
.ds-modal .ds-button-danger,
.ds-modal .ds-button-negative,
.ds-modal--doc .ds-button-danger,
.ds-modal--doc .ds-button-negative,
.ds-paper-desk .ds-button-danger,
.ds-paper-desk .ds-button-negative,
.module-actions-bottom .ds-button-danger,
.module-actions-bottom .ds-button-negative,
[data-eid*="ferri-oms-3"] .ds-button-danger,
[data-eid*="ferri-oms-3"] .ds-button-negative {
  background: #FDF2F0 !important;
  color: #8A1F11 !important;
  border: 1.5px solid #8A1F11 !important;
  font-family: var(--font-mono) !important;
  font-weight: 800 !important;
  font-size: 11px !important;
  letter-spacing: 0.04em !important;
  text-transform: uppercase !important;
  border-radius: 3px !important;
  padding: 6px 14px !important;
  box-shadow: 1px 1px 0 rgba(138, 31, 17, 0.2) !important;
}

.ds-scope-sales .ds-button-danger:hover,
.ds-scope-sales .ds-button-negative:hover,
.ds-scope-sales.module-workbench .ds-button-danger:hover,
.ds-scope-sales.module-workbench .ds-button-negative:hover,
.ds-modal .ds-button-danger:hover,
.ds-modal .ds-button-negative:hover,
.ds-modal--doc .ds-button-danger:hover,
.ds-modal--doc .ds-button-negative:hover,
.ds-paper-desk .ds-button-danger:hover,
.ds-paper-desk .ds-button-negative:hover,
.module-actions-bottom .ds-button-danger:hover,
.module-actions-bottom .ds-button-negative:hover,
[data-eid*="ferri-oms-3"] .ds-button-danger:hover,
[data-eid*="ferri-oms-3"] .ds-button-negative:hover {
  background: #FCE4E4 !important;
  color: #5C150B !important;
  border-color: #5C150B !important;
}

.ds-scope-sales .ds-filter-chip,
.ds-scope-sales.module-workbench .ds-filterbar .ds-filter-chip,
.ds-scope-sales .ds-filterbar .ds-filter-chip {
  background: var(--paper-manila, #EDE6D2) !important;
  color: var(--ink-soft, #2E2D28) !important;
  border: 1px solid var(--hairline-dark, #B8AF98) !important;
  font-family: var(--font-mono) !important;
  font-weight: 700 !important;
  font-size: 10px !important;
  letter-spacing: 0.04em !important;
  text-transform: uppercase !important;
  border-radius: 3px !important;
  padding: 4px 10px !important;
  cursor: pointer !important;
  transition: background 0.12s ease, border-color 0.12s ease !important;
}

.ds-scope-sales .ds-filter-chip:hover,
.ds-scope-sales.module-workbench .ds-filterbar .ds-filter-chip:hover,
.ds-scope-sales .ds-filterbar .ds-filter-chip:hover {
  background: var(--paper-sheet, #FAF8F2) !important;
  border-color: var(--ink, #111110) !important;
  color: var(--ink, #111110) !important;
}

.ds-scope-sales.module-workbench .ds-filterbar .ds-filter-chip-active,
.ds-scope-sales.module-workbench .ds-filterbar .ds-filter-chip-active:hover,
.ds-scope-sales .module-workbench .ds-filterbar .ds-filter-chip-active,
.ds-scope-sales .ds-filterbar .ds-filter-chip-active,
.ds-scope-sales .ds-filter-chip-active {
  background: var(--paper-sheet, #FAF8F2) !important;
  color: var(--royal-blue, #123B75) !important;
  border: 1.5px solid var(--royal-blue, #123B75) !important;
  font-weight: 800 !important;
  box-shadow: inset 0 1px 0 rgba(18, 59, 117, 0.12) !important;
}

.ds-scope-sales .ds-crm-curswitch,
.ds-scope-sales.module-workbench .ds-crm-curswitch {
  display: inline-flex !important;
  border: 1.5px solid var(--hairline-dark, #B8AF98) !important;
  border-radius: 3px !important;
  background: var(--paper-manila, #EDE6D2) !important;
  padding: 2px !important;
  gap: 2px !important;
}

.ds-scope-sales .ds-crm-curswitch-btn,
.ds-scope-sales.module-workbench .ds-crm-curswitch-btn {
  background: transparent !important;
  border: 1px solid transparent !important;
  color: var(--ink-mute, #6A675C) !important;
  font-family: var(--font-mono) !important;
  font-weight: 700 !important;
  font-size: 10px !important;
  letter-spacing: 0.04em !important;
  padding: 3px 8px !important;
  border-radius: 2px !important;
  cursor: pointer !important;
}

.ds-scope-sales .ds-crm-curswitch-btn:hover,
.ds-scope-sales.module-workbench .ds-crm-curswitch-btn:hover {
  color: var(--ink, #111110) !important;
}

.ds-scope-sales .ds-crm-curswitch-btn-on,
.ds-scope-sales.module-workbench .ds-crm-curswitch-btn-on {
  background: var(--paper-sheet, #FAF8F2) !important;
  color: var(--ink, #111110) !important;
  border: 1px solid var(--ink, #111110) !important;
  font-weight: 800 !important;
  box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.1) !important;
}

.ds-scope-sales .ds-page-head-title,
.ds-scope-sales .ds-section-title,
.ds-scope-sales .ds-app-section-title,
.ds-scope-sales.module-workbench .module-title {
  font-family: var(--font-serif, "Fraunces", Georgia, serif) !important;
  font-weight: 700 !important;
  letter-spacing: -0.02em !important;
  color: var(--ink, #111110) !important;
}

.ds-scope-sales .ds-kicker,
.ds-scope-sales.module-workbench .eyebrow {
  font-family: var(--font-mono) !important;
  font-weight: 700 !important;
  font-size: 9.5px !important;
  letter-spacing: 0.1em !important;
  text-transform: uppercase !important;
  color: var(--ink-mute, #6A675C) !important;
}





/* ---------------------------------------------------------------------------
   Whiteboards & Diagrams studio (/app/diagrams)

   The page IS the canvas. One hairline command row — surface label, the switch
   between the three canvases, and a pop-out — then the drawing tool edge to
   edge under it. The row is deliberately shallow (30px): the tool underneath
   brings its own toolbar, and two tall bars stacked read as an unfinished
   frame rather than a working surface.
   --------------------------------------------------------------------------- */
.ds-diagrams-studio {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: 100%;
  min-height: 0;
  overflow: hidden;
  background: var(--paper);
}

.ds-diagrams-bar {
  display: flex;
  align-items: center;
  gap: 16px;
  flex: 0 0 auto;
  height: 30px;
  padding: 0 10px;
  background: var(--paper-2);
  border-bottom: 1px solid var(--hairline);
}

.ds-diagrams-title {
  flex: 0 0 auto;
  font-family: var(--font-mono);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-mute);
  white-space: nowrap;
}

.ds-diagrams-tabs {
  display: inline-flex;
  align-items: stretch;
  gap: 0;
  height: 100%;
  margin-right: auto;
  padding: 0;
  background: transparent;
  border: none;
  border-radius: 0;
}

.ds-diagrams-tab {
  display: inline-flex;
  align-items: center;
  padding: 0 12px;
  font-family: var(--font-ui);
  font-size: 12px;
  font-weight: 500;
  line-height: 1;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink-soft);
  background: transparent;
  border: none;
  border-bottom: 2px solid transparent;
  border-radius: 0;
  cursor: pointer;
}

.ds-diagrams-tab:hover {
  color: var(--ink);
}

.ds-diagrams-tab[aria-selected="true"] {
  color: var(--ink);
  font-weight: 700;
  background: transparent;
  border-bottom-color: var(--baobab);
}

.ds-diagrams-popout {
  flex: 0 0 auto;
  padding: 0;
  font-family: var(--font-ui);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--ink-mute);
  text-decoration: none;
  white-space: nowrap;
  background: transparent;
  border: none;
  border-radius: 0;
}

.ds-diagrams-popout:hover {
  color: var(--ink);
  text-decoration: underline;
}

.ds-diagrams-canvas {
  position: relative;
  flex: 1 1 auto;
  min-height: 0;
  width: 100%;
  background: var(--paper);
}

.ds-diagrams-frame {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: none;
  background: var(--paper);
}

.ds-diagrams-frame[data-active="false"] {
  display: none;
}

/* The canvas picker: /app/diagrams opens on this rather than dropping the
   viewer into whichever tool happened to be first. A plain list of rows, one
   per canvas — name, what it is for, and the host it runs on — not tiles. */
.ds-diagrams-picker {
  position: absolute;
  inset: 0;
  overflow-y: auto;
  margin: 0;
  padding: 0;
  list-style: none;
  background: var(--paper-2);
}

.ds-diagrams-pick-row {
  display: flex;
  align-items: stretch;
  gap: 0;
  border-bottom: 1px solid var(--hairline);
  background: var(--paper);
}

.ds-diagrams-pick {
  display: grid;
  grid-template-columns: minmax(150px, 210px) 1fr auto;
  align-items: baseline;
  gap: 16px;
  flex: 1 1 auto;
  min-width: 0;
  padding: 11px 14px;
  font-family: var(--font-ui);
  text-align: left;
  color: var(--ink);
  background: transparent;
  border: none;
  border-radius: 0;
  cursor: pointer;
}

.ds-diagrams-pick:hover {
  background: var(--paper-2);
}

.ds-diagrams-pick-name {
  font-size: 13px;
  font-weight: 700;
  color: var(--ink);
}

.ds-diagrams-pick-purpose {
  min-width: 0;
  font-size: 12px;
  line-height: 1.35;
  color: var(--ink-soft);
}

.ds-diagrams-pick-host {
  font-family: var(--font-mono);
  font-size: 10px;
  letter-spacing: 0.04em;
  color: var(--ink-mute);
  white-space: nowrap;
}

.ds-diagrams-pick-window {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  padding: 0 14px;
  font-family: var(--font-ui);
  font-size: 11px;
  color: var(--ink-mute);
  text-decoration: none;
  white-space: nowrap;
  border-left: 1px solid var(--hairline);
}

.ds-diagrams-pick-window:hover {
  color: var(--ink);
  text-decoration: underline;
}

/* ============================================================================
   LOCKED DESIGN ROLLOUT — MMDB-1688 / MMDB-2395, 2026-08-28 (Ben: "lock this
   in as our new design system for the mmd portal... every single button from
   the central repository, no local styles allowed").
   Frozen spec (Ben design-freeze 2026-08-27): SF Pro/system font stack for
   window chrome + controls, JetBrains Mono for figures/labels, 4px radius on
   windows/title bars/buttons/inputs/pills/tabs, flat solid-fill buttons with a
   1px border + hairline inset bottom edge, 3D-bevelled title bars in both the
   black-ink (standard/back window) and red-topped (front/active window)
   families, ONE merged top bar, 24x24px window-control hit area / 14px glyph.
   COLORS NOT ADJUSTED: every value below is an EXISTING CDS token (paper/
   paper-2/paper-3/ink/ink-soft/ink-mute/hairline/hairline-dark/baobab/
   baobab-on) or a color-mix() derived purely from one — zero new hex
   literals introduced. --ds-radius-sm (4px) and --font-mono (JetBrains Mono)
   are pre-existing DS tokens (shell.css / fonts.css); --ds-font-window is the
   one new NON-color token this rollout adds, for the SF Pro stack.
   ============================================================================ */

:root{
  --ds-font-window:-apple-system,'SF Pro Text','SF Pro Display',system-ui,'Helvetica Neue',sans-serif;
}

/* ---- ds-btn: the ONE button system for window chrome / desktop apps.
   Flat, solid fill, 1px border, hairline inset bottom edge, 4px radius.
   Every gsp-btn / md-ghost / ec-ghost / mlp button below is a thin alias
   onto this recipe — see the "gsp structural layer" and "master-data ghost"
   sections further down. ---- */
.ds-btn{display:inline-flex;align-items:center;gap:6px;padding:5px 13px;font-family:var(--ds-font-window);font-size:11px;font-weight:600;line-height:1.5;border-radius:var(--ds-radius-sm);cursor:pointer;white-space:nowrap;border:1px solid transparent}
.ds-btn:disabled{opacity:.5;cursor:not-allowed;pointer-events:none}
.ds-btn-sm{padding:3px 10px;font-size:9.5px}
.ds-btn-primary-red{background:var(--baobab);color:var(--baobab-on);border-color:var(--baobab);box-shadow:inset 0 -1px 0 rgba(0,0,0,.18)}
.ds-btn-primary-red:hover{background:color-mix(in srgb, var(--baobab) 88%, black)}
.ds-btn-primary-ink{background:var(--ink);color:var(--paper);border-color:var(--ink);box-shadow:inset 0 -1px 0 rgba(0,0,0,.35)}
.ds-btn-primary-ink:hover{background:var(--ink-soft)}
.ds-btn-ghost{background:var(--paper);color:var(--ink);border-color:var(--hairline-dark);font-weight:500;box-shadow:inset 0 -1px 0 color-mix(in srgb, var(--ink) 10%, transparent)}
.ds-btn-ghost:hover{border-color:var(--ink-mute);color:var(--ink)}
.ds-btn-ghost.on,.ds-btn-ghost[aria-pressed="true"]{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.ds-btn-danger{background:color-mix(in srgb, var(--baobab) 6%, var(--paper));color:color-mix(in srgb, var(--baobab) 72%, black);border-color:color-mix(in srgb, var(--baobab) 72%, black);font-weight:500}
.ds-btn-danger:hover{background:var(--baobab-bg)}
.ds-btn-row{display:flex;gap:7px;align-items:center;padding:6px 10px;border-top:1px solid var(--hairline);background:var(--paper-2);flex:none}
.ds-btn-row-note{margin-right:auto;font-family:var(--ds-font-window);font-size:10.5px;color:color-mix(in srgb, var(--baobab) 72%, black)}
.ds-btn-row.end{justify-content:flex-end}

/* ---- ds-topbar: ONE merged top bar (red band + brand + app tabs + tools).
   Replaces any band+menu double bar. Distinct name from the marketing
   `.topbar` above (fixed site header) — this is the signed-in app shell's
   bar, never both on screen together. ---- */
.ds-topbar{display:flex;align-items:stretch;height:42px;flex:none;position:relative;z-index:30;color:var(--paper);background:linear-gradient(180deg,color-mix(in srgb, var(--baobab) 92%, white) 0%,var(--baobab) 55%,color-mix(in srgb, var(--baobab) 82%, black) 100%);box-shadow:inset 0 1px 0 rgba(255,255,255,.22),inset 0 -2px 0 rgba(0,0,0,.18),0 2px 6px rgba(0,0,0,.14)}
.ds-tb-brand{display:flex;align-items:center;gap:9px;padding:0 16px;flex:none;border-right:1px solid rgba(255,255,255,.24)}
.ds-tb-brand svg{flex:none;display:block;height:14px;width:auto;fill:var(--paper)}
.ds-tb-brand .ds-tb-app-name{font-family:var(--ds-font-window);font-weight:700;font-size:12px;letter-spacing:-0.01em}
.ds-tb-apps{display:flex;align-items:stretch;gap:2px;padding:0 6px;overflow-x:auto;scrollbar-width:none;flex:1 1 0;min-width:0}
.ds-tb-apps::-webkit-scrollbar{display:none}
.ds-tb-tab{display:flex;align-items:center;gap:6px;padding:0 12px;font-family:var(--ds-font-window);font-size:11.5px;font-weight:500;color:rgba(255,255,255,.86);white-space:nowrap;cursor:pointer;border:0;background:transparent}
.ds-tb-tab .n{font-family:var(--font-mono);font-size:8.5px;padding:0 4px;line-height:13px;border:1px solid rgba(255,255,255,.55);color:var(--paper);border-radius:var(--ds-radius-sm)}
.ds-tb-tab.active{margin:6px 3px;padding:0 12px;border-radius:var(--ds-radius-sm);font-weight:700;color:var(--ink);background:linear-gradient(180deg,var(--paper) 0%,var(--paper) 62%,var(--paper-2) 100%);border-top:3px solid var(--baobab);box-shadow:0 1px 3px rgba(0,0,0,.20),inset 0 -1px 0 rgba(35,34,30,.08)}
.ds-tb-tab.active .n{border-color:var(--ink);color:var(--ink);background:var(--paper-2)}
.ds-tb-tools{margin-left:auto;display:flex;align-items:center;gap:8px;padding:0 14px;flex:none}
.ds-tb-search{width:150px;height:24px;padding:0 8px;font-family:var(--ds-font-window);font-size:10.5px;border-radius:var(--ds-radius-sm);background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.32);color:var(--paper)}
.ds-tb-search::placeholder{color:rgba(255,255,255,.68)}
.ds-tb-btn{height:24px;padding:0 10px;display:flex;align-items:center;border-radius:var(--ds-radius-sm);font-family:var(--ds-font-window);font-size:10.5px;background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.32);color:var(--paper);cursor:pointer}
.ds-tb-btn-solid{background:var(--paper);color:var(--ink);font-weight:600;border-color:var(--paper)}
.ds-tb-who{font-family:var(--font-mono);font-size:9px;letter-spacing:0.06em;text-transform:uppercase;color:rgba(255,255,255,.86)}
.ds-tb-signout{font-family:var(--ds-font-window);font-size:10px;color:var(--paper);text-decoration:underline;text-underline-offset:2px;background:none;border:0;cursor:pointer;padding:0}

/* ---- ds-titlebar: window title bar, both chrome families, 3D bevel ----
   Standard/back window = black ink. Front/active window = red-topped white
   plate. Both 4px radius (inherited from the window frame's overflow:hidden
   + border-radius), 24x24 controls / 14px glyphs. ---- */
.ds-titlebar{display:flex;align-items:center;gap:9px;height:38px;padding:0 6px 0 12px;flex:none;color:var(--paper);background:linear-gradient(180deg,color-mix(in srgb, var(--ink) 88%, white) 0%,var(--ink) 10%,var(--ink) 55%,var(--ink) 88%,color-mix(in srgb, var(--ink) 96%, white) 100%);box-shadow:inset 0 1px 0 rgba(255,255,255,.10),inset 0 -1px 0 rgba(0,0,0,.65);border-bottom:1px solid var(--ink)}
.ds-titlebar-front{height:41px;color:var(--ink);border-top:3px solid var(--baobab);border-bottom:1px solid var(--hairline);background:linear-gradient(180deg,var(--paper) 0%,var(--paper) 62%,var(--paper-2) 100%);box-shadow:inset 0 1px 0 var(--paper),inset 0 -2px 0 rgba(35,34,30,.10)}
.ds-titlebar .ds-titlebar-app{font-family:var(--font-mono);font-size:8.5px;letter-spacing:0.1em;text-transform:uppercase;font-weight:700}
.ds-titlebar .ds-titlebar-app::after{content:"/";margin-left:8px;opacity:.55;font-weight:400}
.ds-titlebar .ds-titlebar-name{font-family:var(--ds-font-window);font-weight:600;font-size:12.5px}
.ds-titlebar-front .ds-titlebar-name{font-weight:700}
.ds-titlebar-ctl{display:flex;gap:5px;margin-left:auto}
.ds-ctl-btn{width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:var(--ds-radius-sm);background:rgba(255,255,255,.08);box-shadow:inset 0 -1px 0 rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.42);cursor:pointer;padding:0}
.ds-titlebar-front .ds-ctl-btn{background:rgba(0,0,0,.03);box-shadow:inset 0 -1px 0 rgba(35,34,30,.14);border:1px solid rgba(35,34,30,.22)}
.ds-ctl-btn-close:hover{background:var(--baobab);border-color:var(--baobab)}
.ds-ctl-btn svg{display:block}

/* ---- ds-window: 4px radius everywhere a window/dialog frame renders. ----
   Extends (does not replace) the existing WindowChrome .ds-window rules —
   this section only brings radius/font/bevel up to the frozen spec; the
   positioning/sizing custom-property mechanism in WindowChrome.tsx is
   unchanged. */
.ds-window{border-radius:var(--ds-radius-sm);overflow:hidden}
.ds-window-titlebar{border-radius:var(--ds-radius-sm) var(--ds-radius-sm) 0 0;font-family:var(--ds-font-window);background:linear-gradient(180deg,color-mix(in srgb, var(--ink) 88%, white) 0%,var(--ink) 10%,var(--ink) 55%,var(--ink) 88%,color-mix(in srgb, var(--ink) 96%, white) 100%);box-shadow:inset 0 1px 0 rgba(255,255,255,.10),inset 0 -1px 0 rgba(0,0,0,.65)}
.ds-window-title{font-family:var(--font-mono)}
.ds-window-back,.ds-window-pin,.ds-window-popout,.ds-window-close,.ds-window-minimize{width:24px;height:24px;border-radius:var(--ds-radius-sm)}
/* Desk floating windows (PortalDesk): back = black-ink bevel, front = red-topped bevel — mirrors the reference's two-family system without touching WindowChrome's shared contract. */
.mlp-float-host .ds-window-titlebar{background:linear-gradient(180deg,color-mix(in srgb, var(--ink) 88%, white) 0%,var(--ink) 10%,var(--ink) 55%,var(--ink) 88%,color-mix(in srgb, var(--ink) 96%, white) 100%);box-shadow:inset 0 1px 0 rgba(255,255,255,.10),inset 0 -1px 0 rgba(0,0,0,.65);height:38px;padding:0 6px 0 12px}
.mlp-float-host[data-focused="true"] .ds-window-titlebar{color:var(--ink);border-top:3px solid var(--baobab);background:linear-gradient(180deg,var(--paper) 0%,var(--paper) 62%,var(--paper-2) 100%);box-shadow:inset 0 1px 0 var(--paper),inset 0 -2px 0 rgba(35,34,30,.10)}
.mlp-float-host[data-focused="true"] .ds-window{box-shadow:0 6px 16px rgba(35,34,30,.26);border-color:var(--ink-mute)}

/* ---- ds-button (the pre-existing, already-central 151-file button family
   used across the general portal — HR, Finance, Reporting, sidebar, etc.).
   Sizing/casing left as-is (unreviewed blast radius of 151 files); brought
   into the frozen spec on the two dimensions that are safe to apply
   uniformly: SF Pro window font, and the flat inset-bevel edge. Radius was
   already 4px — no change needed there. ---- */
.ds-button,[data-slot~="ds-button"]{font-family:var(--ds-font-window);box-shadow:inset 0 -1px 0 rgba(0,0,0,.18)}
.ds-button-secondary,[data-slot~="ds-button-secondary"],[data-slot~="ds-button-on-light"]{box-shadow:inset 0 -1px 0 color-mix(in srgb, var(--ink) 10%, transparent)}
.ds-button-danger{box-shadow:inset 0 -1px 0 color-mix(in srgb, var(--baobab) 12%, transparent)}

/* ---- master-data / employee-chip ghost buttons: was duplicated in
   src/app/globals.css (a local style, now removed there) AND components.css
   with a broken `var(--ds-radius-sm)` (undefined token, silently rendering
   square corners). Fixed to the ONE central definition, 4px, SF Pro. ---- */
.md-ghost,.ec-ghost{font-family:var(--ds-font-window);font-size:11px;background:var(--paper);border:1px solid var(--hairline-dark);border-radius:var(--ds-radius-sm);padding:5px 11px;color:var(--ink-mute);cursor:pointer;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;box-shadow:inset 0 -1px 0 color-mix(in srgb, var(--ink) 10%, transparent)}
.md-ghost:hover,.ec-ghost:hover{color:var(--ink);border-color:var(--ink-mute)}
.md-ghost.on,.ec-ghost.on{color:var(--paper);background:var(--ink);border-color:var(--ink)}

/* ============================================================================
   ds-portal-desk (.mlp) — the MMD Employee Portal shell in the FROZEN
   design (Ben design-freeze 2026-08-27, superseding the earlier per-section-
   hue letterpress pass). Migrated 2026-08-28 from the app-local
   src/app/app/_design/portal-letterpress.css into the central DS per Ben's
   "no local styles allowed" instruction; classnames kept identical
   (.mlp-*) to avoid touching every consuming component for a pure rename.
   What changed vs the pre-freeze version: no per-section accent colours
   (apps get no colours of their own — depth is two greys and one shadow,
   never colour); the black-square-everywhere look becomes 4px radius +
   3D bevel; Fraunces/serif titles become SF Pro; the titlebar+menubar
   double bar becomes ONE merged .ds-topbar (brand · app tabs · tools).
   Every colour below is an existing CDS token (paper/paper-2/paper-3/ink/
   ink-soft/ink-mute/hairline/hairline-dark/baobab/baobab-on) or a
   color-mix() derived from one — zero new hex literals. ---------------- */

.mlp {
  --mlp-paper: var(--paper);
  --mlp-paper-2: var(--paper-2);
  --mlp-paper-3: var(--paper-3);
  --mlp-hairline: var(--hairline);
  --mlp-hairline-dark: var(--hairline-dark);
  --mlp-ink: var(--ink);
  --mlp-ink-mute: var(--ink-mute);
}

.mlp.mlp-desk{position:fixed;inset:0;display:flex;flex-direction:column;background:var(--mlp-paper-2);color:var(--mlp-ink);font-family:var(--ds-font-window);font-size:12px;overflow:hidden;z-index:40}
.mlp .mlp-window{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}

/* ---- ONE merged top bar, reusing the ds-topbar/ds-tb-* recipe verbatim
   (see the "LOCKED DESIGN ROLLOUT" section above) — brand mark, app tabs
   with the active tab as a white 4px pill, search / Assistant / user /
   Sign out on the same row, no second bar underneath it. ---- */
.mlp .ds-tb-mark{height:16px;width:auto;display:block;filter:brightness(0) invert(1)}
.mlp .ds-tb-tab{position:relative}
.mlp .ds-tb-tab[data-current="true"]:not(.active){box-shadow:inset 0 -2px 0 rgba(255,255,255,.55)}
.mlp .ds-tb-menu-panel{position:absolute;top:100%;left:0;z-index:250;min-width:230px;padding:4px 0;background:var(--ink);border:1px solid color-mix(in srgb, var(--ink) 80%, white);border-radius:0 0 var(--ds-radius-sm) var(--ds-radius-sm);box-shadow:0 10px 26px rgba(0,0,0,.32);display:flex;flex-direction:column}
.mlp .ds-tb-menu-panel-head{padding:6px 12px 7px;margin-bottom:3px;border-bottom:1px solid color-mix(in srgb, var(--paper) 18%, transparent);color:color-mix(in srgb, var(--paper) 60%, transparent);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase}
.mlp .ds-tb-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:7px 12px;background:transparent;border:0;border-left:3px solid transparent;color:var(--paper);font-family:var(--ds-font-window);font-size:11.5px;text-align:left;cursor:pointer;white-space:nowrap}
.mlp .ds-tb-menu-item:hover,.mlp .ds-tb-menu-item:focus-visible{background:color-mix(in srgb, var(--paper) 10%, transparent);border-left-color:var(--baobab);outline:none}
.mlp .ds-tb-menu-item[data-muted="true"]{color:color-mix(in srgb, var(--paper) 42%, transparent)}
.mlp .ds-tb-menu-item-note{margin-left:auto;padding-left:14px;color:color-mix(in srgb, var(--paper) 45%, transparent);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.08em;text-transform:uppercase}

/* ---- work area — the screen itself, and any floating windows over it ---- */
.mlp .mlp-work{position:relative;display:flex;flex-direction:column;flex:1 1 auto;min-height:0;background:var(--mlp-paper-2);overflow:hidden}
.mlp .mlp-frame{display:block;width:100%;height:100%;border:0;background:var(--mlp-paper)}
.mlp .mlp-screen-body{flex:1 1 auto;min-height:0;overflow:hidden;background:var(--mlp-paper)}

/* floating screen windows ride the shared WindowChrome/.ds-window system —
   frozen bevel treatment lives in the "LOCKED DESIGN ROLLOUT" section
   (.mlp-float-host rules) above; nothing section-hued here any more. */
.mlp .mlp-float-host{display:contents}

/* ---- start screen — the whole portal as a dense index, section by section, no colour per column ---- */
.mlp .mlp-index{height:100%;overflow:auto;padding:16px 20px 24px;column-width:230px;column-gap:26px;background:var(--mlp-paper)}
.mlp .mlp-index-col{break-inside:avoid;margin:0 0 18px;padding-left:10px;border-left:2px solid var(--mlp-hairline-dark)}
.mlp .mlp-index-head{margin:0 0 6px;font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--mlp-ink-mute)}
.mlp .mlp-index-list{margin:0;padding:0;list-style:none}
.mlp .mlp-index-item{display:block;width:100%;padding:3px 6px 3px 2px;background:transparent;border:0;border-radius:var(--ds-radius-sm);color:var(--mlp-ink);font-family:var(--ds-font-window);font-size:12px;line-height:1.5;text-align:left;cursor:pointer}
.mlp .mlp-index-item:hover{background:var(--baobab-bg);color:var(--mlp-ink)}
.mlp .mlp-index-item[data-muted="true"]{color:var(--mlp-ink-mute);cursor:default}
.mlp .mlp-index-item[data-muted="true"]:hover{background:transparent;color:var(--mlp-ink-mute)}

/* ---- taskbar — one chip per open screen, no section colour ---- */
.mlp .mlp-taskbar{display:flex;align-items:center;gap:6px;min-height:34px;padding:5px 10px;background:var(--mlp-paper);border-top:1px solid var(--mlp-hairline-dark);font-size:11px}
.mlp .mlp-taskbar-chips{display:flex;align-items:center;gap:6px;flex:1 1 auto;overflow-x:auto}
.mlp .mlp-chip{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;background:var(--mlp-paper-2);border:1px solid var(--mlp-hairline-dark);border-radius:var(--ds-radius-sm);color:var(--mlp-ink);font-family:var(--ds-font-window);font-size:10.5px;white-space:nowrap;cursor:pointer}
.mlp .mlp-chip:hover{border-color:var(--mlp-ink-mute)}
.mlp .mlp-chip[data-active="true"]{box-shadow:inset 3px 0 0 var(--baobab);font-weight:700;background:var(--mlp-paper)}
.mlp .mlp-chip[data-minimized="true"]{opacity:.6}
.mlp .mlp-taskbar-note{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.08em;color:var(--mlp-ink-mute);text-transform:uppercase;flex:none}
.mlp .mlp-taskbar-link{flex:none;padding:3px 10px;background:var(--mlp-paper-2);border:1px solid var(--mlp-hairline-dark);border-radius:var(--ds-radius-sm);color:var(--mlp-ink);font-family:var(--ds-font-window);font-size:10.5px;text-decoration:none}
.mlp .mlp-taskbar-link:hover{border-color:var(--mlp-ink-mute)}
.mlp .mlp-taskbar-link[data-current="true"]{background:var(--ink);color:var(--paper);border-color:var(--ink)}

/* ---- framed screen content under this shell: 4px radius everywhere,
   table headers print in the same silver/ink register as the reference
   (var(--paper-2) fill, ink text) instead of pre-freeze literal black. ---- */
.mlp-page table thead th,
.mlp-page .ds-table thead th,
.mlp-page .ds-oms-table thead th,
.mlp-page .ds-report-table thead th{background:var(--paper-2) !important;color:var(--ink) !important;border:1px solid var(--hairline) !important;border-radius:0 !important;font-family:var(--font-mono);font-size:10.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:5px 8px}
.mlp-page .ds-card,.mlp-page .ds-panel,.mlp-page .ds-window,.mlp-page .ds-pop,.mlp-page .row-popup{border-radius:var(--ds-radius-sm)}

.mlp .mlp-menu-wrap{position:relative;display:inline-block}

/* MMDB-1785 round 2 (2026-08-28) -- HR document viewer (dark "zinc" theme,
   employee master-data document preview). Every value here is relocated
   verbatim from the inline style={{...}} it replaces -- zero new colors,
   pixel-identical render, only the mechanism (className vs inline style)
   changed so this file can carry zero style= attributes. Appended at file
   end so single-class specificity wins over earlier .md-in/.md-field rules. */
.docviewer-backdrop-top{z-index:11000}
.docviewer-modal{width:94vw;max-width:1400px;height:88vh;max-height:920px;display:flex;flex-direction:column;padding:0;overflow:hidden;border-radius:12px;box-shadow:0 20px 50px rgba(0,0,0,.4)}
.docviewer-header{padding:.875rem 1.25rem;background:#18181b;color:#f4f4f5;border-bottom:1px solid #27272a;display:flex;align-items:center;justify-content:space-between}
.docviewer-header-group{display:flex;align-items:center;gap:.75rem}
.docviewer-badge{background:#27272a;color:#a1a1aa;padding:.2rem .5rem;border-radius:4px;font-size:.75rem;font-weight:600;text-transform:uppercase}
.docviewer-badge-type{background:#3f3f46;color:#e4e4e7;font-weight:400;text-transform:none}
.docviewer-filename{font-size:1.1rem;color:#ffffff}
.docviewer-split{flex:1;display:flex;overflow:hidden;background:#09090b}
.docviewer-panel{width:380px;min-width:350px;background:#18181b;color:#e4e4e7;border-right:1px solid #27272a;display:flex;flex-direction:column;overflow-y:auto;padding:1.25rem;gap:1rem}
.docviewer-stack{display:flex;flex-direction:column;gap:.75rem}
.docviewer-section-title{margin:0;font-size:.95rem;color:#a1a1aa;text-transform:uppercase;letter-spacing:.05em}
.docviewer-label{color:#a1a1aa;font-size:.8rem}
.docviewer-input-dark{background:#27272a;color:#ffffff;border-color:#3f3f46}
.docviewer-input-dark-ro{background:#27272a;color:#a1a1aa}
.docviewer-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:.5rem}
.docviewer-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:.4rem}
.docviewer-meta-line{font-size:.75rem;color:#71717a}
.docviewer-card{background:#27272a;padding:.75rem;border-radius:6px;display:flex;flex-direction:column;gap:.5rem}
.docviewer-card--tight{gap:.25rem;font-size:.8rem}
.docviewer-row-between{display:flex;align-items:center;justify-content:space-between}
.docviewer-ingest-badge{color:#ffffff;padding:.15rem .4rem;border-radius:4px;font-size:.7rem}
.docviewer-ingest-badge.yes{background:#15803d}
.docviewer-ingest-badge.no{background:#991b1b}
.docviewer-ingest-summary{margin:.25rem 0 0 0;color:#d4d4d8;font-size:.75rem;line-height:1.4}
.docviewer-card-label{font-size:.75rem;font-weight:600;color:#a1a1aa;text-transform:uppercase}
.docviewer-zoom-row{display:flex;align-items:center;justify-content:space-between;margin-top:.25rem}
.docviewer-hint{color:#a1a1aa;font-size:.75rem}
.docviewer-zoom-controls{display:flex;gap:.25rem}
.docviewer-footer{display:flex;flex-direction:column;gap:.5rem;margin-top:auto}
.docviewer-preview{flex:1;position:relative;display:flex;align-items:center;justify-content:center;background:#09090b;overflow:hidden;padding:1rem}
.docviewer-overlay-toolbar{position:absolute;top:1rem;right:1rem;z-index:10;background:rgba(24,24,27,.85);backdrop-filter:blur(8px);padding:.35rem .6rem;border-radius:6px;border:1px solid rgba(63,63,70,.5);display:flex;align-items:center;gap:.5rem}
.docviewer-divider{width:1px;height:14px;background:#3f3f46}
.docviewer-content{width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:auto}
.docviewer-preview-img{max-width:100%;max-height:100%;object-fit:contain;transform:var(--doc-transform,none);transition:transform .25s cubic-bezier(.4,0,.2,1);border-radius:4px;box-shadow:0 8px 30px rgba(0,0,0,.5)}
.docviewer-preview-frame{width:100%;height:100%;border:none;border-radius:4px;background:#ffffff;transform:var(--doc-transform,none);transition:transform .25s cubic-bezier(.4,0,.2,1)}
.proc-typeahead-root{position:relative;width:100%}
.proc-typeahead-menu{position:absolute;left:0;right:0;top:100%;z-index:40;max-height:260px;overflow:auto}
.ds-hint-inset{padding:4px 8px}

/* MMDB-1785 round 2 (2026-08-28) -- procurement Master Data Governance
   workspace (MasterDataHome.tsx). Relocated verbatim from the inline
   styles they replace; only .ds-full-bleed and .ds-hint-mb are broad
   enough to be true reusable primitives, the rest are named modifiers
   scoped to this page's own components. */
.ds-full-bleed{width:100%;max-width:100%;box-sizing:border-box}
.module-workbench-header--gap{margin-bottom:12px}
.ds-notice--compact{padding:10px 14px;margin:0 0 16px 0;justify-content:space-between;border:1px solid var(--hairline);border-radius:2px;box-shadow:0 1px 3px rgba(26,26,26,.06)}
.ds-notice-lead{display:flex;align-items:center;gap:10px}
.ds-notice-rule--divider{width:1px;height:24px;background:var(--hairline)}
.ds-notice-label--ink{color:var(--ink);font-weight:700;letter-spacing:0.05em;margin-bottom:2px}
.ds-notice-text--sm{margin:0;font-size:12px;color:var(--ink-mute)}
.ds-notice-tags{display:flex;gap:6px}
.ds-full-bleed-section{width:100%;max-width:100%;margin:0 0 16px 0;padding:0}
.ds-full-bleed-section--flush{margin:0}
.ds-table-header--gap{margin-bottom:8px}
.ds-category-list{display:flex;flex-direction:column;gap:12px;width:100%;padding:6px 16px 26px 16px;box-sizing:border-box}
.ds-paper-folder-link{text-decoration:none;color:inherit;display:block}
.ds-paper-folder-row-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:2px}
.ds-link-row-title--sm{font-size:13.5px}
.ds-hint-mb{margin-bottom:4px}
.ds-review-field--wide{flex:2 1 200px}
.ds-spec-card{background:var(--paper);border:1px solid var(--hairline);border-radius:2px;padding:12px 16px;box-shadow:0 1px 3px rgba(26,26,26,.06)}
.ds-spec-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}
.ds-spec-item{display:flex;flex-direction:column;gap:4px;padding:8px 10px;background:var(--paper-2);border:1px solid var(--hairline);border-radius:2px}
.ds-spec-item-head{display:flex;align-items:center;justify-content:space-between;gap:6px}
.ds-spec-item-label{font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-mute);font-weight:700}
.ds-tag--xs{font-size:8.5px;padding:0 4px;height:16px}
.ds-spec-item-desc{margin:0;font-size:11.5px;color:var(--ink);line-height:1.35}
.ds-pf-block--tight{margin:0 0 10px}
.ds-pf-block-h--tight{margin:0 0 4px}
.ds-pf-empty--sm{padding:2px 0;font-size:11px}
