๐Ÿ“ ๅฝ“ๅ‰ไฝ็ฝฎ: ๆžถๆž„ๅ›พ (2/8) | ๅฏผ่ˆช: โ† ไธŠไธ€็ฏ‡: ๆ€ป่งˆ | โ†’ ไธ‹ไธ€็ฏ‡: ๆ ธๅฟƒๅ‘็Žฐ | ๐Ÿ“š ็›ฎๅฝ•


shadcn-ui ๆžถๆž„ๅ›พ#

ๆœฌๆ–‡ๆกฃไฝฟ็”จ Mermaid ๅ›พ่กจๅ’Œ ASCII ๅ›พๆฅๅฏ่ง†ๅŒ– shadcn-ui ็š„ๆžถๆž„่ฎพ่ฎกใ€‚


1. ็ณป็ปŸๆ€ป่งˆ#

graph TB
    subgraph "็”จๆˆท้กน็›ฎ"
        A[็”จๆˆทไปฃ็ ] --> B[components/ui/]
        A --> C[components.json]
    end

    subgraph "shadcn-ui ้กน็›ฎ"
        D[CLI ๅทฅๅ…ท<br/>packages/shadcn] --> E[Registry API]
        F[ๅฎ˜็ฝ‘<br/>apps/v4] --> G[็ป„ไปถๆณจๅ†Œ่กจ<br/>registry/]
        G --> H[public/r/]
    end

    subgraph "ๅค–้ƒจไพ่ต–"
        I[@radix-ui/react-*]
        J[Tailwind CSS]
        K[React Hook Form]
    end

    D -.->|npx shadcn add| B
    D -->|่Žทๅ–็ป„ไปถ| H
    B --> I
    B --> J
    F -->|ๆž„ๅปบ| H
    G -->|build-registry| H

    style A fill:#e1f5ff
    style D fill:#fff4e6
    style F fill:#f3e5f5
    style H fill:#e8f5e9

2. Monorepo ็ป“ๆž„#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    shadcn-ui Monorepo                       โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚   apps/v4/         โ”‚       โ”‚  packages/shadcn/    โ”‚    โ”‚
โ”‚  โ”‚   (Next.js 16)     โ”‚       โ”‚  (CLI ๅทฅๅ…ท)          โ”‚    โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค       โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค    โ”‚
โ”‚  โ”‚ โ€ข app/             โ”‚       โ”‚ โ€ข src/               โ”‚    โ”‚
โ”‚  โ”‚ โ€ข registry/        โ”‚       โ”‚   โ”œโ”€ commands/       โ”‚    โ”‚
โ”‚  โ”‚ โ€ข components/      โ”‚       โ”‚   โ”œโ”€ registry/       โ”‚    โ”‚
โ”‚  โ”‚ โ€ข content/docs/    โ”‚       โ”‚   โ”œโ”€ utils/          โ”‚    โ”‚
โ”‚  โ”‚ โ€ข scripts/         โ”‚       โ”‚   โ””โ”€ mcp/            โ”‚    โ”‚
โ”‚  โ”‚   โ””โ”€ build-        โ”‚       โ”‚ โ€ข dist/              โ”‚    โ”‚
โ”‚  โ”‚     registry.mts   โ”‚       โ”‚   โ””โ”€ index.js        โ”‚    โ”‚
โ”‚  โ”‚ โ€ข public/r/        โ”‚โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”ค                      โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚         โ”‚                              โ”‚                    โ”‚
โ”‚         โ”‚                              โ”‚                    โ”‚
โ”‚         โ–ผ                              โ–ผ                    โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚
โ”‚  โ”‚         packages/tests/                     โ”‚          โ”‚
โ”‚  โ”‚         (้›†ๆˆๆต‹่ฏ•)                           โ”‚          โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
โ”‚                                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
      pnpm workspace + Turbo ๆž„ๅปบ็ฎก้“

3. Registry ็ณป็ปŸๆžถๆž„#

sequenceDiagram
    participant User as ็”จๆˆท็ปˆ็ซฏ
    participant CLI as shadcn CLI
    participant API as Registry API
    participant CDN as ui.shadcn.com/r/
    participant Local as ๆœฌๅœฐ้กน็›ฎ

    User->>CLI: npx shadcn@latest add button
    CLI->>Local: ่ฏปๅ– components.json
    CLI->>API: resolveRegistryDependencies(button)
    API->>CDN: GET /r/styles/new-york-v4/button.json
    CDN-->>API: {files, dependencies, registryDependencies}
    API->>API: ้€’ๅฝ’่งฃๆž registryDependencies
    API-->>CLI: ่ฟ”ๅ›žๅฎŒๆ•ดไพ่ต–ๆ ‘
    CLI->>CLI: ๅˆๅนถ npm ไพ่ต–
    CLI->>User: ๅฎ‰่ฃ… @radix-ui/react-slot
    CLI->>Local: ๅ†™ๅ…ฅ components/ui/button.tsx
    CLI->>Local: ๆ›ดๆ–ฐ components/ui/label.tsx (ไพ่ต–)
    CLI-->>User: โœ“ ็ป„ไปถๆทปๅŠ ๆˆๅŠŸ

4. Registry ๆ•ฐๆฎๆต#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     Registry ๆž„ๅปบๆต็จ‹                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
                            โ–ผ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚  registry/bases/{base}/registry.ts   โ”‚
         โ”‚  (ๅฎšไน‰ๅŸบ็ก€็ป„ไปถๅ’Œ้…็ฝฎ)                 โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
                            โ–ผ
              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ”‚  buildBasesIndex()      โ”‚
              โ”‚  โ€ข ้ชŒ่ฏ Zod schema      โ”‚
              โ”‚  โ€ข ็”Ÿๆˆ __index__.tsx   โ”‚
              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                          โ”‚
                          โ–ผ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚  Base ร— Style ็Ÿฉ้˜ต็ป„ๅˆ         โ”‚
         โ”‚  base-new-york                 โ”‚
         โ”‚  base-los-angeles              โ”‚
         โ”‚  base-miami                    โ”‚
         โ”‚  radix-new-york                โ”‚
         โ”‚  radix-los-angeles             โ”‚
         โ”‚  radix-miami                   โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                     โ”‚
                     โ–ผ
       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ”‚  transformStyle()           โ”‚
       โ”‚  โ€ข ่ฏปๅ– style-*.css         โ”‚
       โ”‚  โ€ข ๅˆ›ๅปบๆ ทๅผๆ˜ ๅฐ„ (styleMap)  โ”‚
       โ”‚  โ€ข AST ่ฝฌๆข className       โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                 โ”‚
                 โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  buildRegistry()           โ”‚
    โ”‚  โ€ข ็”Ÿๆˆ JSON ๆ–‡ไปถ          โ”‚
    โ”‚  โ€ข ๅŽ‹็ผฉๆ–‡ไปถๅ†…ๅฎน            โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚
             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  public/r/styles/{style}/      โ”‚
โ”‚  โ€ข button.json                 โ”‚
โ”‚  โ€ข dialog.json                 โ”‚
โ”‚  โ€ข form.json                   โ”‚
โ”‚  โ€ข ... 55+ ็ป„ไปถ                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚
             โ–ผ
     [CDN / Vercel ้ƒจ็ฝฒ]

5. ็ป„ไปถไพ่ต–ๅ…ณ็ณปๅ›พ#

graph TD
    Dialog[Dialog] --> Button
    Dialog --> Label
    Dialog -.->|npm| RadixDialog[@radix-ui/react-dialog]

    Button -.->|npm| RadixSlot[@radix-ui/react-slot]

    Label -.->|npm| RadixLabel[@radix-ui/react-label]

    Form[Form] --> Button
    Form --> Label
    Form --> Input
    Form -.->|npm| RHF[react-hook-form]
    Form -.->|npm| Zod[zod]

    Input -.->|npm| RadixSlot2[@radix-ui/react-slot]

    Table[Table] --> Badge
    Table --> Button

    DataTable[Data Table] --> Table
    DataTable --> Pagination
    DataTable -.->|npm| TanStack[@tanstack/react-table]

    style Dialog fill:#ffcdd2
    style Form fill:#f8bbd0
    style DataTable fill:#e1bee7
    style Button fill:#c5e1a5
    style Label fill:#c5e1a5
    style Input fill:#c5e1a5

ๅ›พไพ‹๏ผš

  • ๅฎž็บฟ็ฎญๅคด๏ผšregistryDependencies (็ป„ไปถไพ่ต–)
  • ่™š็บฟ็ฎญๅคด๏ผšdependencies (npm ๅŒ…ไพ่ต–)
  • ็ปฟ่‰ฒ๏ผšๅŸบ็ก€็ป„ไปถ
  • ็บข่‰ฒ/็ฒ‰่‰ฒ๏ผšๅคๅˆ็ป„ไปถ

6. ไธ‰ๅฑ‚ไพ่ต–็ณป็ปŸ#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   Dialog ็ป„ไปถไพ่ต–ๆ ‘                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

dialog
โ”œโ”€ dependencies (npm ๅŒ…)
โ”‚  โ””โ”€ @radix-ui/react-dialog@^1.0.5
โ”‚
โ”œโ”€ registryDependencies (็ป„ไปถ)
โ”‚  โ”œโ”€ button
โ”‚  โ”‚  โ””โ”€ dependencies
โ”‚  โ”‚     โ””โ”€ @radix-ui/react-slot@^1.0.2
โ”‚  โ”‚
โ”‚  โ””โ”€ label
โ”‚     โ””โ”€ dependencies
โ”‚        โ””โ”€ @radix-ui/react-label@^2.0.2
โ”‚
โ””โ”€ devDependencies
   โ””โ”€ (ๆ— )

ๅˆๅนถๅŽ็š„ npm ไพ่ต–๏ผš
  โ€ข @radix-ui/react-dialog@^1.0.5
  โ€ข @radix-ui/react-slot@^1.0.2
  โ€ข @radix-ui/react-label@^2.0.2

้œ€่ฆๅคๅˆถ็š„ๆ–‡ไปถ๏ผš
  โ€ข components/ui/dialog.tsx
  โ€ข components/ui/button.tsx
  โ€ข components/ui/label.tsx

7. CLI ๅทฅไฝœๆต็จ‹#

stateDiagram-v2
    [*] --> Init: npx shadcn@latest init

    Init --> ConfigCreated: ๅˆ›ๅปบ components.json
    ConfigCreated --> TailwindSetup: ๅฎ‰่ฃ… Tailwind CSS
    TailwindSetup --> CSSVarsSetup: ้…็ฝฎ CSS ๅ˜้‡
    CSSVarsSetup --> PathAliasSetup: ่ฎพ็ฝฎ่ทฏๅพ„ๅˆซๅ
    PathAliasSetup --> Ready: ๅˆๅง‹ๅŒ–ๅฎŒๆˆ

    Ready --> Add: npx shadcn@latest add [component]

    Add --> ResolveDeps: ่งฃๆžไพ่ต–
    ResolveDeps --> DownloadFiles: ไธ‹่ฝฝๆ–‡ไปถ
    DownloadFiles --> InstallNpm: ๅฎ‰่ฃ… npm ๅŒ…
    InstallNpm --> UpdateConfig: ๆ›ดๆ–ฐ้…็ฝฎ
    UpdateConfig --> WriteFiles: ๅ†™ๅ…ฅๆ–‡ไปถ
    WriteFiles --> ComponentAdded: ็ป„ไปถๆทปๅŠ ๆˆๅŠŸ

    ComponentAdded --> Diff: npx shadcn@latest diff [component]
    Diff --> CompareVersions: ๅฏนๆฏ”ๆœฌๅœฐไธŽ่ฟœ็จ‹
    CompareVersions --> ShowDiff: ๆ˜พ็คบๅทฎๅผ‚
    ShowDiff --> Ready: ๅ†ณๅฎšๆ˜ฏๅฆๆ›ดๆ–ฐ

    ComponentAdded --> Ready
    Ready --> [*]

8. ็ฝ‘็ซ™่ทฏ็”ฑๆžถๆž„#

apps/v4/app/
โ”‚
โ”œโ”€โ”€ (app)/                          # ไธปๅบ”็”จ่ทฏ็”ฑ็ป„
โ”‚   โ”œโ”€โ”€ page.tsx                    # ้ฆ–้กต
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ docs/[[...slug]]/          # ๆ–‡ๆกฃ็ณป็ปŸ
โ”‚   โ”‚   โ””โ”€โ”€ page.tsx               # ๅŠจๆ€ๆ–‡ๆกฃ้กต้ข
โ”‚   โ”‚       โ”œโ”€ /docs/installation
โ”‚   โ”‚       โ”œโ”€ /docs/components/button
โ”‚   โ”‚       โ””โ”€ /docs/...
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ blocks/                     # Block ๅฑ•็คบ
โ”‚   โ”‚   โ”œโ”€โ”€ page.tsx               # Block ๅˆ—่กจ
โ”‚   โ”‚   โ””โ”€โ”€ [name]/
โ”‚   โ”‚       โ””โ”€โ”€ page.tsx           # ๅ•ไธช Block
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ charts/                     # ๅ›พ่กจ็คบไพ‹
โ”‚   โ”‚   โ””โ”€โ”€ [type]/
โ”‚   โ”‚       โ””โ”€โ”€ page.tsx
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ examples/                   # ๅฎŒๆ•ด็คบไพ‹
โ”‚       โ””โ”€โ”€ [name]/
โ”‚           โ””โ”€โ”€ page.tsx
โ”‚
โ”œโ”€โ”€ (view)/                         # ้ข„่งˆ่ทฏ็”ฑ็ป„ (iframe)
โ”‚   โ””โ”€โ”€ view/[style]/[name]/
โ”‚       โ””โ”€โ”€ page.tsx               # ็ป„ไปถ้š”็ฆป้ข„่งˆ
โ”‚
โ”œโ”€โ”€ (create)/                       # ๅˆ›ๅปบๅ‘ๅฏผ
โ”‚   โ””โ”€โ”€ create/[...slug]/
โ”‚       โ””โ”€โ”€ page.tsx
โ”‚
โ””โ”€โ”€ api/                            # API ่ทฏ็”ฑ
    โ””โ”€โ”€ og/                         # Open Graph ๅ›พ็‰‡
        โ””โ”€โ”€ route.ts

9. ็ป„ไปถ้ข„่งˆ็ณป็ปŸ#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚               ComponentPreview ๆธฒๆŸ“็ญ–็•ฅ                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚ type ๅˆคๆ–ญ   โ”‚
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚                               โ”‚
         โ–ผ                               โ–ผ
    type="block"                   type="component"
         โ”‚                               โ”‚
         โ–ผ                               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   ็งปๅŠจ็ซฏ้ข„่งˆ     โ”‚            โ”‚   ๅฎžๆ—ถๆธฒๆŸ“       โ”‚
โ”‚   โ€ข PNG ๅ›พ็‰‡     โ”‚            โ”‚   โ€ข <Component/> โ”‚
โ”‚     (light/dark) โ”‚            โ”‚   โ€ข ไปฃ็ ้ซ˜ไบฎ     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜            โ”‚   โ€ข ๅคๅˆถๆŒ‰้’ฎ     โ”‚
         +                      โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚   ๆกŒ้ข็ซฏ้ข„่งˆ     โ”‚
โ”‚   โ€ข iframe       โ”‚
โ”‚   โ€ข ๅฎŒๅ…จ้š”็ฆป     โ”‚
โ”‚   โ€ข ็‹ฌ็ซ‹ๆ ทๅผ     โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

10. ๆž„ๅปบ็ฎก้“#

graph LR
    A[pnpm build] --> B{Turbo ๅนถ่กŒๆ‰ง่กŒ}

    B --> C[packages/shadcn]
    C --> C1[tsup ๆž„ๅปบ]
    C1 --> C2[็”Ÿๆˆ dist/]
    C2 --> C3[ๅคšๅ…ฅๅฃ็‚นๅฏผๅ‡บ]

    B --> D[apps/v4]
    D --> D1[registry:build]
    D1 --> D2[build-registry.mts]
    D2 --> D3[็”Ÿๆˆ public/r/]
    D3 --> D4[next build]
    D4 --> D5[้™ๆ€็”Ÿๆˆ]

    C3 --> E[ๅฎŒๆˆ]
    D5 --> E

    style A fill:#e3f2fd
    style E fill:#c8e6c9

11. ็ผ“ๅญ˜็ญ–็•ฅ#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    ๅŒๅฑ‚็ผ“ๅญ˜ๆžถๆž„                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Registry ็ผ“ๅญ˜           โ”‚
โ”‚  โ€ข LRU (max: 500)        โ”‚
โ”‚  โ€ข TTL: 5 ๅˆ†้’Ÿ           โ”‚
โ”‚  โ€ข Key: style:name       โ”‚
โ”‚  โ€ข ็ผ“ๅญ˜ๅฎŒๆ•ด็ป„ไปถๆ•ฐๆฎ      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚
             โ–ผ
    [getRegistryItem()]
             โ”‚
             โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ไปฃ็ ้ซ˜ไบฎ็ผ“ๅญ˜            โ”‚
โ”‚  โ€ข LRU (max: 500)        โ”‚
โ”‚  โ€ข TTL: 1 ๅฐๆ—ถ           โ”‚
โ”‚  โ€ข Key: sha256(code+lang)โ”‚
โ”‚  โ€ข ็ผ“ๅญ˜ HTML ้ซ˜ไบฎ็ป“ๆžœ    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
             โ”‚
             โ–ผ
    [highlightCode()]
             โ”‚
             โ–ผ
      [่ฟ”ๅ›ž้ซ˜ไบฎ็š„ HTML]

12. ไธป้ข˜็ณป็ปŸ#

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    CSS ๅ˜้‡ๅฑ‚ๆฌก                          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

:root (ๅ…จๅฑ€)
โ”œโ”€ --background: 0 0% 100%
โ”œโ”€ --foreground: 240 10% 3.9%
โ”œโ”€ --primary: 240 5.9% 10%
โ”œโ”€ --primary-foreground: 0 0% 98%
โ”œโ”€ --secondary: 240 4.8% 95.9%
โ”œโ”€ --muted: 240 4.8% 95.9%
โ”œโ”€ --accent: 240 4.8% 95.9%
โ”œโ”€ --destructive: 0 84.2% 60.2%
โ”œโ”€ --border: 240 5.9% 90%
โ”œโ”€ --input: 240 5.9% 90%
โ”œโ”€ --ring: 240 5.9% 10%
โ”œโ”€ --chart-1 ~ --chart-5
โ””โ”€ --radius: 0.5rem

        โ”‚
        โ–ผ
@media (prefers-color-scheme: dark)
โ”œโ”€ --background: 240 10% 3.9%
โ”œโ”€ --foreground: 0 0% 98%
โ””โ”€ ... (ๆ‰€ๆœ‰้ขœ่‰ฒๅ่ฝฌ)

        โ”‚
        โ–ผ
tailwind.config.ts ๆ˜ ๅฐ„
โ”œโ”€ background: "hsl(var(--background))"
โ”œโ”€ foreground: "hsl(var(--foreground))"
โ”œโ”€ primary: {
โ”‚    DEFAULT: "hsl(var(--primary))",
โ”‚    foreground: "hsl(var(--primary-foreground))"
โ”‚  }
โ””โ”€ ...

        โ”‚
        โ–ผ
Tailwind ็ฑปๅ
โ”œโ”€ bg-background
โ”œโ”€ text-foreground
โ”œโ”€ bg-primary
โ”œโ”€ text-primary-foreground
โ””โ”€ ...

13. Form ็ณป็ปŸ Context ๆžถๆž„#

graph TD
    A[FormProvider<br/>react-hook-form] --> B[Form ็ป„ไปถ]

    B --> C[FormField]
    C --> D[FormFieldContext<br/>ๆŽงๅˆถๅญ—ๆฎตๅ]

    D --> E[FormItem]
    E --> F[FormItemContext<br/>็ฎก็† ID]

    F --> G[FormLabel]
    F --> H[FormControl]
    F --> I[FormDescription]
    F --> J[FormMessage]

    H --> K[Input / Select / Textarea]

    style A fill:#ffccbc
    style B fill:#ffccbc
    style C fill:#ffe0b2
    style E fill:#ffe0b2
    style D fill:#fff9c4
    style F fill:#fff9c4
    style G fill:#c5e1a5
    style H fill:#c5e1a5
    style I fill:#c5e1a5
    style J fill:#c5e1a5
    style K fill:#80deea

ARIA ่‡ชๅŠจๅ…ณ่”๏ผš

FormControl (id="field-form-item")
    โ†“
aria-describedby="field-form-item-description field-form-item-message"
    โ†“
FormDescription (id="field-form-item-description")
FormMessage (id="field-form-item-message")

14. CVA ๅ˜ไฝ“็ณป็ปŸ#

buttonVariants
    โ”‚
    โ”œโ”€ baseClasses (ๅง‹็ปˆๅบ”็”จ)
    โ”‚  "inline-flex items-center ..."
    โ”‚
    โ””โ”€ variants
       โ”‚
       โ”œโ”€ variant ่ฝด
       โ”‚  โ”œโ”€ default     โ†’ bg-primary text-primary-foreground
       โ”‚  โ”œโ”€ destructive โ†’ bg-destructive text-white
       โ”‚  โ”œโ”€ outline     โ†’ border bg-background
       โ”‚  โ”œโ”€ secondary   โ†’ bg-secondary text-secondary-foreground
       โ”‚  โ”œโ”€ ghost       โ†’ hover:bg-accent
       โ”‚  โ””โ”€ link        โ†’ text-primary underline
       โ”‚
       โ””โ”€ size ่ฝด
          โ”œโ”€ default   โ†’ h-9 px-4 py-2
          โ”œโ”€ sm        โ†’ h-8 px-3
          โ”œโ”€ lg        โ†’ h-10 px-6
          โ”œโ”€ icon      โ†’ size-9
          โ”œโ”€ icon-sm   โ†’ size-8
          โ””โ”€ icon-lg   โ†’ size-10

็ป„ๅˆ็คบไพ‹๏ผš
buttonVariants({ variant: "destructive", size: "lg" })
    โ†“
"inline-flex items-center ... bg-destructive text-white h-10 px-6"

15. MCP (Model Context Protocol) ้›†ๆˆ#

sequenceDiagram
    participant AI as AI ๅŠฉๆ‰‹
    participant MCP as MCP ๆœๅŠกๅ™จ<br/>packages/shadcn/src/mcp
    participant CLI as shadcn CLI
    participant Project as ็”จๆˆท้กน็›ฎ

    AI->>MCP: ่ฐƒ็”จ add_component ๅทฅๅ…ท
    MCP->>CLI: ๆ‰ง่กŒ add ๅ‘ฝไปค
    CLI->>Project: ๆทปๅŠ ็ป„ไปถ
    Project-->>CLI: ๆˆๅŠŸ
    CLI-->>MCP: ่ฟ”ๅ›ž็ป“ๆžœ
    MCP-->>AI: ็ป„ไปถๅทฒๆทปๅŠ 
    AI-->>AI: ็ปง็ปญๅฏน่ฏ

MCP ๅทฅๅ…ทๅˆ—่กจ๏ผš

packages/shadcn/src/mcp/tools.ts
โ”œโ”€ add_component        # ๆทปๅŠ ็ป„ไปถ
โ”œโ”€ init_project         # ๅˆๅง‹ๅŒ–้กน็›ฎ
โ”œโ”€ diff_component       # ๆŸฅ็œ‹ๅทฎๅผ‚
โ”œโ”€ list_components      # ๅˆ—ๅ‡บๅฏ็”จ็ป„ไปถ
โ””โ”€ get_component_info   # ่Žทๅ–็ป„ไปถไฟกๆฏ

ๆ€ป็ป“#

shadcn-ui ็š„ๆžถๆž„่ฎพ่ฎกไฝ“็Žฐไบ†ไปฅไธ‹็‰น็‚น๏ผš

  1. ๆธ…ๆ™ฐ็š„ๅˆ†ๅฑ‚: Monorepo ็ป“ๆž„ๆธ…ๆ™ฐๅˆ†็ฆป CLIใ€ๅฎ˜็ฝ‘ใ€ๆต‹่ฏ•
  2. ็ตๆดป็š„ Registry: ๆ”ฏๆŒๅคšๆบใ€ๅคš้ฃŽๆ ผใ€็‰ˆๆœฌ็ฎก็†
  3. ๅผบๅคง็š„ไพ่ต–่งฃๆž: ไธ‰ๅฑ‚ไพ่ต–็ณป็ปŸ่‡ชๅŠจๅค„็†ๅคๆ‚ไพ่ต–
  4. ้ซ˜ๆ€ง่ƒฝ: ๅŒๅฑ‚ LRU ็ผ“ๅญ˜ + React.lazy + Turbopack
  5. ๅผ€ๅ‘่€…ๅ‹ๅฅฝ: CLI + ๆ–‡ๆกฃ + MCP + ่ฏฆ็ป†็คบไพ‹
  6. ็ŽฐไปฃๅŒ–ๆŠ€ๆœฏๆ ˆ: Next.js 16 + React 19 + TypeScript 5.5 + Tailwind 4

่ฟ™ๅฅ—ๆžถๆž„ไธบๆž„ๅปบ็ฑปไผผ็š„็ป„ไปถๅˆ†ๅ‘็ณป็ปŸๆไพ›ไบ†ๅฎŒๆ•ด็š„ๅ‚่€ƒ่Œƒไพ‹ใ€‚