Interaction
All buttons use pill border-radius (999px) and DM Sans Medium (500). Height: SM=34px, Default=44px, LG=54px. Active state scales to 97%. Focus shows Wasatch ring.
Variants Component
Use buildBtn() via .bsn-btn-mount for data-driven or programmatically generated buttons. Direct <button class="btn btn-*"> HTML is still fine for static prototypes.
Light surface variants
Dark surface variants — use btn-primary-dark on Alpine backgrounds
buildBtn() — declarative API
Rendered via buildBtn() — each is a .bsn-btn-mount with data-bsn-btn JSON
Sizes
States
Light surface · .btn-primary (Alpine)
Dark surface · .btn-primary-dark (BSI Yellow — 9.33:1 on Alpine ✓)
CRO Button Component
Add .btn-cro to any button to switch from pill radius (--radius-pill 999px) to rounded-rect (--radius-input 8px). Used exclusively for conversion CTAs on Marketplace product cards and group cards — "Start free trial", "Purchase", "Request pack", "Renew", "Add to account". All variants, sizes, and states are identical to the standard button system.
Light surface variants + .btn-cro
Dark surface + .btn-cro
--radius-input (8px) · All other tokens, hover states, focus ring, active scale, and disabled opacity identical to .btn · Modifier only — always combine with a variant class (.btn-primary, .btn-outline, etc.) · Scope: Marketplace product cards and group cards only. Never use on platform UI buttons (nav, modals, toolbars, forms)..btn-primary = --color-alpine bg + --color-salt text · Hover=#1a302c · Secondary/Outline=transparent + Alpine border · Dark surface: .btn-primary-dark = --color-bsi-yellow bg + --color-carbon text (9.33:1 on Alpine = AAA ✓) — only use on Alpine or dark backgrounds · Danger=--color-canyonlands bg · Radius=--radius-pill (standard) / --radius-input (CRO)