# fma-ds
> A personal component registry in the shadcn/ui format, built on react-aria-components: components, blocks, libs, hooks and themes copied into your project by the shadcn CLI (not an npm package).
Register the namespace in components.json:
```json
{
"registries": {
"@fma-ds": "https://ds.fmartinsandre.dev.br/r/{name}.json"
}
}
```
Then add items by name: `pnpm dlx shadcn@latest add @fma-ds/button`. Dependencies between items resolve through the same namespace. Everything installs into `fma-ds` folders (`components/fma-ds/`, `hooks/fma-ds/`, `lib/fma-ds/`), so it never collides with the official shadcn components.
The APIs follow React Aria, not Radix: `isDisabled` instead of `disabled`, `onPress` instead of `onClick`, and no `asChild` (use `LinkButton` for a link that looks like a button). Wrap the app in React Aria's `RouterProvider` for client-side links (see the Routing guide).
License: MIT, except for themes adapted from tweakcn (Apache-2.0). Each registry item states its own in meta.license; upstream notices are in https://github.com/fmartins-andre/fma-ds/blob/main/THIRD_PARTY_NOTICES.md.
## Docs
- [Introduction](https://ds.fmartinsandre.dev.br/docs): Installation, React Aria conventions, themes.
- [Compatibility](https://ds.fmartinsandre.dev.br/docs/compatibility): fma-ds is code you copy, so it runs on your project's toolchain. These are the versions it is built and tested against.
- [Dark mode](https://ds.fmartinsandre.dev.br/docs/dark-mode): Dark mode is on by a `dark` class on an ancestor, usually ``. Every theme defines both palettes, so adding the class is all it takes.
- [Routing](https://ds.fmartinsandre.dev.br/docs/routing): Links in fma-ds are react-aria links. Without a router they do a full page load, so wrap your app in React Aria's `RouterProvider` to send them through your router.
- [Offline and privacy](https://ds.fmartinsandre.dev.br/docs/offline): fma-ds makes no network requests at runtime, with one exception. There is no telemetry, and themes don't load fonts from a CDN.
- [Touch](https://ds.fmartinsandre.dev.br/docs/touch): Controls meet WCAG 2.2 AA for pointer targets (2.5.8): at least 24 by 24 CSS pixels, or spaced far enough apart that a 24px circle on one doesn't touch the next. They are sized for desktop density, so an app used mostly by touch should pick larger sizes.
- [Updating items](https://ds.fmartinsandre.dev.br/docs/updating): The code lives in your project, so nothing updates by itself: you choose when to pull changes and which ones to keep.
- [Contributing](https://ds.fmartinsandre.dev.br/docs/contributing): fma-ds is a personal registry, developed in the open. Issues are welcome, and new components start from a real need in an app.
- [Registry index](https://ds.fmartinsandre.dev.br/r/registry.json): Every component, block, lib, hook and theme in one file.
- [Theme editor](https://ds.fmartinsandre.dev.br/themes): Tweak a theme and export it as CSS or JSON.
- [Full text](https://ds.fmartinsandre.dev.br/llms-full.txt): This file plus every item's usage example.
## Components
- [Accordion](https://ds.fmartinsandre.dev.br/components/accordion): A vertically stacked set of headers that expand to reveal or hide associated content. Supports single or multiple items open at once. Registry item: https://ds.fmartinsandre.dev.br/r/accordion.json
- [Alert](https://ds.fmartinsandre.dev.br/components/alert): A callout for important, static information — supports an icon, title, description, and an optional action, with semantic variants (destructive/info/success/warning/invert) and a `brand` variant for announcements and promos in the theme's second identity color. Registry item: https://ds.fmartinsandre.dev.br/r/alert.json
- [Alert Dialog](https://ds.fmartinsandre.dev.br/components/alert-dialog): A modal dialog that interrupts the user with important content and expects an explicit response (e.g. confirming a destructive action) — unlike Dialog, it can't be dismissed by clicking outside or pressing Escape. Registry item: https://ds.fmartinsandre.dev.br/r/alert-dialog.json
- [Aspect Ratio](https://ds.fmartinsandre.dev.br/components/aspect-ratio): Constrains content (typically an image or video) to a fixed width/height ratio, so it scales without distortion or layout shift. Registry item: https://ds.fmartinsandre.dev.br/r/aspect-ratio.json
- [Attachment](https://ds.fmartinsandre.dev.br/components/attachment): A file/attachment chip for chat-style UIs — shows a name, optional upload progress or error state, and an independently clickable remove action. Registry item: https://ds.fmartinsandre.dev.br/r/attachment.json
- [Avatar](https://ds.fmartinsandre.dev.br/components/avatar): A user/entity image with a text or icon fallback for when the image fails to load. Composes into overlapping groups for showing multiple participants. Registry item: https://ds.fmartinsandre.dev.br/r/avatar.json
- [Badge](https://ds.fmartinsandre.dev.br/components/badge): A small label for status, count, or category — inline with text or attached to another element. Registry item: https://ds.fmartinsandre.dev.br/r/badge.json
- [Breadcrumb](https://ds.fmartinsandre.dev.br/components/breadcrumb): Shows the user's current location within a hierarchy, as a trail of links back to parent pages, with an ellipsis for collapsing long paths. Registry item: https://ds.fmartinsandre.dev.br/r/breadcrumb.json
- [Bubble](https://ds.fmartinsandre.dev.br/components/bubble): A single chat message bubble — start/end alignment for sent vs. received, several color variants, and an optional reactions pill overlaid on a corner. Registry item: https://ds.fmartinsandre.dev.br/r/bubble.json
- [Button](https://ds.fmartinsandre.dev.br/components/button): Displays a button, or a component that looks like one, with a set of visual variants and sizes. Also exports LinkButton (react-aria-components' Link, same variants) for link-as-button use cases. Registry item: https://ds.fmartinsandre.dev.br/r/button.json
- [Button Group](https://ds.fmartinsandre.dev.br/components/button-group): Visually joins a row (or column) of buttons into one connected control, with shared borders and rounded end corners. Can include a separator or a plain text segment. Registry item: https://ds.fmartinsandre.dev.br/r/button-group.json
- [Calendar](https://ds.fmartinsandre.dev.br/components/calendar): A date grid for selecting a single date, multiple dates or a range. Registry item: https://ds.fmartinsandre.dev.br/r/calendar.json
- [Card](https://ds.fmartinsandre.dev.br/components/card): A container for grouping related content, with header, title, description, action, content, and footer slots. Supports a compact size="sm" variant. Registry item: https://ds.fmartinsandre.dev.br/r/card.json
- [Carousel](https://ds.fmartinsandre.dev.br/components/carousel): A carousel for cycling through slides (images, cards, or any content) with keyboard, swipe, and button navigation. Registry item: https://ds.fmartinsandre.dev.br/r/carousel.json
- [Chart](https://ds.fmartinsandre.dev.br/components/chart): Composable chart primitives (ChartContainer, ChartTooltip, ChartLegend) wrapping Recharts, themed via CSS custom properties from a ChartConfig. Supports area, bar, line, and pie charts. Registry item: https://ds.fmartinsandre.dev.br/r/chart.json
- [Checkbox](https://ds.fmartinsandre.dev.br/components/checkbox): A control for a single on/off/indeterminate value. Registry item: https://ds.fmartinsandre.dev.br/r/checkbox.json
- [Code Block](https://ds.fmartinsandre.dev.br/components/code-block): A code block with shiki syntax highlighting, for docs and AI chat UIs. `` is complete on its own. Registry item: https://ds.fmartinsandre.dev.br/r/code-block.json
- [Collapsible](https://ds.fmartinsandre.dev.br/components/collapsible): Shows or hides a single section of content behind a trigger. A thin wrapper around react-aria-components' Disclosure — for several mutually-exclusive sections, use Accordion instead. Registry item: https://ds.fmartinsandre.dev.br/r/collapsible.json
- [Color Picker](https://ds.fmartinsandre.dev.br/components/color-picker): A composable color picker: `ColorPicker` holds the color and shares it with parts laid out in any way. Registry item: https://ds.fmartinsandre.dev.br/r/color-picker.json
- [Combobox](https://ds.fmartinsandre.dev.br/components/combobox): A searchable, filterable select combining a text input with a listbox popover. Supports single selection (ComboboxValue) or a multi-select tag/chip input (ComboboxChips + ComboboxChip). Registry item: https://ds.fmartinsandre.dev.br/r/combobox.json
- [Command](https://ds.fmartinsandre.dev.br/components/command): A searchable list of commands or actions, filtered live as you type. Registry item: https://ds.fmartinsandre.dev.br/r/command.json
- [Confirm Dialog](https://ds.fmartinsandre.dev.br/components/confirm-dialog): A ready-made yes/no dialog on top of the `use-dialog-promise` hook. Registry item: https://ds.fmartinsandre.dev.br/r/confirm-dialog.json
- [Context Menu](https://ds.fmartinsandre.dev.br/components/context-menu): A menu that opens on right-click (or long-press on touch) instead of a regular trigger click. Supports nested submenus, separators, and keyboard shortcut display. Registry item: https://ds.fmartinsandre.dev.br/r/context-menu.json
- [Copy Button](https://ds.fmartinsandre.dev.br/components/copy-button): An icon button that copies a value too long to type (protocol, tracking code, Pix code, token) to the clipboard. Registry item: https://ds.fmartinsandre.dev.br/r/copy-button.json
- [Credit Card](https://ds.fmartinsandre.dev.br/components/credit-card): A payment card drawn from its data, to show a saved card or preview one while it's typed. Registry item: https://ds.fmartinsandre.dev.br/r/credit-card.json
- [Data Grid](https://ds.fmartinsandre.dev.br/components/data-grid): A data grid driven by a TanStack Table v9 instance and rendered with react-aria's `Table`, which brings cell keyboard navigation, `aria-sort`, selection, column resizing, row drag and drop and virtualization. Registry item: https://ds.fmartinsandre.dev.br/r/data-grid.json
- [Date Field](https://ds.fmartinsandre.dev.br/components/date-field): A segmented, keyboard-editable date input. Registry item: https://ds.fmartinsandre.dev.br/r/date-field.json
- [Date Picker](https://ds.fmartinsandre.dev.br/components/date-picker): A typed date input paired with a calendar popover over one value, for single dates (`DatePicker`) or ranges (`DateRangePicker`). Registry item: https://ds.fmartinsandre.dev.br/r/date-picker.json
- [Description List](https://ds.fmartinsandre.dev.br/components/description-list): Term/value pairs on a semantic `
`: `DescriptionList` > `DescriptionItem` > `DescriptionTerm` + `DescriptionDetails`. Registry item: https://ds.fmartinsandre.dev.br/r/description-list.json
- [Dialog](https://ds.fmartinsandre.dev.br/components/dialog): A modal window layered over the page, requiring explicit action (or Escape) to dismiss. Pair with react-aria-components' DialogTrigger to wire up the trigger and open state. Registry item: https://ds.fmartinsandre.dev.br/r/dialog.json
- [Direction](https://ds.fmartinsandre.dev.br/components/direction): Sets LTR/RTL text-direction context for descendant react-aria-components — a compatibility shim so a Radix/Base UI-style `direction` prop keeps working via react-aria's locale system. Registry item: https://ds.fmartinsandre.dev.br/r/direction.json
- [Drawer](https://ds.fmartinsandre.dev.br/components/drawer): A panel that slides in from an edge of the screen, with swipe-to-dismiss and snap-point support. Uses @base-ui/react (not react-aria-components), so its API and data attributes differ from this repo's other overlays. Registry item: https://ds.fmartinsandre.dev.br/r/drawer.json
- [Dropdown Menu](https://ds.fmartinsandre.dev.br/components/dropdown-menu): A menu of actions or options triggered by clicking a button. Supports nested submenus, separators, labels, and a shortcut-display slot for each item. Registry item: https://ds.fmartinsandre.dev.br/r/dropdown-menu.json
- [Emoji Picker](https://ds.fmartinsandre.dev.br/components/emoji-picker): An emoji picker with search, skin tones, recently used emoji, custom emoji and a virtualized grid. Registry item: https://ds.fmartinsandre.dev.br/r/emoji-picker.json
- [Empty](https://ds.fmartinsandre.dev.br/components/empty): A placeholder for empty states — no data, no search results, nothing configured yet. Composes an icon/media, title, description, and optional call-to-action content. Registry item: https://ds.fmartinsandre.dev.br/r/empty.json
- [Field](https://ds.fmartinsandre.dev.br/components/field): Layout primitives for building form fields. Pairs with `Label`, `Input`, and friends. Registry item: https://ds.fmartinsandre.dev.br/r/field.json
- [File Type](https://ds.fmartinsandre.dev.br/components/file-type): A file type icon: a page with a folded corner and the extension label, in the format's brand or family color (Word blue, Excel green, the GitHub language colors). Registry item: https://ds.fmartinsandre.dev.br/r/file-type.json
- [File Upload](https://ds.fmartinsandre.dev.br/components/file-upload): Picks files by dragging them in, pasting them or browsing, and lists them; it doesn't upload. Registry item: https://ds.fmartinsandre.dev.br/r/file-upload.json
- [Glance](https://ds.fmartinsandre.dev.br/components/glance): A quick piece of information that opens more context one click away — an account notice, a balance, a count of pending items. Registry item: https://ds.fmartinsandre.dev.br/r/glance.json
- [Hover Card](https://ds.fmartinsandre.dev.br/components/hover-card): A popover that shows on hover or focus instead of click, for previewing content (a profile card, a link preview) without navigating away. Unlike a tooltip, it can contain interactive content. Registry item: https://ds.fmartinsandre.dev.br/r/hover-card.json
- [Icon Stack](https://ds.fmartinsandre.dev.br/components/icon-stack): A layered icon illustration for empty states: three receding cards drawn from `currentColor`, with an optional glyph (`children`) laid flat on the front card. Registry item: https://ds.fmartinsandre.dev.br/r/icon-stack.json
- [Icon Tile](https://ds.fmartinsandre.dev.br/components/icon-tile): A square surface that gives icons a consistent footprint. Registry item: https://ds.fmartinsandre.dev.br/r/icon-tile.json
- [Input](https://ds.fmartinsandre.dev.br/components/input): A single-line text input, styled to match the rest of the registry. Plain native attributes (disabled, not isDisabled) since it wraps react-aria-components' bare Input rather than a higher-level field primitive. Registry item: https://ds.fmartinsandre.dev.br/r/input.json
- [Input Group](https://ds.fmartinsandre.dev.br/components/input-group): Wraps an Input or Textarea with leading/trailing addons (icons, text, or buttons) inside one bordered container, so the whole group shares a single focus ring and border. Registry item: https://ds.fmartinsandre.dev.br/r/input-group.json
- [Input Otp](https://ds.fmartinsandre.dev.br/components/input-otp): A one-time-password / verification-code input rendered as individual boxed slots, backed by a single hidden text input for real typing, paste, and autofill behavior. Registry item: https://ds.fmartinsandre.dev.br/r/input-otp.json
- [Item](https://ds.fmartinsandre.dev.br/components/item): A generic row layout for lists of things — media/icon, title, description, and trailing actions. Registry item: https://ds.fmartinsandre.dev.br/r/item.json
- [Kbd](https://ds.fmartinsandre.dev.br/components/kbd): Displays a keyboard key or shortcut (e.g. ⌘K) inline, styled as a small pill. KbdGroup lays out several keys side by side for combos like ⌘+Shift+P. Registry item: https://ds.fmartinsandre.dev.br/r/kbd.json
- [Label](https://ds.fmartinsandre.dev.br/components/label): A form field label. Registry item: https://ds.fmartinsandre.dev.br/r/label.json
- [Loading Overlay](https://ds.fmartinsandre.dev.br/components/loading-overlay): Blocks interaction while an operation runs. No brand animation: just a spinner. Registry item: https://ds.fmartinsandre.dev.br/r/loading-overlay.json
- [Marker](https://ds.fmartinsandre.dev.br/components/marker): A small inline label used in chat/message timelines — a date separator, a status note, or similar metadata — rendered in muted text with an optional icon. Registry item: https://ds.fmartinsandre.dev.br/r/marker.json
- [Masked Input](https://ds.fmartinsandre.dev.br/components/masked-input): An `Input` with live Maskito formatting. Works inside a react-aria `TextField`. Registry item: https://ds.fmartinsandre.dev.br/r/masked-input.json
- [Menubar](https://ds.fmartinsandre.dev.br/components/menubar): An app-style menu bar (File, Edit, View…). Registry item: https://ds.fmartinsandre.dev.br/r/menubar.json
- [Message](https://ds.fmartinsandre.dev.br/components/message): Layout for one message row in a chat UI — avatar, header, footer, and a content column that aligns to the start or end depending on who sent it. Pairs with Bubble for the actual message content. Registry item: https://ds.fmartinsandre.dev.br/r/message.json
- [Message Scroller](https://ds.fmartinsandre.dev.br/components/message-scroller): An auto-scrolling viewport for chat message lists: sticks to the latest message as new ones arrive, and shows a jump-to-end/start button once the user scrolls away. Registry item: https://ds.fmartinsandre.dev.br/r/message-scroller.json
- [Native Select](https://ds.fmartinsandre.dev.br/components/native-select): A styled wrapper around the real, native