Components

Every export in @youspot/ui, with usage. See them rendered on the collage and the theme proof.

Button

Primary, tertiary, secondary, destructive, and quiet actions with pending spinner.

TextField

Labeled text input with description and validation error slots.

TextArea

Labeled multiline input with description and validation error slots.

MarkdownEditor

A rich text field whose value is Markdown, with a toolbar for bold, italic, headings, lists and links. Reach for it over TextArea when the person is writing prose that gets rendered later, and keep TextArea when the raw Markdown is the point.

MentionInput

TextArea whose trigger character opens a filtered suggestion list; picking one writes the mention at the caret. Reach for it over TextArea when the prose has to name records the app knows about (people, companies, saved assets) and you need the pick as data, not just the typed string.

NumberField

Numeric input with increment and decrement steppers.

Checkbox

Single checkbox with indeterminate state; CheckboxGroup for labeled sets.

CheckboxGroup

Labeled group of checkboxes with shared description and validation.

RadioGroup

Single-choice group, vertical or horizontal.

Switch

On/off toggle with label, description, and validation slots.

Slider

Single or range slider with live output value.

Select

Picker over a dropdown listbox; SelectItem and SelectSection for options.

ComboBox

Autocomplete input over a filtered listbox.

Form

Stacked form wrapper wiring React Aria validation.

DateField

Segmented date input; TimeField for times.

TimeField

Segmented time input on the DateField chassis.

Calendar

Month grid with keyboard navigation; RangeCalendar for spans.

Card

Generic surface: Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter.

Badge

Static status pill with semantic color variants.

Alert

Inline callout with icon slot, title, and description; status variants.

Skeleton

Pulsing placeholder for a layout whose shape you already know, so nothing jumps when the data lands. SkeletonLine, SkeletonCircle and SkeletonText compose it; SkeletonCardList, SkeletonTable, SkeletonRows, SkeletonToolbar and SkeletonPanel are the whole shapes. Wrap a region in SkeletonBlock so it announces itself once instead of not at all. Stops animating under reduce-motion.

Spinner

The wait for something whose shape you do not know yet, like a submit or a panel fetching. Prefer Skeleton when the layout is known, and Shimmer for a model working in a transcript. Same arc as Loader and Button's pending state.

Kbd

Keyboard key cap; KbdGroup for chords.

AspectRatio

Locks a child to a ratio; images and videos cover the box.

Item

Media / content / actions row primitive for lists and settings.

ButtonGroup

Attaches adjacent buttons into one segmented control.

ToggleButton

Pressable on/off button; ToggleButtonGroup for single or multiple selection.

ProgressBar

Determinate or indeterminate progress with label and value.

Meter

Gauge that shifts success → warning → destructive as it fills.

Toast

Sonner underneath, our markup on top: it owns the stack, the timers and the announcements; we own every pixel. Mount ToastRegion once at the app root and call toast() from anywhere. A plain card with the tone carried by its icon: default, success, destructive, warning, info, and loading, which spins and should usually be given no timeout. A thin line shows the time left and pauses on hover; older toasts wait behind, and one that leaves dissolves.

Sheet

Side panel over a scrim; Drawer is the bottom placement.

AlertDialog

Blocking confirm dialog with cancel and confirm actions.

Table

Sortable, selectable, resizable data grid: Table, TableHeader, Column, TableBody, Row, Cell.

Pagination

Page controls with sibling window and gaps.

BreadcrumbList

React Aria breadcrumb trail; the layout Breadcrumbs stays the data-driven server-safe one.

StatTile

One number, named: label, auto-compacted value, optional delta and hint. The right form when a measure has no shape worth drawing.

CopyButton

Copies a value to the clipboard and says Copied for two seconds. Text or icon only; onBlocked fires when the browser refuses, so the caller can say what to do instead.

Sidebar

Collapsible app rail: provider, header, groups, menu buttons with injected links, nested sub-menus that fly out once collapsed, badges, off-canvas below the mobile breakpoint, trigger, inset.

ReorderList

A list you reorder by dragging the whole row, no handle. Rows spring into place; Alt plus the arrow keys moves the focused row.

QuietSelect

A select that reads as plain text until hovered: the value at the end of a settings row, like Always show in the sidebar editor.

SidebarCustomizeDialog

Linear-style sidebar editor: a settings card, then sections of rows that each pick Always show, Show when it has items or Don't show, reordered by dragging the row.

TopBar

The app's stable frame: brand, destinations with a shared active pill, search, and the account, the same on every page. `inset` sits over the page beside a sidebar card; `full` spans the window with the sidebar below it. Sets --topbar-row-h, --tabstrip-h and their sum as CSS variables, so a second row costs no measurement and no re-render.

CountBadge

The orange count pill beside a section title or a nav tab. Caps at 99+.

IconBox

A muted square that holds a row's icon, at 32px or 40px.

SegmentedControl

A small single choice switch in a muted well, the selected option lifted onto a card. For views and sort orders inside a page, not for navigation.

SegmentedNav

The v2 top bar's centered destinations: links in a muted well, the current one lifted onto a card pill that slides between items, with an optional count. Labels can hide on narrow screens and fall back to a tooltip.

IconRail

The simple shell's fixed column: 40px glyph items on the chrome ground with a shared active pill, a tooltip to the right and a hidden text label. An item with an href is a link; one with onPress is a button, so it can trigger the launcher or the account menu.

Launcher

The apps popover body: grouped destinations three to a row with a divider between groups and an All apps footer row. LauncherPopover wraps it in the Popover and Dialog for a DialogTrigger on the rail.

PageTrail

The one-line breadcrumb above a Brain or Settings page, built on the Kobra breadcrumb parts: parent links, chevron separators and the current page as plain text. Truncates instead of wrapping so it fits beside the sidebar toggle.

TabStrip

Browser-style tabs for the top bar's second row. Each tab is a remembered location rather than a document; a pinned tab shrinks to its glyph and shows no close control, and middle-click closes.

Topbar

The rail's other half: a sticky bar across the content column carrying where you are on the left, and on the right the tools that are the same on every page: search, icon actions with badges, then the account. Pairs with SidebarInset; it does not span the rail.

ErrorState

Page or inline failure surface: title, detail, error message and digest, retry and home actions.

Banner

One full-bleed line about the whole session, not the page: impersonation, an unreachable backend, a job still running. Alert is the in-page box; this is the strip under the top bar. Dismissible only if you pass onDismiss.

DataState

Loading, empty, error or the thing itself, decided once from a Query status. A failure always outranks emptiness, so a list never claims to be empty when the request actually failed. Wraps children in an ErrorBoundary.

ErrorBoundary

Catches render errors below it and shows ErrorState with a reset; resetKeys clear it.

OfflineState

The offline preset of ErrorState; useOnline() reports connectivity.

Carousel

Embla-powered slides with previous/next controls and arrow-key navigation.

Chart

Recharts inside a tokenized container: chart-1…5 colors, tooltip and legend in contract tokens.

IsoDatePicker

A DatePicker over a plain YYYY-MM-DD string, so a form field and the server agree without a date library at the edge.

IsoDateTimePicker

A DatePicker with hour and minute segments over a plain YYYY-MM-DDTHH:mm string, for a moment something happens, like when a post goes live.

DataTable

TanStack Table over the React Aria Table: column defs, sorting, optional pagination.

DataGrid

A windowed grid with a sticky first column, hidden row selection, mobile long press and drag select, and per column footer summaries.

InfiniteDataTable

Virtualized table over an infinite query: server-driven sort, scroll-to-load-more, disclosure rows, loading/empty/error states.

ColumnFilterButton

Column-header filter popover for text, facets, numbers, and dates. The host owns the applied value; the button shows whether the column is filtered.

AnimatedNumber

A number that tweens to its new value when it changes, or with roll turns each digit like an odometer; still under reduced motion.

InputOTP

One-time-code input with slots, groups, and separators.

PhoneField

Country picker plus a tel input that formats as you type and reports the number as E.164.

Resizable

Draggable panel groups with an optional grip handle.

ContextMenu

Right-click menu anchored at the pointer; a Menu in a Popover, so keyboard users get it via the item's own actions.

Menubar

Toolbar of menu triggers with arrow-key movement between menus.

NavigationMenu

Site nav with plain links and popover panels; panel links carry a title and description.

HoverCard

Rich hover/focus card on a popover, so it stays while the pointer moves onto it and its links can be clicked.

ObjectChip

A brain object inline in prose: a quiet type icon, the name, and a hover card that opens the object page. What every /graph/object link becomes in MarkdownDoc and the rich editor.

Tabs

Tab list with panels.

TagGroup

Tags with semantic colors, selection, and removal.

Menu

Dropdown menu with sections, submenus, and shortcuts.

Modal

Centered modal over a blurred scrim.

Heading

A dialog title with theme-defined typography and heading semantics.

Disclosure

Expandable section; DisclosureGroup for accordions.

ListBox

Selectable list with sections; DropdownItem for menus and selects.

StepDots

Where you are in a short unnamed flow: one dot per step, the current one slides. Use FlowProgress when the steps have names worth reading.

SetupProgress

The bar the host renders above each v2 setup step: one segment per step with the current one wider, the step count, and Back where the host passes it.

MarkdownDiff

The lines a Markdown rewrite changed, unified or split, folded past 16 lines behind Show all. Import it from @youspot/ui/components/markdown-diff.

BrandKitSwatches

A brand kit's eight colors, two typefaces, radius and logo painted from the kit as runtime data; sm for list rows, md for the full strip.

BrandKitEditor

Controlled form over a BrandKit: hex fields with a native color picker and contrast hints, font selects, a radius slider, logo uploads, and the review alert with Approve for an extracted kit.

BrandKitWebsitePull

An explicit 3-credit website pull with a separate candidate preview, evidence, conflict confirmation, Apply to draft and Discard.