norns-ui
Every component in@human-synthesis/norns-uiwith its variants. Toggle the theme to verify dark-mode contrast.
Typography
Bare HTML elements pick up the library defaults. No wrapper components needed.
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Body paragraph. The lazy dog jumps over the quick brown fox, then thinks better of it and curls up by the fire. Defaultline-height, defaultfont-family, default contrast role tokens.
Muted paragraph using.text-fg-mutedutility — for secondary copy.
Inlinecode, a pre block, and a⌘ Kkeyboard hint.
const norns = {
framework: 'svelte+kit',
language: 'civet',
template: 'pug'
}“Programs must be written for people to read, and only incidentally for machines to execute.”
Colors
Five oklch scales (50–950) forprimary,success,warning,danger,info. Use asbg-<name>-<step>,text-<name>-<step>,border-<name>-<step>.
Role tokens
What atoms reference. Swap themes — these are the cells that change.
Icon
Iconify wrapper. Default collection islucide; install + register more viaaddCollection.
Common glyphs
Sizes / tinted
Btn
Variants, sizes, loading state, icon prop, snippet slots. Polymorphic — passhrefto render an<a>instead.
Input / Textarea / Select
Form controls. Field wraps with label, help, error.
this field is required
size='sm'
autocomplete + type
children: option elements
rows=3
Checkbox / Radio / Switch
Native form controls; accent color comes from--color-primary-600.
Card / Surface
Surface primitives. Card has structural header / body / footer slots; Surface is a bare panel. Card is polymorphic — passhrefto render as an<a>.
Header + footer
Body content goes here. Padded by default.
Interactive
Hover me. The border shifts + lift on hover.
Link card
Rendered as<a>viahref— click anywhere on the card.
Unpadded card lets you bleed custom regions to the edge.
Surface
Bare elevated panel — same role tokens, no structural slots.
Surface glass
Same atom withtone="glass"— semi-transparent + backdrop blur.
Banner
Variants, optional icon, optional actions. Inline tinted surface for non-blocking messages.
Badge / Chip
Compact status indicators. Badge is read-only; Chip is interactive (filter, removable).
Badge
Chip
Avatar
Falls back fromsrc→ initials → a lucideuserglyph.
Sizes
Source / fallback
Skeleton / Progress
Loading placeholders + linear / circular determinate / indeterminate bars.
Skeleton
Progress
Tree
Recursive nodes; click to expand or select. Bindexpanded(array of ids) andselected.
Files
Selected
selected: src/lib/cn.js
expanded: ["src","src/lib"]
Breadcrumbs / Pagination
Wayfinding pair — trail of the current location plus paged navigation.
Breadcrumbs
Pagination
Page 4 of 19
Stepper / Accordion
Step-by-step progress paired with collapsible details. Accordion uses native<details>; passmultipleto allow several open at once.
Stepper
- Account
- 2Profile
- 3Preferences
- 4Review
Accordion
Build quality
Lighter than chrome plate, heavier than a Faraday cage.
Sound design
Polyphonic notes layered through ratio-based wave folding.
Controls
Knobs are smooth-detented; macros bind via shift-click.
Carousel
Defaultaspect="video"; passaspect="square"oraspect="wide", or override withclass="aspect-[…]".
16:9 video (default)
Square + autoplay
Header
Site header — brand / nav / actions slots.
HeroBanner
Page-opening banner with title / description / actions slots.align="center"flips to centered.
Build apps you can read in five minutes.
Pug + Civet on top of Svelte 5. Feature folders, DI, valibot.
Centered hero
Same API; align='center'.
Dialog / Sheet
Portal + focus trap + scroll lock + escape, on the shared behaviors module. Sheet covers all four sides; theside="left"variant replaces the oldDrawer.
Popover / Dropdown / Tooltip
Floating overlays — positioned with@floating-ui/dom, portaled to<body>, close on click-outside / Escape.
Tabs
Overview content. Keyboard nav (←/→, Home, End) and aria roles wired.
Toast
Imperative API:toast(msg, opts). Bottom-right region;duration: 0stays until dismissed.
Variants
Duration
DataTable
Styled minimal table — sticky header, optional striping, sortable columns.
| Status | |||
|---|---|---|---|
| Ada Lovelace | Programmer | Analytical | Pioneer |
| Grace Hopper | Compiler | COBOL | Pioneer |
| Donald Knuth | Author | TeX | Active |
| Linus Torvalds | Maintainer | C | Active |
| Anders Hejlsberg | Architect | TypeScript | Active |
DatePicker / DateRangePicker / TimePicker
All three are Popover + a custom Calendar / time grid — no external date library.
DatePicker
DateRangePicker
TimePicker
Autocomplete / MultiSelect / TagsInput
Custom combobox + listbox — arrow keys / Home / End navigate, Enter selects, Esc closes.
Autocomplete
MultiSelect
TagsInput
Press , or Enter to add
NumberInput / OtpField / ColorPicker
Specialised inputs — clamped integers, segmented one-time-passwords, and a hex+swatch combo.
NumberInput
min 0, max 99
OtpField
value: ∅
ColorPicker
Uploader
Drag and drop or click. Multi-file by default.
Toggles / ButtonGroup / Toolbar / Separator
ToggleButton is.btn-secondary[data-pressed]— same visual language as buttons, just with a pressed state.
ToggleButton + ToggleButtonGroup
ButtonGroup + Toolbar
Collapsible / Tooltip (rich)
Collapsible is one section of expand-collapse (use Accordion for many).richswaps Tooltip's compact dark style for a surface-elevated card; ideal for previewing user cards or links.
Collapsible
Show details
Inline expand-collapse for one section. Use Accordion for many.
More info
Each instance is independent.
Tooltip (rich)
Tooltip on a link
ContextMenu / HierarchicalMenu / MegaMenu
Right-click + horizontal nav patterns. Hierarchical opens on hover/focus; ContextMenu anchors to the pointer.
ContextMenu (right-click)
HierarchicalMenu
MegaMenu
ScrollArea
Constrained-height region with native scrollbars. Passhorizontalfor x-axis scroll instead.
Vertical (default)
Horizontal
Timeline
Vertical event list with colored dots — passvariantper item to tint.
- May 2026Phase 1 shipsBtn + atoms + presetUI
- May 2026Phase 2 shipsForms tier + valibot
- May 20260.0.4Theming + icons + display + composite + 27 more
- May 20260.0.6bits-ui dropped; custom behaviors on @floating-ui/dom
Image / Audio / Video
Thin wrappers around the native elements — aspect ratio, loading state, sensible defaults.
Audio
Native<audio>with controls
<video>, mutedAvatarGroup
Overlapping avatars with hover lift; truncates to+Nonce max is reached.
GradientText / AnimatedNumber
GradientText is CSS-only and free.AnimatedNumberlives in the/motionsubpath since it pulls in Motion One.
GradientText
Animated background-position; CSS-only.
AnimatedNumber
CopyButton / ShinyButton / RippleButton / LiquidButton
Decorative button variants. The first three are CSS-only; LiquidButton lives in the/motionsubpath.
Reveal / Sparkles / GradientBackground
All three live in the/motionsubpath. Free to remix; pause onprefers-reduced-motion.
Reveal
Scroll the page — wrappers fade up when entering the viewport.
Sparkles
GradientBackground
Looping color-stop animation. CSS-driven; pauses off-screen via IntersectionObserver.