mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-30 16:14:13 +00:00
* feat(monorepo): use tailwindcss v4 in monorepo example * feat(shadcn): add monorepo tailwind detection * feat: update default monorepo template * fix: minor fixes * chore(shadcn): changeset * docs(www): update monorepo docs * docs: updates --------- Co-authored-by: shadcn <m@shadcn.com>
230 lines
6.0 KiB
Plaintext
230 lines
6.0 KiB
Plaintext
---
|
||
title: Monorepo
|
||
description: Using shadcn/ui components and CLI in a monorepo.
|
||
---
|
||
|
||
Until now, using shadcn/ui in a monorepo was a bit of a pain. You could add
|
||
components using the CLI, but you had to manage where the components
|
||
were installed and manually fix import paths.
|
||
|
||
With the new monorepo support in the CLI, we've made it a lot easier to use
|
||
shadcn/ui in a monorepo.
|
||
|
||
The CLI now understands the monorepo structure and will install the components,
|
||
dependencies and registry dependencies to the correct paths and handle imports
|
||
for you.
|
||
|
||
## Getting started
|
||
|
||
<Steps>
|
||
|
||
### Create a new monorepo project
|
||
|
||
To create a new monorepo project, run the `init` command. You will be prompted
|
||
to select the type of project you are creating.
|
||
|
||
```bash
|
||
npx shadcn@canary init
|
||
```
|
||
|
||
Select the `Next.js (Monorepo)` option.
|
||
|
||
```bash
|
||
? Would you like to start a new project?
|
||
Next.js
|
||
❯ Next.js (Monorepo)
|
||
```
|
||
|
||
This will create a new monorepo project with two workspaces: `web` and `ui`,
|
||
and [Turborepo](https://turbo.build/repo/docs) as the build system.
|
||
|
||
Everything is set up for you, so you can start adding components to your project.
|
||
|
||
Note: The monorepo uses React 19 and Tailwind CSS v4.
|
||
|
||
### Add components to your project
|
||
|
||
To add components to your project, run the `add` command **in the path of your app**.
|
||
|
||
```bash
|
||
cd apps/web
|
||
```
|
||
|
||
```bash
|
||
npx shadcn@canary add [COMPONENT]
|
||
```
|
||
|
||
The CLI will figure out what type of component you are adding and install the
|
||
correct files to the correct path.
|
||
|
||
For example, if you run `npx shadcn@canary add button`, the CLI will install the button component under `packages/ui` and update the import path for components in `apps/web`.
|
||
|
||
If you run `npx shadcn@canary add login-01`, the CLI will install the `button`, `label`, `input` and `card` components under `packages/ui` and the `login-form` component under `apps/web/components`.
|
||
|
||
### Importing components
|
||
|
||
You can import components from the `@workspace/ui` package as follows:
|
||
|
||
```tsx
|
||
import { Button } from "@workspace/ui/components/button"
|
||
```
|
||
|
||
You can also import hooks and utilities from the `@workspace/ui` package.
|
||
|
||
```tsx
|
||
import { useTheme } from "@workspace/ui/hooks/use-theme"
|
||
import { cn } from "@workspace/ui/lib/utils"
|
||
```
|
||
|
||
</Steps>
|
||
|
||
## File Structure
|
||
|
||
When you create a new monorepo project, the CLI will create the following file structure:
|
||
|
||
```txt
|
||
apps
|
||
└── web # Your app goes here.
|
||
├── app
|
||
│ └── page.tsx
|
||
├── components
|
||
│ └── login-form.tsx
|
||
├── components.json
|
||
└── package.json
|
||
packages
|
||
└── ui # Your components and dependencies are installed here.
|
||
├── src
|
||
│ ├── components
|
||
│ │ └── button.tsx
|
||
│ ├── hooks
|
||
│ ├── lib
|
||
│ │ └── utils.ts
|
||
│ └── styles
|
||
│ └── globals.css
|
||
├── components.json
|
||
└── package.json
|
||
package.json
|
||
turbo.json
|
||
```
|
||
|
||
## Requirements
|
||
|
||
1. Every workspace must have a `components.json` file. A `package.json` file tells npm how to install the dependencies. A `components.json` file tells the CLI how and where to install components.
|
||
|
||
2. The `components.json` file must properly define aliases for the workspace. This tells the CLI how to import components, hooks, utilities, etc.
|
||
|
||
<Tabs defaultValue="v4">
|
||
|
||
<TabsList>
|
||
<TabsTrigger value="v4">Tailwind CSS v4</TabsTrigger>
|
||
<TabsTrigger value="v3">Tailwind CSS v3</TabsTrigger>
|
||
</TabsList>
|
||
|
||
<TabsContent value="v4">
|
||
|
||
```json showLineNumbers title="apps/web/components.json"
|
||
{
|
||
"$schema": "https://ui.shadcn.com/schema.json",
|
||
"style": "new-york",
|
||
"rsc": true,
|
||
"tsx": true,
|
||
"tailwind": {
|
||
"config": "",
|
||
"css": "../../packages/ui/src/styles/globals.css",
|
||
"baseColor": "zinc",
|
||
"cssVariables": true
|
||
},
|
||
"iconLibrary": "lucide",
|
||
"aliases": {
|
||
"components": "@/components",
|
||
"hooks": "@/hooks",
|
||
"lib": "@/lib",
|
||
"utils": "@workspace/ui/lib/utils",
|
||
"ui": "@workspace/ui/components"
|
||
}
|
||
}
|
||
```
|
||
|
||
```json showLineNumbers title="packages/ui/components.json"
|
||
{
|
||
"$schema": "https://ui.shadcn.com/schema.json",
|
||
"style": "new-york",
|
||
"rsc": true,
|
||
"tsx": true,
|
||
"tailwind": {
|
||
"config": "",
|
||
"css": "src/styles/globals.css",
|
||
"baseColor": "zinc",
|
||
"cssVariables": true
|
||
},
|
||
"iconLibrary": "lucide",
|
||
"aliases": {
|
||
"components": "@workspace/ui/components",
|
||
"utils": "@workspace/ui/lib/utils",
|
||
"hooks": "@workspace/ui/hooks",
|
||
"lib": "@workspace/ui/lib",
|
||
"ui": "@workspace/ui/components"
|
||
}
|
||
}
|
||
```
|
||
|
||
</TabsContent>
|
||
|
||
<TabsContent value="v3">
|
||
|
||
```json showLineNumbers title="apps/web/components.json"
|
||
{
|
||
"$schema": "https://ui.shadcn.com/schema.json",
|
||
"style": "new-york",
|
||
"rsc": true,
|
||
"tsx": true,
|
||
"tailwind": {
|
||
"config": "../../packages/ui/tailwind.config.ts",
|
||
"css": "../../packages/ui/src/styles/globals.css",
|
||
"baseColor": "zinc",
|
||
"cssVariables": true
|
||
},
|
||
"iconLibrary": "lucide",
|
||
"aliases": {
|
||
"components": "@/components",
|
||
"hooks": "@/hooks",
|
||
"lib": "@/lib",
|
||
"utils": "@workspace/ui/lib/utils",
|
||
"ui": "@workspace/ui/components"
|
||
}
|
||
}
|
||
```
|
||
|
||
```json showLineNumbers title="packages/ui/components.json"
|
||
{
|
||
"$schema": "https://ui.shadcn.com/schema.json",
|
||
"style": "new-york",
|
||
"rsc": true,
|
||
"tsx": true,
|
||
"tailwind": {
|
||
"config": "tailwind.config.ts",
|
||
"css": "src/styles/globals.css",
|
||
"baseColor": "zinc",
|
||
"cssVariables": true
|
||
},
|
||
"iconLibrary": "lucide",
|
||
"aliases": {
|
||
"components": "@workspace/ui/components",
|
||
"utils": "@workspace/ui/lib/utils",
|
||
"hooks": "@workspace/ui/hooks",
|
||
"lib": "@workspace/ui/lib",
|
||
"ui": "@workspace/ui/components"
|
||
}
|
||
}
|
||
```
|
||
|
||
</TabsContent>
|
||
|
||
</Tabs>
|
||
|
||
3. Ensure you have the same `style`, `iconLibrary` and `baseColor` in both `components.json` files.
|
||
|
||
4. **For Tailwind CSS v4, leave the `tailwind` config empty in the `components.json` file.**
|
||
|
||
By following these requirements, the CLI will be able to install ui components, blocks, libs and hooks to the correct paths and handle imports for you.
|