@velobits
An open source collection of accessible, contrast-gated React components on a warm neutral palette and a two-tier glass material — the VeloBits design system, authored once and shipped both as an npm package and as this registry.
Install this registry
npx shadcn@latest add https://ui.velobits.dev/r/registry.json pnpm dlx shadcn@latest add https://ui.velobits.dev/r/registry.json bunx shadcn@latest add https://ui.velobits.dev/r/registry.json curl -s https://ui.velobits.dev/r/registry.json Components
48 totalThe base style: tokens, the cn util, the provider stack, and every Tier-1 primitive, Tier-2 overlay and Tier-3 composite. Start here.
npx shadcn@latest add https://ui.velobits.dev/r/velobits.json The full token layer as CSS variables. Every colour pair here is contrast-verified in both themes by the @velobitsio/tokens test suite.
npx shadcn@latest add https://ui.velobits.dev/r/velobits-theme.json Tailwind-aware class merger. Signature must stay twMerge(clsx(...)) , the dashboard app points components.json `utils` at it.
npx shadcn@latest add https://ui.velobits.dev/r/cn.json React-free light/dark resolution, storage and the blocking init script. Storage key is required, never defaulted.
npx shadcn@latest add https://ui.velobits.dev/r/theme.json ThemeProvider + useTheme. Honours the existing fmx_theme_mode and tf.theme keys.
npx shadcn@latest add https://ui.velobits.dev/r/use-theme.json Media query subscription plus usePrefersReducedMotion. Import breakpoints from @velobitsio/tokens rather than re-typing the pixel value, so the JS and CSS brea…
npx shadcn@latest add https://ui.velobits.dev/r/use-media-query.json Row selection for DataTable. The selection is DERIVED , the stored set intersected with the rows on screen , so a bulk action can never point at a row the filt…
npx shadcn@latest add https://ui.velobits.dev/r/use-row-selection.json Mount once at the shell root: ThemeProvider + TooltipProvider + MotionConfig reducedMotion="user".
npx shadcn@latest add https://ui.velobits.dev/r/velobits-provider.json Status panel. Defaults to polite role="status"; escalate to "alert" deliberately. Tier-S glass on the neutral variant only , the four soft washes would replace…
npx shadcn@latest add https://ui.velobits.dev/r/alert.json npx shadcn@latest add https://ui.velobits.dev/r/avatar.json Soft washes pair with the matching text token, never with the solid fill.
npx shadcn@latest add https://ui.velobits.dev/r/badge.json Controls are radius-md. No variant paints --primary as text; `link` uses --primary-text.
npx shadcn@latest add https://ui.velobits.dev/r/button.json Tier-S glass by default; surface="panel" for the opaque original, which writes border-border explicitly so it survives an app that skipped the base layer.
npx shadcn@latest add https://ui.velobits.dev/r/card.json Includes the indeterminate state bulk-selection headers need.
npx shadcn@latest add https://ui.velobits.dev/r/checkbox.json Label/description/error wiring. Keeps BOTH ids in aria-describedby when a field has an error and a hint.
npx shadcn@latest add https://ui.velobits.dev/r/field.json All three glass tiers behind one prop: surface (Tier S, no blur by default) · overlay · elevated. Never for page backgrounds, table rows, or nested glass.
npx shadcn@latest add https://ui.velobits.dev/r/glass-surface.json border-input maps to --field-border, the half WCAG 1.4.11 gates.
npx shadcn@latest add https://ui.velobits.dev/r/input.json npx shadcn@latest add https://ui.velobits.dev/r/kbd.json A real <label>, so htmlFor resolves. Non-control roots need aria-labelledby instead.
npx shadcn@latest add https://ui.velobits.dev/r/label.json A cva-styled native <select>. Deliberately NOT Radix Select, which is undriveable under happy-dom.
npx shadcn@latest add https://ui.velobits.dev/r/native-select.json A scrollable region with a styled scrollbar. The thumb is --field-border, not --border: it is an interactive control, so 1.4.11 applies to it.
npx shadcn@latest add https://ui.velobits.dev/r/scroll-area.json Decorative, so it uses --border and is exempt from 1.4.11.
npx shadcn@latest add https://ui.velobits.dev/r/separator.json aria-hidden; pair with ONE sr-only live region rather than announcing each block.
npx shadcn@latest add https://ui.velobits.dev/r/skeleton.json The name goes on the THUMB , Radix puts role="slider" there, so htmlFor and a root aria-label both dangle.
npx shadcn@latest add https://ui.velobits.dev/r/slider.json npx shadcn@latest add https://ui.velobits.dev/r/spinner.json Applies immediately. Thumb translation is mirrored explicitly for RTL.
npx shadcn@latest add https://ui.velobits.dev/r/switch.json npx shadcn@latest add https://ui.velobits.dev/r/textarea.json TooltipProvider is required , Radix throws without it, and under Module Federation it must be a singleton.
npx shadcn@latest add https://ui.velobits.dev/r/tooltip.json cmdk inside a Radix Dialog. The ⌘K listener is opt-in via `shortcut` , a design system must not bind a global key by merely being imported.
npx shadcn@latest add https://ui.velobits.dev/r/command-palette.json The centred form modal. `focusFirstField` exists because autoFocus is silently swallowed by Radix FocusScope.
npx shadcn@latest add https://ui.velobits.dev/r/dialog.json Highlight is data-[highlighted], never :hover , Radix drives keyboard focus through it. Cannot host a text input; use Dialog or Popover.
npx shadcn@latest add https://ui.velobits.dev/r/dropdown-menu.json The elevated tier, for glass stacked on glass. PopoverTitle wires aria-labelledby , Radix content is role="dialog" with no Title part, so it is otherwise unnam…
npx shadcn@latest add https://ui.velobits.dev/r/popover.json The anchored reading sheet. Deliberately NOT Dialog and deliberately does NOT redirect focus , the two focus policies are opposites, so do not merge them behin…
npx shadcn@latest add https://ui.velobits.dev/r/side-panel.json Variants use a logical border stripe, not a soft wash: bg-*-soft is a utility and beats --glass-bg from the components layer, flattening the tier.
npx shadcn@latest add https://ui.velobits.dev/r/toast.json The one sanctioned height animation: Radix measures --radix-accordion-content-height, so it does not thrash layout the way an unbounded height:auto transition …
npx shadcn@latest add https://ui.velobits.dev/r/accordion.json The authenticated chrome. `sidebar` is a prop rather than a child because it is rendered TWICE , as a rail at md and up, and inside a drawer below it , so a na…
npx shadcn@latest add https://ui.velobits.dev/r/app-shell.json A named nav landmark around an ordered list. The leaf is a plain span with aria-current="page" , NOT shadcn’s role="link" aria-disabled, which announces static…
npx shadcn@latest add https://ui.velobits.dev/r/breadcrumb.json Preformatted code, with a copy button that survives an insecure origin (navigator.clipboard is absent over plain http). The `terminal` variant is the theme-inv…
npx shadcn@latest add https://ui.velobits.dev/r/code-block.json Sorting, selection and row activation over a column registry , deliberately not TanStack, whose grouping and pivoting nothing here uses. aria-sort goes on the …
npx shadcn@latest add https://ui.velobits.dev/r/data-table.json A unified line diff. The +/− gutter is the primary channel and the green/red wash the secondary , colour alone fails 1.4.1, and the gutter is also the only cha…
npx shadcn@latest add https://ui.velobits.dev/r/diff-viewer.json First-run, filtered-to-nothing and failed-to-load are three different states; this covers the first two and an Alert covers the third. The title is a <p> unles…
npx shadcn@latest add https://ui.velobits.dev/r/empty-state.json react-hook-form bound to Field’s ARIA wiring. label and description are PROPS, not children, because aria-describedby is assembled before children render , a d…
npx shadcn@latest add https://ui.velobits.dev/r/form.json Page transitions and capped list staggers on framer-motion, which was already a required peer for VelobitsProvider’s MotionConfig and until now bought nothing …
npx shadcn@latest add https://ui.velobits.dev/r/motion.json Numbers are links, previous/next are buttons: an <a> cannot express "unavailable" without ceasing to be focusable. Unavailability is aria-disabled plus a guard…
npx shadcn@latest add https://ui.velobits.dev/r/pagination.json Radix ToggleGroup with a REAL disabled and a working accessible name , a div root makes an external htmlFor dangle, and pointer-events-none leaves the control …
npx shadcn@latest add https://ui.velobits.dev/r/segmented-control.json On/off/partial/pending/archived as one chip. Every status ships a DISTINCT glyph, because colour alone fails 1.4.1 and on-versus-off is the distinction a contr…
npx shadcn@latest add https://ui.velobits.dev/r/status-chip.json Rows are never glass , one backdrop-filter per row repaints its own backdrop region on every scroll. Surface treatment belongs on the container.
npx shadcn@latest add https://ui.velobits.dev/r/table.json npx shadcn@latest add https://ui.velobits.dev/r/tabs.json