Design registry · v0.2 · 56 items

Decided once.
Built to survive the tails.

Tokens, primitives, composites, and whole surfaces for every Fat Tailed Solutions product — one vocabulary for humans and agents, light and dark from a single source, quality checked by script.

npx shadcn@latest add @fts/theme @fts/utils @fts/rules
See the blocks
Less, but better
Every variant earns its place. One primary action per view.
Decided once
Colors, formats, confirmations — one source, zero re-litigating.
Status always visible
Loading, empty, and error are designed in, never bolted on.
Built for delegation
Rules ship with the code so agents build like seniors.
Layer 0

Foundations

An OKLCH token system derived from the FTS mark — semantic aliases over primitive ramps, so components never name a color, and both themes fall out of one file.

tokens · semanticthe only vocabulary components speak
canvas
surface
surface-2
sidebar
input
hover
border
border-strong
divider
track
ink
muted
faint
primary
accent
link
ring
sel
tokens · statussix tones encode all state — nothing else does
In portfolioDraftSettledDegradedBreachedRebalancing
Fund IIBacktestLivePaperHaltedHedgev0.2
type & numeralssystem stack, tabular numbers for data
Tail risk, priced daily

Body text is quiet and unhurried. Emphasis comes from weight and ink, not color.

1,2842.4M+2.34%−0.87%
radius & elevationone dial for corners; borders separate, shadows season
sm
md
lg
xl
xs
sm
md
overlay
motiona small grammar: fade, pop, slide — never decoration
fade-in · 140ms
pop-in · 150ms
toast-in · 180ms
Enters decelerate, exits accelerate, nothing exceeds 240ms — and all of it collapses under prefers-reduced-motion.
Layer 1

Primitives

The vocabulary — boring on purpose. Radix underneath wherever behavior is hard; FTS tokens and one focus-ring language throughout.

buttonfive variants; loading holds width
input · textarea · fieldField wires the aria so you can't forget

Visible to the whole desk.

select · checkbox · radio · switchevery form control, one focus language
dialog · confirmrecovery designed in; irreversible means typed
dropdown · popover · sheetmenus for actions, popovers for detail, sheets for side work
toast · alerttoast for background results; alert for notices in place
Quarterly roll window opens Monday
tabs · breadcrumbsone tab style; a where-am-I trail
Underline tabs — the only tab treatment in the system.
avatar · progress · spinner · skeletonpeople and time, quietly
pricing…
table · kbdthe plain primitives DataTable is built on
ScenarioP&L
−3σ equity gap+$8.4M
Vol crush−$0.6M
Command menu ⌘K · Save ⌘S · Escape Esc
Layer 2

Composites

The money layer: recurring combinations with the opinions baked in, so nobody re-decides them per app. This is where coherence is actually enforced.

page-header · toolbarevery screen opens the same way
Portfolio

Tail Fund II

Convexity-first hedging program, 85bps annual premium budget.

4 filters
metric-carddirection moves the arrow; sentiment picks the color
Tail budget used
61bps
+4bps
Max drawdown
−4.2%
−1.1pt
P(L > 3σ)
0.9%
vs 2.4% unhedged
Hedge P&L
+$2.1M
+18.2%

A falling drawdown is good news — the type system lets you say so.

data-tableloading, empty, and error designed in — click the states
Tail hedge positions
InstrumentNotionalConvexityStatus
SPX 3600P DEC26
Left-tail hedge · S&P 500
$4.2M
0.94
Active
CL 55P JUN27
Convex overlay · crude
$1.8M
0.81
Rolling
VIX 40C MAR27
Vol spike convexity
$950K
0.77
Review
EEM 28P SEP26
EM drawdown protection
$640K
0.52
Breached
empty-state · description-listzero states that say what will appear

No scenarios yet

Run a backtest and its scenario grid will appear here.

Mandate
Left-tail hedge, global equity
Inception
Jan 12, 2024
Custodian
Northern Trust
command-menu · copy-buttonthe keyboard layer

Press ⌘K anywhere on this page — the menu that opens is this component, navigating this page.

npx shadcn@latest add @fts/command-menu
Layer 3

Blocks

Whole surfaces, assembled from the layers below — install one, own the code, wire your data. Each frame here is the real component running live.

app-shell
⌘K
Feeds live

Positions

Every open hedge across the program.

Open positions
24
Notional
$7.6M
+$1.2M
Avg convexity
0.81
Breaches
1
+1
Open positions
InstrumentNotionalConvexityStatus
SPX 3600P DEC26
Left-tail hedge · S&P 500
$4.2M
0.94
Active
CL 55P JUN27
Convex overlay · crude
$1.8M
0.81
Rolling
VIX 40C MAR27
Vol spike convexity
$950K
0.77
Review
EEM 28P SEP26
EM drawdown protection
$640K
0.52
Breached
dashboard-page
Desk

Morning overview

As of 06:30 ET.

NAV
$412M
+0.4%
VaR (99%)
$3.1M
−8%
Recent activity

Fills and rolls, latest first.

Rolled CL 55P → JUN27Roll2m ago
Filled SPX 3600P ×120Done18m ago
EEM 28P breach flaggedAlert1h ago
settings-page

Desk settings

Applies to everyone on tail-fund-2.

Alerts

When the desk gets paged.

Page on any limit breach.

Morning summary at 06:30 ET.

Escalation

Who gets the second page.

detail-page
Position

SPX 3600P DEC26

Active

Left-tail hedge on S&P 500, December 2026 expiry.

Notional
$4.2M
Entry
Feb 3, 2026 · 41.20 vol
Convexity
0.94
Delta
−0.18
Vega
+41.2K
Stress (−3σ)
+$8.4M
auth-page
Sign in to the desk

Welcome back. Enter your details to continue.

No account? Ask your desk lead.

error-page
404

Page not found

The page you’re looking for doesn’t exist or has moved. Check the address, or head back.

Go home
Contact support
Index

The full catalog

Every installable item, straight from registry.json — the manifest and this page can't drift apart.

Foundation

4 items
FTS Theme Tokens
@fts/theme

The token source of truth: OKLCH color system (light + dark), elevation, motion, radius, and the Tailwind v4 @theme mapping. Import once; everything else references it.

FTS Design Rules
@fts/rules

The design constitution as an installable file. Reference it from CLAUDE.md / AGENTS.md so every human and agent session builds to the same rules.

cn() utility
@fts/utils

Class-name merge helper (clsx + tailwind-merge).

Formatters
@fts/format

Numbers, currency, percentages, deltas, dates, relative time, and bytes — formatted one way, everywhere. Intl-based, zero dependencies.

Hooks

3 items
useBreakpoint
@fts/use-breakpoint

SSR-safe media-query hook keyed to the Tailwind breakpoints.

useMounted
@fts/use-mounted

True after first client render; avoids hydration mismatches.

useHotkey
@fts/use-hotkey

Global keyboard shortcut binding ("mod+k"). Ignores plain keys while typing; mod-combos always fire.

Primitives

29 items
Spinner
@fts/spinner

Indeterminate activity indicator for in-place work. Page and section loads should use Skeleton instead.

Button
@fts/button

The action primitive: five variants, five sizes, asChild slot, and a width-stable loading state.

Input
@fts/input

Text input with focus ring, token styling, and aria-invalid error styling. Wrap in Field for label + error wiring.

Textarea
@fts/textarea

Multi-line input that grows with content, capped at a sane height.

Label
@fts/label

Accessible form label (Radix).

Checkbox
@fts/checkbox

Checkbox with checked and indeterminate states (Radix).

RadioGroup
@fts/radio-group

Pick one of a few visible options (Radix). More than five options wants a Select.

Switch
@fts/switch

On/off toggle for settings that apply immediately (Radix).

Select
@fts/select

Dropdown selection styled like Input, with groups, labels, and keyboard support (Radix).

Tabs
@fts/tabs

Underline-style tabs — the one tab treatment used everywhere (Radix).

Badge
@fts/badge

Small label token with the full semantic tone set (brand, neutral, success, warning, danger, info) and an optional dot.

Card
@fts/card

Surface container with Header/Title/Description/Content/Footer.

Separator
@fts/separator

Hairline divider (Radix).

Kbd
@fts/kbd

Keyboard shortcut hint.

Skeleton
@fts/skeleton

Loading placeholder; respects reduced motion.

Avatar
@fts/avatar

Image avatar with automatic initials fallback. One style, three sizes (Radix).

Progress
@fts/progress

Determinate progress bar. Unknown durations want a Spinner (Radix).

Alert
@fts/alert

Inline callout with semantic tones and correct live-region roles: info/success announce, warning/danger interrupt.

Table
@fts/table

Plain table primitives — the single source of the FTS table look. DataTable builds on these.

Breadcrumbs
@fts/breadcrumb

Where-am-I trail; the last item is the current page.

Tooltip
@fts/tooltip

Inverted-surface tooltip for labeling icon-only controls. Never hides essential information (Radix).

Popover
@fts/popover

Anchored floating panel for filters, pickers, and small forms (Radix).

DropdownMenu
@fts/dropdown-menu

Action menu with checkbox/radio items, submenus, shortcuts, and a danger treatment for destructive items (Radix).

Dialog
@fts/dialog

Modal dialog with scrim, pop-in motion, and scroll containment (Radix).

AlertDialog
@fts/alert-dialog

Interruptive confirmation: no X, no outside-click dismiss — the user must choose. Prefer the ConfirmDialog composite (Radix).

Sheet
@fts/sheet

Edge-anchored drawer for nav, filters, and side detail. Four sides, slide motion (Radix Dialog).

Toast
@fts/toast

toast() function + Toaster viewport. At most three on screen, calm durations, swipe to dismiss, action support (Radix).

ThemeProvider
@fts/theme-provider

Light/dark/system theme context with a pre-hydration ThemeScript (no flash), cross-tab sync, and OS following. No dependencies.

ThemeToggle
@fts/theme-toggle

Light/dark switch button. Requires ThemeProvider.

Composites

13 items
Field
@fts/field

Labelled form row that wires id, aria-describedby, and aria-invalid onto its child control automatically.

StatusPill
@fts/status-pill

The one way status is shown: dot + semantic tone, decided once for every FTS app.

MetricCard
@fts/metric-card

KPI panel with value and delta. Direction moves the arrow, sentiment picks the color — a falling drawdown can be good news. Compose in MetricStrip.

PageHeader
@fts/page-header

Title + description + actions header. Enforces the FTS opening rhythm.

EmptyState
@fts/empty-state

Centered zero/empty state with icon, copy that says what will appear, and an optional action.

SearchInput
@fts/search-input

Input with a leading search glyph and optional shortcut hint.

DataTable
@fts/data-table

Presentational table with built-in loading / error / empty states and keyboard-operable rows. Built on the Table primitives; never fetches.

Toolbar
@fts/toolbar

Row of controls above content, with Spacer and Separator helpers.

DescriptionList
@fts/description-list

Key–value detail rows for entity attributes and metadata; responsive term/detail layout.

Pagination
@fts/pagination

Numbered pagination with previous/next; collapses to ellipses past seven pages. You own the page state.

CopyButton
@fts/copy-button

Copy-to-clipboard with visible check confirmation, announced to screen readers.

ConfirmDialog
@fts/confirm-dialog

The one way consequential actions are confirmed: destructive tone, async progress, and typed confirmation for irreversible operations.

CommandMenu
@fts/command-menu

⌘K command menu (cmdk): every important action reachable from the keyboard. Data-driven groups with icons and shortcut hints.

Blocks

7 items
App Shell
@fts/app-shell

Two-column app layout: sidebar with sectioned nav and badges, sticky topbar, and a mobile drawer so navigation never disappears on small screens.

Search Results View
@fts/search-results-view

Flagship surface: search bar, optional filter row, KPI strip, and a results table with relevance bars and status pills.

Auth Page
@fts/auth-page

Centered sign-in surface with error and pending states wired: Card + Field + Input + Button.

Dashboard Page
@fts/dashboard-page

Overview surface: header, KPI strip, and a section grid (DashboardSection) for tables, lists, and activity.

Settings Page
@fts/settings-page

Settings surface: narrow column, left-rail section titles, one control per row (SettingsSection + SettingsRow).

Detail Page
@fts/detail-page

Single-entity surface: breadcrumbs, identity header with status, key facts, and tabbed detail.

Error Page
@fts/error-page

Full-page 404/500 that leads with the way out: retry, go home, or reach support. Never a dead end.