Components

Reference documentation for every component in the Bundy UI library.

Elements

Actions

Layout

App

Wraps the app to set the language every component renders in and to mount the toast stack.

Card

A generic surface container with color/variant/rounding options, optionally clickable.

Divider

A horizontal or vertical rule, optionally with centered label text.

ScrollArea

A scrollable region with slim, themed scrollbars in place of the native ones.

Accordion

A stack of collapsible panels, either one at a time or several open at once.

Collapsible

A single expand/collapse panel — any trigger content toggling any panel content, height-animated open. The one-off, roll-your-own building block behind `Accordion`'s multi-item list.

Navbar

A sticky top bar with title/description and left/right action slots.

Sidebar

A collapsible, resizable application sidebar with header/footer slots, a drag-to-resize edge and a collapse toggle in its header.

SidebarToggle

A ghost icon button that collapses and expands a `Sidebar`, with the icon following the state so it always shows which way the click will go. Stateless: bind `v-model` to whatever owns the open state. `Sidebar` renders one in its header, and the same component works standalone in a navbar.

ResizeHandle

A draggable divider that resizes the panel beside it — a pixel size over `v-model`, clamped between `min` and `max`, on either axis. Pointer travel past a bound is reported through `overdrag` rather than swallowed, which is how a parent turns a hard drag into a collapse. Also keyboard-operable, and double-clickable to reset.

Toolbar

A row of grouped actions with dividers, matching a toolbar's compact layout.

Marquee

A horizontal or vertical strip of content that scrolls in an infinite loop.

Forms

Form

The state and validation container the other form pieces sit in: it validates on submit, routes each error to the `FormField` carrying that `name`, and emits `submit` only once everything passes. Takes a rules record or any Standard Schema validator (zod, valibot, arktype) — neither is a dependency.

FormField

A label/description/error wrapper standardizing the layout around a form control. Inside a `Form`, `name` is what pairs it with a value and pulls in that field's error.

Label

A styled label/legend with an optional description and required asterisk, rendered as whichever tag fits the context — used internally by `FormField`, `Checkbox`, `Radio`, `Switch`, `CheckboxGroup`, and `RadioGroup`, but usable on its own for a custom field layout.

Input

A single-line text input with optional leading/trailing icon and validation states.

Textarea

A multi-line text input with optional autosize.

NumberInput

A numeric input with increment/decrement controls and min/max/step support.

PasswordInput

A password input with a show/hide toggle and an optional live checklist of length/character requirements.

PinInput

A row of single-character boxes for entering a PIN or verification code.

PhoneInput

A text input paired with a searchable country picker, showing a flag and dial code.

DateInput

A date or date-range picker backed by a calendar popover.

Calendar

A month grid for picking a date or date range — navigation, today/clear actions, and min/max bounds. Powers `DateInput`'s popover, but also usable standalone for an inline calendar.

TimeInput

A time or time-range picker.

TagsInput

A text input that turns entries into removable tag chips.

FileUpload

A drag-and-drop/click file picker with a list of selected files.

CreditCardInput

A card number/name/expiry/CVC entry with a live, flipping card preview and network detection.

CreditCard

A live, flippable card visual — front number/name/expiry, back magstripe/CVC — with automatic network detection. Powers `CreditCardInput`'s preview but also usable standalone to just display a card.

CreditCardBrandMark

The card network logo/wordmark rendered on `CreditCard`, used internally.

Selection

Select

A native-feeling dropdown select over a list of items.

Combobox

A searchable, richer alternative to `Select`, supporting icons/avatars and multi-select.

Autocomplete

A text input that filters and selects from a list of suggestions as you type.

LanguageSelect

A language picker showing each language in its own name, with an optional flag — as a full-width field with search, or a compact icon button for a navbar.

Checkbox

A single checkbox input with label and description.

CheckboxGroup

A set of checkboxes sharing a single array `v-model`.

Radio

A single radio button with label and description, for use inside `RadioGroup`.

RadioGroup

A set of mutually-exclusive radio options sharing a single `v-model`.

Switch

An on/off switch, with color and label/description options.

Slider

A draggable single- or dual-thumb range input.

ColorInput

A hex text input, sized to its own value, with a live `ColorSwatch` preview that falls back to transparent while the typed text isn't a valid hex color. Optionally opens a `ColorPicker` popover, and optionally supports an alpha channel via `alpha`.

ColorPicker

A hue/saturation/lightness picker over a hex `v-model`, with an optional alpha track for an 8-digit hex and a `ColorSwatch` + hex code preview of the current selection.

ColorSwatchPicker

A row of hex color swatches to pick a single value from, sharing a `v-model` like a radio group.

ColorSwatch

A single color swatch with a checkmark when `selected` and a checkerboard behind translucent colors — purely presentational, so a parent like `ColorSwatchPicker` owns the actual selection and listens for a click. Also usable standalone with a custom `icon`, or as a plain non-interactive preview by leaving `selected` unbound.

EmojiPicker

A trigger-activated emoji panel — grouped into labeled categories with a recently-used section, and searchable by name. Wraps `Popover` internally; pass a custom trigger via the default slot or use the built-in icon button.

Data

Navigation

Overlays

Feedback

Blocks

LoginForm

A ready-made email/password sign-in form with 'remember me', a forgot-password link, and client-side validation — emits `submit` with the collected values instead of calling an API itself.

SignupForm

A ready-made account-creation form — name/email/password/confirm fields, a live password-strength checklist, and a required terms checkbox — emits `submit` with the collected values instead of calling an API itself.

SocialLogin

The row of 'Continue with Google/Apple/GitHub' buttons under a sign-in form, with bundled brand logos for ten providers — stacked and labelled, or icon-only side by side. Emits `select` with the provider's id; starting the OAuth flow is yours. Already built into `LoginForm`/`SignupForm` via their `providers` prop.

Chat

A ready-made conversation UI combining `ChatMessages` and `ChatInput` — pass a `messages` array in and handle `send`, no wiring between the two required.

ChatMessages

A scrolling list of `ChatMessage`s that groups consecutive messages from the same sender, inserts date separators, and auto-scrolls to the newest message.

ChatMessage

A single chat bubble — avatar, name, content, timestamp, and delivery status — aligned left or right depending on who sent it.

ChatInput

A message composer with an auto-resizing textarea, an emoji picker, and file attachments — Enter sends, Shift+Enter for a newline.

PricingPlans

The responsive row a set of `PricingPlan`s sits in — pass a `plans` array or write the cards out yourself, and it handles the columns, the equal heights and scaling the highlighted plan above its neighbours.

PricingPlan

A single plan on a pricing page — name, price, a `CheckList` of what it includes, and a call to action. `highlight` marks the recommended one, which colors the card and turns its button solid.

PricingTable

The feature-by-feature comparison under a set of plans: tiers across the top, features grouped into sections down the side, and a checkmark, a rule or a value in each cell. `orientation="vertical"` re-reads the same data as one `PricingPlan` per tier for small screens.

UserMenu

A sidebar/navbar-footer trigger showing the current user's avatar and name, opening a menu with a built-in presence status switcher and custom actions like settings or sign out.

TeamSwitcher

The workspace picker at the top of an app sidebar — current team's avatar and name in the trigger, the rest in a dropdown under it. Three weights via `variant`, a `collapsed` state that drops to just the avatar, and room for a "Create team" action below the list. `UserMenu` is its opposite number at the sidebar's foot.

SettingsModal

A two-pane settings dialog — a `Navigation` sidebar of sections on the left, the selected section's panel on the right — in the style of Discord's or Claude's settings.

Spotlight

A guided tour overlay that dims the page and highlights one target element at a time, with a positioned card of title/description and step navigation — for onboarding walkthroughs and feature tutorials.

Charts

LineChart

One or more trends over an ordered x axis, with a shared crosshair tooltip listing every series at the hovered position. The default for change over time — and with `guides="false"` and a small `height`, the inline sparkline in a stat tile or table cell.

AreaChart

A filled trend over time — stacked to show a total, normalized to show share, or overlapping for two or three series. Strokes the top edge of each band so a stack stays readable where two fills meet, and takes `gradient` to fade the fill out toward its baseline.

BarChart

Categorical comparison as bars, vertical or horizontal, with multiple series grouped, stacked, or normalized to 100%. Reach for `horizontal` whenever the category labels are words rather than dates.

ScatterChart

Two quantities against each other as points, optionally grouped by colour and sized by a third value for a bubble chart. Keep colour groups to three — any two points can end up adjacent, which is a harder test than a bar chart's neighbours.

HeatmapChart

A matrix of cells coloured by magnitude on a single-hue sequential ramp, for spotting concentration across two categorical dimensions. Ships a ramp legend, since a cell's colour can't be read back to a number without one.

PieChart

Parts of a single whole as slices, sorted largest-first. Honest for two or three shares and a rough read of the rest; past about five slices a `BarChart` compares them far better.

DonutChart

A `PieChart` with its middle opened up and filled with the number the chart is actually about — a total, a headline share — as ordinary DOM rather than SVG text.

RadialBarChart

Bars bent around a circle — a rose growing outward from a shared centre, or concentric activity rings. A compact summary; bending a bar makes its length depend on its radius, so a plain `BarChart` is the honest choice for close ranking.

RadarChart

Several comparable measures as one closed polygon per profile, for comparing shapes across five to eight axes. Every axis shares one radial scale, so the measures have to be normalized to a common range first.

GaugeChart

A single bounded value on a dial — an arc over a restricted sweep, with the exact number in the middle. Good for a status summary; a `Progress` bar is the better read when the value needs comparing to another one.

VennChart

Overlapping sets as area-proportional circles, for how much two or three audiences, tags or cohorts share. Exact at three sets and no further — four circles can't draw all fifteen of their regions, so a `BarChart` of the combinations is the honest chart past that.

ChartFrame

The shell every other chart is built in: it measures its container, reserves the axis margins, handles loading and empty states, places the legend and tooltip, and hands your default slot a plot rect to draw SVG into. Use it when the composition you need isn't one of the named charts.

ChartAxes

The grid rules behind a cartesian plot, drawn from tick positions a chart has already computed. Paired with `ChartLabels`, which draws the text for the same ticks.

ChartLabels

Tick text and axis titles for a cartesian plot, positioned from ticks a chart has already computed. Paired with `ChartAxes`, which draws the rules for the same ticks.

ChartLegend

The swatch-and-label list every multi-series chart renders under its plot, with an optional muted value per entry and a slot for custom rows. Presentational by default; `interactive` turns each entry into a button for an app that filters series.

ChartTooltip

The panel that follows the pointer across a plot, carrying a title and a list of swatch/label/value rows. Same chrome as `Tooltip`, but positioned from plot coordinates rather than anchored to an element.

ChartMarker

A dashed rule across a cartesian plot at one value on either axis, ending in a note — a release date on a timeline, a target on a bar chart — with an optional tooltip on hover. Placed in a `LineChart`, `AreaChart`, `BarChart` or `ScatterChart`'s default slot, it reads that chart's scales, so it takes a data value rather than a pixel.