- Accordion
- Action Bar
- Action Toast
- Alert Banner
- Alert Dialog
- Alert
- Alphabet Index
- Amount Field
- Aspect Ratio
- Attachment
- Availability List
- Avatar
- Badge
- Bank Card
- Breadcrumb
- Bubble
- Button Group
- Button
- Calendar
- Camera Frame
- Card Design Picker
- Card Details
- Card Peek
- Card Stack
- Card
- Carousel
- Chart
- Chat Thread
- Checkbox
- Chip Group
- Choice Tile
- Code Block
- Code Dots
- Collapsible
- Combobox
- Command
- Context Menu
- Copy Field
- Countdown
- Country Select
- Data Table
- Date Field
- Date Picker
- Date Range Picker
- Dialog
- Direction
- Document Paper
- Drawer
- Dropdown Menu
- Empty
- Entity Avatar
- Field
- File Trigger
- File Upload Item
- Hover Card
- Input Group
- Input OTP
- Input
- Item
- Kbd
- Key Value
- Keypad
- Label
- Live Region
- Marker
- Message Scroller
- Message
- Money Amount
- Native Select
- Number Field
- Pagination
- Percent Split Editor
- Phone Field
- Popover
- Progress
- QR Code
- Questionnaire
- Radio Group
- Range Histogram
- Rating
- Resizable
- Scroll Area
- Search Field
- Select
- Separator
- Share Bar
- Sheet
- Sidebar
- Skeleton
- Slider
- Sonner
- Sortable List
- Spinner
- Status Timeline
- Step Header
- Steps List
- Swipe Row
- Switch
- Table
- Tabs
- Text Field
- Textarea
- Tier Ladder
- Toggle Group
- Toggle
- Token Search Field
- Tooltip
- Trace
- Transaction Row
- Usage Meter
Dots is distributed as code. The shadcn CLI copies each component into your project, where you own and edit it. Dots ships one configuration: React Aria for behavior, the Dots style for the look, Geist and Geist Mono for type and Phosphor for icons.
Create your app
Start from any React app that uses Tailwind CSS v4: Next.js, Vite, React Router, TanStack Start or Astro. For example, with Next.js:
pnpm create next-app@latest my-app --typescript --tailwind --eslint --app
create-next-app already loads Geist and Geist Mono in app/layout.tsx, as --font-geist-sans and --font-geist-mono. init keeps an existing Geist setup as it is, so rename the two variables to --font-sans and --font-mono before you run it. Otherwise the page falls back to the browser's default font.
Or with Vite:
pnpm create vite@latest my-app -- --template react-ts
For Vite, also add Tailwind CSS and the @/* path alias as described in the Vite and Tailwind CSS docs before you continue.
Initialize Dots
Run init with the Dots preset in the root of your app:
pnpm dlx shadcn@latest init --preset https://dots.sendity.net/init?base=aria
The preset is served by this site at /init. It sets up React Aria with the Dots style. It:
- writes
components.jsonwith thedotsstyle and registers the@dotsregistry namespace, so the CLI fetches Dots items from this site - adds the Dots palette (light and dark) as CSS variables to your global CSS file
- installs Geist (
--font-sans, the page font) and Geist Mono (--font-mono, used forcode,kbd,preandsamp) - installs
react-aria-components,@phosphor-icons/react,class-variance-authorityandcn
Add components
Add components through the @dots namespace:
pnpm dlx shadcn@latest add @dots/button @dots/field @dots/dialog
Use them
import { Button } from "@/components/ui/button"
export default function Home() {
return <Button>Continue</Button>
}The @dots namespace#
init adds this entry to components.json:
{
"registries": {
"@dots": "<origin>/r/{name}.json"
}
}<origin> is the site you ran init against. Every Dots item refers to its own dependencies through @dots/<name>, so they always come from the same place. You can browse what is available in Components.
Dark mode#
The palette ships light and dark tokens. Add the dark class to <html> to switch, or follow the dark mode guide for your framework.