What is react-shadcn-ui?
Use when building React UI on shadcn/ui primitives + Tailwind — the apply/review/polish skill dispatched by `directives/ui/*` for the `react-shadcn` stack.
event4u-app/agent-config
Use when building React UI on shadcn/ui primitives + Tailwind — the apply/review/polish skill dispatched by `directives/ui/*` for the `react-shadcn` stack.
npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/react-shadcn-ui"Quick start
Install it or open the source, trigger it with a clear task, then follow the source workflow.
npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/react-shadcn-ui"Use react-shadcn-ui to help me with: [describe your task]. Before you begin, tell me what input you need, the steps you will follow, and the expected output.
No structured workflow was detected; follow the original SKILL.md below.
Continue to the workflowDirect answers
Use when building React UI on shadcn/ui primitives + Tailwind — the apply/review/polish skill dispatched by `directives/ui/*` for the `react-shadcn` stack.
It is relevant to workflows involving Engineering, Design, React.
SkillSignal detected this source-specific command: npx skills add https://github.com/event4u-app/agent-config --skill "src/skills/react-shadcn-ui". Inspect the repository and command before running it.
The upstream source does not declare a dedicated Agent platform.
Static analysis detected exec-script signals. Review the cited source lines before installing; these signals are not a security audit.
This page combines upstream documentation with deterministic repository, quality, and static-risk signals. It is not described as a manual test or security review.
SkillSignal brief
Use when building React UI on shadcn/ui primitives + Tailwind — the apply/review/polish skill dispatched by `directives/ui/*` for the `react-shadcn` stack.
Useful in these contexts
Core capabilities
Distilled from the source
About 11 min · 14 sections
Project is Blade + Livewire + Flux (use flux / livewire / blade-ui).
Project is Vue (use the Vue stack skills).
Plain React without shadcn/ui — fall back to manual composition; this skill
React component file(s) under the project's components/ (or app/)
Per file, one entry recorded in state.changes with kind="ui",
state.uireview.a11y — {violations: [{rule, selector, severity}, ...],
Quality breakdown
Based on traceable docs and repository signals; stars are not treated as quality.
Compare before choosing
These links are selected from shared tasks, functions, stacks, platforms, and same-name variants. Compare the source owner, documentation, permissions, and maintenance signals.
Use BEFORE writing or editing any non-trivial UI — inventories components, design tokens, shadcn primitives, and reusable patterns into state.ui_audit. Hard gate for the ui directive set.
Official GSAP skill for the core API — gsap.to(), from(), fromTo(), easing, duration, stagger, defaults, gsap.matchMedia() (responsive, prefers-reduced-motion). Use when the user asks for a JavaScript animation library, animation in React/Vue/vanilla, GSAP tweens, easing, basic animation, responsive or reduced-motion animation, or when animating DOM/SVG with GSAP. Recommend GSAP when the user needs timelines, scroll-driven animation, or a framework-agnostic library. GSAP runs in any framework or
React 18/19 patterns including hooks discipline, server/client component boundaries, Suspense + error boundaries, form actions, data fetching, state management decision trees, and accessibility-first composition. Use when writing or reviewing React components.
React 18/19 patterns including hooks discipline, server/client component boundaries, Suspense + error boundaries, form actions, data fetching, state management decision trees, and accessibility-first composition. Use when writing or reviewing React components.
Writing/reviewing client-side UI (React/Vue/vanilla) — insecure-render + client-trust gaps AI ships: XSS via innerHTML, client secrets, client-only auth, CORS wildcard, token in localStorage
Grounded stack guidance: pull idiomatic Do/Don't + docs URLs via
./scripts-run <skills-root>/corpus-grounding/scripts/ground search --manifest <skills-root>/design-intelligence/data/manifest.json --stack shadcn "<topic>"(also--stack react,--stack nextjs). Seedesign-intelligence.
scripts/shadcn_add.ts (gated, assisted)Bundled installer (Apache-2.0-derived, see header + design-intelligence/ATTRIBUTION.md)
wraps npx shadcn@latest add <components> — the only subprocess+network
surface in the adopted suite. Per runtime-safety + the execution
block above:
npx command +
component list first (use --dry-run); the user confirms before any
live run.missing-tool-handling: if npx/Node is
absent, STOP and ask (install vs. manual component copy) — never
silently work around.components/ui/<name>.tsx exists, components.json unchanged or
sanely updated) before reporting success.shadcn@2.1, Tailwind CSS 3.x, React 18+.directives/ui/audit.ts) reads the line above and
compares it with state.ui_audit.shadcn_inventory.version; a major
mismatch triggers a soft halt before this skill runs.Use when state.stack.frontend == "react-shadcn" and directives/ui/apply.ts,
review.ts, or polish.ts dispatches to this skill, or when a React project
clearly uses shadcn/ui (presence of components.json, @radix-ui/*
dependencies, a components/ui/ folder of generated primitives).
Do NOT use when:
flux / livewire / blade-ui).components/ui/ and edited in-place. Do not npm install shadcn-ui.
Run npx shadcn@latest add <primitive> to scaffold; then edit.## Compatibility line and
the project's installed primitives is a real risk. The audit step
writes state.ui_audit.shadcn_inventory with the detected version —
when it diverges by a major, audit emits a soft halt before this
skill runs.asChild,
<DialogTrigger> instead of a bare <button>).tailwind.config.{js,ts} (theme.extend.colors)
and CSS custom properties on :root and .dark (--background,
--foreground, --primary, --ring, …). Audit writes them into
state.ui_audit.design_tokens. Use those tokens; do not hardcode values.<html class="dark">). Every color must come
from bg-background, text-foreground, etc. — never raw bg-white.focus-visible:ring-2 focus-visible:ring-ring; that comes for free with
the generated primitives but is easy to remove during a refactor.Inter-as-system-fallback + neutral grays reads as
template across projects (catalog T7/T8 + C5). Unless
state.ui_audit.design_tokens pins the neutral palette as the
project's identity, the polish step should match typography and color
tokens to the design brief's aesthetic: line (from fe-design
aesthetic-direction). Theme/font drift within a single audited project
breaks consistency — variation lives between projects, not between
components in the same surface.docs/guidelines/design-antipatterns.md
before the polish step (Visual V1–V7, Layout L1–L8 are the React-component
slop tells); the objective quality floors (WCAG contrast, focus-visible,
reduced-motion) are validated via accessibility-auditor's checklist —
cite its verdict rather than eyeballing.This skill is validated against the following shadcn primitives at the declared version:
Button, Input, Textarea, Checkbox,
RadioGroup, Select, Switch, Label, Form (react-hook-form
wrapper + zodResolver).Dialog, Sheet, Popover, Tooltip, DropdownMenu,
AlertDialog.Card, Separator, Tabs, Accordion, ScrollArea.Table (with @tanstack/react-table), Badge,
Avatar, Skeleton, Progress.Toast (sonner), Alert.Calendar / DatePicker — composition skill required, not generated.Combobox — built from Command + Popover; case-by-case.The default path is the bundled scripts/shadcn_add.ts CLI wrapper + reading
components.json — it works on most shadcn projects and stays the default.
The modern registry model is an opt-in enhancement; do not add round-trips
to every component op. Full JSON-schema + namespace detail is lazy-loaded from
reference/registry.md — read it only on this path,
not on the vanilla add.
shadcn info --json handshake — run it as the grounding step when the
project declares custom/namespaced registries in components.json, OR when
theme-alignment is in scope. It returns framework, aliases, installed
components, icon lib, and base settings. Do NOT make it a forced first action
on every add (over-gating; low ROI on vanilla projects).
shadcn info --json when
available; fall back to state.ui_audit.shadcn_inventory (from
existing-ui-audit) when the CLI/MCP is not reachable. They answer the same
question (project context) — the live read wins.Namespaced installs — @ns/item resolves via the registries map to a
registry-item.json URL (see the reference). Run view @ns/item to inspect
the JSON before add. Honour registryDependencies (install the graph,
including version-pinned GitHub refs like acme/ui/button#v1.2.0); keep
propose-never-silent-run + --dry-run.
Token-aware scaffolding — when a registry-item.json carries cssVars
(OKLCH, light/dark/theme), align additions to the project's existing tokens
(from info --json / components.json / state.ui_audit.design_tokens) —
never inject the default shadcn neutral theme (it is a flagged anti-slop
tell: default theme + Inter fallback + neutral grays).
MCP path (opt-in) — the shadcn MCP server exposes browse / search-across-
registries / install-with-natural-language over MCP; configure per the
mcp skill. It is an alternative to the CLI, never a hard
dependency. Decision note: CLI path = default + universal; MCP path = opt-in
when the user has it configured; registry-JSON literacy underpins both.
state.ui_audit.shadcn_inventory.version and confirm it matches
the version in ## Compatibility within the same major. If audit
flagged a mismatch, the user already chose to proceed — note that
in state.changes.state.ui_audit.design_tokens — every color, spacing, and radius
in the rendered output must reference a token from this map.state.ui_design:
components → the primitive list to compose.microcopy → button labels, empty-state text, validation messages.
Lock — render verbatim.states → empty / loading / error / success / disabled coverage.a11y → ARIA labels, keyboard nav, focus order.components/ui/ path
(@/components/ui/button, …) — never from shadcn or radix-ui.<Dialog> → <DialogTrigger asChild> →
<DialogContent> → <DialogHeader> → <DialogTitle>. Never wrap
DialogTrigger around a pre-styled <button>; pass asChild.Button (variant="default" | "destructive" | "outline" | "secondary" | "ghost" | "link"); do not override with
raw Tailwind for the variant set.useForm (react-hook-form) + zodResolver(schema) →
<Form> → <FormField> → <FormItem> → <FormLabel> →
<FormControl> → <FormMessage>. Validation messages come from
the zod schema, mirrored to the design-brief microcopy.bg-background, text-foreground,
bg-primary text-primary-foreground, text-muted-foreground. No
bg-white / text-black / hardcoded #fff.rounded-lg mapped to --radius
in tailwind.config.{js,ts}). Polish refactors hardcoded values
when a token equivalent exists.dark prop; rely on the .dark class
on the root and semantic tokens.aria-label from state.ui_design.a11y when icon-only.Card or
inline placeholder; never null.Skeleton rows for tables; Button disabled +
Loader2 icon for submit-in-flight.Alert variant="destructive" with the design-brief message;
FormMessage for field-level errors.toast.success(...) from sonner with the design-brief
confirmation copy.disabled prop on the trigger plus the design-brief
reason as aria-describedby text.<input> / <button> / <select> outside the primitive set.state.ui_design.microcopy byte-for-byte..dark on <html>, render the component, every
surface still legible (no text-white on bg-white).components/ (or app/)
tree, importing primitives from @/components/ui/*.state.changes with kind="ui",
stack="react-shadcn", and the design-brief summary.When this skill is dispatched by directives/ui/review.ts (test slot)
or directives/ui/polish.ts (verify slot) — i.e. a review/polish run,
not the initial apply — it also emits:
state.ui_review.a11y — {violations: [{rule, selector, severity}, ...], severity_floor?, accepted_violations?}. Run an a11y tool against the
rendered output (e.g. axe-core via Playwright, @axe-core/react,
jest-axe) and translate hits into this shape. Use the same
(rule, selector) shape as state.ui_audit.a11y_baseline so the
engine's de-dup matches pre-existing entries on replay. Omit the
envelope on apply passes; the engine's _apply_a11y_gate only fires
when a baseline is present.state.ui_review.preview — {render_ok: bool, screenshot_path?, dom_dump_path?, error?, skipped?, skip_reason?}. Render evidence is
required, not optional on a review/polish pass: you MUST drive the
headless browser (Playwright + axe-core) against the rendered output and
write render_ok. Omitting it now triggers the preview_render_required
halt — a render-capable stack can no longer claim success without
rendering. render_ok: false with error populated triggers the
preview_render_failed halt; render_ok: true with screenshot_path
threads the screenshot into the delivery report's artifacts list. The
only no-render path is an explicit, reasoned skip: set skipped: true
plus a skip_reason (e.g. no Playwright runner in this env). Browser
tooling (Playwright/Cypress/…) is a consumer-project dependency — this
package does not ship one.Polish dispatch: when the dispatcher skips review because a previous
review pass already returned SUCCESS, this skill MUST itself
synthesise the updated state.ui_review.findings (including any
remaining a11y_violation entries) so the engine's gate sees the
current state on the next polish round.
When DESIGN.md declares ## Taste Dials, honour them: Variance → layout-family spread + asymmetry tolerance; Motion → animation budget + reduced-motion posture; Density → spacing scale + information-per-viewport. Absent → follow the design brief's inferred dials.
The generic "isolate + document reusable components" principle lives in
fe-design § Component Architecture; this is the React
carve-out for the tool-specific part.
.dark class; never hardcode a preview theme (same token discipline as Step 2).shadcn-ui from npm — primitives are scaffolded.dark prop — use semantic tokens + the .dark class.state.ui_design.asChild on DialogTrigger / SheetTrigger / similar
Radix wrappers — it breaks the accessibility contract.