/* ============================================================================
   NUVO  design system theme
   Lifted 1:1 from the Texas Automation Labs marketing site so internal Razor
   surfaces (exec dashboard, invoices, workflow studio, settings) carry the
   same editorial-blueprint vibe as the public marketing pages.
   ============================================================================
   Authoring notes
   ---------------
   - All component classes are prefixed `nuvo-` to avoid colliding with the
     existing studio-ui-kit / exec-invoice / invoice-workflow-console / hub-shell
     stylesheets while migration is in progress.
   - All color, spacing, radius, font, and elevation values resolve to CSS
     custom properties on :root / [data-theme="dark"]. Never hard-code a hex
     value in a Razor component  read a token.
   - Dark mode is opt-in via `<html data-theme="dark">`. The token surface is
     symmetric, so any nuvo-* component works in either theme without overrides.
   - Sharp small radii (4-8-14px) by design. Resist any urge to round more.
   - Borders, not shadows, are the primary structural device. Cards share
     edges with their grid container; do not give individual cells a shadow.
   ============================================================================ */


/* ============================================================================
   1. FONTS  load from Google Fonts (or self-host these woff2 files)
   ============================================================================ */
@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');


/* ============================================================================
   2. DESIGN TOKENS
   ============================================================================ */
:root {
  /* ---- Surface ---- */
  --nuvo-bg:          #fdfdfa;
  --nuvo-bg-alt:      #f6f6f1;
  --nuvo-bg-soft:     #fafaf5;
  --nuvo-bg-card:     #ffffff;
  --nuvo-bg-grid:     rgba(0, 0, 0, 0.04);

  /* ---- Ink (text) ---- */
  --nuvo-ink:         #14150f;
  --nuvo-ink-soft:    #3a3b30;
  --nuvo-ink-mute:    #6b6c5c;
  --nuvo-ink-faint:   #9a9b8c;

  /* ---- Lines / dividers ---- */
  --nuvo-line:        rgba(20, 21, 15, 0.09);
  --nuvo-line-strong: rgba(20, 21, 15, 0.18);
  --nuvo-crop-mark:   rgba(20, 21, 15, 0.44);

  /* ---- Accent: green (success / numbers / icons) ---- */
  --nuvo-green:       #3fa84a;
  --nuvo-green-deep:  #2d7a36;
  --nuvo-green-soft:  #d8ecdb;
  --nuvo-green-bg:    #e9f3eb;

  /* ---- Accent: lavender (primary CTA) ---- */
  --nuvo-lavender:      #b6a8e8;
  --nuvo-lavender-soft: #c8bef0;
  --nuvo-lavender-bg:   #e7e0fb;
  --nuvo-lavender-ink:  #1a1233;

  /* ---- Status accents ---- */
  --nuvo-orange:       #e7943a;
  --nuvo-orange-bg:    #fdf1de;
  --nuvo-red:          #d94a3d;
  --nuvo-red-bg:       #f8d4d0;
  --nuvo-red-ink:      #6b1e15;
  --nuvo-info:         #4f7ed4;
  --nuvo-info-bg:      #e2ebfa;

  /* ---- Footer / dark hero ---- */
  --nuvo-footer-bg:    #1c3a2a;
  --nuvo-footer-ink:   #e8efe6;

  /* ---- Shadows (used sparingly) ---- */
  --nuvo-shadow-sm: 0 1px 2px rgba(20, 21, 15, 0.04);
  --nuvo-shadow-md: 0 4px 24px rgba(20, 21, 15, 0.06);
  --nuvo-shadow-lg: 0 24px 60px rgba(20, 21, 15, 0.10);

  /* ---- Radii ---- */
  --nuvo-radius:    4px;
  --nuvo-radius-md: 8px;
  --nuvo-radius-lg: 14px;

  /* ---- Typography ----
     Fraunces is the editorial display serif (used on the marketing site,
     visible in "Capture. structure. deliver." headline). Georgia is the
     safe fallback if Fraunces fails to load. Inter for body. JetBrains
     Mono for all-caps eyebrows, button labels, KPI sub-labels, and
     tabular numerals in tables. */
  --nuvo-font-display: 'Fraunces', Georgia, 'Times New Roman', serif;
  --nuvo-font-body:    'Inter', system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
  --nuvo-font-mono:    'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;

  /* ---- Layout rhythm ---- */
  --nuvo-container:           1240px;          /* wider than marketing  internal screens get more room */
  --nuvo-container-narrow:    1040px;          /* match the marketing hero width when needed */
  --nuvo-pad-x:               clamp(20px, 4vw, 56px);
  --nuvo-section-space:       clamp(52px, 7vw, 72px);
  --nuvo-section-space-tight: clamp(28px, 4vw, 40px);
  --nuvo-section-head-top:    clamp(34px, 4.5vw, 46px);
  --nuvo-section-head-bottom: clamp(14px, 2.2vw, 22px);

  /* ---- Crop marks ---- */
  --nuvo-crop-len:   16px;
  --nuvo-crop-thk:   1.9px;
  --nuvo-crop-inset: 0px;

  /* ---- Focus ring ---- */
  --nuvo-focus: 0 0 0 2px var(--nuvo-bg), 0 0 0 4px var(--nuvo-green);
}

[data-theme="dark"] {
  --nuvo-bg:          #0e0f0c;
  --nuvo-bg-alt:      #131410;
  --nuvo-bg-soft:     #161712;
  --nuvo-bg-card:     #1a1c17;
  --nuvo-bg-grid:     rgba(255, 255, 255, 0.045);

  --nuvo-ink:         #f1f1e8;
  --nuvo-ink-soft:    #d4d4c4;
  --nuvo-ink-mute:    #92938a;
  --nuvo-ink-faint:   #5e5f56;

  --nuvo-line:        rgba(255, 255, 255, 0.07);
  --nuvo-line-strong: rgba(255, 255, 255, 0.16);
  --nuvo-crop-mark:   rgba(255, 255, 255, 0.40);

  --nuvo-green:       #5cc869;
  --nuvo-green-deep:  #4ab056;
  --nuvo-green-soft:  #1f3d24;
  --nuvo-green-bg:    #16291b;

  --nuvo-lavender:      #c4b5f5;
  --nuvo-lavender-soft: #b2a0ee;
  --nuvo-lavender-bg:   #2a2342;
  --nuvo-lavender-ink:  #14091f;

  --nuvo-orange:    #f0a55a;
  --nuvo-orange-bg: #3a2a17;
  --nuvo-red:       #e67065;
  --nuvo-red-bg:    #3a1c18;
  --nuvo-red-ink:   #f8d4d0;
  --nuvo-info:      #7ea4e8;
  --nuvo-info-bg:   #1a2438;

  --nuvo-footer-bg: #0d2419;

  --nuvo-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4);
  --nuvo-shadow-md: 0 4px 24px rgba(0, 0, 0, 0.4);
  --nuvo-shadow-lg: 0 24px 60px rgba(0, 0, 0, 0.6);

  --nuvo-focus: 0 0 0 2px var(--nuvo-bg), 0 0 0 4px var(--nuvo-green);
}


/* ============================================================================
   3. RESET  scoped to nuvo containers so we don't fight Bootstrap/host CSS
   ============================================================================
   Apply class `nuvo` (or any nuvo-* page-shell variant) on a wrapper near the
   top of the Razor surface so these resets only affect nuvo subtrees. */
.nuvo, .nuvo *, .nuvo *::before, .nuvo *::after { box-sizing: border-box; }

.nuvo {
  font-family: var(--nuvo-font-body);
  background: var(--nuvo-bg);
  color: var(--nuvo-ink);
  line-height: 1.55;
  font-size: 15px;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-variant-ligatures: none;
  font-feature-settings: "liga" 0, "clig" 0, "calt" 0;
}

.nuvo h1, .nuvo h2, .nuvo h3, .nuvo h4, .nuvo h5, .nuvo h6 { margin: 0; }
.nuvo p { margin: 0; }
.nuvo a { color: inherit; text-decoration: none; }
.nuvo img, .nuvo svg { display: block; max-width: 100%; }


/* ============================================================================
   4. TYPOGRAPHY UTILITIES
   ============================================================================ */
.nuvo-eyebrow {
  font-family: var(--nuvo-font-mono);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nuvo-ink-mute);
  font-weight: 500;
}
.nuvo-eyebrow::before { content: "/  "; opacity: .6; }
.nuvo-eyebrow--plain::before { content: none; }

/* Big editorial serif heading  for page H1s, hero blocks, big metric kickers */
.nuvo-display {
  font-family: var(--nuvo-font-display);
  font-weight: 500;
  letter-spacing: -0.02em;
  line-height: 1.05;
  color: var(--nuvo-ink);
  margin: 0;
}
.nuvo-display--xl  { font-size: clamp(36px, 6vw, 64px); }
.nuvo-display--lg  { font-size: clamp(28px, 4vw, 44px); line-height: 1.12; }
.nuvo-display--md  { font-size: clamp(22px, 2.6vw, 28px); line-height: 1.2; }
.nuvo-display--sm  { font-size: clamp(18px, 2vw, 22px); line-height: 1.25; }

/* Sans-serif H1 (for tighter app/page headers that don't want a serif voice) */
.nuvo-title {
  font-family: var(--nuvo-font-body);
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.2;
  font-size: clamp(20px, 2.4vw, 26px);
  margin: 0;
}

/* Subhead with monospace `/` prefix  used for section labels under a header */
.nuvo-subhead {
  font-family: var(--nuvo-font-mono);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--nuvo-ink-mute);
}
.nuvo-subhead::before { content: "/  "; opacity: .55; }

.nuvo-mute   { color: var(--nuvo-ink-mute); }
.nuvo-soft   { color: var(--nuvo-ink-soft); }
.nuvo-faint  { color: var(--nuvo-ink-faint); }
.nuvo-mono   { font-family: var(--nuvo-font-mono); }
.nuvo-serif  { font-family: var(--nuvo-font-display); }


/* ============================================================================
   5. LAYOUT  container + page shell variants
   ============================================================================ */
.nuvo-container {
  width: 100%;
  max-width: var(--nuvo-container);
  margin: 0 auto;
  padding-left: var(--nuvo-pad-x);
  padding-right: var(--nuvo-pad-x);
  min-width: 0;
}
.nuvo-container--narrow { max-width: var(--nuvo-container-narrow); }

/* DsPageShell variants. The `Surface` parameter on the Razor side picks one. */
.nuvo-page          { background: var(--nuvo-bg);      min-height: 100%; }
.nuvo-page--soft    { background: var(--nuvo-bg-soft); }
.nuvo-page--alt     { background: var(--nuvo-bg-alt); }

/* Page header  kicker, title, subtitle, meta chips, actions row */
.nuvo-page-header {
  display: grid;
  gap: 6px;
  padding: clamp(24px, 3vw, 36px) 0 clamp(14px, 2vw, 18px);
}
.nuvo-page-header__kicker { /* uses .nuvo-eyebrow */ }
.nuvo-page-header__title  {
  font-family: var(--nuvo-font-display);
  font-weight: 500;
  font-size: clamp(24px, 3.4vw, 34px);
  letter-spacing: -0.018em;
  line-height: 1.12;
  color: var(--nuvo-ink);
}
.nuvo-page-header__subtitle {
  color: var(--nuvo-ink-mute);
  font-size: 14.5px;
  max-width: 64ch;
}
.nuvo-page-header__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  margin-top: 14px;
}
.nuvo-page-header__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
}
.nuvo-page-header__actions {
  display: flex;
  gap: 10px;
  align-items: center;
  flex-wrap: wrap;
}

/* Centered section head  for marketing-style intros inside an app screen */
.nuvo-section-head {
  text-align: center;
  padding: var(--nuvo-section-head-top) 0 var(--nuvo-section-head-bottom);
}
.nuvo-section-head h2 {
  font-family: var(--nuvo-font-display);
  font-weight: 500;
  font-size: clamp(28px, 4vw, 44px);
  letter-spacing: -0.02em;
  line-height: 1.12;
  margin: 14px auto;
  max-width: 22ch;
}
.nuvo-section-head p {
  max-width: 56ch;
  margin: 0 auto;
  color: var(--nuvo-ink-mute);
  font-size: 15px;
}


/* ============================================================================
   6. CROP MARKS  the L-bracket framing on grids and panels
   ============================================================================
   Mirror of the marketing site's .crop element. Apply to a grid wrapper to
   get the 4 outer brackets. Add <span class="nuvo-crop-bl" /> and
   <span class="nuvo-crop-br" /> as the first two children for the bottom
   corners. Use <span class="nuvo-crop-tick {top|bottom|left|right}" /> to
   mark the inner cell intersections. */
.nuvo-crop { position: relative; }

.nuvo-crop::before,
.nuvo-crop::after,
.nuvo-crop > .nuvo-crop-bl,
.nuvo-crop > .nuvo-crop-br {
  content: "";
  position: absolute;
  width: var(--nuvo-crop-len);
  height: var(--nuvo-crop-len);
  border-color: var(--nuvo-crop-mark);
  border-style: solid;
  border-width: 0;
  pointer-events: none;
  z-index: 5;
}
.nuvo-crop::before {
  top: calc(-1 * var(--nuvo-crop-inset));
  left: calc(-1 * var(--nuvo-crop-inset));
  border-top-width: var(--nuvo-crop-thk);
  border-left-width: var(--nuvo-crop-thk);
}
.nuvo-crop::after {
  top: calc(-1 * var(--nuvo-crop-inset));
  right: calc(-1 * var(--nuvo-crop-inset));
  border-top-width: var(--nuvo-crop-thk);
  border-right-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-bl {
  bottom: calc(-1 * var(--nuvo-crop-inset));
  left: calc(-1 * var(--nuvo-crop-inset));
  border-bottom-width: var(--nuvo-crop-thk);
  border-left-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-br {
  bottom: calc(-1 * var(--nuvo-crop-inset));
  right: calc(-1 * var(--nuvo-crop-inset));
  border-bottom-width: var(--nuvo-crop-thk);
  border-right-width: var(--nuvo-crop-thk);
}

.nuvo-crop > .nuvo-crop-tick {
  position: absolute;
  width: 0;
  height: 0;
  pointer-events: none;
  z-index: 5;
}
.nuvo-crop > .nuvo-crop-tick::before,
.nuvo-crop > .nuvo-crop-tick::after {
  content: "";
  position: absolute;
  width: var(--nuvo-crop-len);
  height: var(--nuvo-crop-len);
  border-color: var(--nuvo-crop-mark);
  border-style: solid;
  border-width: 0;
}
.nuvo-crop > .nuvo-crop-tick.top { top: 0; left: var(--x, 50%); }
.nuvo-crop > .nuvo-crop-tick.top::before {
  right: 0; top: 0;
  border-top-width: var(--nuvo-crop-thk);
  border-right-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-tick.top::after {
  left: 0; top: 0;
  border-top-width: var(--nuvo-crop-thk);
  border-left-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-tick.bottom { bottom: 0; left: var(--x, 50%); }
.nuvo-crop > .nuvo-crop-tick.bottom::before {
  right: 0; bottom: 0;
  border-bottom-width: var(--nuvo-crop-thk);
  border-right-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-tick.bottom::after {
  left: 0; bottom: 0;
  border-bottom-width: var(--nuvo-crop-thk);
  border-left-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-tick.left { left: 0; top: var(--y, 50%); }
.nuvo-crop > .nuvo-crop-tick.left::before {
  left: 0; bottom: 0;
  border-bottom-width: var(--nuvo-crop-thk);
  border-left-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-tick.left::after {
  left: 0; top: 0;
  border-top-width: var(--nuvo-crop-thk);
  border-left-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-tick.right { right: 0; top: var(--y, 50%); }
.nuvo-crop > .nuvo-crop-tick.right::before {
  right: 0; bottom: 0;
  border-bottom-width: var(--nuvo-crop-thk);
  border-right-width: var(--nuvo-crop-thk);
}
.nuvo-crop > .nuvo-crop-tick.right::after {
  right: 0; top: 0;
  border-top-width: var(--nuvo-crop-thk);
  border-right-width: var(--nuvo-crop-thk);
}


/* ============================================================================
   7. BUTTONS  DsButton, DsIconButton variants
   ============================================================================
   Default sizing: comfortable 13/22 padding with monospace uppercase label.
   The arrow icon inside `.nuvo-btn__arrow` slides on hover (see hero buttons
   on the marketing site). */
.nuvo-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: 13px 22px;
  font-family: var(--nuvo-font-mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  border-radius: 3px;
  border: 1px solid transparent;
  background: transparent;
  color: var(--nuvo-ink);
  cursor: pointer;
  white-space: nowrap;
  transition: transform .2s ease, background-color .2s ease, color .2s ease,
              border-color .2s ease, box-shadow .2s ease;
}
.nuvo-btn:hover:not(:disabled) { transform: translateY(-1px); }
.nuvo-btn:focus-visible { outline: none; box-shadow: var(--nuvo-focus); }
.nuvo-btn:disabled { opacity: .5; cursor: not-allowed; transform: none; }
.nuvo-btn__arrow { display: inline-flex; transition: transform .25s ease; }
.nuvo-btn:hover:not(:disabled) .nuvo-btn__arrow { transform: translateX(3px); }

/* Variants */
.nuvo-btn--primary {
  background: var(--nuvo-lavender);
  color: var(--nuvo-lavender-ink);
}
.nuvo-btn--primary:hover:not(:disabled) { background: var(--nuvo-lavender-soft); }

.nuvo-btn--dark {
  background: var(--nuvo-ink);
  color: var(--nuvo-bg);
}
.nuvo-btn--dark:hover:not(:disabled) { background: color-mix(in srgb, var(--nuvo-ink) 88%, transparent); }

.nuvo-btn--outline {
  background: transparent;
  color: var(--nuvo-ink);
  border-color: var(--nuvo-line-strong);
}
.nuvo-btn--outline:hover:not(:disabled) { border-color: var(--nuvo-ink); }

.nuvo-btn--ghost {
  background: transparent;
  color: var(--nuvo-ink-soft);
}
.nuvo-btn--ghost:hover:not(:disabled) { background: var(--nuvo-bg-soft); color: var(--nuvo-ink); }

.nuvo-btn--danger {
  background: var(--nuvo-red);
  color: #fff;
}
.nuvo-btn--danger:hover:not(:disabled) { background: color-mix(in srgb, var(--nuvo-red) 88%, transparent); }

/* Sizes */
.nuvo-btn--sm { padding: 8px 14px; font-size: 10px; letter-spacing: 0.14em; gap: 8px; }
.nuvo-btn--lg { padding: 18px 28px; font-size: 12px; letter-spacing: 0.18em; }
.nuvo-btn--block {
  display: flex;
  width: 100%;
  justify-content: space-between;
  padding: 18px 24px;
}

/* DsIconButton  square icon-only action */
.nuvo-icon-btn {
  width: 34px;
  height: 34px;
  display: inline-grid;
  place-items: center;
  border-radius: 50%;
  border: 1px solid var(--nuvo-line);
  background: transparent;
  color: var(--nuvo-ink-soft);
  cursor: pointer;
  transition: background-color .2s ease, color .2s ease, border-color .2s ease, transform .25s ease;
}
.nuvo-icon-btn:hover:not(:disabled) {
  border-color: var(--nuvo-line-strong);
  color: var(--nuvo-ink);
}
.nuvo-icon-btn:focus-visible { outline: none; box-shadow: var(--nuvo-focus); }
.nuvo-icon-btn[aria-expanded="true"],
.nuvo-icon-btn--active {
  background: var(--nuvo-ink);
  color: var(--nuvo-bg);
  border-color: var(--nuvo-ink);
}
.nuvo-icon-btn--sm { width: 28px; height: 28px; }
.nuvo-icon-btn--square { border-radius: 6px; }

/* Button cluster (toolbar / action cell) */
.nuvo-btn-group {
  display: inline-flex;
  gap: 8px;
  flex-wrap: wrap;
  align-items: center;
}


/* ============================================================================
   8. CHIPS / BADGES  DsChip, DsStatusBadge
   ============================================================================ */
.nuvo-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  font-family: var(--nuvo-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-weight: 500;
  color: var(--nuvo-ink-soft);
  background: var(--nuvo-bg-alt);
  border: 1px solid var(--nuvo-line);
  border-radius: 999px;
  white-space: nowrap;
}
.nuvo-chip__dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: currentColor;
  flex: 0 0 6px;
}

.nuvo-chip--neutral  { color: var(--nuvo-ink-soft);    background: var(--nuvo-bg-alt);     border-color: var(--nuvo-line); }
.nuvo-chip--info     { color: var(--nuvo-info);        background: var(--nuvo-info-bg);    border-color: color-mix(in srgb, var(--nuvo-info) 25%, transparent); }
.nuvo-chip--success  { color: var(--nuvo-green-deep);  background: var(--nuvo-green-bg);   border-color: color-mix(in srgb, var(--nuvo-green) 25%, transparent); }
.nuvo-chip--warning  { color: var(--nuvo-orange);      background: var(--nuvo-orange-bg);  border-color: color-mix(in srgb, var(--nuvo-orange) 30%, transparent); }
.nuvo-chip--danger   { color: var(--nuvo-red-ink);     background: var(--nuvo-red-bg);     border-color: color-mix(in srgb, var(--nuvo-red) 30%, transparent); }
.nuvo-chip--pending  { color: var(--nuvo-ink-mute);    background: var(--nuvo-bg-soft);    border-color: var(--nuvo-line); }
.nuvo-chip--accent   { color: var(--nuvo-lavender-ink); background: var(--nuvo-lavender-bg); border-color: color-mix(in srgb, var(--nuvo-lavender) 35%, transparent); }

/* Status badge  same vocabulary as a chip but a touch larger, square corners
   for tables and lists where a pill feels too marketing-y */
.nuvo-status {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  font-family: var(--nuvo-font-mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  font-weight: 500;
  border-radius: var(--nuvo-radius);
  border: 1px solid transparent;
  white-space: nowrap;
}
.nuvo-status--neutral { color: var(--nuvo-ink-soft);    background: var(--nuvo-bg-alt);    border-color: var(--nuvo-line); }
.nuvo-status--info    { color: var(--nuvo-info);        background: var(--nuvo-info-bg); }
.nuvo-status--success { color: var(--nuvo-green-deep);  background: var(--nuvo-green-bg); }
.nuvo-status--warning { color: var(--nuvo-orange);      background: var(--nuvo-orange-bg); }
.nuvo-status--danger  { color: var(--nuvo-red-ink);     background: var(--nuvo-red-bg); }
.nuvo-status--pending { color: var(--nuvo-ink-mute);    background: var(--nuvo-bg-soft);    border-color: var(--nuvo-line); }


/* ============================================================================
   9. CARDS  DsCard primitive + section header
   ============================================================================ */
.nuvo-card {
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.nuvo-card--soft        { background: var(--nuvo-bg-soft); }
.nuvo-card--elevated    { box-shadow: var(--nuvo-shadow-md); }
.nuvo-card--interactive {
  cursor: pointer;
  transition: background-color .2s ease, border-color .2s ease, transform .2s ease;
}
.nuvo-card--interactive:hover { background: var(--nuvo-bg-soft); border-color: var(--nuvo-line-strong); }
.nuvo-card--flat        { border-radius: 0; }
.nuvo-card--accent      { border-color: color-mix(in srgb, var(--nuvo-green) 30%, var(--nuvo-line)); }

.nuvo-card__header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 16px clamp(18px, 2.4vw, 24px) 14px;
  border-bottom: 1px solid var(--nuvo-line);
  background: var(--nuvo-bg-card);
}
.nuvo-card__header--plain { border-bottom: none; padding-bottom: 0; }
.nuvo-card__title {
  font-family: var(--nuvo-font-body);
  font-weight: 600;
  font-size: 15px;
  letter-spacing: -0.005em;
  color: var(--nuvo-ink);
}
.nuvo-card__kicker { /* uses .nuvo-eyebrow */ display: block; margin-bottom: 4px; }
.nuvo-card__actions { display: flex; gap: 8px; align-items: center; }

.nuvo-card__body {
  padding: clamp(16px, 2.2vw, 22px) clamp(18px, 2.4vw, 24px);
  flex: 1 1 auto;
}
.nuvo-card__body--tight { padding: 12px 16px; }
.nuvo-card__body--flush { padding: 0; }

.nuvo-card__footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 12px clamp(18px, 2.4vw, 24px);
  border-top: 1px solid var(--nuvo-line);
  background: var(--nuvo-bg-soft);
  font-size: 12.5px;
  color: var(--nuvo-ink-mute);
}

/* Section header  used inside a card or page region */
.nuvo-section-header {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 14px;
  margin-bottom: 14px;
  flex-wrap: wrap;
}
.nuvo-section-header__title {
  font-family: var(--nuvo-font-body);
  font-weight: 600;
  font-size: 16px;
  color: var(--nuvo-ink);
  letter-spacing: -0.005em;
}
.nuvo-section-header__kicker { /* uses .nuvo-eyebrow */ display: block; margin-bottom: 4px; }
.nuvo-section-header__actions { display: flex; gap: 8px; align-items: center; }


/* ============================================================================
   10. METRIC / KPI CARDS  DsMetricCard, WidgetKpiCard
   ============================================================================
   Two flavors: the marketing-style "green serif number" metric, and a denser
   dashboard KPI tile. Use --num color modifier classes to recolor a metric. */
.nuvo-metric {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.nuvo-metric__num {
  font-family: var(--nuvo-font-display);
  font-weight: 500;
  font-size: clamp(26px, 3.2vw, 36px);
  color: var(--nuvo-green);
  letter-spacing: -0.01em;
  line-height: 1.05;
  white-space: nowrap;
}
.nuvo-metric__num--ink      { color: var(--nuvo-ink); }
.nuvo-metric__num--warning  { color: var(--nuvo-orange); }
.nuvo-metric__num--danger   { color: var(--nuvo-red); }
.nuvo-metric__num--accent   { color: var(--nuvo-lavender-ink); }
.nuvo-metric__label {
  font-size: 11.5px;
  color: var(--nuvo-ink-mute);
  max-width: 22ch;
  line-height: 1.45;
}
.nuvo-metric__hint {
  font-family: var(--nuvo-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.06em;
  color: var(--nuvo-ink-faint);
  text-transform: uppercase;
}

/* Inline group of metrics (case-study style  3 numbers in a row) */
.nuvo-metrics-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: 18px;
  align-items: start;
}

/* KPI tile  denser, with delta/trend */
.nuvo-kpi {
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
  padding: clamp(16px, 2vw, 22px);
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 0;
}
.nuvo-kpi__label {
  font-family: var(--nuvo-font-mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--nuvo-ink-mute);
}
.nuvo-kpi__value {
  font-family: var(--nuvo-font-display);
  font-weight: 500;
  font-size: clamp(26px, 3vw, 34px);
  color: var(--nuvo-ink);
  letter-spacing: -0.01em;
  line-height: 1;
}
.nuvo-kpi__value--success { color: var(--nuvo-green); }
.nuvo-kpi__value--warning { color: var(--nuvo-orange); }
.nuvo-kpi__value--danger  { color: var(--nuvo-red); }
.nuvo-kpi__delta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  color: var(--nuvo-ink-mute);
}
.nuvo-kpi__delta--up   { color: var(--nuvo-green-deep); }
.nuvo-kpi__delta--down { color: var(--nuvo-red); }
.nuvo-kpi__sub {
  font-size: 12.5px;
  color: var(--nuvo-ink-mute);
  line-height: 1.4;
}
.nuvo-kpi__icon {
  width: 32px;
  height: 32px;
  display: inline-grid;
  place-items: center;
  border-radius: var(--nuvo-radius);
  background: var(--nuvo-green-bg);
  color: var(--nuvo-green-deep);
  margin-bottom: 2px;
}
.nuvo-kpi__icon--warning { background: var(--nuvo-orange-bg); color: var(--nuvo-orange); }
.nuvo-kpi__icon--danger  { background: var(--nuvo-red-bg);    color: var(--nuvo-red); }
.nuvo-kpi__icon--accent  { background: var(--nuvo-lavender-bg); color: var(--nuvo-lavender-ink); }

/* KPI grid  for invoice ops or exec headers */
.nuvo-kpi-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 14px;
}

/* Shared-edge KPI strip  the marketing-grid look where cells share borders
   instead of stacking individual cards. Wrap with .nuvo-kpi-strip and use
   .nuvo-kpi--seam inside. */
.nuvo-kpi-strip {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 0;
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
  overflow: hidden;
}
.nuvo-kpi-strip .nuvo-kpi--seam,
.nuvo-kpi-strip > .nuvo-kpi {
  border: 0;
  border-radius: 0;
  border-right: 1px solid var(--nuvo-line);
}
.nuvo-kpi-strip > *:last-child { border-right: none; }


/* ============================================================================
   11. FEATURE / CELL GRID  DsFilterGrid, uc-grid pattern, deploy-grid pattern
   ============================================================================
   Borders are shared between cells. Use a child <div> per cell. Add a count
   modifier on the parent (.nuvo-cell-grid--3, --4) to fix columns. */
.nuvo-cell-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 0;
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
  overflow: hidden;
}
.nuvo-cell-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.nuvo-cell-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.nuvo-cell-grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.nuvo-cell-grid--flat { border-radius: 0; }
.nuvo-cell-grid--soft { background: var(--nuvo-bg-soft); }

.nuvo-cell {
  padding: clamp(20px, 2.6vw, 30px);
  border-right: 1px solid var(--nuvo-line);
  border-bottom: 1px solid var(--nuvo-line);
  background: transparent;
  display: flex;
  flex-direction: column;
  gap: 10px;
  min-width: 0;
}
.nuvo-cell:hover { background: var(--nuvo-bg-soft); }
.nuvo-cell--interactive { cursor: pointer; transition: background-color .2s ease; }
.nuvo-cell__icon {
  width: 28px;
  height: 28px;
  color: var(--nuvo-green);
  margin-bottom: 4px;
}
.nuvo-cell__title {
  font-size: 15px;
  font-weight: 600;
  margin: 0;
  letter-spacing: -0.005em;
}
.nuvo-cell__desc {
  color: var(--nuvo-ink-mute);
  font-size: 13.5px;
  line-height: 1.55;
  margin: 0;
  max-width: 52ch;
}

/* Strip trailing right-borders and bottom-borders based on column count.
   These rules handle 2/3/4-col defaults; for auto-fit grids the inner cells
   inherit borders cleanly because the wrapper clips overflow. */
.nuvo-cell-grid--2 > .nuvo-cell:nth-child(2n) { border-right: none; }
.nuvo-cell-grid--2 > .nuvo-cell:nth-last-child(-n+2):nth-child(odd),
.nuvo-cell-grid--2 > .nuvo-cell:nth-last-child(-n+2):nth-child(odd) ~ .nuvo-cell { border-bottom: none; }

.nuvo-cell-grid--3 > .nuvo-cell:nth-child(3n) { border-right: none; }
.nuvo-cell-grid--3 > .nuvo-cell:nth-last-child(-n+3):nth-child(3n+1),
.nuvo-cell-grid--3 > .nuvo-cell:nth-last-child(-n+3):nth-child(3n+1) ~ .nuvo-cell { border-bottom: none; }

.nuvo-cell-grid--4 > .nuvo-cell:nth-child(4n) { border-right: none; }
.nuvo-cell-grid--4 > .nuvo-cell:nth-last-child(-n+4):nth-child(4n+1),
.nuvo-cell-grid--4 > .nuvo-cell:nth-last-child(-n+4):nth-child(4n+1) ~ .nuvo-cell { border-bottom: none; }

@media (max-width: 880px) {
  .nuvo-cell-grid--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .nuvo-cell-grid--2,
  .nuvo-cell-grid--3,
  .nuvo-cell-grid--4 { grid-template-columns: 1fr; }
  .nuvo-cell-grid > .nuvo-cell { border-right: none; }
}


/* ============================================================================
   12. DATA TABLES  DsDataTable, InvoiceTable, vendor mappings, etc
   ============================================================================
   Sharp, monospace headers; comfortable row height; alternating zebra optional.
   For the mobile fallback use .nuvo-table-mobile-cards on the container. */
.nuvo-table-wrap {
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
  overflow: hidden;
}
.nuvo-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13.5px;
  color: var(--nuvo-ink);
}
.nuvo-table thead th {
  text-align: left;
  font-family: var(--nuvo-font-mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--nuvo-ink-mute);
  background: var(--nuvo-bg-soft);
  padding: 12px 16px;
  border-bottom: 1px solid var(--nuvo-line);
  white-space: nowrap;
}
.nuvo-table tbody td {
  padding: 14px 16px;
  border-bottom: 1px solid var(--nuvo-line);
  vertical-align: middle;
}
.nuvo-table tbody tr:last-child td { border-bottom: none; }
.nuvo-table tbody tr { transition: background-color .15s ease; }
.nuvo-table tbody tr:hover { background: var(--nuvo-bg-soft); }
.nuvo-table tbody tr.is-selected { background: color-mix(in srgb, var(--nuvo-lavender-bg) 60%, var(--nuvo-bg-card)); }

.nuvo-table--zebra tbody tr:nth-child(odd):not(.is-selected) { background: var(--nuvo-bg-alt); }
.nuvo-table--zebra tbody tr:nth-child(odd):hover { background: var(--nuvo-bg-soft); }

.nuvo-table--compact thead th { padding: 8px 12px; }
.nuvo-table--compact tbody td { padding: 10px 12px; }

.nuvo-table__num     { font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }
.nuvo-table__mono    { font-family: var(--nuvo-font-mono); font-size: 12.5px; }
.nuvo-table__actions { display: flex; gap: 6px; justify-content: flex-end; flex-wrap: wrap; }
.nuvo-table__primary { font-weight: 600; color: var(--nuvo-ink); }
.nuvo-table__caption {
  caption-side: top;
  padding: 12px 16px;
  text-align: left;
  font-size: 12.5px;
  color: var(--nuvo-ink-mute);
  background: var(--nuvo-bg-soft);
  border-bottom: 1px solid var(--nuvo-line);
}

/* Mobile card fallback  at narrow widths, hide thead and turn rows into stacks */
@media (max-width: 640px) {
  .nuvo-table-mobile-cards .nuvo-table thead { display: none; }
  .nuvo-table-mobile-cards .nuvo-table tbody tr {
    display: block;
    padding: 14px 16px;
    border-bottom: 1px solid var(--nuvo-line);
  }
  .nuvo-table-mobile-cards .nuvo-table tbody td {
    display: flex;
    justify-content: space-between;
    gap: 12px;
    padding: 4px 0;
    border-bottom: none;
  }
  .nuvo-table-mobile-cards .nuvo-table tbody td::before {
    content: attr(data-label);
    font-family: var(--nuvo-font-mono);
    font-size: 10.5px;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--nuvo-ink-mute);
    flex: 0 0 40%;
  }
}


/* ============================================================================
   13. DETAIL GRID  DsDetailGrid (label/value metadata pairs)
   ============================================================================ */
.nuvo-detail-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 4px 18px;
}
.nuvo-detail-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.nuvo-detail-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.nuvo-detail-grid--list { display: flex; flex-direction: column; gap: 8px; }

.nuvo-detail {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 10px 0;
  border-bottom: 1px dashed var(--nuvo-line);
  min-width: 0;
}
.nuvo-detail:last-child { border-bottom: none; }
.nuvo-detail__label {
  font-family: var(--nuvo-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--nuvo-ink-mute);
}
.nuvo-detail__value {
  font-size: 14px;
  color: var(--nuvo-ink);
  word-break: break-word;
}
.nuvo-detail__value--mono { font-family: var(--nuvo-font-mono); font-size: 13px; }
.nuvo-detail__value--strong { font-weight: 600; }
.nuvo-detail--span-2 { grid-column: span 2; }
.nuvo-detail--span-full { grid-column: 1 / -1; }


/* ============================================================================
   14. FORM ELEMENTS  DsField, inputs, selects, toggles
   ============================================================================ */
.nuvo-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}
.nuvo-field__label {
  font-family: var(--nuvo-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--nuvo-ink-mute);
  font-weight: 500;
}
.nuvo-field__required { color: var(--nuvo-red); margin-left: 4px; }
.nuvo-field__hint  { font-size: 12px; color: var(--nuvo-ink-mute); line-height: 1.45; }
.nuvo-field__error { font-size: 12px; color: var(--nuvo-red); line-height: 1.45; }

.nuvo-input,
.nuvo-textarea,
.nuvo-select {
  width: 100%;
  padding: 10px 12px;
  font-family: var(--nuvo-font-body);
  font-size: 14px;
  color: var(--nuvo-ink);
  background: var(--nuvo-bg);
  border: 1px solid var(--nuvo-line-strong);
  border-radius: var(--nuvo-radius);
  transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
  appearance: none;
  -webkit-appearance: none;
}
.nuvo-input::placeholder,
.nuvo-textarea::placeholder { color: var(--nuvo-ink-faint); }
.nuvo-input:hover,
.nuvo-textarea:hover,
.nuvo-select:hover { border-color: var(--nuvo-ink-mute); }
.nuvo-input:focus,
.nuvo-textarea:focus,
.nuvo-select:focus {
  outline: none;
  border-color: var(--nuvo-green);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--nuvo-green) 18%, transparent);
}
.nuvo-input:disabled,
.nuvo-textarea:disabled,
.nuvo-select:disabled {
  background: var(--nuvo-bg-soft);
  color: var(--nuvo-ink-mute);
  cursor: not-allowed;
}
.nuvo-input--mono   { font-family: var(--nuvo-font-mono); font-size: 13px; }
.nuvo-input--sm     { padding: 7px 10px; font-size: 13px; }
.nuvo-textarea      { min-height: 88px; resize: vertical; line-height: 1.5; }
.nuvo-select {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'><path fill='none' stroke='%236b6c5c' stroke-width='1.5' d='M2.5 4.5L6 8l3.5-3.5'/></svg>");
  background-repeat: no-repeat;
  background-position: right 10px center;
  padding-right: 32px;
}

.nuvo-input--has-error,
.nuvo-textarea--has-error,
.nuvo-select--has-error { border-color: var(--nuvo-red); }
.nuvo-input--has-error:focus { box-shadow: 0 0 0 3px color-mix(in srgb, var(--nuvo-red) 18%, transparent); }

/* Search input with leading icon */
.nuvo-search {
  position: relative;
  display: flex;
  align-items: center;
}
.nuvo-search__icon {
  position: absolute;
  left: 12px;
  width: 14px;
  height: 14px;
  color: var(--nuvo-ink-mute);
  pointer-events: none;
}
.nuvo-search .nuvo-input { padding-left: 34px; }
.nuvo-search__hint {
  position: absolute;
  right: 10px;
  font-family: var(--nuvo-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.06em;
  color: var(--nuvo-ink-faint);
  padding: 2px 6px;
  border: 1px solid var(--nuvo-line);
  border-radius: 3px;
  background: var(--nuvo-bg);
}

/* Checkbox + radio */
.nuvo-check {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-size: 14px;
  color: var(--nuvo-ink);
  cursor: pointer;
}
.nuvo-check input[type="checkbox"],
.nuvo-check input[type="radio"] {
  appearance: none;
  -webkit-appearance: none;
  width: 16px;
  height: 16px;
  border: 1px solid var(--nuvo-line-strong);
  border-radius: 3px;
  background: var(--nuvo-bg);
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: background-color .15s ease, border-color .15s ease;
  flex: 0 0 16px;
}
.nuvo-check input[type="radio"] { border-radius: 50%; }
.nuvo-check input[type="checkbox"]:checked,
.nuvo-check input[type="radio"]:checked {
  background: var(--nuvo-green);
  border-color: var(--nuvo-green);
}
.nuvo-check input[type="checkbox"]:checked::after {
  content: "";
  width: 9px;
  height: 5px;
  border-left: 2px solid #fff;
  border-bottom: 2px solid #fff;
  transform: rotate(-45deg) translate(1px, -1px);
}
.nuvo-check input[type="radio"]:checked::after {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #fff;
}
.nuvo-check input:focus-visible { outline: none; box-shadow: var(--nuvo-focus); }

/* Switch / toggle */
.nuvo-switch {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  cursor: pointer;
  font-size: 14px;
}
.nuvo-switch input { position: absolute; opacity: 0; pointer-events: none; }
.nuvo-switch__track {
  width: 36px;
  height: 20px;
  border-radius: 999px;
  background: var(--nuvo-line-strong);
  position: relative;
  transition: background-color .2s ease;
  flex: 0 0 36px;
}
.nuvo-switch__track::after {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: #fff;
  transition: transform .2s ease;
  box-shadow: 0 1px 2px rgba(0,0,0,.2);
}
.nuvo-switch input:checked + .nuvo-switch__track { background: var(--nuvo-green); }
.nuvo-switch input:checked + .nuvo-switch__track::after { transform: translateX(16px); }
.nuvo-switch input:focus-visible + .nuvo-switch__track { box-shadow: var(--nuvo-focus); }


/* ============================================================================
   15. TOOLBARS, FILTERS, SEGMENTED CONTROLS
   ============================================================================ */
.nuvo-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  flex-wrap: wrap;
  padding: 12px 0;
}
.nuvo-toolbar__start,
.nuvo-toolbar__end {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  min-width: 0;
}

/* Segmented pill row  like the invoice filter pills */
.nuvo-segmented {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 4px;
  background: var(--nuvo-bg-soft);
  border: 1px solid var(--nuvo-line);
  border-radius: 999px;
}
.nuvo-segmented__item {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 6px 14px;
  font-family: var(--nuvo-font-mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  font-weight: 500;
  color: var(--nuvo-ink-mute);
  background: transparent;
  border: none;
  border-radius: 999px;
  cursor: pointer;
  transition: background-color .15s ease, color .15s ease;
}
.nuvo-segmented__item:hover { color: var(--nuvo-ink); }
.nuvo-segmented__item.is-active {
  background: var(--nuvo-bg-card);
  color: var(--nuvo-ink);
  box-shadow: var(--nuvo-shadow-sm);
}
.nuvo-segmented__count {
  display: inline-grid;
  place-items: center;
  min-width: 20px;
  height: 18px;
  padding: 0 6px;
  border-radius: 999px;
  background: var(--nuvo-bg-alt);
  color: var(--nuvo-ink-mute);
  font-size: 10px;
}
.nuvo-segmented__item.is-active .nuvo-segmented__count {
  background: var(--nuvo-green-bg);
  color: var(--nuvo-green-deep);
}

/* Dense labeled filter grid */
.nuvo-filter-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 12px 16px;
  padding: 16px;
  background: var(--nuvo-bg-soft);
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
}


/* ============================================================================
   16. BANNERS  DsBanner
   ============================================================================ */
.nuvo-banner {
  display: grid;
  grid-template-columns: 22px 1fr auto;
  gap: 14px;
  align-items: start;
  padding: 14px 18px;
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
  background: var(--nuvo-bg-card);
  font-size: 13.5px;
  color: var(--nuvo-ink);
  line-height: 1.5;
}
.nuvo-banner__icon { color: var(--nuvo-ink-mute); margin-top: 2px; }
.nuvo-banner__title { font-weight: 600; margin: 0 0 2px; font-size: 14px; }
.nuvo-banner__body { color: var(--nuvo-ink-soft); }
.nuvo-banner__actions { display: flex; gap: 8px; align-items: center; }

.nuvo-banner--info {
  background: var(--nuvo-info-bg);
  border-color: color-mix(in srgb, var(--nuvo-info) 30%, var(--nuvo-line));
}
.nuvo-banner--info .nuvo-banner__icon { color: var(--nuvo-info); }

.nuvo-banner--success {
  background: var(--nuvo-green-bg);
  border-color: color-mix(in srgb, var(--nuvo-green) 30%, var(--nuvo-line));
}
.nuvo-banner--success .nuvo-banner__icon { color: var(--nuvo-green-deep); }

.nuvo-banner--warning {
  background: var(--nuvo-orange-bg);
  border-color: color-mix(in srgb, var(--nuvo-orange) 35%, var(--nuvo-line));
}
.nuvo-banner--warning .nuvo-banner__icon { color: var(--nuvo-orange); }

.nuvo-banner--danger {
  background: var(--nuvo-red-bg);
  border-color: color-mix(in srgb, var(--nuvo-red) 35%, var(--nuvo-line));
  color: var(--nuvo-red-ink);
}
.nuvo-banner--danger .nuvo-banner__icon { color: var(--nuvo-red); }


/* ============================================================================
   17. EMPTY STATE, LOADING STATE
   ============================================================================ */
.nuvo-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: clamp(36px, 5vw, 56px) clamp(24px, 4vw, 36px);
  text-align: center;
  background: var(--nuvo-bg-card);
  border: 1px dashed var(--nuvo-line-strong);
  border-radius: var(--nuvo-radius-md);
  color: var(--nuvo-ink-mute);
}
.nuvo-empty__icon {
  width: 40px;
  height: 40px;
  color: var(--nuvo-ink-faint);
}
.nuvo-empty__title {
  font-family: var(--nuvo-font-display);
  font-weight: 500;
  font-size: 20px;
  color: var(--nuvo-ink);
  letter-spacing: -0.01em;
}
.nuvo-empty__body {
  font-size: 13.5px;
  max-width: 44ch;
  line-height: 1.55;
}
.nuvo-empty__actions { margin-top: 6px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; }

.nuvo-loading {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding: clamp(36px, 5vw, 56px);
  color: var(--nuvo-ink-mute);
  font-size: 13.5px;
}
.nuvo-loading__spinner {
  width: 18px;
  height: 18px;
  border: 2px solid var(--nuvo-line-strong);
  border-top-color: var(--nuvo-green);
  border-radius: 50%;
  animation: nuvo-spin .7s linear infinite;
}
@keyframes nuvo-spin { to { transform: rotate(360deg); } }


/* ============================================================================
   18. MODAL, DRAWER, CONFIRM DIALOG
   ============================================================================ */
.nuvo-modal-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(20, 21, 15, 0.46);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
  z-index: 1000;
  display: grid;
  place-items: center;
  padding: 20px;
  animation: nuvo-fade-in .18s ease;
}
@keyframes nuvo-fade-in { from { opacity: 0; } to { opacity: 1; } }

.nuvo-modal {
  width: 100%;
  max-width: 560px;
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line-strong);
  border-radius: var(--nuvo-radius-lg);
  box-shadow: var(--nuvo-shadow-lg);
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 40px);
  animation: nuvo-modal-in .22s cubic-bezier(.2,.7,.3,1);
}
@keyframes nuvo-modal-in {
  from { opacity: 0; transform: translateY(8px) scale(.98); }
  to   { opacity: 1; transform: none; }
}
.nuvo-modal--sm  { max-width: 420px; }
.nuvo-modal--lg  { max-width: 760px; }
.nuvo-modal--xl  { max-width: 960px; }

.nuvo-modal__header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 14px;
  padding: 20px 24px 14px;
  border-bottom: 1px solid var(--nuvo-line);
}
.nuvo-modal__title {
  font-family: var(--nuvo-font-display);
  font-weight: 500;
  font-size: 22px;
  letter-spacing: -0.01em;
  color: var(--nuvo-ink);
}
.nuvo-modal__kicker { /* uses .nuvo-eyebrow */ display: block; margin-bottom: 4px; }
.nuvo-modal__body {
  padding: 20px 24px;
  overflow: auto;
  flex: 1 1 auto;
  font-size: 14px;
  line-height: 1.55;
  color: var(--nuvo-ink-soft);
}
.nuvo-modal__footer {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  padding: 14px 24px 20px;
  border-top: 1px solid var(--nuvo-line);
  background: var(--nuvo-bg-soft);
}

/* Side drawer */
.nuvo-drawer-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(20, 21, 15, 0.46);
  z-index: 1000;
  animation: nuvo-fade-in .18s ease;
}
.nuvo-drawer {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  width: min(440px, 100vw);
  background: var(--nuvo-bg-card);
  border-left: 1px solid var(--nuvo-line-strong);
  box-shadow: var(--nuvo-shadow-lg);
  z-index: 1001;
  display: flex;
  flex-direction: column;
  animation: nuvo-drawer-in .25s cubic-bezier(.2,.7,.3,1);
}
@keyframes nuvo-drawer-in {
  from { transform: translateX(20px); opacity: 0; }
  to   { transform: none; opacity: 1; }
}
.nuvo-drawer--lg { width: min(640px, 100vw); }
.nuvo-drawer__header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 14px;
  padding: 18px 22px;
  border-bottom: 1px solid var(--nuvo-line);
}
.nuvo-drawer__body { padding: 18px 22px; flex: 1 1 auto; overflow: auto; }
.nuvo-drawer__footer {
  display: flex;
  justify-content: flex-end;
  gap: 10px;
  padding: 14px 22px 18px;
  border-top: 1px solid var(--nuvo-line);
  background: var(--nuvo-bg-soft);
}


/* ============================================================================
   19. DROP ZONE  DsDropZonePanel wrapper
   ============================================================================ */
.nuvo-dropzone {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: clamp(28px, 4vw, 44px);
  background: var(--nuvo-bg-soft);
  border: 1.5px dashed var(--nuvo-line-strong);
  border-radius: var(--nuvo-radius-md);
  text-align: center;
  color: var(--nuvo-ink-mute);
  transition: border-color .2s ease, background-color .2s ease;
  cursor: pointer;
}
.nuvo-dropzone:hover,
.nuvo-dropzone.is-active {
  border-color: var(--nuvo-green);
  background: var(--nuvo-green-bg);
  color: var(--nuvo-green-deep);
}
.nuvo-dropzone__icon { width: 32px; height: 32px; color: currentColor; }
.nuvo-dropzone__title { font-weight: 600; font-size: 14px; color: var(--nuvo-ink); }
.nuvo-dropzone__hint  { font-size: 12.5px; }


/* ============================================================================
   20. PROGRESS / BAR / SPARKLINE PRIMITIVES
   ============================================================================ */
.nuvo-progress {
  width: 100%;
  height: 6px;
  background: var(--nuvo-line);
  border-radius: 999px;
  overflow: hidden;
}
.nuvo-progress__bar {
  height: 100%;
  background: var(--nuvo-green);
  border-radius: inherit;
  transition: width .5s cubic-bezier(.2,.7,.3,1);
}
.nuvo-progress__bar--warning { background: var(--nuvo-orange); }
.nuvo-progress__bar--danger  { background: var(--nuvo-red); }
.nuvo-progress__bar--accent  { background: var(--nuvo-lavender); }

.nuvo-progress-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: 12px;
  padding: 10px 0;
  border-bottom: 1px solid var(--nuvo-line);
  font-size: 13px;
}
.nuvo-progress-row:last-child { border-bottom: none; }
.nuvo-progress-row__label { color: var(--nuvo-ink); font-weight: 500; }
.nuvo-progress-row__value {
  font-family: var(--nuvo-font-mono);
  font-size: 12.5px;
  color: var(--nuvo-ink-soft);
  text-align: right;
  white-space: nowrap;
}
.nuvo-progress-row__bar { grid-column: 1 / -1; margin-top: 4px; }


/* ============================================================================
   21. ACCURACY / RANKED LIST ROW  accuracy/results style row
   ============================================================================
   Mirror of .acc-row from the marketing site. Use for ranked results, vendor
   accuracy lists, top-vendor widgets, validation summaries. */
.nuvo-rank-row {
  display: grid;
  grid-template-columns: 24px 1fr auto;
  gap: 14px;
  padding: 14px 0;
  border-bottom: 1px solid var(--nuvo-line);
  align-items: center;
}
.nuvo-rank-row:last-child { border-bottom: none; }
.nuvo-rank-row__icon { color: var(--nuvo-green); }
.nuvo-rank-row__name { font-weight: 600; font-size: 14px; margin: 0 0 2px; color: var(--nuvo-ink); }
.nuvo-rank-row__sub  { color: var(--nuvo-ink-mute); font-size: 12.5px; }
.nuvo-rank-row__pct  {
  font-family: var(--nuvo-font-display);
  font-size: 22px;
  font-weight: 500;
  color: var(--nuvo-green);
}
.nuvo-rank-row--warn .nuvo-rank-row__icon,
.nuvo-rank-row--warn .nuvo-rank-row__pct { color: var(--nuvo-orange); }
.nuvo-rank-row--danger .nuvo-rank-row__icon,
.nuvo-rank-row--danger .nuvo-rank-row__pct { color: var(--nuvo-red); }
.nuvo-rank-row--best {
  background: var(--nuvo-green-bg);
  margin: 0 -24px;
  padding-left: 24px;
  padding-right: 24px;
  border-bottom: none;
  border-radius: var(--nuvo-radius);
}


/* ============================================================================
   22. BREADCRUMB
   ============================================================================ */
.nuvo-breadcrumb {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  font-family: var(--nuvo-font-mono);
  font-size: 11.5px;
  letter-spacing: 0.06em;
  color: var(--nuvo-ink-mute);
  margin-bottom: 14px;
}
.nuvo-breadcrumb a { color: var(--nuvo-ink-mute); transition: color .15s ease; }
.nuvo-breadcrumb a:hover { color: var(--nuvo-ink); }
.nuvo-breadcrumb__sep { opacity: .5; }
.nuvo-breadcrumb__current { color: var(--nuvo-ink); font-weight: 500; }


/* ============================================================================
   23. QUOTE / CALLOUT  for case studies, change-request notes, audit entries
   ============================================================================ */
.nuvo-quote {
  border-left: 2px solid var(--nuvo-green);
  padding: 4px 0 4px 14px;
  font-size: 13.5px;
  color: var(--nuvo-ink-soft);
  font-style: italic;
  max-width: 60ch;
}
.nuvo-quote--accent { border-color: var(--nuvo-lavender); }
.nuvo-quote--warning { border-color: var(--nuvo-orange); }
.nuvo-quote--danger { border-color: var(--nuvo-red); }


/* ============================================================================
   24. STAGE TRACK  Workflow Studio stage cards
   ============================================================================ */
.nuvo-stage-track {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 0;
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
  overflow: hidden;
}
.nuvo-stage {
  padding: 16px 20px;
  border-right: 1px solid var(--nuvo-line);
  display: flex;
  flex-direction: column;
  gap: 6px;
  position: relative;
  background: var(--nuvo-bg-card);
  transition: background-color .2s ease;
  cursor: pointer;
}
.nuvo-stage:last-child { border-right: none; }
.nuvo-stage:hover { background: var(--nuvo-bg-soft); }
.nuvo-stage__step {
  font-family: var(--nuvo-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--nuvo-ink-faint);
}
.nuvo-stage__title { font-size: 14px; font-weight: 600; color: var(--nuvo-ink); }
.nuvo-stage__meta  { font-size: 12px; color: var(--nuvo-ink-mute); }
.nuvo-stage.is-complete .nuvo-stage__step { color: var(--nuvo-green-deep); }
.nuvo-stage.is-complete::after {
  content: "";
  position: absolute;
  top: 12px;
  right: 14px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--nuvo-green);
}
.nuvo-stage.is-active {
  background: var(--nuvo-lavender-bg);
}
.nuvo-stage.is-active .nuvo-stage__step { color: var(--nuvo-lavender-ink); }
.nuvo-stage.is-active::after {
  content: "";
  position: absolute;
  top: 12px;
  right: 14px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--nuvo-lavender);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--nuvo-lavender) 30%, transparent);
}


/* ============================================================================
   25. CONFIDENCE BAR  invoice extraction confidence, vendor match scores
   ============================================================================ */
.nuvo-conf-bar {
  position: relative;
  width: 100%;
  height: 4px;
  background: var(--nuvo-line);
  border-radius: 999px;
  overflow: hidden;
}
.nuvo-conf-bar > span {
  display: block;
  height: 100%;
  background: var(--nuvo-green);
  border-radius: inherit;
  transition: width .5s cubic-bezier(.2,.7,.3,1);
  width: var(--conf, 0%);
}
.nuvo-conf-bar--warn > span { background: var(--nuvo-orange); }
.nuvo-conf-bar--low  > span { background: var(--nuvo-red); }


/* ============================================================================
   26. DASHBOARD WIDGET FRAME  WidgetCard, dashboard composition
   ============================================================================
   Standard frame for every dashboard widget. Composes a card-style frame
   with a fixed header strip, scrollable body, optional footer, and a
   "unavailable" overlay state. */
.nuvo-widget {
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line);
  border-radius: var(--nuvo-radius-md);
  display: flex;
  flex-direction: column;
  min-width: 0;
  position: relative;
  overflow: hidden;
}
.nuvo-widget--flush { padding: 0; }
.nuvo-widget__head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  padding: 14px 18px 12px;
  border-bottom: 1px solid var(--nuvo-line);
  background: var(--nuvo-bg-card);
}
.nuvo-widget__title {
  font-family: var(--nuvo-font-body);
  font-weight: 600;
  font-size: 14px;
  color: var(--nuvo-ink);
  letter-spacing: -0.005em;
}
.nuvo-widget__subtitle {
  font-size: 12px;
  color: var(--nuvo-ink-mute);
  margin-top: 2px;
  line-height: 1.45;
}
.nuvo-widget__kicker { /* uses .nuvo-eyebrow */ }
.nuvo-widget__actions { display: flex; gap: 6px; align-items: center; }
.nuvo-widget__body {
  padding: 16px 18px;
  flex: 1 1 auto;
  min-height: 0;
}
.nuvo-widget__body--flush { padding: 0; }
.nuvo-widget__footer {
  padding: 10px 18px;
  border-top: 1px solid var(--nuvo-line);
  background: var(--nuvo-bg-soft);
  font-size: 12px;
  color: var(--nuvo-ink-mute);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}

.nuvo-widget--unavailable .nuvo-widget__body {
  display: grid;
  place-items: center;
  text-align: center;
  color: var(--nuvo-ink-mute);
  font-size: 13px;
  padding: 32px 18px;
}


/* ============================================================================
   27. NAVIGATION SHELL  top bar for /exec or app frame
   ============================================================================ */
.nuvo-nav {
  position: sticky;
  top: 0;
  z-index: 50;
  background: color-mix(in srgb, var(--nuvo-bg) 88%, transparent);
  backdrop-filter: saturate(140%) blur(12px);
  -webkit-backdrop-filter: saturate(140%) blur(12px);
  border-bottom: 1px solid var(--nuvo-line);
}
.nuvo-nav__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  height: 64px;
  padding: 0 var(--nuvo-pad-x);
  max-width: var(--nuvo-container);
  margin: 0 auto;
}
.nuvo-nav__brand {
  display: flex;
  align-items: center;
  gap: 10px;
  font-family: var(--nuvo-font-display);
  font-size: 20px;
  font-weight: 500;
  letter-spacing: -0.01em;
  line-height: 1.05;
  color: var(--nuvo-ink);
}
.nuvo-nav__brand-mark { width: 22px; height: 22px; color: var(--nuvo-green); }
.nuvo-nav__links {
  display: flex;
  align-items: center;
  gap: 30px;
}
.nuvo-nav__link {
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.04em;
  color: var(--nuvo-ink-soft);
  transition: color .15s ease;
}
.nuvo-nav__link:hover { color: var(--nuvo-ink); }
.nuvo-nav__link.is-active { color: var(--nuvo-ink); position: relative; }
.nuvo-nav__link.is-active::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -22px;
  height: 2px;
  background: var(--nuvo-green);
}
.nuvo-nav__cta { display: flex; align-items: center; gap: 14px; }


/* ============================================================================
   28. OPERATOR CHIP / USER STAMP  small avatar+name pill
   ============================================================================ */
.nuvo-operator {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 4px 10px 4px 4px;
  background: var(--nuvo-bg-card);
  border: 1px solid var(--nuvo-line);
  border-radius: 999px;
  font-size: 12.5px;
}
.nuvo-operator__avatar {
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--nuvo-lavender-bg);
  color: var(--nuvo-lavender-ink);
  display: grid;
  place-items: center;
  font-family: var(--nuvo-font-mono);
  font-size: 10px;
  font-weight: 600;
}
.nuvo-operator__name { color: var(--nuvo-ink); font-weight: 500; }
.nuvo-operator__role {
  color: var(--nuvo-ink-mute);
  font-family: var(--nuvo-font-mono);
  font-size: 10.5px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}


/* ============================================================================
   29. REVEAL ANIMATIONS  for staggered page entry
   ============================================================================ */
.nuvo-reveal {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity .8s cubic-bezier(.2,.7,.3,1), transform .8s cubic-bezier(.2,.7,.3,1);
}
.nuvo-reveal.is-in { opacity: 1; transform: none; }
.nuvo-reveal-stagger > * {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity .7s cubic-bezier(.2,.7,.3,1), transform .7s cubic-bezier(.2,.7,.3,1);
}
.nuvo-reveal-stagger.is-in > * { opacity: 1; transform: none; }
.nuvo-reveal-stagger.is-in > *:nth-child(1) { transition-delay: 0s; }
.nuvo-reveal-stagger.is-in > *:nth-child(2) { transition-delay: .08s; }
.nuvo-reveal-stagger.is-in > *:nth-child(3) { transition-delay: .16s; }
.nuvo-reveal-stagger.is-in > *:nth-child(4) { transition-delay: .24s; }
.nuvo-reveal-stagger.is-in > *:nth-child(5) { transition-delay: .32s; }
.nuvo-reveal-stagger.is-in > *:nth-child(6) { transition-delay: .40s; }


/* ============================================================================
   30. RESPONSIVE OVERRIDES  collapse multi-col grids gracefully
   ============================================================================ */
@media (max-width: 880px) {
  .nuvo-page-header__row { flex-direction: column; align-items: flex-start; }
  .nuvo-page-header__actions { width: 100%; }
}
@media (max-width: 640px) {
  .nuvo-btn { padding: 12px 16px; }
  .nuvo-btn--block { padding: 16px 18px; }
  .nuvo-detail-grid--2,
  .nuvo-detail-grid--3 { grid-template-columns: 1fr; }
  .nuvo-modal { max-height: calc(100vh - 24px); }
}


/* ============================================================================
   31. REDUCED MOTION
   ============================================================================ */
@media (prefers-reduced-motion: reduce) {
  .nuvo *, .nuvo *::before, .nuvo *::after {
    animation-duration: .001ms !important;
    transition-duration: .001ms !important;
  }
}


/* ============================================================================
   32. PRINT  strip borders/colors for clean printouts
   ============================================================================ */
@media print {
  .nuvo { background: white; color: black; }
  .nuvo-btn, .nuvo-icon-btn, .nuvo-nav { display: none !important; }
  .nuvo-card, .nuvo-widget, .nuvo-table-wrap { border-color: #ccc; box-shadow: none; }
}
