- 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
The components.json file holds configuration for your project.
We use it to understand how your project is set up and how to generate components customized for your project.
It is only required if you're using the CLI to add components to your project. If you're using the copy and paste method, you don't need this file.
You can create a components.json file in your project by running the following command:
pnpm dlx shadcn@latest init
See the CLI section for more information.
$schema#
You can see the JSON Schema for components.json here.
{
"$schema": "https://ui.shadcn.com/schema.json"
}style#
The style for your components.
{
"style": "dots"
}Dots ships one style, dots. /init writes it for you.
The shadcn CLI also reads a base library from the style name (aria-…, radix-…, base-…) and treats a name without one, like dots, as radix. Dots components do not depend on that value, but you will see it in two places:
shadcn inforeportsbase radix.- Re-running
initwith?base=ariain a project that already has Dots asks "You are switching from radix to aria". Leave the parameter off when you re-run it:npx shadcn@latest init --preset <site>/init --force --no-reinstall.
tailwind#
Configuration to help the CLI understand how Tailwind CSS is set up in your project.
See the installation section for how to set up Tailwind CSS.
tailwind.config#
Path to where your tailwind.config.js file is located. For Tailwind CSS v4, leave this blank.
{
"tailwind": {
"config": "tailwind.config.js" | "tailwind.config.ts"
}
}tailwind.css#
Path to the CSS file that imports Tailwind CSS into your project.
{
"tailwind": {
"css": "styles/global.css"
}
}tailwind.baseColor#
The base colour the CLI records for your project. /init always writes neutral; the Dots palette overrides every token it defines.
{
"tailwind": {
"baseColor": "neutral"
}
}tailwind.cssVariables#
We use and recommend CSS variables for theming.
Set tailwind.cssVariables to true to generate semantic theme tokens like background, foreground, and primary. Set it to false to generate inline Tailwind color utilities instead.
{
"tailwind": {
"cssVariables": `true` | `false`
}
}For more information, see the theming docs.
This cannot be changed after initialization. To switch between CSS variables and utility classes, you'll have to delete and re-install your components.
tailwind.prefix#
The prefix to use for your Tailwind CSS utility classes. Components will be added with this prefix.
{
"tailwind": {
"prefix": "tw-"
}
}rsc#
Whether or not to enable support for React Server Components.
The CLI automatically adds a use client directive to client components when set to true.
{
"rsc": `true` | `false`
}tsx#
Choose between TypeScript or JavaScript components.
Setting this option to false allows components to be added as JavaScript with the .jsx file extension.
{
"tsx": `true` | `false`
}aliases#
The CLI uses these values to place generated components in the correct location and rewrite imports.
You can back these aliases with either:
compilerOptions.pathsin yourtsconfig.jsonorjsconfig.jsonpackage.json#importswith TypeScript package import resolution enabled
The aliases in components.json are still required when using the CLI. They tell the CLI which import roots map to components, ui, lib, hooks, and utils.
Important: If you're using package imports, enable
resolvePackageJsonImports and use moduleResolution: "bundler" in your
tsconfig.json. If you're using paths, make sure your aliases include the
src directory when applicable.
Using tsconfig or jsconfig paths#
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}Using package.json#imports#
Recommended setup for a single-package app:
{
"imports": {
"#components/*": "./src/components/*.tsx",
"#lib/*": "./src/lib/*.ts",
"#hooks/*": "./src/hooks/*.ts"
}
}{
"compilerOptions": {
"moduleResolution": "bundler",
"resolvePackageJsonImports": true
}
}{
"aliases": {
"components": "#components",
"ui": "#components/ui",
"lib": "#lib",
"hooks": "#hooks",
"utils": "#lib/utils"
}
}The aliases in components.json still tell the CLI where to place
components, ui, lib, hooks, and utils. package.json#imports
provides the runtime and TypeScript resolution for those #... specifiers.
The matched imports target also controls whether generated #... imports keep
file extensions:
"#components/*": "./src/components/*"preserves source extensions and can generate imports like#components/button.tsx"#components/*": "./src/components/*.tsx"strips source extensions and generates imports like#components/button
Local
workspace aliases can use package.json#imports, while shared workspace
imports such as @workspace/ui/components are resolved from the target
package's exports.
For framework-specific setup, see the package imports guide.
aliases.utils#
Import alias for your utility functions.
{
"aliases": {
"utils": "@/lib/utils"
}
}aliases.components#
Import alias for your components.
{
"aliases": {
"components": "@/components"
}
}aliases.ui#
Import alias for ui components.
The CLI will use the aliases.ui value to determine where to place your ui components. Use this config if you want to customize the installation directory for your ui components.
{
"aliases": {
"ui": "@/app/ui"
}
}aliases.lib#
Import alias for lib functions such as format-date or generate-id.
{
"aliases": {
"lib": "@/lib"
}
}aliases.hooks#
Import alias for hooks such as use-media-query or use-toast.
{
"aliases": {
"hooks": "@/hooks"
}
}registries#
Configure multiple resource registries for your project. This allows you to install components, libraries, utilities, and other resources from various sources including private registries.
See the registry docs for how Dots is served.
Basic configuration#
Configure registries with URL templates:
{
"registries": {
"@dots": "<origin>/r/{name}.json",
"@acme": "https://registry.acme.com/{name}.json",
"@internal": "https://internal.company.com/{name}.json"
}
}The {name} placeholder is replaced with the resource name when installing. <origin> is the site you ran init against, and init already writes the @dots entry for you.
Authentication#
For private registries that require authentication:
{
"registries": {
"@private": {
"url": "https://api.company.com/registry/{name}.json",
"headers": {
"Authorization": "Bearer ${REGISTRY_TOKEN}",
"X-API-Key": "${API_KEY}"
},
"params": {
"version": "latest"
}
}
}
}Environment variables in the format ${VAR_NAME} are automatically expanded from your environment.
Using namespaced registries#
Once configured, install resources using the namespace syntax:
# Install from a configured registry
npx shadcn@latest add @dots/button
# Install from private registry
npx shadcn@latest add @private/button
# Install multiple resources
npx shadcn@latest add @acme/header @internal/auth-utilsExample: several registries#
{
"registries": {
"@dots": "<origin>/r/{name}.json",
"@company-ui": {
"url": "https://registry.company.com/ui/{name}.json",
"headers": {
"Authorization": "Bearer ${COMPANY_TOKEN}"
}
},
"@team": {
"url": "https://team.company.com/{name}.json",
"params": {
"team": "frontend",
"version": "${REGISTRY_VERSION}"
}
}
}
}This configuration allows you to:
- Install Dots components through
@dots - Access private company UI components with authentication
- Use team-specific resources with versioning
On This Page
$schemastyletailwindtailwind.configtailwind.csstailwind.baseColortailwind.cssVariablestailwind.prefixrsctsxaliasesUsingtsconfig or jsconfig pathsUsing package.json#importsaliases.utilsaliases.componentsaliases.uialiases.libaliases.hooksregistriesBasic configurationAuthenticationUsing namespaced registriesExample: several registries