Internal QA/reference page for the canonical LAGO button primitive. Every example uses the real production Button component. Not linked from any product navigation.
DS-001 Lago Button System is the canonical shared button primitive. One component, two layers: canonical DS-001 variants (12px radius, shadow-free, LAGO tokens) and legacy compatibility variants (unchanged from pre-DS-001 shadcn).
DS-001 — Lago Button System
Status: Implemented in production
src/components/ui/button.jsx — no second button component.
Small 32px · Medium 40px (default) · Large 48px · Icon is square at each size
All canonical DS-001 variants and legacy compatibility variants. Canonical variants carry 12px radius and shadow-free treatment; legacy variants retain their original geometry.
Preserved unchanged for existing consumers. Note the 8px radius (rounded-md) and shadow on some.
Small (h-8), Medium (h-10, default), Large (h-12). Icon scales with size.
Icon integration (DS-002 Lucide), the canonical loading spinner, and the disabled treatment — all using the real production Button behavior.
variant='icon' is square at every size with zero padding. Pass aria-label when no visible text is present.
Full variant colour preserved — no muting, no layout shift. Spinner + aria-busy + native disabled.
Click any button to see the canonical loading spinner for 2 seconds.
Distinct muted treatment (bg-muted text-muted-foreground), not just opacity.
Full-width usage, keyboard/focus behavior, and the DS-001 dependency/reference notes.
w-full makes the button fill its container — useful for mobile CTAs and modal footers.
Multiple buttons wrap naturally on narrow screens. The primary action stays dominant.
Tab through the buttons above to see the canonical focus ring.
Primitive: src/components/ui/button.jsx
Typography: Montserrat, sentence case — Test C approved: Compact 13/18/500 · Medium 14/20/500 · Large 14/20/500 (see Typography Calibration section; production primitive still renders 600 pending calibration)
Geometry: 12px radius (canonical, currently in production — pending calibration), 1px border (outline), 8px icon/text gap (pending calibration)
Colour tokens: --lago-button-* aliases (no new hex)
Iconography: DS-002 Lucide, 16px (sm) / 20px (md, lg)
lago-prefixed keys where they collide with legacy names (ghost, destructive, secondary). Non-colliding concepts use direct keys (primary, navy, tealOutline, icon).The button typography direction has been approved as Typography Test C. This section documents the approved values and separates them from the still-pending button visual calibration. The production Button implementation is not modified here.
| Size | Font size | Line height | Weight | Token |
|---|---|---|---|---|
| Compact | 13px | 18px | 500 | lago-type-button-compact |
| Medium | 14px | 20px | 500 | lago-type-button |
| Large | 14px | 20px | 500 | lago-type-button-large |
src/index.css andtailwind.config.js.The real production Button is shown below. It currently renders weight 600 (font-semibold). The approved Test C target is weight 500. The visual difference is documented here; the primitive is NOT changed in this reconciliation step.
Test C resolves typography only. The following visual properties remain unresolved and will be evaluated in the upcoming button calibration step.
The approved Test C + Candidate B calibration is now implemented in the production Button primitive via compoundVariants. This harness remains the internal visual QA/reference page, showing the selected candidate beside the prior production rendering for regression checking.
Typography — Test C
Small 13/18/500 · Medium 14/20/500 · Large 14/20/500
Geometry — Candidate B
Small 6px · Medium 8px · Large 10px radius
src/components/ui/button.jsx via compoundVariants. This page remains the internal visual QA/reference. The specimens below show the selected candidate beside the prior production rendering for regression checking.Candidate B (6 / 8 / 10px) is selected. Shown beside current production (12 / 12 / 12px). Candidate classes override the production rounded-lg via className; the primitive is unchanged.
Typography 13/18/500 · 14/20/500 · 14/20/500 · Radius 6 / 8 / 10px
Typography 14/20/600 · Radius 12 / 12 / 12px
Test C (weight 500) is selected. Shown beside current production (weight 600). Weight override is applied via className; the primitive is unchanged.
Typography 13/18/500 · 14/20/500 · 14/20/500 · Radius 6 / 8 / 10px
Typography 14/20/600 · Radius 12 / 12 / 12px
font-medium (500) and explicit text-[13px] leading-[18px] for Small. Medium and Large keep the production text-sm leading-5 (14/20) with weight 500.The selected candidate beside current production across all content configurations. The centering correction is verified below — no arbitrary offsets are introduced.
Test C + Candidate B — SELECTED
Current production
Test C + Candidate B — SELECTED
Current production
Test C + Candidate B — SELECTED
Current production
The production Button uses flex-based centering (items-center justify-center gap-2). The selected candidate inherits this exactly — no arbitrary offsets are added.
items-center, justify-center, gap-2, or [&_svg]:shrink-0 — so centering is preserved exactly as production.The selected candidate beside current production as full rows. Weight and radius interact; evaluate the combined visual effect.
Typography 13/18/500 · 14/20/500 · 14/20/500 · Radius 6 / 8 / 10px
Typography 14/20/600 · Radius 12 / 12 / 12px
The selected candidate inside realistic LAGO component contexts, with current production beside it. Production components (LagoPageHeader, LagoContentCard) are used as-is and not modified.
LagoPageHeader primary + secondary actions. Selected candidate first, then current production.
SELECTED — Test C + Candidate B
Manage your published and draft experiences.
Current production
Manage your published and draft experiences.
LagoContentCard with footer actions. Selected candidate first, then current production.
SELECTED
Current production
A typical form footer with cancel + submit.
SELECTED
Form fields would appear here.
Current production
Form fields would appear here.
A representative modal footer with dismiss + confirm.
SELECTED
Delete experience?
This action cannot be undone.
Current production
Delete experience?
This action cannot be undone.
A representative table row with row actions.
SELECTED
| Experience | Status | Actions |
|---|---|---|
| Sunset Pontoon Cruise | Published | |
| Fishing Charter — Half Day | Draft |
Current production
| Experience | Status | Actions |
|---|---|---|
| Sunset Pontoon Cruise | Published | |
| Fishing Charter — Half Day | Draft |
Desktop, tablet, and mobile examples plus preserved accessibility states. Selected candidate first, then current production.
Buttons at natural width in a wide container.
SELECTED
Current production
Simulated tablet width (max-w-md).
SELECTED
Current production
Simulated mobile width (max-w-sm) with full-width primary CTA.
SELECTED
Current production
Tab through to see the teal focus ring (ring-2 ring-ring ring-offset-2).
SELECTED
Current production
Keyboard: Tab to focus, Enter/Space to activate.
Native disabled + pointer-events-none. Not clickable, not focusable.
SELECTED
Current production
aria-busy + native disabled. Blocks duplicate submission.
SELECTED
Current production
Icon-only buttons require an aria-label (consumer responsibility).
SELECTED
Current production