# Outlex v2 Component Grammar Cheat-Sheet

**Direction B — Precision + Atmosphere**  
Extracted from the approved dark mockup (`direction-b-precision-atmosphere.html`) and light mockup (`direction-b-light.html`).  
All CSS references `--ox-*` tokens from `tokens-v2.css`. Copy exact recipes — do not derive from taste.

---

## (a) Elevated Card — Dark + Light

Both themes share identical structure. Shadow/highlight values are the only theme-specific variables.

```css
/* ---- DARK ---- */
.card-dark {
  background: linear-gradient(180deg,
    oklch(0.21 0.012 270deg),
    oklch(0.18 0.012 270deg)
  );
  border: 1px solid rgba(255,255,255,0.07);
  border-radius: var(--ox-radius-lg);              /* 12px */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.08),          /* Linear inset-highlight signature */
    0 1px 2px rgba(0,0,0,0.40),
    0 4px 16px rgba(0,0,0,0.35),
    0 12px 40px rgba(0,0,0,0.25);
  position: relative;
  transition:
    transform var(--ox-enter) var(--ox-ease),
    box-shadow var(--ox-enter) var(--ox-ease),
    border-color var(--ox-enter) var(--ox-ease);
}
.card-dark:hover {
  transform: translateY(-2px);
  border-color: rgba(255,255,255,0.12);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.12),
    0 2px 4px rgba(0,0,0,0.50),
    0 8px 24px rgba(0,0,0,0.45),
    0 20px 60px rgba(0,0,0,0.35);
}

/* ---- LIGHT ---- */
/*
 * Page bg = warm cream oklch(0.962 0.010 80deg) ≈ #F5F1EA.
 * Cards stay pure white — the cream bg makes them POP rather than merge.
 */
.card-light {
  background: linear-gradient(180deg, #FFFFFF, #FDFBF8);  /* pure white → barely-warm white */
  border: 1px solid var(--ox-border);              /* oklch(0.86 0.015 80deg) ≈ #DCD5CA — visible */
  border-radius: var(--ox-radius-lg);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.95),          /* strong inset on white against cream bg */
    0 1px 2px rgba(45,38,28,0.07),
    0 4px 10px rgba(45,38,28,0.08),
    0 12px 32px rgba(45,38,28,0.09);
  transition:
    transform var(--ox-enter) var(--ox-ease),
    box-shadow var(--ox-enter) var(--ox-ease),
    border-color var(--ox-enter) var(--ox-ease);
}
.card-light:hover {
  transform: translateY(-2px);
  border-color: oklch(0.82 0.016 80deg);           /* slightly darker border on hover */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.95),
    0 2px 4px rgba(45,38,28,0.08),
    0 8px 24px rgba(45,38,28,0.11),
    0 20px 60px rgba(45,38,28,0.10);
}
```

---

## (b) Primary Sage CTA Button

Identical gradient works on both dark and light backgrounds.

```css
.btn-primary {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ox-space-2);                          /* 8px */
  font-family: var(--ox-font-sans);
  font-size: 14px;
  font-weight: var(--ox-weight-medium);            /* 500 */
  letter-spacing: var(--ox-tracking-body);         /* -0.01em */
  padding: 10px 20px;
  border: none;
  border-radius: var(--ox-radius-md);              /* 8px */
  cursor: pointer;
  text-decoration: none;

  /* Sage gradient — the canonical CTA surface */
  background: linear-gradient(180deg, #7BA081, #5F8266);
  color: #F0EDE8;                                  /* warm white — always this on sage */

  /* 3D grammar: inset top edge + warm glow below */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.25),
    0 1px 2px rgba(0,0,0,0.3),
    0 4px 16px oklch(0.60 0.10 150deg / 0.35);    /* sage glow */

  transition:
    transform var(--ox-press) ease,
    box-shadow var(--ox-enter) var(--ox-ease),
    background-color var(--ox-enter) var(--ox-ease);
}
.btn-primary:hover {
  background: linear-gradient(180deg, #8BAD91, #6F9276);
  color: #F5F2ED;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.30),
    0 2px 4px rgba(0,0,0,0.35),
    0 6px 20px oklch(0.60 0.10 150deg / 0.45);
  transform: translateY(-1px);
}
.btn-primary:active {
  transform: translateY(1px) scale(0.99);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.15),
    0 1px 2px rgba(0,0,0,0.4),
    0 2px 8px oklch(0.60 0.10 150deg / 0.20);
}
```

---

## (c) Secondary Button — Dark / Light Variants

```css
/* ---- DARK ---- */
.btn-secondary-dark {
  background: linear-gradient(180deg, rgba(255,255,255,0.05), rgba(255,255,255,0.02));
  color: var(--ox-fg-secondary);
  padding: 10px 20px;
  border: 1px solid rgba(255,255,255,0.10);
  border-radius: var(--ox-radius-md);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.06),
    0 1px 3px rgba(0,0,0,0.25);
}
.btn-secondary-dark:hover {
  background: linear-gradient(180deg, rgba(255,255,255,0.08), rgba(255,255,255,0.04));
  color: var(--ox-fg-primary);
  border-color: rgba(255,255,255,0.16);
  transform: translateY(-1px);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.10),
    0 2px 8px rgba(0,0,0,0.35);
}

/* ---- LIGHT ---- */
.btn-secondary-light {
  background: linear-gradient(180deg, #FFFFFF, #F8F6F3);
  color: var(--ox-fg-secondary);
  padding: 10px 20px;
  border: 1px solid var(--ox-border-subtle);
  border-radius: var(--ox-radius-md);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.90),
    0 1px 2px rgba(40,35,30,0.05),
    0 2px 6px rgba(40,35,30,0.04);
}
.btn-secondary-light:hover {
  background: linear-gradient(180deg, #FFFFFF, #F4F2EE);
  color: var(--ox-fg-primary);
  border-color: oklch(0.82 0.016 80deg);
  transform: translateY(-1px);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.95),
    0 2px 8px rgba(45,38,28,0.09);
}

/* Shared active state */
.btn-secondary-dark:active,
.btn-secondary-light:active {
  transform: scale(0.97);
}
```

---

## (d) Chip / Citation Chip

**Linear-style dot-chip grammar (both themes):**
- Chip surface = neutral, one step above ground
- Border = `rgba(255,255,255,0.10)` dark / `var(--ox-border)` ≈ `oklch(0.86 0.015 80deg)` light
- Label text = `var(--ox-fg-secondary)` — NEVER coloured
- Colour lives ONLY in the 4–5px leading dot
- Dot palette: terracotta = HIGH/overdue · amber = needs-review/pending · sage = ready/done · teal (`#54D6A4` at 70% opacity) = AI/citation

```css
/* ---- BASE CHIP (Linear-style neutral — both themes) ---- */
.chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-family: var(--ox-font-mono);
  font-size: var(--ox-text-chip);                  /* 11px */
  font-weight: var(--ox-weight-medium);            /* 500 */
  letter-spacing: var(--ox-tracking-caps);         /* 0.09em */
  text-transform: uppercase;
  border-radius: var(--ox-radius-sm);              /* 4px */
  padding: 3px 8px;

  /* DARK: neutral surface one step above ground */
  background: linear-gradient(180deg,
    rgba(255,255,255,0.06),
    rgba(255,255,255,0.03)
  );
  color: var(--ox-fg-secondary);                  /* label is ALWAYS neutral — no colour */
  border: 1px solid rgba(255,255,255,0.10);

  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.08),
    0 1px 2px rgba(0,0,0,0.25);
  transition:
    transform var(--ox-enter) var(--ox-ease),
    box-shadow var(--ox-enter) var(--ox-ease),
    border-color var(--ox-enter) var(--ox-ease);
}
.chip:hover {
  border-color: rgba(255,255,255,0.18);            /* border brightens on hover */
  transform: translateY(-1px);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.12),
    0 2px 6px rgba(0,0,0,0.30);
}

/* LIGHT theme override */
[data-theme="light"] .chip {
  background: linear-gradient(180deg, #FFFFFF, #FDFCFA);
  color: #4A4641;                                  /* fg-secondary light */
  border-color: var(--ox-border);                  /* oklch(0.86 0.015 80deg) — strengthened */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.95),
    0 1px 2px rgba(45,38,28,0.07);
}
[data-theme="light"] .chip:hover {
  border-color: oklch(0.82 0.016 80deg);           /* slightly darker on hover */
}

/* Dot pseudo-element — shared */
.chip::before {
  content: '';
  width: 5px;
  height: 5px;
  border-radius: 50%;
  flex-shrink: 0;
}

/* ---- HIGH / OVERDUE — terracotta dot ---- */
.chip-high::before {
  background: oklch(0.70 0.15 28deg);
  box-shadow: 0 0 4px oklch(0.70 0.15 28deg / 0.60);
}

/* ---- NEEDS REVIEW / PENDING — amber dot ---- */
.chip-review::before {
  background: oklch(0.78 0.14 75deg);
  box-shadow: 0 0 4px oklch(0.78 0.14 75deg / 0.60);
}

/* ---- READY / DONE — sage dot ---- */
.chip-ready::before {
  background: oklch(0.75 0.09 150deg);
  box-shadow: 0 0 4px oklch(0.75 0.09 150deg / 0.60);
}

/* ---- AI / CITATION — teal dot ---- */
.chip-ai::before,
.citation-chip::before {
  background: rgba(84, 214, 164, 0.70);           /* #54D6A4 at 70% */
  box-shadow: 0 0 4px rgba(84, 214, 164, 0.50);
}

/* ---- CITATION CHIP (inline in AI response text) ---- */
/* Neutral surface, teal dot, neutral label — NO amber */
.citation-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-family: var(--ox-font-mono);
  font-size: 10.5px;
  font-weight: 400;
  color: var(--ox-fg-secondary);                  /* neutral — never amber */
  background: linear-gradient(180deg,
    rgba(255,255,255,0.06),
    rgba(255,255,255,0.03)
  );
  border: 1px solid rgba(255,255,255,0.10);
  border-radius: var(--ox-radius-sm);
  padding: 2px 8px;
  cursor: pointer;
  vertical-align: middle;
  margin: 0 2px;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.07),
    0 1px 2px rgba(0,0,0,0.20);
  text-decoration: none;
  transition: all var(--ox-enter) var(--ox-ease);
}
.citation-chip:hover {
  border-color: rgba(255,255,255,0.20);            /* border brightens — no colour change */
  transform: translateY(-1px);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.10),
    0 2px 6px rgba(0,0,0,0.25);
}

/* LIGHT theme citation chip */
[data-theme="light"] .citation-chip {
  color: #4A4641;
  background: linear-gradient(180deg, #FFFFFF, #FDFCFA);
  border-color: var(--ox-border);                  /* strengthened ≈ #DCD5CA */
}
[data-theme="light"] .citation-chip:hover {
  border-color: oklch(0.82 0.016 80deg);
}
```

---

## (e) Icon Container (IconBox)

**ONE-ACCENT-PER-ELEMENT RULE**: Icon containers are MONOCHROME. Container bg is neutral; icon stroke is `fg-secondary`. Severity/state lives in the row's dot chip only — never also in icon colour. A coloured icon + coloured label on the same element is a hard violation.

```css
/* ---- BASE ICON BOX (monochrome — both themes) ---- */
.icon-box {
  width: 40px;
  height: 40px;
  border-radius: var(--ox-radius-lg);              /* 12px — soft squircle feel */
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: all var(--ox-enter) var(--ox-ease);

  /* DARK: monochrome neutral container */
  background: rgba(255,255,255,0.06);
  color: var(--ox-fg-secondary);                  /* icon inherits — neutral, NOT coloured */
  border: 1px solid rgba(255,255,255,0.08);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.12),
    0 1px 3px rgba(0,0,0,0.30),
    0 4px 10px rgba(0,0,0,0.20);
}
.icon-box:hover {
  transform: scale(1.1) translateY(-2px);
  border-color: rgba(255,255,255,0.14);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.18),
    0 4px 8px rgba(0,0,0,0.40),
    0 10px 24px rgba(0,0,0,0.30);
}

/* LIGHT theme override — warm-tinted container (NOT grey) */
[data-theme="light"] .icon-box {
  background: linear-gradient(180deg, #F6F1E9, #EFE9DF);  /* warm paper tone — biscuit/parchment */
  color: #4A4641;                                          /* fg-secondary light */
  border: 1px solid rgba(45,38,28,0.08);                  /* warm dark border at low opacity */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.85),
    0 1px 2px rgba(45,38,28,0.07),
    0 3px 8px rgba(45,38,28,0.08);
}

/* Icon inside: always 18×18, stroke-width 1.5 */
.icon-box svg { width: 18px; height: 18px; stroke-width: 1.5; }

/*
 * Accent icon-box variants are RESERVED for the CTA (sage) and explicit
 * informational callouts (blue) — NOT for general AI/status differentiation.
 * One accent per element max.
 */

/* Sage CTA variant — reserved for confirm/success action buttons */
.icon-box-sage {
  background: linear-gradient(145deg, oklch(0.30 0.06 150deg), oklch(0.22 0.04 150deg));
  color: oklch(0.80 0.09 150deg);
  border-color: oklch(0.60 0.10 150deg / 0.30);
}

/* Blue informational variant — reserved for info callouts */
.icon-box-blue {
  background: linear-gradient(145deg, oklch(0.28 0.08 270deg), oklch(0.20 0.06 270deg));
  color: oklch(0.78 0.14 270deg);
  border-color: oklch(0.57 0.15 270deg / 0.30);
}

/*
 * icon-box-amber is REMOVED. Amber was the AI icon container colour.
 * AI containers now use the neutral .icon-box base (rgba(255,255,255,0.06)).
 * Severity/AI distinction lives in the adjacent dot chip, not the icon itself.
 */
```

---

## (f) AI / Lexi Bubble + Confidence Bar

**The Lexi mark symbol (`#ic-lexi`) must be defined once per HTML document alongside the other symbols.**
The `#ic-lexi` symbol uses `fill="currentColor"` — it inherits whatever `color` the parent element has.
For AI buttons and inline labels, it inherits text colour (monochrome). For avatars/card-label rows,
use `<use href="#outlex-mark"/>` (gradient version) at 14–18px.

```html
<!-- Add inside the same width="0" height="0" SVG container as outlex-mark and Lucide symbols -->

<!-- ic-lexi: Outlex mark as monochrome (currentColor) — for AI buttons + inline AI labels -->
<symbol id="ic-lexi" viewBox="50 47 150 160">
  <path fill="currentColor" d="m123.34,113.7h0c-4.85,0-8.96-3.55-9.68-8.34l-6.28-29.49c-1.46-9.76,6.1-18.53,15.96-18.53h0c9.86,0,17.42,8.77,15.96,18.53l-6.28,29.49c-.72,4.79-4.83,8.34-9.68,8.34Z"/>
  <path fill="currentColor" d="m106.93,126.15h0c-2.46,4.18-7.6,5.93-12.09,4.11l-28.6-9.54c-9.15-3.69-12.88-14.65-7.88-23.15h0c5-8.5,16.39-10.57,24.06-4.36l22.23,20.37c3.77,3.05,4.74,8.39,2.28,12.57Z"/>
  <path fill="currentColor" d="m138.38,126.15h0c2.46,4.18,7.6,5.93,12.09,4.11l28.6-9.54c9.15-3.69,12.88-14.65,7.88-23.15h0c-5-8.5-16.39-10.57-24.06-4.36l-22.23,20.37c-3.77,3.05-4.74,8.39-2.28,12.57Z"/>
  <path fill="currentColor" d="m174.62,149.45l-46.79-19.44s-.01.03-.02.04c-1.35-.7-2.86-1.14-4.48-1.14-1.14,0-2.21.23-3.23.59-.08,0-.16-.01-.28.06l-.26.11s-.04.02-.06.02l-47.83,19.75c-9.15,3.68-12.89,14.64-7.89,23.15,5,8.51,16.39,10.58,24.06,4.37l24.26-22.78-4.73,33.94c-1.46,9.76,6.1,18.53,15.96,18.53s17.42-8.77,15.96-18.53l-4.7-33.55,23.84,22.39c7.67,6.2,19.06,4.13,24.06-4.37,5-8.51,1.26-19.46-7.89-23.15Z"/>
</symbol>
```

**ic-lexi usage:**
- AI buttons ("Generate", "Open with Lexi", "Ask Lexi"): `<svg width="13" height="14"><use href="#ic-lexi"/></svg>` — inherits button text colour (monochrome).
- Inline AI labels: same 13×14 usage, inherits surrounding text colour.
- Avatars / card label rows: use gradient `<use href="#outlex-mark"/>` at 14–18px instead.
- `ic-sparkles` is **BANNED** on all AI affordances. It may remain in the symbol set for non-AI decorative contexts only.

---

The canonical Lexi response surface is **neutral** — identical in structure to an elevated card.
No amber background. No amber border. No amber label colour. Teal dot is the AI accent.

```css
/* ---- LEXI RESPONSE BUBBLE (neutral — dark theme) ---- */
.lexi-bubble {
  /* Same surface as elevated card — neutral, NOT amber-tinted */
  background: linear-gradient(180deg,
    oklch(0.21 0.012 270deg),
    oklch(0.18 0.012 270deg)
  );
  border: 1px solid rgba(255,255,255,0.07);        /* neutral card border */
  border-radius: var(--ox-radius-lg);              /* 12px — standard card, NOT asymmetric spine */
  padding: 18px 20px;
  font-size: 14px;
  font-weight: 400;
  color: var(--ox-fg-primary);
  line-height: var(--ox-leading-loose);            /* 1.75 — AI prose breathes */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.08),          /* inset highlight — card signature */
    0 1px 3px rgba(0,0,0,0.30),
    0 4px 16px rgba(0,0,0,0.20);
  /* NO amber bloom. NO left-border spine. */
}

/* LIGHT theme */
[data-theme="light"] .lexi-bubble {
  background: linear-gradient(180deg, #FFFFFF, #FDFBF8);
  border-color: var(--ox-border);                  /* strengthened ≈ #DCD5CA */
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.95),
    0 1px 2px rgba(45,38,28,0.07),
    0 4px 10px rgba(45,38,28,0.08),
    0 12px 32px rgba(45,38,28,0.09);
}

/* Inline emphasis in AI body text — neutral foreground weight, NOT coloured */
.lexi-bubble strong {
  font-weight: var(--ox-weight-semibold);          /* 600 */
  color: var(--ox-fg-primary);                     /* foreground/ink colour — NOT amber */
}
/* Light: ink is #231F20 — same rule applies */

/* ---- LEXI HEADER ROW ---- */
.lexi-header {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: var(--ox-space-3);               /* 12px */
}

/* Avatar: gradient mark at 14-18px (the sanctioned AI mark usage) */
.lexi-avatar {
  width: 28px; height: 28px;
  border-radius: var(--ox-radius-md);             /* 8px */
  background: var(--ox-surface-2);
  border: 1px solid rgba(255,255,255,0.07);       /* neutral border */
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
/* Inside lexi-avatar: <svg width="16" height="16"><use href="#outlex-mark"/></svg> */

/* Label row: LEXI + timestamp — both fg-muted, no amber */
.lexi-label {
  font-family: var(--ox-font-mono);
  font-size: 11px;
  font-weight: var(--ox-weight-medium);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ox-fg-muted);                      /* muted neutral — NOT amber */
}
.lexi-timestamp {
  font-family: var(--ox-font-mono);
  font-size: 10px;
  color: var(--ox-fg-muted);
  margin-left: auto;
}

/* ---- PROCESSING / STREAMING CHIP ---- */
/* Neutral chip surface + pulsing teal dot + muted mono text */
.lexi-streaming-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 10px;
  border-radius: var(--ox-radius-sm);
  background: rgba(255,255,255,0.06);
  border: 1px solid rgba(255,255,255,0.10);
  color: var(--ox-fg-muted);
  font-family: var(--ox-font-mono);
  font-size: 10px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.lexi-streaming-dot {
  width: 5px; height: 5px;
  border-radius: 50%;
  background: #54D6A4;                            /* teal — AI accent dot */
  animation: teal-pulse 1.2s ease-in-out infinite;
  flex-shrink: 0;
}
@keyframes teal-pulse {
  0%, 100% { opacity: 0.70; transform: scale(1); }
  50%       { opacity: 1;    transform: scale(1.2); }
}

/* ---- CONFIDENCE BAR ---- */
/* 2px track, solid sage fill, mono fg-muted label */
.confidence-bar-wrap {
  display: flex;
  align-items: center;
  gap: var(--ox-space-2);
  flex: 1;
  margin-top: var(--ox-space-2);
  padding-top: var(--ox-space-3);
  border-top: 1px solid var(--ox-border-subtle);
}
.confidence-bar-track {
  flex: 1;
  height: 2px;                                    /* 2px — not 3px */
  background: rgba(255,255,255,0.08);             /* neutral track */
  border-radius: 2px;
  overflow: hidden;
}
.confidence-bar-fill {
  height: 100%;
  border-radius: 2px;
  background: var(--ox-sage-500);                 /* SOLID sage — no sage→amber gradient */
  transition: width 0.4s var(--ox-ease);
}
.confidence-label {
  font-family: var(--ox-font-mono);
  font-size: 9.5px;
  letter-spacing: var(--ox-tracking-caps);
  text-transform: uppercase;
  color: var(--ox-fg-muted);                      /* fg-muted — not sage, not amber */
}
/* Example label text: "82% CONFIDENCE" or "CONFIANÇA 82%" */
```

---

## (g) Status Badges (Linear-style dot chips)

**The dot-chip is the canonical status pattern.** Colour lives only in the leading dot —
label text is always `fg-secondary` (neutral). Never coloured chip backgrounds or coloured label text.

Use `.chip` + `.chip-{variant}` from section (d) for all status chips.

For standalone inline badges (no dot, text only — e.g. SLA meta text beside a deadline):
use `fg-muted` colour directly on the text, not a chip container:

```css
/*
 * SLA / deadline meta text — amber is allowed here as tiny inline warning text only.
 * This is plain <span> text, NOT a chip container.
 * Example: "Due in 18h — Outlex Ltda."
 */
.meta-warning {
  font-family: var(--ox-font-mono);
  font-size: var(--ox-text-meta);                 /* 12px */
  color: var(--ox-amber-500);                     /* amber ONLY for this tiny warning meta text */
  letter-spacing: 0.04em;
}

/*
 * For stat cards: at most ONE line of coloured meta (e.g. amber deadline text).
 * Never: coloured icon + coloured number + coloured label + coloured chip all together.
 * State = small dot in the corner chip. Icon, number, label = neutral.
 */

/* Stat card neutral icon box — number and label are fg colours, not accents */
.stat-card {
  display: flex;
  align-items: flex-start;
  gap: var(--ox-space-3);
  padding: var(--ox-space-4);
  background: linear-gradient(180deg,
    oklch(0.21 0.012 270deg),
    oklch(0.18 0.012 270deg)
  );
  border: 1px solid rgba(255,255,255,0.07);
  border-radius: var(--ox-radius-lg);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.08),
    0 1px 3px rgba(0,0,0,0.30);
}
.stat-card-number {
  font-family: var(--ox-font-sans);
  font-size: 28px;
  font-weight: var(--ox-weight-semibold);
  color: var(--ox-fg-primary);                    /* foreground — NOT amber */
  line-height: 1;
}
.stat-card-label {
  font-family: var(--ox-font-mono);
  font-size: var(--ox-text-meta);
  color: var(--ox-fg-muted);                      /* muted — NOT coloured */
  letter-spacing: var(--ox-tracking-caps);
  text-transform: uppercase;
}

/* Lawyer notification count badge (filled — exception: this IS a coloured filled element) */
.badge-count {
  min-width: 18px;
  height: 18px;
  background: oklch(0.55 0.18 28deg);
  border-radius: var(--ox-radius-full);
  font-size: 10px;
  font-weight: var(--ox-weight-semibold);
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0 5px;
  font-family: var(--ox-font-mono);
}
```

---

## (h) Orb Backdrop

Three radial gradient orbs for ambient atmosphere. Zero layout impact — always behind content.

```css
/* Orb container */
.orbs {
  position: absolute;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  z-index: 0;                                      /* content must be z-index: 1 */
}

.orb {
  position: absolute;
  border-radius: 50%;
  filter: blur(var(--ox-orb-blur));                /* blur(120px) */
  animation: orb-pulse var(--ox-orb-cycle) ease-in-out infinite;
}

/* DARK THEME orbs */
.orb-sage-dark {
  width: 600px; height: 500px;
  top: -100px; left: -200px;
  background: radial-gradient(circle,
    oklch(0.60 0.10 150deg / 0.18) 0%,
    transparent 70%
  );
  animation-delay: 0s;
}
.orb-blue-dark {
  width: 700px; height: 600px;
  top: 100px; right: -250px;
  background: radial-gradient(circle,
    oklch(0.57 0.15 270deg / 0.14) 0%,
    transparent 70%
  );
  animation-delay: 2.7s;
}
.orb-amber-dark {
  width: 500px; height: 400px;
  bottom: -50px; left: 30%;
  background: radial-gradient(circle,
    oklch(0.70 0.14 75deg / 0.10) 0%,
    transparent 70%
  );
  animation-delay: 5.3s;
}

/* LIGHT THEME orbs — use same positions, reduced opacity */
.orb-sage-light {
  background: radial-gradient(circle, rgba(107,143,113,0.14) 0%, transparent 70%);
}
.orb-blue-light {
  background: radial-gradient(circle, rgba(48,106,239,0.08) 0%, transparent 70%);
}
.orb-amber-light {
  background: radial-gradient(circle, rgba(196,148,50,0.10) 0%, transparent 70%);
}

@keyframes orb-pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%       { opacity: 0.7; transform: scale(1.08); }
}
```

---

## (i) Grain Overlay Snippet

Zero layout impact. Apply via `::after` on any surface element.

```css
/*
 * The grain overlay is a fixed-position SVG feTurbulence noise layer.
 * Always use pointer-events: none and z-index: 9999 (or above content z-index).
 * DARK theme: mix-blend-mode: overlay, opacity: 0.04
 * LIGHT theme: mix-blend-mode: multiply, opacity: 0.03
 */

.ox-grain::after {
  content: '';
  position: fixed;
  inset: 0;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23noise)' opacity='0.04'/%3E%3C/svg%3E");
  pointer-events: none;
  z-index: 9999;
  opacity: 1;                                      /* per-theme blending handles visual weight */
  mix-blend-mode: overlay;                         /* dark */
}

[data-theme="light"] .ox-grain::after {
  mix-blend-mode: multiply;
  /* Swap the SVG's internal rect opacity to 0.03 for light — or use a separate grain class */
}

/*
 * LIGHT-SPECIFIC grain (opacity 0.03 baked into data URI):
 */
.ox-grain-light::after {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='300' height='300'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='300' height='300' filter='url(%23noise)' opacity='0.03'/%3E%3C/svg%3E");
  mix-blend-mode: multiply;
}
```

---

## (j) macOS-Frame Product Screenshot Staging

For marketing hero and product showcase sections.

```css
/* Product frame container */
.product-frame-wrapper {
  position: relative;
  width: 100%;
  max-width: 960px;
  margin: 0 auto;
}

/* The 3D-tilted frame */
.product-frame {
  background: var(--ox-surface-1);
  border: 1px solid var(--ox-border-subtle);
  border-radius: var(--ox-radius-2xl);             /* 16px */
  overflow: hidden;
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,0.07),
    0 40px 120px oklch(0.05 0.02 270deg / 0.80),
    0 8px 40px oklch(0.05 0.02 270deg / 0.50);

  /* Perspective tilt — creates 3D depth effect */
  transform: perspective(1200px) rotateX(6deg) rotateY(-2deg);
  transform-origin: center bottom;
  transition: transform 0.6s var(--ox-ease);
}

/* Flatten on scroll / hover — use IntersectionObserver or :hover */
.product-frame:hover {
  transform: perspective(1200px) rotateX(2deg) rotateY(-0.5deg);
}

/* Radial glow beneath — simulates light source on dark background */
.product-frame-glow {
  position: absolute;
  bottom: -60px;
  left: 50%;
  transform: translateX(-50%);
  width: 70%;
  height: 80px;
  background: radial-gradient(ellipse,
    oklch(0.57 0.15 270deg / 0.25) 0%,
    transparent 70%
  );
  filter: blur(20px);
  pointer-events: none;
}

/*
 * macOS chrome bar (fake title bar, optional):
 * Place a 44px bar at top of .product-frame with three dots:
 */
.product-frame-chrome {
  height: 44px;
  background: oklch(0.14 0.012 270deg);
  border-bottom: 1px solid var(--ox-border-subtle);
  display: flex;
  align-items: center;
  padding: 0 16px;
  gap: 8px;
  flex-shrink: 0;
}
.chrome-dot {
  width: 12px; height: 12px;
  border-radius: 50%;
}
.chrome-dot-red    { background: #FF5F57; }
.chrome-dot-yellow { background: #FEBC2E; }
.chrome-dot-green  { background: #28C840; }
```

---

## (k) Outlex Mark — Symbol Usage

**Critical gotcha**: the symbol SVG container uses `width="0" height="0" style="position:absolute"` — NEVER `display:none`. `display:none` prevents the gradients from rendering in Safari and Firefox. The `width=0/height=0` approach keeps the SVG in the DOM without taking up layout space.

**Always define once as a symbol near the top of `<body>` and reference everywhere via `<use>`.**

```html
<!-- Define ONCE near top of <body> -->
<svg width="0" height="0" style="position:absolute" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <symbol id="outlex-mark" viewBox="50 47 150 160">
    <defs>
      <linearGradient id="oxg1" x1="123.34" y1="47.41" x2="123.34" y2="196.68" gradientUnits="userSpaceOnUse">
        <stop offset=".35" stop-color="#306aef"/>
        <stop offset=".48" stop-color="#3b8dd6"/>
        <stop offset=".62" stop-color="#46adc0"/>
        <stop offset=".75" stop-color="#4dc3b0"/>
        <stop offset=".88" stop-color="#52d1a7"/>
        <stop offset="1"   stop-color="#54d6a4"/>
      </linearGradient>
      <linearGradient id="oxg2" x1="82.2"   y1="47.41" x2="82.2"   y2="196.68" href="#oxg1" xlink:href="#oxg1"/>
      <linearGradient id="oxg3" x1="163.11" y1="47.41" x2="163.11" y2="196.68" href="#oxg1" xlink:href="#oxg1"/>
      <linearGradient id="oxg4" x1="123.15" y1="47.41" x2="123.15" y2="196.68" href="#oxg1" xlink:href="#oxg1"/>
    </defs>
    <!-- Petal 1: top -->
    <path fill="url(#oxg1)" d="m123.34,113.7h0c-4.85,0-8.96-3.55-9.68-8.34l-6.28-29.49c-1.46-9.76,6.1-18.53,15.96-18.53h0c9.86,0,17.42,8.77,15.96,18.53l-6.28,29.49c-.72,4.79-4.83,8.34-9.68,8.34Z"/>
    <!-- Petal 2: left -->
    <path fill="url(#oxg2)" d="m106.93,126.15h0c-2.46,4.18-7.6,5.93-12.09,4.11l-28.6-9.54c-9.15-3.69-12.88-14.65-7.88-23.15h0c5-8.5,16.39-10.57,24.06-4.36l22.23,20.37c3.77,3.05,4.74,8.39,2.28,12.57Z"/>
    <!-- Petal 3: right -->
    <path fill="url(#oxg3)" d="m138.38,126.15h0c2.46,4.18,7.6,5.93,12.09,4.11l28.6-9.54c9.15-3.69,12.88-14.65,7.88-23.15h0c-5-8.5-16.39-10.57-24.06-4.36l-22.23,20.37c-3.77,3.05-4.74,8.39-2.28,12.57Z"/>
    <!-- Bottom 3 petals -->
    <path fill="url(#oxg4)" d="m174.62,149.45l-46.79-19.44s-.01.03-.02.04c-1.35-.7-2.86-1.14-4.48-1.14-1.14,0-2.21.23-3.23.59-.08,0-.16-.01-.28.06l-.26.11s-.04.02-.06.02l-47.83,19.75c-9.15,3.68-12.89,14.64-7.89,23.15,5,8.51,16.39,10.58,24.06,4.37l24.26-22.78-4.73,33.94c-1.46,9.76,6.1,18.53,15.96,18.53s17.42-8.77,15.96-18.53l-4.7-33.55,23.84,22.39c7.67,6.2,19.06,4.13,24.06-4.37,5-8.51,1.26-19.46-7.89-23.15Z"/>
  </symbol>
</svg>

<!-- Reference anywhere: -->
<!-- Nav (20px): -->
<svg width="20" height="20"><use href="#outlex-mark"/></svg>

<!-- Hero (72px with blue glow on dark): -->
<svg width="72" height="72" style="filter: drop-shadow(0 0 28px oklch(0.57 0.15 270deg / 0.50))">
  <use href="#outlex-mark"/>
</svg>

<!-- Favicon / tiny usage (16px, no filter): -->
<svg width="16" height="16"><use href="#outlex-mark"/></svg>
```

**Usage rules:**
- Mark appears in exactly 3–4 sanctioned moments per screen context: (1) nav brand mark, (2) empty state backdrop (blurred, 8–12% opacity), (3) hero/marketing backdrop, (4) loading state.
- On dark: the blue→teal gradient glows naturally. Add `filter: drop-shadow(0 0 Npx oklch(0.57 0.15 270deg / 0.50))` for glow.
- On light: no glow filter needed; the gradient reads cleanly.
- NEVER fill petals with a single flat color. The gradient IS the mark.
- NEVER distort aspect ratio. The viewBox is `50 47 150 160` — preserve it.

---

## (l) Lucide Icon Symbol Set at 1.5px Stroke

All Lucide icons are pre-defined as symbols in the same `width="0" height="0"` SVG container as the outlex-mark. Same gotcha: never `display:none`.

**Standard usage:** `width="18" height="18"` inside icon boxes; `width="16" height="16"` inline in text; `width="20" height="20"` in nav.

All symbols: `fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"`. Color inherits from `currentColor` — set it via the parent element's `color` property using semantic tokens only (never hardcoded hex).

```html
<!-- All symbols defined in the same SVG container as outlex-mark (see section k) -->

<symbol id="ic-home" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8"/>
  <path d="M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/>
</symbol>

<symbol id="ic-message-circle" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719"/>
</symbol>

<symbol id="ic-book-open" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M12 7v14"/>
  <path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/>
</symbol>

<symbol id="ic-file-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/>
  <path d="M14 2v5a1 1 0 0 0 1 1h5"/>
  <path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/>
</symbol>

<symbol id="ic-search" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="11" cy="11" r="8"/>
  <path d="m21 21-4.34-4.34"/>
</symbol>

<symbol id="ic-users" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/>
  <path d="M16 3.128a4 4 0 0 1 0 7.744"/>
  <path d="M22 21v-2a4 4 0 0 0-3-3.87"/>
  <circle cx="9" cy="7" r="4"/>
</symbol>

<symbol id="ic-user" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/>
  <circle cx="12" cy="7" r="4"/>
</symbol>

<symbol id="ic-settings" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"/>
  <circle cx="12" cy="12" r="3"/>
</symbol>

<symbol id="ic-bell" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M10.268 21a2 2 0 0 0 3.464 0"/>
  <path d="M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326"/>
</symbol>

<symbol id="ic-pen-line" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M13 21h8"/>
  <path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"/>
</symbol>

<symbol id="ic-sparkles" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z"/>
  <path d="M20 2v4"/><path d="M22 4h-4"/>
  <circle cx="4" cy="20" r="2"/>
</symbol>

<symbol id="ic-paperclip" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551"/>
</symbol>

<symbol id="ic-check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</symbol>

<symbol id="ic-folder" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/>
</symbol>

<symbol id="ic-briefcase" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/>
  <rect width="20" height="14" x="2" y="6" rx="2"/>
</symbol>

<symbol id="ic-bar-chart-2" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M5 21v-6"/><path d="M12 21V3"/><path d="M19 21V9"/>
</symbol>

<symbol id="ic-triangle-alert" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/>
  <path d="M12 9v4"/><path d="M12 17h.01"/>
</symbol>

<symbol id="ic-handshake" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="m11 17 2 2a1 1 0 1 0 3-3"/>
  <path d="m14 14 2.5 2.5a1 1 0 1 0 3-3l-3.88-3.88a3 3 0 0 0-4.24 0l-.88.88a1 1 0 1 1-3-3l2.81-2.81a5.79 5.79 0 0 1 7.06-.87l.47.28a2 2 0 0 0 1.42.25L21 4"/>
  <path d="m21 3 1 11h-2"/>
  <path d="M3 3 2 14l6.5 6.5a1 1 0 1 0 3-3"/>
  <path d="M3 4h8"/>
</symbol>

<symbol id="ic-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="4"/>
  <path d="M12 2v2"/><path d="M12 20v2"/>
  <path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/>
  <path d="M2 12h2"/><path d="M20 12h2"/>
  <path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/>
</symbol>

<symbol id="ic-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/>
</symbol>

<symbol id="ic-scroll-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
  <path d="M15 12h-5"/><path d="M15 8h-5"/>
  <path d="M19 17V5a2 2 0 0 0-2-2H4"/>
  <path d="M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3"/>
</symbol>
```

**Icon color rules:**
- ONLY use semantic token classes: `color: var(--ox-fg-muted)`, `var(--ox-fg-secondary)`, `var(--ox-fg-primary)`, `var(--ox-sage-500)`, `var(--ox-blue-400)`.
- NEVER hardcode hex on icons (exception: the teal dot `#54D6A4` in `.lexi-streaming-dot` / `.chip-ai::before`).
- NEVER set `color: var(--ox-amber-500)` on icons — amber is for deadline meta text only.
- Nav/sidebar icons: `var(--ox-fg-muted)` idle, `var(--ox-fg-primary)` active.
- AI/Lexi icon containers: `var(--ox-fg-secondary)` (neutral — NOT amber). Mark appears as `<use href="#ic-lexi"/>` inheriting text colour, or `<use href="#outlex-mark"/>` (gradient) for avatars.
- `ic-sparkles` is BANNED on AI affordances. Do not use it where the user would interpret it as an AI indicator.
- Action icons: `var(--ox-sage-500)` for confirm, `var(--ox-terracotta-500)` for destructive.
- ONE ACCENT PER ELEMENT — if the icon has a coloured container, the label must be neutral. If the chip has a coloured dot, the chip bg and text must be neutral.

---

## (m) Section Tick — Sanctioned Micro-Accent

A **section tick** is a small dash or dash-hyphen prefix on mono section labels (e.g. "— REQUER ATENÇÃO", "— DOCUMENTOS"). It is the ONE sanctioned per-page coloured accent allowed in light mode's page rhythm.

**Rule**: the section tick — and ONLY the section tick — may be `var(--ox-sage-500)` in light mode. Everything else (dot chips, label text, icon colour, stat numbers) follows the one-accent-per-element rule and stays neutral.

```css
/* Section tick — applied to the dash/em-dash before mono ALL-CAPS labels */
.section-label::before {
  content: '— ';
  color: var(--ox-sage-500);   /* ONLY sanctioned per-page accent in light rhythm */
}

/* The label text itself stays neutral — never colour the text, only the tick */
.section-label {
  font-family: var(--ox-font-mono);
  font-size: var(--ox-text-meta);       /* 12px */
  font-weight: var(--ox-weight-medium); /* 500 */
  letter-spacing: var(--ox-tracking-caps); /* 0.09em */
  text-transform: uppercase;
  color: var(--ox-fg-muted);            /* neutral — not sage */
}
```

**Why**: the tick warms the vertical page rhythm in light mode — it reads as a structural signal without introducing loud colour. One tick per section group. NEVER: a coloured tick AND a coloured chip dot on the same row (one-accent rule).

---

## Quick Reference — Most Common Mistakes

| Wrong | Correct |
|---|---|
| `display: none` on the symbol SVG | `width="0" height="0" style="position:absolute"` |
| `gap: 4px` (gap-1) | `gap: 8px` minimum (`--ox-space-2`) |
| `color: #7BA081` inline | `color: var(--ox-sage-500)` |
| `font-weight: 700` on Tiempos/Newsreader | max `font-weight: 600` (`--ox-weight-semibold`) |
| `background: black` or `color: black` | use `--ox-surface-0` / `--ox-fg-primary` |
| Amber background on AI/Lexi card | neutral card surface — `--ox-ai-surface` = same as surface-1 |
| Amber label text on AI chip or citation chip | `var(--ox-fg-secondary)` neutral label — colour lives in the dot only |
| `ic-sparkles` on AI buttons or labels | `<svg width="13" height="14"><use href="#ic-lexi"/></svg>` |
| `color: var(--ox-amber-500)` on icons | `var(--ox-fg-secondary)` — amber is warning text only |
| Coloured icon + coloured label on same element | one accent per element max — neutral icon OR dot chip, not both |
| `stroke-width="2"` on Lucide | always `stroke-width="1.5"` |
| `box-shadow: 0 4px 8px rgba(0,0,0,0.5)` (neutral black) | warm-tinted shadows: `oklch(0.05 0.02 270deg / 0.N)` |
| Confidence bar fill `linear-gradient(sage, amber)` | solid `var(--ox-sage-500)` — no gradient on confidence bar |
| AI streaming chip in amber | neutral chip + pulsing teal dot (`.lexi-streaming-chip`) |
