Tabs
Three skins over one spring. Pill for top-level surface switching, underline for document-like sections, segment for tight either/or controls. The active indicator glides — it never blinks — and inactive panels stay mounted so their content survives for crawlers and assistive tech.
Variants (live)
Click between triggers to see the indicator glide. Each variant shows its active panel below.
Total balance, per-asset rows, 24h change.
Sends, receives and swaps in reverse-chronological order.
Receiving addresses; each rotates after first use.
Status, confirmations, fee and fee rate for this transaction.
2 inputs · 0.102 045 00 BTC total.
Payment + change · 0.102 013 80 BTC total.
Hex-encoded transaction, mono face, copy affordance.
1.417 123 45 BTC
141 712 345 sats
$164,740.60
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@coldharbor/ui";
<Tabs defaultValue="portfolio" variant="pill">
<TabsList>
<TabsTrigger value="portfolio">Portfolio</TabsTrigger>
<TabsTrigger value="activity">Activity</TabsTrigger>
</TabsList>
<TabsContent value="portfolio">…</TabsContent>
<TabsContent value="activity">…</TabsContent>
</Tabs>--ch-primary--ch-primary-fg--ch-surface--ch-border--ch-fg--ch-fg-muted--ch-focus
Trigger states — every variant
Active and inactive are real states (defaultValue picks the active trigger). Hover and focus-visible are forced with static classes on an inactive trigger. Tabs has no per-trigger disabled state — that is reported as a gap, not simulated.
Inactive trigger lifts to full foreground.
<TabsTrigger value="receive">Receive</TabsTrigger>
{/* hover/focus are pointer states — never hard-code them in product code */}--ch-primary--ch-primary-fg--ch-surface--ch-border--ch-fg--ch-fg-muted--ch-focus
Themes
The segment variant — unit switcher — under all three layers.
--ch-primary--ch-primary-fg--ch-surface--ch-border--ch-fg--ch-fg-muted--ch-focus