components/
Components
Around sixty components, all plain Go functions returning h.Node -- from layout primitives to whole page templates. Every one of them is on this page, interactive, in whichever theme you have on.
Forms
Input
input.goTextarea
textarea.goCheckbox
checkbox.goRadio Group
radio-group.goDefault
With Default Selected
Disabled
Invalid
Switch
switch.goSelect
select.goBasic
With Default Value
With Groups
Small Size
With Disabled Items
Disabled
Align End
Native Select
native-select.goDefault
Small
With OptGroup
Disabled
Invalid
Combobox
combobox.goBasic
With Default Value
With Clear Button
With Groups
With Disabled Items
Disabled
Slider
slider.goDefault
Custom Range (0-200, step 10)
Empty (0%)
Full (100%)
Disabled
Input Group
input-group.goWith Icon (inline-start)
With Icon (inline-end)
With Text Prefix
With Text Suffix
Both Sides
With Button
With Button (icon-xs)
With Textarea
Disabled
Invalid
Calendar
calendar.goDefault
With Selected Date
With Form Name
With Min/Max Constraints
Date Picker
date-picker.goBasic
With Selected Date
With Form Name
With Min/Max
With Label
Date + Time
Time Picker
time-picker.go24-Hour (Default)
24-Hour with Value
12-Hour (AM/PM)
12-Hour with Value
With Form Name
With Label
With Seconds (24h)
With Seconds (12h)
Label
label.goField
field.goVertical (Default)
Your full name as it appears on documents.
With Error
Horizontal with Switch
Horizontal with Checkbox + Content
You agree to our Terms of Service and Privacy Policy.
Disabled
FieldSet & FieldGroup
field.goFieldSeparator
field.goor
FieldLegend Variants
field.goLegend (Default)
Label Variant
Overlays
Dialog
dialog.goDrawer
drawer.goDirections
With Form
No Close Button
Popover
popover.goDefault (bottom center)
Top
Left
Right
Align End
With Form Content
Tooltip
tooltip.goSides
With Icon Button
Variants
Dropdown Menu
menu.goBasic
With Checkbox Items
With Radio Items
With Submenu
With Disabled & Groups
Align End
Context Menu
menu.goRow Menu
row-menu.goA context menu whose trigger is the whole row: right-click with a mouse, press and hold with a finger. The phone list keeps one tap target per row.
Command
command.goInline command palette and dialog variant (Cmd+K / Ctrl+K).
Press ⌘K to open the command palette.
Carousel
carousel.goDefault (Horizontal)
With Dots
With Counter
Vertical
With Cards
Multiple Items (3 per view)
Feedback
Alert
alert.goDefault
Destructive
With Icon
Destructive with Icon
With Action
Toast
toast.goTypes
With Title
Persistent
Loading
Progress
progress.goDefault
With Label & Value
Empty (0%)
Complete (100%)
Partial
Indeterminate
Indeterminate (bare)
Loader
loader.goSkeleton
skeleton.goDefault
Circle
Card Placeholder
Charts
chart.goLayout
Stack
layout.goCluster
layout.goSwitcher
layout.goBelow 24rem of container every item stacks at once -- never two over one.
Grid
layout.goSidebarLayout
layout.goCenter
layout.goCapped at the measure (60ch) and centred. Every Layout's axiom: a line of reading text should stay near sixty characters, whatever the screen, because a longer one loses the eye on the way back to the next line.
Page templates
page.goPageHeader, Stat and four screen shapes assembled from the primitives above. Each opens as a whole page.
Search
ResultsHeader
search.go2 invoices for “acme”
Every chip and sort option is a link to the same page with one parameter changed, so the URL is the state. Try them -- they open the live List template.
FilterBar
search.goFilterChip
search.goThe whole chip removes the filter; a zero-count facet option is shown but not offered.
NoResults
empty.goTable empty
table.go| Invoice | Customer | Amount |
|---|---|---|
No results for “INV-9” Check the spelling, or remove a filter to widen the search. | ||
Content
Typography
typography.goH1
Taxing Laughter: The Joke Tax Chronicles
H2
The People of the Kingdom
H3
The Joke Tax
H4
People stopped telling jokes
Paragraph
The king, seeing how much happier his subjects were, realized the error of his ways and repealed the joke tax.
Blockquote
"After all," he said, "everyone enjoys a good joke, so it's only fair that they should pay for the privilege."
Table
| King's Treasury | People's happiness |
|---|---|
| Empty | Overflowing |
| Modest | Satisfied |
| Full | Ecstatic |
List
- 1st level of puns: 5 gold coins
- 2nd level of jokes: 10 gold coins
- 3rd level of one-liners : 20 gold coins
Inline Code
@radix-ui/react-alert-dialog
Lead
A modal dialog that interrupts the user with important content and expects a response.
Large
Small
Email addressMuted
Enter your email address.
Badge
badge.goAvatar
avatar.goSizes
With Fallback
With Badge
Group
Group (Small)
Group (Large)
Icon
icon.goAny Phosphor name, lit by the page's one light source
The whole set, and why closed glyphs are lit while arrows stay flat, is on the Design page.
Kbd
kbd.goSingle Keys
Key Combinations (KbdGroup)
Inside Tooltip
Empty
empty.goChrome
Dark Mode
dark-mode.goThe toggle is in the bar at the top of this page -- flip it and watch every card here follow, with no second stylesheet and no per-component dark variant.
Why nothing flashes on reload
The choice is written to localStorage and re-applied by the inline script in base.go before first paint, so the page never renders in the wrong theme first.
One instance per page
The switch keys off id="dark-toggle", so a page renders exactly one -- which is why this card describes it instead of showing a second copy.
ThemeChoice
The settings-page form: System stores nothing and follows the OS live. Every control paints from the same stored value, so this and the bar's switch move together.
Sound Settings
sound-settings.goControls the audio cues every component plays. Stored per browser and honoured by the shared audio utility.
Installed App
pwa.goInstalled to a home screen the app has no browser chrome, so it brings its own: StandaloneReload is a menu row that only appears there (the AppShell account menu carries it), and a swipe in from the left edge goes back.
Why it is invisible here
base.js marks html[data-standalone] before first paint when the display mode is standalone. In a browser tab the chrome already has both controls, so neither is drawn.
Nav Skeleton
nav-skeleton.goA page change changes the screen on the press: the destination's template -- the real page's classes with Skeleton blocks where the words go -- is cloned into #main-content, and the answer replaces it by id. Routes without a template navigate as they always did.
See it
Open the AppShell demo and press a conversation: the chat skeleton paints before the answer lands. Pass templates through AppShellProps.Skeletons.
Page Shell
base.goBase is the whole document: head, both bundles, the icon gradient, the skip link, and the footer. Every full page render goes through it; a fragment render never does.
What it inlines rather than fetches
base.csstokens and resets, inline in <head> so the first paint has thembase.jstheme pre-paint, the sound palette, _uiOnInit -- inline, nonce-carryingIconDefs()the one gradient every lit icon reaches for, once per document