Precision + Atmosphere
Every component built directly from tokens-v2.css and GRAMMAR.md. Toggle dark/light at top-right. No lorem ipsum — real Outlex legal content throughout.
Buttons
Four semantic roles: primary sage CTA, secondary ghost-fill, ghost for low-hierarchy actions, destructive for irreversible operations. All states interactive — hover, active (press), disabled, loading.
Recipe — Primary CTA
/* Sage gradient fill — canonical CTA */ .btn-primary { background: linear-gradient(180deg, #7BA081, #5F8266); color: #F0EDE8; /* warm white on sage */ padding: 10px 20px; border-radius: var(--ox-radius-md); /* 8px */ box-shadow: inset 0 1px 0 rgba(255,255,255,0.25), /* inset highlight */ 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); } .btn-primary:hover { background: linear-gradient(180deg, #8BAD91, #6F9276); transform: translateY(-1px); } .btn-primary:active { transform: translateY(1px) scale(0.99); }
Inputs
Text, search, and textarea. Sage focus ring with 0 0 0 3px glow. Terracotta error state. Disabled at 45% opacity. All states functional.
Recipe — Field Input
.field-input { background: linear-gradient(180deg, oklch(0.18 0.010 270), oklch(0.15 0.010 270)); border: 1px solid rgba(255,255,255,0.10); border-radius: var(--ox-radius-md); box-shadow: inset 0 1px 0 var(--ox-inset-highlight); transition: border-color var(--ox-enter), box-shadow var(--ox-enter); } .field-input:focus { border-color: oklch(0.60 0.10 150deg / 0.6); box-shadow: inset 0 1px 0 var(--ox-inset-highlight), 0 0 0 3px oklch(0.60 0.10 150deg / 0.18); /* sage glow ring */ } .field-input.error { border-color: oklch(0.60 0.15 28deg / 0.6); box-shadow: inset 0 1px 0 var(--ox-inset-highlight), 0 0 0 3px oklch(0.60 0.15 28deg / 0.15); }
Cards
Four elevation levels. Dark: lightness-lift. Light: shadow-expressed via warm-tinted multi-layer. 1px inset white top highlight (Linear signature) on all elevated cards. Hover: translateY(-2px) + stronger shadow.
Recipe — Elevated Card (Dark)
/* Dark — gradient + inset highlight + warm shadow stack */ .card { background: linear-gradient(180deg, oklch(0.21 0.012 270), oklch(0.18 0.012 270)); 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 */ 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); } .card:hover { transform: translateY(-2px); border-color: rgba(255,255,255,0.12); }
Chips & Badges
Status chips: neutral surface + border, colour expressed only in the 4–5px leading dot (Linear-style). Citation chips: neutral surface + teal dot (AI accent). Filter pills. Badge variants for counts and SLA states. Amber = warning/deadline dots only — NEVER on AI/Lexi surfaces.
Recipe — Status Chip (Sage/Ready)
.chip { font-family: var(--ox-font-mono); font-size: 10px; letter-spacing: 0.09em; text-transform: uppercase; border-radius: var(--ox-radius-sm); /* 4px */ box-shadow: inset 0 1px 0 rgba(255,255,255,0.08), 0 1px 2px rgba(0,0,0,0.25); } .chip::before { content: ''; width: 5px; height: 5px; border-radius: 50%; } .chip-ready { background: linear-gradient(180deg, oklch(0.60 0.10 150deg / 0.20), oklch(0.60 0.10 150deg / 0.12)); color: oklch(0.80 0.09 150deg); border: 1px solid oklch(0.60 0.10 150deg / 0.35); } .chip-ready::before { background: oklch(0.75 0.09 150deg); box-shadow: 0 0 4px oklch(0.75 0.09 150deg / 0.60); /* subtle glow */ }
Icon System
Lucide at stroke-width 1.5. Defined once as SVG symbols, referenced via <use href="#id">. NEVER display:none on the symbol container. Standard sizes: 16px inline, 18px in icon boxes, 20px in nav. Icon containers in list/stat rows: monochrome (.icon-box-mono). Severity lives in the row's dot chip, never in icon colour.
Recipe — Symbol definition (never display:none)
<!-- Define ONCE near top of <body> — width=0 height=0 style="position:absolute" --> <svg width="0" height="0" style="position:absolute"> <symbol id="ic-home" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"> <!-- paths --> </symbol> </svg> <!-- Reference anywhere: --> <svg width="18" height="18"><use href="#ic-home"/></svg> /* Color via semantic token ONLY (never hardcoded hex): */ color: var(--ox-fg-muted); /* idle */ color: var(--ox-fg-primary); /* active */ color: var(--ox-amber-500); /* warning / deadline dots only — NOT AI/Lexi */
Lexi / AI Grammar
Neutral grammar — 2026-06-11. Lexi is represented by the Outlex gradient mark, not sparkles. AI card = neutral elevated card (no amber tint, no coloured border). Confidence bar: solid sage, 2px. Citation chips: neutral + teal dot. Body text: fw600 in fg-primary. Anatomy fully annotated.
Recipe — Lexi Bubble + confidence bar (neutral grammar)
.lexi-bubble { 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 — NO amber spine */ border-radius: 4px 14px 14px 4px; line-height: 1.75; /* No pulse animation */ } .lexi-bubble strong { font-weight: 600; color: var(--ox-fg-primary); } /* Confidence bar: solid sage, 2px */ .confidence-bar-track { height: 2px; background: rgba(255,255,255,0.08); } .confidence-bar-fill { background: var(--ox-sage-500); /* solid — no amber gradient */ transition: width 0.4s var(--ox-ease); } /* Citation chip: neutral + teal dot */ .citation-chip::before { width: 4px; height: 4px; border-radius: 50%; background: rgba(84,214,164,0.70); /* #54D6A4 teal at 70% */ }
Tables
Legal Hub document rows. Mono column headers in uppercase. Hairline dividers. Hover reveals row actions. Date + document type in monospace. Group headers for clustering.
| Documento | Tipo | Ref. / Origem | Data | Estado | ||
|---|---|---|---|---|---|---|
| Contratos de subcontratante 4 | ||||||
|
Contrato TI Subcontratante — AWS EMEA
|
DPA | AWS-DPA-PT-2024-003 | 12 Mar 2024 | Conforme |
|
|
|
Acordo de Processamento de Dados — Salesforce
|
DPA | SFC-EU-2023-087 | 7 Nov 2023 | Em revisão |
|
|
|
Contrato Subcontratante — Infraestrutura Cloud PT
|
DPA | INFRA-PT-2024-012 | 3 Jun 2024 | Urgente |
|
|
| Jurisprudência 2 | ||||||
|
Acórdão STJ — Proc. 4521/18.0T8PNF.P1.S1
|
Acórdão | 0006497.15.1TVPRT | 12 Mar 2024 | Indexado |
|
|
Recipe — Document Row
.doc-row { cursor: pointer; border-bottom: 1px solid var(--ox-border-subtle); /* hairline divider */ transition: background var(--ox-enter) var(--ox-ease); } .doc-row:hover { background: var(--ox-surface-1); } /* Actions reveal on hover */ .doc-actions { opacity: 0; transition: opacity var(--ox-enter); } .doc-row:hover .doc-actions { opacity: 1; } /* Column header — mono, caps, muted */ .doc-table thead th { font-family: var(--ox-font-mono); font-size: 10px; letter-spacing: 0.09em; text-transform: uppercase; color: var(--ox-fg-muted); }
Empty States
Outlex mark as aperture backdrop (radial glow, 8–12% opacity). Display type + muted description + CTA. Mark appears in 3–4 sanctioned moments per screen.
Importe contratos, regulamentos ou jurisprudência para começar a trabalhar com a Lexi.
Não encontrámos documentos para "Art. 28 responsável". Tente outra pesquisa ou ajuste os filtros.
Toasts & Banners
Four semantic variants: warning (SLA), error, success, info. Floating cards with 4-layer shadow. SLA timer banner for lawyer notifications. All states live.
Command Palette
The glow moment. Triggered by ⌘K. Radial blue glow in box-shadow on dark. Static demo showing the anatomy: search row, grouped results, selected state, footer shortcuts.
Recipe — Command palette glow (dark)
.cmd-palette { background: linear-gradient(180deg, oklch(0.21 0.012 270), oklch(0.17 0.012 270)); border: 1px solid rgba(255,255,255,0.12); border-radius: var(--ox-radius-xl); /* 14px */ box-shadow: inset 0 1px 0 rgba(255,255,255,0.10), 0 4px 16px rgba(0,0,0,0.50), 0 20px 60px rgba(0,0,0,0.40), 0 0 80px oklch(0.57 0.15 270deg / 0.12); /* blue glow moment */ }
Token Reference
Quick reference for the most commonly used --ox-* tokens. Both themes shown. See tokens-v2.css for the full 11-step ramps and motion tokens.
CTA / success
warning / deadline dots only
Info / link
Danger
| Wrong | Correct |
|---|---|
| display: none on 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 Newsreader | max font-weight: 600 (--ox-weight-semibold) |
| background: black | var(--ox-surface-0) / var(--ox-fg-primary) |
| Amber as a loud fill | Amber for hairlines, dots, labels only |
| #ic-sparkles on AI / Lexi affordances | #ic-lexi (monochrome mark) on buttons · #outlex-mark (gradient) on avatars/labels |
| stroke-width="2" on Lucide | always stroke-width="1.5" |
Do / Don't
Five live-rendered side-by-side pairs. The DON'T panel has a terracotta ✗ corner tag.
Reviewed the NDA — key points: liability cap at €500k, 3-year term.
Elevated card — inset highlight + 3 shadow layers
color: var(--ox-fg-primary);
border: 1px solid var(--ox-border);