Observation from a downstream project (reference links kept internal): shadcn was initialized in the template but nothing ever used it, so interactive primitives got hand-rolled and diverged (two copies of the same popover, no arrow-key nav / positioning).
The pattern:
- Interactive primitives (menus, switches, dialogs, popovers) come from
bunx shadcn@latest add <component> into src/components/ui/ — committed vendor-style code, restyled at call sites.
- App components compose these; never hand-roll popover/focus/a11y behavior a Radix primitive provides.
- Gotcha to fix in the template:
components.json aliases must match the app's real tsconfig alias (a stale alias breaks the CLI with "Could not resolve the following aliases").
Scope if accepted: fix template components.json aliases, ship one real shadcn component as the seed/example, add an ADR.
Observation from a downstream project (reference links kept internal): shadcn was initialized in the template but nothing ever used it, so interactive primitives got hand-rolled and diverged (two copies of the same popover, no arrow-key nav / positioning).
The pattern:
bunx shadcn@latest add <component>intosrc/components/ui/— committed vendor-style code, restyled at call sites.components.jsonaliases must match the app's real tsconfig alias (a stale alias breaks the CLI with "Could not resolve the following aliases").Scope if accepted: fix template
components.jsonaliases, ship one real shadcn component as the seed/example, add an ADR.