component-system-shadcn-radixlisted
Install: claude install-skill BenMacDeezy/Orns-Forge
<!-- last-verified: 2026-07 -->
# Component system: shadcn/ui + Radix
Default posture for any new interactive component: **install from a registry,
own the code, restyle the tokens** — do not hand-roll a dialog/menu/combobox
from raw `<div>`s. shadcn distributes the source into the repo; Radix supplies
the unstyled, accessible behavior underneath. You get to keep and edit the code
without an opaque dependency.
## shadcn/ui is a code distributor, not an npm dependency
You do not `import { Button } from "shadcn"`. The CLI copies component **source
files** into the project (typically `components/ui/`), and from then on they are
your files to edit. Core commands (`pnpm dlx shadcn@latest …`, or the npm/yarn/bun
equivalent):
- `init` — scaffold `components.json`, CSS variables, and the `cn()` util.
- `add <name>` — vendor a component's source into the repo (e.g. `add button dialog`).
- `view <name>` — inspect a registry item's files/deps before installing.
- `search <query>` — find items across configured registries.
Because it is copy-in source, upgrades are diffs you review, not version bumps
you pray over. Never re-fetch and clobber a component the project has since
customized — treat a vendored file as owned code.
## registry.json turns any repo into a component source
A `registry.json` (schema at `ui.shadcn.com/schema/registry.json`) plus item
JSON files makes **any** repo a shadcn registry the CLI can install from. This is
how you ship an internal component library: p