Specimen
A measured argument for fewer animations.
Motion has a cost. The question is whether it earns its keep.
Sample copy.
aiux
Tokens, primitives, and conventions used across aiux.
Six token scales plus a z-index stack. Defined in globals.css, exposed as Tailwind utilities.
Semantic CSS variables. Light/dark resolves at runtime. WCAG AA contrast on every paired token.
background-primary
background-secondary
surface-primary
surface-elevated
text-primary
text-secondary
text-tertiary
accent-primary
border-success
border-warning
border-error
border-info
.bg-grain
Every hero
.bg-hero-mesh
Homepage only
Satoshi, self-hosted. Seven steps. Each token bundles size, weight, leading, and tracking.
Specimen
Motion has a cost. The question is whether it earns its keep.
Sample copy.
.type-display56px8001.05-0.03em.type-h140px7001.15-0.025em.type-h232px7001.2-0.02em.type-h324px6001.3-0.015em.type-body16px4001.6-0.005em.type-caption14px5001.50.type-eyebrow12px6001.40.08emFive semantic aliases over Tailwind's scale.
tight8pxsnug12pxdefault16pxloose24pxroomy32pxNamed by role, not size.
.rounded-input
Pattern
Confidence visualization
.rounded-card
Unlock 3 more audits
Enter your email to continue.
.rounded-modal
.rounded-pill
Six shadows. Light and dark variants.
.shadow-flatDisabled, dense lists
.shadow-cardCard resting
.shadow-card-hoverCard hover
.shadow-elevatedCallouts
.shadow-modalDialogs
.shadow-popoverTooltips, menus
Seven layers. No raw z-50 in new code.
.z-base0Default flow.z-dropdown10Menus, comboboxes.z-sticky20Sticky headers and CTAs.z-overlay30Backdrop dimmers.z-modal40Dialog content.z-toast50Transient notifications.z-tooltip60Hover tooltips (always topmost)Four durations, three easings. Default: ease-out-expo.
snap100msToggles, taps
quick180msHover, focus
base280msModals, accordions
deliberate450msPage transitions
Most reused composition. Shared chrome: rounded-card, border, bg-surface-primary, padding from the spacing scale.
Pattern
Show users how certain the model is about each output, not just the output itself. Pair a probability with a plain-language qualifier so non-technical readers can act on it.
Prompt
Inline action — copy / submit
Adaptive interfaces
12Surfaces that reshape themselves based on user signal.
Dense — list cell
Self-hosted SVGs. Navy filter. CSS-only marquee at 100s for peripheral motion.
company-logos.tsCompanyLogoCarouselTimeline of newsletter issues on /news. Today's row gets a tinted surface and a status pill.
Three stories about how designers need to rethink interfaces when AI agents have real autonomy, from trading stocks to scheduling.
9 min readAs AI agents handle longer tasks, design systems need memory, prototypes need authenticity, and designers need a new vocabulary.
9 min readGoogle launches a real-time AI design tool, Notion opens its workspace to native agents, and Replit ships parallel coding.
8 min readEmail + submit pair, used across the audit unlock, newsletter signups, pattern pages, and guides. Same primitives, three densities.
Inline · default
Stacked · audit unlock
Drop your email. We'll send the report and unlock 3 more runs.
Compact · footer / sidebar
Shared component: InlineNewsletterSignup. Variant hero / inline / stacked, plus darkBackground and secondary flags.
Button, Dialog, and Input live in src/components/ui/. Supporting hooks: useScrollLock, useClickOutside, useFocusTrap.
Button
Dialog
Backdrop click, Escape, and the Cancel button all close. Focus is trapped inside and returned to the trigger.
Input
With a description below.
Email must include an @
size='sm' for dense surfaces
WCAG 2.2 AA contrast on every paired token.
Keyboard navigation on every interactive surface. No bare focus removal.
Focus rings via --ring-focus. Dark-mode aware.
next/font handles swap with adjustFontFallback. No layout reflow.
Required alt text on images. Empty alt only for decorative.
Each tied to a specific production incident.
No CDN dependencies. Fonts and logos served from our domain.
Hotjar recording · Feb 2026
Hardcoded dimensions on every img, SVG, and video. Survives a missing stylesheet.
CLS spike · Apr 2026
Size-adjusted fallback matches Satoshi's metrics. No reflow on font swap.
Font CLS fix · Apr 2026
Re-throw on DB error, runtime guard against empty renders, live-page watchdog.
/news ISR cache · May 2026
Run npm run design-audit:report for the live counts.
1,169 raw Tailwind color uses
Mostly in pattern demo components and SkeletonLoader. New uses are blocked at commit.
62 raw z-index values
z-10 through z-50 scattered across modals and sticky bars. Migrating to z-modal / z-sticky / z-overlay.
69 arbitrary font sizes
text-[14px], text-[18px], etc. Should use the type-* utilities.
108 light-only colors without dark variants
bg-white / text-black without dark: counterparts.
Migrate 5 modals to the Dialog primitive
Primitive is shipped — PaywallModal, WelcomeModal, EmailReportModal, DownloadPDFModal, SearchModal still inline their own backdrop and focus logic.
Migrate 4 search inputs to the Input primitive
Primitive is shipped — SearchBar, UnifiedSearchBar, AdvancedSearchBar, SmartSearchChat still diverge on keyboard behavior.
9 card variants → Card
Shared chrome, isolated implementations.
No Storybook
This page is the reference instead.
No automated a11y in CI
axe-core in Playwright pending.