create-inox-app 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -0
- package/dist/cli.js +22196 -0
- package/dist/prompt-Bp8saGVV.js +852 -0
- package/dist/templates/base/.gitignore.hbs +9 -0
- package/dist/templates/base/package.json.hbs +29 -0
- package/dist/templates/base/packages/typescript-config/base.json +17 -0
- package/dist/templates/base/packages/typescript-config/nextjs.json +8 -0
- package/dist/templates/base/packages/typescript-config/package.json +10 -0
- package/dist/templates/base/packages/typescript-config/react-library.json +7 -0
- package/dist/templates/base/turbo.json.hbs +32 -0
- package/dist/templates/ci/.gitlab-ci.yml.hbs +70 -0
- package/dist/templates/ci/scripts/build.sh.hbs +94 -0
- package/dist/templates/ci/scripts/prebuild.sh.hbs +11 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/SKILL.md +325 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/authentication.md +202 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/commands.md +259 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/proxy-support.md +188 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/session-management.md +193 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/snapshot-refs.md +194 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/references/video-recording.md +173 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/authenticated-session.sh +100 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/capture-workflow.sh +69 -0
- package/dist/templates/claude-config/app/.agents/skills/agent-browser/templates/form-automation.sh +62 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/SKILL.md +150 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/agent.md +131 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/artifact.md +84 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/attachments.md +190 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/audio-player.md +134 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/canvas.md +32 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/chain-of-thought.md +81 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/checkpoint.md +163 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/code-block.md +170 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/commit.md +177 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/confirmation.md +252 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/connection.md +32 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/context.md +126 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/controls.md +30 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/conversation.md +210 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/edge.md +50 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/environment-variables.md +102 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/file-tree.md +72 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/image.md +143 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/inline-citation.md +293 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/jsx-preview.md +101 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/message.md +256 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/mic-selector.md +186 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/model-selector.md +112 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/node.md +71 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/open-in-chat.md +67 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/package-info.md +95 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/panel.md +31 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/persona.md +158 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/plan.md +79 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/prompt-input.md +555 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/queue.md +172 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/reasoning.md +219 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/sandbox.md +126 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/schema-display.md +102 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/shimmer.md +48 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/snippet.md +64 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/sources.md +193 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/speech-input.md +160 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/stack-trace.md +218 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/suggestion.md +121 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/task.md +215 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/terminal.md +103 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/test-results.md +157 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/tool.md +275 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/toolbar.md +30 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/transcription.md +120 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/voice-selector.md +241 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/references/web-preview.md +197 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/agent.tsx +61 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/artifact.tsx +111 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments-inline.tsx +117 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments-list.tsx +88 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/attachments.tsx +78 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/audio-player-remote.tsx +35 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/audio-player.tsx +69 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/chain-of-thought.tsx +74 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/checkpoint.tsx +90 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/code-block-dark.tsx +46 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/code-block.tsx +115 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/commit.tsx +94 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-accepted.tsx +35 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-rejected.tsx +35 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation-request.tsx +54 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/confirmation.tsx +53 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/context.tsx +45 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/conversation.tsx +176 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/environment-variables.tsx +55 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-basic.tsx +14 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-expanded.tsx +17 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree-selection.tsx +20 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/file-tree.tsx +38 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/image.tsx +20 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/inline-citation.tsx +95 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/jsx-preview.tsx +99 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/message.tsx +324 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/mic-selector.tsx +46 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/model-selector.tsx +362 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/open-in-chat.tsx +33 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/package-info.tsx +46 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-command.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-glint.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-halo.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-mana.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-obsidian.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/persona-opal.tsx +96 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/plan.tsx +63 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input-cursor.tsx +459 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input-tooltip.tsx +40 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/prompt-input.tsx +247 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/queue-prompt-input.tsx +367 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/queue.tsx +276 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/reasoning.tsx +67 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sandbox.tsx +166 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-basic.tsx +7 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-body.tsx +20 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-nested.tsx +23 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display-params.tsx +16 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/schema-display.tsx +110 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer-duration.tsx +29 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer-elements.tsx +39 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/shimmer.tsx +17 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/snippet-plain.tsx +19 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/snippet.tsx +25 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sources-custom.tsx +34 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/sources.tsx +27 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/speech-input.tsx +79 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace-collapsed.tsx +39 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace-no-internal.tsx +41 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/stack-trace.tsx +54 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/suggestion-input.tsx +137 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/suggestion.tsx +28 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/task.tsx +60 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-basic.tsx +7 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-clear.tsx +19 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal-streaming.tsx +38 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/terminal.tsx +77 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-basic.tsx +27 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-errors.tsx +51 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results-suites.tsx +40 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/test-results.tsx +78 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-input-available.tsx +31 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-input-streaming.tsx +30 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-output-available.tsx +76 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool-output-error.tsx +45 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/tool.tsx +205 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/transcription.tsx +284 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/voice-selector.tsx +228 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-elements/scripts/web-preview.tsx +99 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/SKILL.md +78 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/ai-gateway.md +66 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/common-errors.md +439 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/devtools.md +52 -0
- package/dist/templates/claude-config/app/.agents/skills/ai-sdk/references/type-safe-agents.md +200 -0
- package/dist/templates/claude-config/app/.agents/skills/better-auth-best-practices/SKILL.md +166 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/SKILL.md +37 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/accessibility.mdx +819 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/as-child.mdx +324 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/composition.mdx +239 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/data-attributes.mdx +413 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/definitions.mdx +258 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/design-tokens.mdx +57 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/docs.mdx +155 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/marketplaces.mdx +144 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/npm.mdx +166 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/polymorphism.mdx +583 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/principles.mdx +61 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/registry.mdx +169 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/state.mdx +99 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/styling.mdx +286 -0
- package/dist/templates/claude-config/app/.agents/skills/building-components/references/types.mdx +191 -0
- package/dist/templates/claude-config/app/.agents/skills/docker-expert/SKILL.md +409 -0
- package/dist/templates/claude-config/app/.agents/skills/email-and-password-best-practices/SKILL.md +224 -0
- package/dist/templates/claude-config/app/.agents/skills/find-skills/SKILL.md +133 -0
- package/dist/templates/claude-config/app/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/dist/templates/claude-config/app/.agents/skills/frontend-design/SKILL.md +42 -0
- package/dist/templates/claude-config/app/.agents/skills/git-commit/SKILL.md +124 -0
- package/dist/templates/claude-config/app/.agents/skills/gitlab-ci-patterns/SKILL.md +271 -0
- package/dist/templates/claude-config/app/.agents/skills/hono/SKILL.md +90 -0
- package/dist/templates/claude-config/app/.agents/skills/langfuse-observability/SKILL.md +139 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/SKILL.md +127 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/context.md +157 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/pitfalls.md +118 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/structure.md +193 -0
- package/dist/templates/claude-config/app/.agents/skills/logging-best-practices/rules/wide-events.md +113 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/SKILL.md +153 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/async-patterns.md +87 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/bundling.md +180 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/data-patterns.md +297 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/debug-tricks.md +105 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/directives.md +73 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/error-handling.md +227 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/file-conventions.md +140 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/font.md +245 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/functions.md +108 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/hydration-error.md +91 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/image.md +173 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/metadata.md +301 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/parallel-routes.md +287 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/route-handlers.md +146 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/rsc-boundaries.md +159 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/runtime-selection.md +39 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/scripts.md +141 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/self-hosting.md +371 -0
- package/dist/templates/claude-config/app/.agents/skills/next-best-practices/suspense-boundaries.md +67 -0
- package/dist/templates/claude-config/app/.agents/skills/next-cache-components/SKILL.md +411 -0
- package/dist/templates/claude-config/app/.agents/skills/next-upgrade/SKILL.md +50 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/SKILL.md +179 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/CHEATSHEET.md +418 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/MIGRATIONS.md +536 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/PERFORMANCE.md +559 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/POSTGRES.md +588 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/QUERIES.md +764 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/RELATIONS.md +624 -0
- package/dist/templates/claude-config/app/.agents/skills/postgres-drizzle/references/SCHEMA.md +554 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/SKILL.md +356 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/references/output-patterns.md +82 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/references/workflows.md +28 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/init_skill.py +303 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/package_skill.py +113 -0
- package/dist/templates/claude-config/app/.agents/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/SKILL.md +164 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/basic-streaming.tsx +34 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/custom-security.tsx +38 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/full-featured.tsx +60 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/static-mode.tsx +17 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/assets/examples/with-caret.tsx +39 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/api.md +278 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/features.md +201 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/plugins.md +239 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/security.md +192 -0
- package/dist/templates/claude-config/app/.agents/skills/streamdown/references/styling.md +166 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/SKILL.md +107 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/deep-modules.md +33 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/interface-design.md +31 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/mocking.md +60 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/refactoring.md +10 -0
- package/dist/templates/claude-config/app/.agents/skills/tdd/tests.md +61 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/SKILL.md +914 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/command/turborepo.md +70 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/RULE.md +241 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/dependencies.md +246 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/packages.md +335 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/best-practices/structure.md +270 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/boundaries/RULE.md +126 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/RULE.md +107 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/gotchas.md +169 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/caching/remote-cache.md +127 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/RULE.md +79 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/github-actions.md +162 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/patterns.md +145 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/ci/vercel.md +103 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/cli/RULE.md +100 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/cli/commands.md +297 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/RULE.md +211 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/global-options.md +191 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/gotchas.md +348 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/configuration/tasks.md +281 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/RULE.md +96 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/gotchas.md +141 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/environment/modes.md +101 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/filtering/RULE.md +148 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/filtering/patterns.md +152 -0
- package/dist/templates/claude-config/app/.agents/skills/turborepo/references/watch/RULE.md +99 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/AGENTS.md +917 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/SKILL.md +88 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +94 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/architecture-compound-components.md +108 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +84 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +94 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +103 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/AGENTS.md +2883 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/SKILL.md +138 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-api-routes.md +35 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-defer-await.md +80 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-dependencies.md +48 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-parallel.md +24 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-conditional.md +37 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +48 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +34 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/bundle-preload.md +44 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-event-listeners.md +78 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +74 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +110 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-cache-storage.md +68 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-length-check-first.md +50 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +32 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +36 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +72 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +26 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +77 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +56 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/templates/claude-config/app/.agents/skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/dist/templates/claude-config/app/.agents/skills/web-design-guidelines/SKILL.md +40 -0
- package/dist/templates/claude-config/app/.agents/skills/workflow/SKILL.md +181 -0
- package/dist/templates/claude-config/app/.claude/commands/council.md +7 -0
- package/dist/templates/claude-config/app/.claude/commands/deslop.md +25 -0
- package/dist/templates/claude-config/app/.claude/commands/diagram.md +101 -0
- package/dist/templates/claude-config/app/.claude/commands/fix-merge.md +47 -0
- package/dist/templates/claude-config/app/.claude/commands/you-might-not-need-an-effect.md +10 -0
- package/dist/templates/claude-config/app/.claude/hooks/post-tool-use-tracker.sh +187 -0
- package/dist/templates/claude-config/app/.claude/hooks/skill-activation-prompt.sh +5 -0
- package/dist/templates/claude-config/app/.claude/hooks/skill-activation-prompt.ts +134 -0
- package/dist/templates/claude-config/app/.claude/rules/comments.md +12 -0
- package/dist/templates/claude-config/app/.claude/rules/typescript.md +31 -0
- package/dist/templates/claude-config/app/.claude/settings.json.hbs +74 -0
- package/dist/templates/claude-config/app/.claude/skills/skill-rules.json.hbs +309 -0
- package/dist/templates/claude-config/app/AGENTS.md.hbs +185 -0
- package/dist/templates/claude-config/app/CLAUDE.md.hbs +5 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/git-commit/SKILL.md +124 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/SKILL.md +534 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/references/deployment-spec.md +780 -0
- package/dist/templates/claude-config/kustomize/.agents/skills/k8s-manifest-generator/references/service-spec.md +748 -0
- package/dist/templates/claude-config/kustomize/.claude/settings.json +42 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/git-commit/SKILL.md +124 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/SKILL.md +534 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/configmap-template.yaml +296 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/deployment-template.yaml +203 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/assets/service-template.yaml +171 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/references/deployment-spec.md +780 -0
- package/dist/templates/claude-config/kustomize/.claude/skills/k8s-manifest-generator/references/service-spec.md +748 -0
- package/dist/templates/docker/.dockerignore.hbs +8 -0
- package/dist/templates/docker/Dockerfile.hbs +81 -0
- package/dist/templates/docker/docker-compose.yml.hbs +55 -0
- package/dist/templates/kustomize/base/deployments/app.yaml.hbs +44 -0
- package/dist/templates/kustomize/base/ingress/app.yaml.hbs +20 -0
- package/dist/templates/kustomize/base/jobs/app-jobs.yaml.hbs +43 -0
- package/dist/templates/kustomize/base/kustomization.yaml.hbs +13 -0
- package/dist/templates/kustomize/base/secrets/regcred.yaml.hbs +7 -0
- package/dist/templates/kustomize/base/services/app.yaml.hbs +12 -0
- package/dist/templates/kustomize/overlays/{{env}}/configs/app.config.env.hbs +21 -0
- package/dist/templates/kustomize/overlays/{{env}}/configs/paradedb.config.env.hbs +3 -0
- package/dist/templates/kustomize/overlays/{{env}}/deployments/paradedb.yaml.hbs +28 -0
- package/dist/templates/kustomize/overlays/{{env}}/deployments/redis.yaml.hbs +18 -0
- package/dist/templates/kustomize/overlays/{{env}}/kustomization.yaml.hbs +36 -0
- package/dist/templates/kustomize/overlays/{{env}}/patch-operation/ingress-host.yaml.hbs +15 -0
- package/dist/templates/kustomize/overlays/{{env}}/services/paradedb.yaml.hbs +11 -0
- package/dist/templates/kustomize/overlays/{{env}}/services/redis.yaml.hbs +11 -0
- package/dist/templates/kustomize/overlays/{{env}}/storage/paradedb-pvc.yaml.hbs +10 -0
- package/dist/templates/presets/ai-chat-app/apps/web/.env.example +11 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/auth/[...all]/route.ts +5 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/input-guardrail.ts +47 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/route.ts +266 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/[id]/messages/route.ts +38 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/[id]/route.ts +59 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/chat/sessions/route.ts +24 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/api/health/route.ts +21 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/chat/[id]/page.tsx +54 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/chat/layout.tsx +23 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/chat/page.tsx +9 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/error.tsx +20 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/global-error.tsx +42 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/globals.css +187 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/layout.tsx.hbs +30 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/login/login-form.tsx +96 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/login/page.tsx +14 -0
- package/dist/templates/presets/ai-chat-app/apps/web/app/not-found.tsx +15 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/code-block.tsx +518 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/context.tsx +356 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/conversation.tsx +150 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/environment-variables.tsx +303 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/message.tsx +295 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/prompt-input.tsx +1179 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/sources.tsx +54 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ai-elements/tool.tsx +157 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/app-sidebar.tsx +110 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/chat-sessions-provider.tsx +89 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/chat-sidebar-list.tsx +174 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/chat-view.tsx +156 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/accordion.tsx +72 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/alert-dialog.tsx +162 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/alert.tsx +73 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/aspect-ratio.tsx +22 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/avatar.tsx +93 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/badge.tsx +49 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/breadcrumb.tsx +103 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/button-group.tsx +78 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/button.tsx +60 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/calendar.tsx +185 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/card.tsx +92 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/carousel.tsx +231 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/chart.tsx +325 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/checkbox.tsx +28 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/collapsible.tsx +17 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/combobox.tsx +273 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/command.tsx +181 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/context-menu.tsx +245 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/dialog.tsx +135 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/direction.tsx +3 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/drawer.tsx +120 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/dropdown-menu.tsx +258 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/empty.tsx +94 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/field.tsx +224 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/hover-card.tsx +46 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input-group.tsx +146 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input-otp.tsx +86 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/input.tsx +20 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/item.tsx +188 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/kbd.tsx +26 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/label.tsx +20 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/menubar.tsx +270 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/native-select.tsx +43 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/navigation-menu.tsx +161 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/pagination.tsx +118 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/popover.tsx +77 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/progress.tsx +66 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/radio-group.tsx +39 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/resizable.tsx +42 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/scroll-area.tsx +51 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/select.tsx +190 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/separator.tsx +21 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sheet.tsx +125 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sidebar.tsx +689 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/skeleton.tsx +13 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/slider.tsx +54 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/sonner.tsx +45 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/spinner.tsx +15 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/switch.tsx +32 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/table.tsx +89 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/tabs.tsx +75 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/textarea.tsx +18 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/toggle-group.tsx +87 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/toggle.tsx +44 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components/ui/tooltip.tsx +54 -0
- package/dist/templates/presets/ai-chat-app/apps/web/components.json +20 -0
- package/dist/templates/presets/ai-chat-app/apps/web/drizzle.config.ts +10 -0
- package/dist/templates/presets/ai-chat-app/apps/web/env.ts +30 -0
- package/dist/templates/presets/ai-chat-app/apps/web/hooks/use-mobile.ts +19 -0
- package/dist/templates/presets/ai-chat-app/apps/web/instrumentation.ts +21 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/auth-client.ts +3 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/auth-session.ts +9 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/auth.ts +16 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/db/index.ts +11 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/db/migrate.ts +53 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/db/schema.ts +94 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/db/seed.ts +123 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/group-by-date.ts +34 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/logger.ts +21 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/openrouter.ts +7 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/schemas/auth.ts +8 -0
- package/dist/templates/presets/ai-chat-app/apps/web/lib/utils.ts +4 -0
- package/dist/templates/presets/ai-chat-app/apps/web/next-env.d.ts +6 -0
- package/dist/templates/presets/ai-chat-app/apps/web/next.config.ts +14 -0
- package/dist/templates/presets/ai-chat-app/apps/web/package.json +70 -0
- package/dist/templates/presets/ai-chat-app/apps/web/postcss.config.mjs +7 -0
- package/dist/templates/presets/ai-chat-app/apps/web/proxy.ts +13 -0
- package/dist/templates/presets/ai-chat-app/apps/web/tsconfig.json +14 -0
- package/dist/templates/presets/blank/apps/web/.env.example +1 -0
- package/dist/templates/presets/blank/apps/web/app/api/health/route.ts +11 -0
- package/dist/templates/presets/blank/apps/web/app/globals.css +49 -0
- package/dist/templates/presets/blank/apps/web/app/layout.tsx.hbs +30 -0
- package/dist/templates/presets/blank/apps/web/app/page.tsx.hbs +10 -0
- package/dist/templates/presets/blank/apps/web/env.ts +10 -0
- package/dist/templates/presets/blank/apps/web/next-env.d.ts +2 -0
- package/dist/templates/presets/blank/apps/web/next.config.ts +9 -0
- package/dist/templates/presets/blank/apps/web/package.json.hbs +27 -0
- package/dist/templates/presets/blank/apps/web/postcss.config.mjs +7 -0
- package/dist/templates/presets/blank/apps/web/tsconfig.json +14 -0
- package/dist/templates/tooling/.oxfmtrc.json +6 -0
- package/dist/templates/tooling/.oxlintrc.json +20 -0
- package/dist/templates/tooling/commitlint.config.ts.hbs +3 -0
- package/dist/templates/tooling/lefthook.yml.hbs +25 -0
- package/package.json +47 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Data Attributes
|
|
3
|
+
description: Using data attributes for declarative styling and component identification.
|
|
4
|
+
type: reference
|
|
5
|
+
summary: Using data-state for declarative visual state styling and data-slot for stable component identification in Tailwind-based systems.
|
|
6
|
+
prerequisites:
|
|
7
|
+
- /composition
|
|
8
|
+
- /styling
|
|
9
|
+
related:
|
|
10
|
+
- /design-tokens
|
|
11
|
+
- /accessibility
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
Data attributes provide a powerful way to expose component state and structure to consumers, enabling flexible styling without prop explosion. Modern component libraries use two primary patterns: `data-state` for visual states and `data-slot` for component identification.
|
|
15
|
+
|
|
16
|
+
## Styling state with data-state
|
|
17
|
+
|
|
18
|
+
One of the most common anti-patterns in component styling is exposing separate className props for different states.
|
|
19
|
+
|
|
20
|
+
In less modern components, you'll often see APIs like this:
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
<Dialog
|
|
24
|
+
openClassName="bg-black"
|
|
25
|
+
closedClassName="bg-white"
|
|
26
|
+
classes={{
|
|
27
|
+
open: "opacity-100",
|
|
28
|
+
closed: "opacity-0",
|
|
29
|
+
}}
|
|
30
|
+
/>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
This approach has several problems:
|
|
34
|
+
|
|
35
|
+
- It couples the component's internal state to its styling API
|
|
36
|
+
- It creates an explosion of props as components grow more complex
|
|
37
|
+
- It makes the component harder to use and maintain
|
|
38
|
+
- It prevents styling based on state combinations
|
|
39
|
+
|
|
40
|
+
### The solution: data-state attributes
|
|
41
|
+
|
|
42
|
+
Instead, use `data-*` attributes to expose component state declaratively. This allows consumers to style components based on state using standard CSS selectors:
|
|
43
|
+
|
|
44
|
+
```tsx title="component.tsx"
|
|
45
|
+
const Dialog = ({ className, ...props }: DialogProps) => {
|
|
46
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
47
|
+
|
|
48
|
+
return (
|
|
49
|
+
<div
|
|
50
|
+
data-state={isOpen ? "open" : "closed"}
|
|
51
|
+
className={cn("transition-all", className)}
|
|
52
|
+
{...props}
|
|
53
|
+
/>
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Now consumers can style the component based on state from the outside:
|
|
59
|
+
|
|
60
|
+
```tsx title="app.tsx"
|
|
61
|
+
<Dialog className="data-[state=open]:opacity-100 data-[state=closed]:opacity-0" />
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Benefits of this approach
|
|
65
|
+
|
|
66
|
+
1. **Single className prop** - No need for multiple state-specific className props
|
|
67
|
+
2. **Composable** - Combine multiple data attributes for complex states
|
|
68
|
+
3. **Standard CSS** - Works with any CSS-in-JS solution or plain CSS
|
|
69
|
+
4. **Type-safe** - TypeScript can infer data attribute values
|
|
70
|
+
5. **Inspectable** - States are visible in DevTools as HTML attributes
|
|
71
|
+
|
|
72
|
+
### Common state patterns
|
|
73
|
+
|
|
74
|
+
Use data attributes for all kinds of component state:
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
// Open/closed state
|
|
78
|
+
<Accordion data-state={isOpen ? 'open' : 'closed'} />
|
|
79
|
+
|
|
80
|
+
// Selected state
|
|
81
|
+
<Tab data-state={isSelected ? 'active' : 'inactive'} />
|
|
82
|
+
|
|
83
|
+
// Disabled state (in addition to disabled attribute)
|
|
84
|
+
<Button data-disabled={isDisabled} disabled={isDisabled} />
|
|
85
|
+
|
|
86
|
+
// Loading state
|
|
87
|
+
<Button data-loading={isLoading} />
|
|
88
|
+
|
|
89
|
+
// Orientation
|
|
90
|
+
<Slider data-orientation="horizontal" />
|
|
91
|
+
|
|
92
|
+
// Side/position
|
|
93
|
+
<Tooltip data-side="top" />
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Styling with Tailwind
|
|
97
|
+
|
|
98
|
+
Tailwind supports arbitrary variants, making data attribute styling elegant:
|
|
99
|
+
|
|
100
|
+
```tsx
|
|
101
|
+
<Dialog
|
|
102
|
+
className={cn(
|
|
103
|
+
// Base styles
|
|
104
|
+
"rounded-lg border p-4",
|
|
105
|
+
// State-based styles
|
|
106
|
+
"data-[state=open]:animate-in data-[state=open]:fade-in",
|
|
107
|
+
"data-[state=closed]:animate-out data-[state=closed]:fade-out",
|
|
108
|
+
// Multiple attributes
|
|
109
|
+
"data-[state=open][data-side=top]:slide-in-from-top-2",
|
|
110
|
+
)}
|
|
111
|
+
/>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
For commonly-used states, you can extend Tailwind's configuration:
|
|
115
|
+
|
|
116
|
+
```js title="tailwind.config.js"
|
|
117
|
+
module.exports = {
|
|
118
|
+
theme: {
|
|
119
|
+
extend: {
|
|
120
|
+
data: {
|
|
121
|
+
open: 'state="open"',
|
|
122
|
+
closed: 'state="closed"',
|
|
123
|
+
active: 'state="active"',
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Now you can use shorthand:
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
<Dialog className="data-open:opacity-100 data-closed:opacity-0" />
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Integration with Radix UI
|
|
137
|
+
|
|
138
|
+
This pattern is used extensively by [Radix UI](https://www.radix-ui.com/), which automatically applies data attributes to its primitives:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
import * as Dialog from "@radix-ui/react-dialog";
|
|
142
|
+
|
|
143
|
+
<Dialog.Root>
|
|
144
|
+
<Dialog.Trigger />
|
|
145
|
+
<Dialog.Portal>
|
|
146
|
+
{/* Radix automatically adds data-state="open" | "closed" */}
|
|
147
|
+
<Dialog.Overlay className="data-[state=open]:animate-in data-[state=closed]:animate-out" />
|
|
148
|
+
<Dialog.Content className="data-[state=open]:fade-in data-[state=closed]:fade-out" />
|
|
149
|
+
</Dialog.Portal>
|
|
150
|
+
</Dialog.Root>;
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Other data attributes Radix provides include:
|
|
154
|
+
|
|
155
|
+
- `data-state` - open/closed, active/inactive, on/off
|
|
156
|
+
- `data-side` - top/right/bottom/left (for positioned elements)
|
|
157
|
+
- `data-align` - start/center/end (for positioned elements)
|
|
158
|
+
- `data-orientation` - horizontal/vertical
|
|
159
|
+
- `data-disabled` - present when disabled
|
|
160
|
+
- `data-placeholder` - present when showing placeholder
|
|
161
|
+
|
|
162
|
+
## Component identification with data-slot
|
|
163
|
+
|
|
164
|
+
While `data-state` tracks visual states, `data-slot` identifies component types within a composition. This pattern, popularized by [shadcn/ui](https://ui.shadcn.com/), allows parent components to target and style specific child components without relying on fragile class names or element selectors.
|
|
165
|
+
|
|
166
|
+
### The problem with child targeting
|
|
167
|
+
|
|
168
|
+
Traditional approaches to styling child components have significant limitations:
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
// Relies on element types - breaks if implementation changes
|
|
172
|
+
<form className="[&_input]:rounded-lg [&_button]:mt-4" />
|
|
173
|
+
|
|
174
|
+
// Relies on class names - breaks if classes change
|
|
175
|
+
<form className="[&_.text-input]:rounded-lg" />
|
|
176
|
+
|
|
177
|
+
// Requires passing classes through props - verbose
|
|
178
|
+
<form>
|
|
179
|
+
<input className={inputClasses} />
|
|
180
|
+
<button className={buttonClasses} />
|
|
181
|
+
</form>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### The solution: data-slot attributes
|
|
185
|
+
|
|
186
|
+
Use `data-slot` to give components stable identifiers that can be targeted by parents:
|
|
187
|
+
|
|
188
|
+
```tsx title="field-set.tsx"
|
|
189
|
+
function FieldSet({ className, ...props }: React.ComponentProps<"fieldset">) {
|
|
190
|
+
return (
|
|
191
|
+
<fieldset
|
|
192
|
+
data-slot="field-set"
|
|
193
|
+
className={cn(
|
|
194
|
+
"flex flex-col gap-6",
|
|
195
|
+
// Target specific child slots
|
|
196
|
+
"has-[>[data-slot=checkbox-group]]:gap-3",
|
|
197
|
+
"has-[>[data-slot=radio-group]]:gap-3",
|
|
198
|
+
className,
|
|
199
|
+
)}
|
|
200
|
+
{...props}
|
|
201
|
+
/>
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
```tsx title="checkbox-group.tsx"
|
|
207
|
+
function CheckboxGroup({ className, ...props }: React.ComponentProps<"div">) {
|
|
208
|
+
return (
|
|
209
|
+
<div
|
|
210
|
+
data-slot="checkbox-group"
|
|
211
|
+
className={cn("flex flex-col gap-2", className)}
|
|
212
|
+
{...props}
|
|
213
|
+
/>
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Benefits of data-slot
|
|
219
|
+
|
|
220
|
+
1. **Stable identifiers** - Won't break when implementation details change
|
|
221
|
+
2. **Semantic targeting** - Target based on component purpose, not structure
|
|
222
|
+
3. **Encapsulation** - Internal classes remain private
|
|
223
|
+
4. **Composable** - Works with arbitrary nesting and composition
|
|
224
|
+
5. **Type-safe** - Can be validated and documented
|
|
225
|
+
|
|
226
|
+
### Using `has-[]` for parent-aware styling
|
|
227
|
+
|
|
228
|
+
Tailwind's `has-[]` selector combined with `data-slot` creates powerful parent-aware styling:
|
|
229
|
+
|
|
230
|
+
```tsx title="form.tsx"
|
|
231
|
+
function Form({ className, ...props }: React.ComponentProps<"form">) {
|
|
232
|
+
return (
|
|
233
|
+
<form
|
|
234
|
+
data-slot="form"
|
|
235
|
+
className={cn(
|
|
236
|
+
"space-y-4",
|
|
237
|
+
// Adjust spacing when specific slots are present
|
|
238
|
+
"has-[>[data-slot=form-section]]:space-y-6",
|
|
239
|
+
"has-[>[data-slot=inline-fields]]:space-y-2",
|
|
240
|
+
// Style based on slot states
|
|
241
|
+
"has-[[data-slot=submit-button][data-loading=true]]:opacity-50",
|
|
242
|
+
className,
|
|
243
|
+
)}
|
|
244
|
+
{...props}
|
|
245
|
+
/>
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Using `[&_]` for descendant targeting
|
|
251
|
+
|
|
252
|
+
For deeper nesting, use the `[&_selector]` pattern to target any descendant:
|
|
253
|
+
|
|
254
|
+
```tsx title="card.tsx"
|
|
255
|
+
function Card({ className, ...props }: React.ComponentProps<"div">) {
|
|
256
|
+
return (
|
|
257
|
+
<div
|
|
258
|
+
data-slot="card"
|
|
259
|
+
className={cn(
|
|
260
|
+
"rounded-lg border p-4",
|
|
261
|
+
// Target any descendant with data-slot
|
|
262
|
+
"[&_[data-slot=card-header]]:mb-4",
|
|
263
|
+
"[&_[data-slot=card-title]]:text-lg [&_[data-slot=card-title]]:font-semibold",
|
|
264
|
+
"[&_[data-slot=card-description]]:text-sm [&_[data-slot=card-description]]:text-muted-foreground",
|
|
265
|
+
"[&_[data-slot=card-footer]]:mt-4 [&_[data-slot=card-footer]]:border-t [&_[data-slot=card-footer]]:pt-4",
|
|
266
|
+
className,
|
|
267
|
+
)}
|
|
268
|
+
{...props}
|
|
269
|
+
/>
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### Global CSS with data-slot
|
|
275
|
+
|
|
276
|
+
Data slots work beautifully with global CSS for theme-wide consistency:
|
|
277
|
+
|
|
278
|
+
```css title="globals.css"
|
|
279
|
+
/* Style all buttons within forms */
|
|
280
|
+
[data-slot="form"] [data-slot="button"] {
|
|
281
|
+
@apply w-full sm:w-auto;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* Style submit buttons specifically */
|
|
285
|
+
[data-slot="form"] [data-slot="submit-button"] {
|
|
286
|
+
@apply bg-primary text-primary-foreground;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/* Adjust inputs within inline layouts */
|
|
290
|
+
[data-slot="inline-fields"] [data-slot="input"] {
|
|
291
|
+
@apply flex-1;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* Style based on state combinations */
|
|
295
|
+
[data-slot="dialog"][data-state="open"] [data-slot="dialog-content"] {
|
|
296
|
+
@apply animate-in fade-in;
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Naming conventions
|
|
301
|
+
|
|
302
|
+
Follow these conventions for consistent `data-slot` naming:
|
|
303
|
+
|
|
304
|
+
1. **Use kebab-case** - `data-slot="form-field"` not `data-slot="formField"`
|
|
305
|
+
2. **Be specific** - `data-slot="submit-button"` not `data-slot="button"`
|
|
306
|
+
3. **Match component purpose** - Name reflects what it does, not how it looks
|
|
307
|
+
4. **Avoid implementation details** - `data-slot="user-avatar"` not `data-slot="rounded-image"`
|
|
308
|
+
|
|
309
|
+
```tsx
|
|
310
|
+
// Good examples
|
|
311
|
+
data-slot="search-input"
|
|
312
|
+
data-slot="navigation-menu"
|
|
313
|
+
data-slot="error-message"
|
|
314
|
+
data-slot="submit-button"
|
|
315
|
+
data-slot="card-header"
|
|
316
|
+
|
|
317
|
+
// Avoid
|
|
318
|
+
data-slot="input" // Too generic
|
|
319
|
+
data-slot="blueButton" // Includes styling
|
|
320
|
+
data-slot="div-wrapper" // Implementation detail
|
|
321
|
+
data-slot="mainContent" // Use camelCase
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## When to use data attributes vs props
|
|
325
|
+
|
|
326
|
+
Understanding when to use each pattern is key to a clean API:
|
|
327
|
+
|
|
328
|
+
### `data-state` use cases
|
|
329
|
+
|
|
330
|
+
- **Visual states** - open/closed, active/inactive, loading, etc.
|
|
331
|
+
- **Layout states** - orientation, side, alignment
|
|
332
|
+
- **Interaction states** - hover, focus, disabled (when you need to style children)
|
|
333
|
+
|
|
334
|
+
### `data-slot` use cases
|
|
335
|
+
|
|
336
|
+
- **Component identification** - Stable identifiers for targeting
|
|
337
|
+
- **Composition patterns** - Parent-child relationships
|
|
338
|
+
- **Global styling** - Theme-wide component styling
|
|
339
|
+
- **Variant-independent targeting** - Target any variant of a component
|
|
340
|
+
|
|
341
|
+
### `props` use cases
|
|
342
|
+
|
|
343
|
+
- **Variants** - Different visual designs (primary, secondary, destructive)
|
|
344
|
+
- **Sizes** - sm, md, lg
|
|
345
|
+
- **Behavioral configuration** - controlled/uncontrolled, default values
|
|
346
|
+
- **Event handlers** - onClick, onChange, etc.
|
|
347
|
+
|
|
348
|
+
### Combined approach
|
|
349
|
+
|
|
350
|
+
A well-designed component uses all three patterns appropriately:
|
|
351
|
+
|
|
352
|
+
```tsx title="button.tsx"
|
|
353
|
+
type ButtonProps = {
|
|
354
|
+
variant?: "primary" | "secondary" | "destructive";
|
|
355
|
+
size?: "sm" | "md" | "lg";
|
|
356
|
+
loading?: boolean;
|
|
357
|
+
disabled?: boolean;
|
|
358
|
+
onClick?: () => void;
|
|
359
|
+
className?: string;
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
const Button = ({
|
|
363
|
+
variant = "primary",
|
|
364
|
+
size = "md",
|
|
365
|
+
loading,
|
|
366
|
+
disabled,
|
|
367
|
+
className,
|
|
368
|
+
...props
|
|
369
|
+
}: ButtonProps) => {
|
|
370
|
+
return (
|
|
371
|
+
<button
|
|
372
|
+
// Slot for targeting
|
|
373
|
+
data-slot="button"
|
|
374
|
+
// State for conditional styling
|
|
375
|
+
data-loading={loading}
|
|
376
|
+
data-disabled={disabled}
|
|
377
|
+
className={cn(
|
|
378
|
+
// Variant styles via props
|
|
379
|
+
buttonVariants({ variant, size }),
|
|
380
|
+
// Additional state styling allowed via className
|
|
381
|
+
className,
|
|
382
|
+
)}
|
|
383
|
+
disabled={disabled}
|
|
384
|
+
{...props}
|
|
385
|
+
/>
|
|
386
|
+
);
|
|
387
|
+
};
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
Now the button can be used and styled in multiple ways:
|
|
391
|
+
|
|
392
|
+
```tsx
|
|
393
|
+
// Basic usage with variants
|
|
394
|
+
<Button variant="primary" size="lg">Submit</Button>
|
|
395
|
+
|
|
396
|
+
// Parent targeting via data-slot
|
|
397
|
+
<form className="[&_[data-slot=button]]:w-full">
|
|
398
|
+
<Button>Submit</Button>
|
|
399
|
+
</form>
|
|
400
|
+
|
|
401
|
+
// State-based styling via data-state
|
|
402
|
+
<Button
|
|
403
|
+
loading={isLoading}
|
|
404
|
+
className="data-[loading=true]:opacity-50"
|
|
405
|
+
>
|
|
406
|
+
Submit
|
|
407
|
+
</Button>
|
|
408
|
+
|
|
409
|
+
// Global CSS can target any button
|
|
410
|
+
// [data-slot="button"][data-loading="true"] { ... }
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
Data attributes provide a robust foundation for styling modern component libraries. By using `data-state` for visual states and `data-slot` for component identification, you create a flexible, maintainable API that scales from simple components to complex design systems.
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Definitions
|
|
3
|
+
description: This page establishes precise terminology used throughout the specification. Terms are intentionally framework agnostic, but we will use React for examples.
|
|
4
|
+
type: reference
|
|
5
|
+
summary: Precise terminology for the specification covering primitives, components, patterns, blocks, pages, templates, and utilities.
|
|
6
|
+
related:
|
|
7
|
+
- /principles
|
|
8
|
+
- /composition
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. Artifact Taxonomy
|
|
12
|
+
|
|
13
|
+
### 1.1 Primitive
|
|
14
|
+
|
|
15
|
+
A primitive (or, unstyled component) is the **lowest‑level building block** that provides behavior and accessibility without any styling.
|
|
16
|
+
|
|
17
|
+
Primitives are completely headless (i.e. unstyled) and encapsulate semantics, focus management, keyboard interaction, layering/portals, ARIA wiring, measurement, and similar concerns. They provide the behavioral foundation but require styling to become finished UI.
|
|
18
|
+
|
|
19
|
+
Examples:
|
|
20
|
+
|
|
21
|
+
- [Radix UI Primitives](https://www.radix-ui.com/primitives) (Dialog, Popover, Tooltip, etc.)
|
|
22
|
+
- [React Aria Components](https://react-spectrum.adobe.com/react-aria)
|
|
23
|
+
- [Base UI](https://base-ui.com)
|
|
24
|
+
- [Headless UI](https://headlessui.com/)
|
|
25
|
+
|
|
26
|
+
Expectations:
|
|
27
|
+
|
|
28
|
+
- Completely unstyled (headless).
|
|
29
|
+
- Single responsibility; composable into styled components.
|
|
30
|
+
- Ships with exhaustive a11y behavior for its role.
|
|
31
|
+
- Versioning favors stability; breaking changes are rare and documented.
|
|
32
|
+
|
|
33
|
+
<Callout>
|
|
34
|
+
The terms primitive and component are typically used interchangeably across
|
|
35
|
+
the web, but they are not the same.
|
|
36
|
+
</Callout>
|
|
37
|
+
|
|
38
|
+
### 1.2 Component
|
|
39
|
+
|
|
40
|
+
A component is a styled, reusable UI unit that adds visual design to primitives or composes multiple elements to create complete, functional interface elements.
|
|
41
|
+
|
|
42
|
+
Components are still relatively low-level but include styling, making them immediately usable in applications. They typically wrap unstyled primitives with default visual design while remaining customizable.
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
|
|
46
|
+
- [shadcn/ui components](https://ui.shadcn.com/) (styled wrappers of Radix primitives)
|
|
47
|
+
- [Material UI components](https://mui.com/components/)
|
|
48
|
+
- [Ant Design components](https://ant.design/components/overview/)
|
|
49
|
+
|
|
50
|
+
Expectations:
|
|
51
|
+
|
|
52
|
+
- Clear props API; supports controlled and uncontrolled usage where applicable.
|
|
53
|
+
- Includes default styling but remains override-friendly (classes, tokens, slots).
|
|
54
|
+
- Fully keyboard accessible and screen-reader friendly (inherits from primitives).
|
|
55
|
+
- Composable (children/slots, render props, or compound subcomponents).
|
|
56
|
+
- May be built from primitives or implement behavior directly with styling.
|
|
57
|
+
|
|
58
|
+
### 1.3 Pattern
|
|
59
|
+
|
|
60
|
+
Patterns are a specific composition of primitives or components that are used to solve a specific UI/UX problem.
|
|
61
|
+
|
|
62
|
+
Examples:
|
|
63
|
+
|
|
64
|
+
- Form validation with inline errors
|
|
65
|
+
- Confirming destructive actions
|
|
66
|
+
- Typeahead search
|
|
67
|
+
- Optimistic UI
|
|
68
|
+
|
|
69
|
+
Expectations.
|
|
70
|
+
|
|
71
|
+
- Describes behavior, a11y, keyboard map, and failure modes.
|
|
72
|
+
- May include reference implementations in multiple frameworks.
|
|
73
|
+
|
|
74
|
+
### 1.4 Block
|
|
75
|
+
|
|
76
|
+
An opinionated, production-ready composition of components that solves a concrete interface use case (often product-specific) with content scaffolding. Blocks trade generality for speed of adoption.
|
|
77
|
+
|
|
78
|
+
Examples:
|
|
79
|
+
|
|
80
|
+
- Pricing table
|
|
81
|
+
- Auth screens
|
|
82
|
+
- Onboarding stepper
|
|
83
|
+
- AI chat panel
|
|
84
|
+
- Billing settings form
|
|
85
|
+
|
|
86
|
+
Expectations.
|
|
87
|
+
|
|
88
|
+
- Strong defaults, copy-paste friendly, easily branded/themed.
|
|
89
|
+
- Minimal logic beyond layout and orchestration; domain logic is stubbed via handlers.
|
|
90
|
+
- Accepts data via props; never hides data behind fetches without a documented adapter.
|
|
91
|
+
|
|
92
|
+
<AuthorNote
|
|
93
|
+
name="Rob Austin"
|
|
94
|
+
role="Founder of shadcnblocks.com"
|
|
95
|
+
githubUsername="JugglerX"
|
|
96
|
+
link="https://www.shadcnblocks.com/"
|
|
97
|
+
>
|
|
98
|
+
Blocks are typically not reusable like a component. You don't import them, but
|
|
99
|
+
they typically import components and primitives. This makes them good
|
|
100
|
+
candidates for a [Registry](/registry) distribution method.
|
|
101
|
+
</AuthorNote>
|
|
102
|
+
|
|
103
|
+
### 1.5 Page
|
|
104
|
+
|
|
105
|
+
A complete, single-route view composed of multiple blocks arranged to serve a specific user-facing purpose. Pages combine blocks into a cohesive layout that represents one destination in an application.
|
|
106
|
+
|
|
107
|
+
Examples:
|
|
108
|
+
|
|
109
|
+
- Landing page (hero block + features block + pricing block + footer block)
|
|
110
|
+
- Product detail page (image gallery block + product info block + reviews block)
|
|
111
|
+
- Dashboard page (stats block + chart block + activity feed block)
|
|
112
|
+
|
|
113
|
+
Expectations:
|
|
114
|
+
|
|
115
|
+
- Combines multiple blocks into a unified layout for a single route.
|
|
116
|
+
- Focuses on layout and block orchestration rather than component-level details.
|
|
117
|
+
- May include page-specific logic for data coordination between blocks.
|
|
118
|
+
- Self-contained for a single URL/route; not intended to be reused across routes.
|
|
119
|
+
|
|
120
|
+
### 1.6 Template
|
|
121
|
+
|
|
122
|
+
A multi-page collection or full-site scaffold that bundles pages, routing configuration, shared layouts, global providers, and project structure. Templates are complete starting points for entire applications or major application sections.
|
|
123
|
+
|
|
124
|
+
Examples:
|
|
125
|
+
|
|
126
|
+
- [TailwindCSS Templates](https://tailwindui.com/templates)
|
|
127
|
+
- [shadcnblocks Templates](https://www.shadcnblocks.com/templates) (full application shells)
|
|
128
|
+
- "SaaS starter" (auth pages + dashboard pages + settings pages + marketing pages)
|
|
129
|
+
- "E-commerce template" (storefront + product pages + checkout flow + admin pages)
|
|
130
|
+
|
|
131
|
+
Expectations:
|
|
132
|
+
|
|
133
|
+
- Includes multiple pages with routing/navigation structure.
|
|
134
|
+
- Provides global configuration (theme providers, auth context, layout shells).
|
|
135
|
+
- Opinionated project structure with clear conventions.
|
|
136
|
+
- Designed as a comprehensive starting point; fork and customize rather than import as dependency.
|
|
137
|
+
- May include build configuration, deployment setup, and development tooling.
|
|
138
|
+
|
|
139
|
+
### 1.7 Utility (Non-visual)
|
|
140
|
+
|
|
141
|
+
A helper exported for developer ergonomics or composition; not rendered UI.
|
|
142
|
+
|
|
143
|
+
Examples:
|
|
144
|
+
|
|
145
|
+
- React hooks (useControllableState, useId)
|
|
146
|
+
- Class utilities
|
|
147
|
+
- Keybinding helpers
|
|
148
|
+
- Focus scopes
|
|
149
|
+
|
|
150
|
+
Expectations.
|
|
151
|
+
|
|
152
|
+
- Side-effect free (except where explicitly documented).
|
|
153
|
+
- Testable in isolation; supports tree-shaking.
|
|
154
|
+
|
|
155
|
+
## 2. API and Composition Vocabulary
|
|
156
|
+
|
|
157
|
+
### 2.1 Props API
|
|
158
|
+
|
|
159
|
+
The public configuration surface of a component. Props are stable, typed, and documented with defaults and a11y ramifications.
|
|
160
|
+
|
|
161
|
+
### 2.2 Children / Slots
|
|
162
|
+
|
|
163
|
+
Placeholders for caller-provided structure or content.
|
|
164
|
+
|
|
165
|
+
- Children (implicit slot). JSX between opening/closing tags.
|
|
166
|
+
- Named slots. Props like icon, footer, or `<Component.Slot>` subcomponents.
|
|
167
|
+
- Slot forwarding. Passing DOM attributes/className/refs through to the underlying element.
|
|
168
|
+
|
|
169
|
+
### 2.3 Render Prop (Function-as-Child)
|
|
170
|
+
|
|
171
|
+
A function child used to delegate rendering while the parent supplies state/data.
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
<ParentComponent data={data}>
|
|
175
|
+
{(item) => <ChildComponent key={item.id} {...item} />}
|
|
176
|
+
</ParentComponent>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Use when the parent must own data/behavior but the consumer must fully control markup.
|
|
180
|
+
|
|
181
|
+
### 2.4 Controlled vs. Uncontrolled
|
|
182
|
+
|
|
183
|
+
**Controlled** and **uncontrolled** are terms used to describe the state of a component.
|
|
184
|
+
|
|
185
|
+
**Controlled** components have their value driven by props, and typically emit an `onChange` event (source of truth is the parent). **Uncontrolled** components hold internal state; and may expose a `defaultValue` and imperative reset.
|
|
186
|
+
|
|
187
|
+
Many inputs should support both. Learn more about [controlled and uncontrolled state](/state).
|
|
188
|
+
|
|
189
|
+
### 2.5 Provider / Context
|
|
190
|
+
|
|
191
|
+
A top-level component that supplies shared state/configuration to a subtree (e.g., theme, locale, active tab id). Providers are explicitly documented with required placement.
|
|
192
|
+
|
|
193
|
+
### 2.6 Portal
|
|
194
|
+
|
|
195
|
+
Rendering UI outside the DOM hierarchy to manage layering/stacking context (e.g., modals, popovers, toasts), while preserving a11y (focus trap, aria-modal, inert background).
|
|
196
|
+
|
|
197
|
+
## 3. Styling and Theming Vocabulary
|
|
198
|
+
|
|
199
|
+
### 3.1 Headless
|
|
200
|
+
|
|
201
|
+
Implements behavior and accessibility without prescribing appearance. Requires the consumer to supply styling.
|
|
202
|
+
|
|
203
|
+
### 3.2 Styled
|
|
204
|
+
|
|
205
|
+
Ships with default visual design (CSS classes, inline styles, or tokens) but remains override-friendly (className merge, CSS vars, theming).
|
|
206
|
+
|
|
207
|
+
### 3.3 Variants
|
|
208
|
+
|
|
209
|
+
Discrete, documented style or behavior permutations exposed via props (e.g., `size="sm|md|lg"`, `tone="neutral|destructive"`). Variants are not separate components.
|
|
210
|
+
|
|
211
|
+
### 3.4 Design Tokens
|
|
212
|
+
|
|
213
|
+
Named, platform-agnostic values (e.g., `--color-bg`, `--radius-md`, `--space-2`) that parameterize visual design and support theming.
|
|
214
|
+
|
|
215
|
+
## 4. Accessibility Vocabulary
|
|
216
|
+
|
|
217
|
+
### 4.1 Role / State / Property
|
|
218
|
+
|
|
219
|
+
WAI-ARIA attributes that communicate semantics (`role="menu"`), state (`aria-checked`), and relationships (`aria-controls`, `aria-labelledby`).
|
|
220
|
+
|
|
221
|
+
### 4.2 Keyboard Map
|
|
222
|
+
|
|
223
|
+
The documented set of keyboard interactions for a widget (e.g., `Tab`, `Arrow keys`, `Home/End`, `Escape`). Every interactive component declares and implements a keyboard map.
|
|
224
|
+
|
|
225
|
+
### 4.3 Focus Management
|
|
226
|
+
|
|
227
|
+
Rules for initial focus, roving focus, focus trapping, and focus return on teardown.
|
|
228
|
+
|
|
229
|
+
## 5. Distribution Vocabulary
|
|
230
|
+
|
|
231
|
+
### 5.1 Package (Registry Distribution)
|
|
232
|
+
|
|
233
|
+
The component/library is published to a package registry (e.g., `npm`) and imported via a bundler. Favors versioned updates and dependency management.
|
|
234
|
+
|
|
235
|
+
### 5.2 Copy-and-Paste (Source Distribution)
|
|
236
|
+
|
|
237
|
+
Source code is integrated directly into the consumer's repository (often via a CLI). Favors ownership, customization, and zero extraneous runtime.
|
|
238
|
+
|
|
239
|
+
### 5.3 Registry (Catalog)
|
|
240
|
+
|
|
241
|
+
A curated index of artifacts (primitives, components, blocks, templates) with metadata, previews, and install/copy instructions. A registry is not necessarily a package manager.
|
|
242
|
+
|
|
243
|
+
## 6. Classification Heuristics
|
|
244
|
+
|
|
245
|
+
Use this decision flow to name and place an artifact:
|
|
246
|
+
|
|
247
|
+
1. Does it encapsulate a single behavior or a11y concern, with no styling? → **Primitive**
|
|
248
|
+
2. Is it a styled, reusable UI element that adds visual design to primitives or composes multiple elements? → **Component**
|
|
249
|
+
3. Does it solve a concrete product use case with opinionated composition and copy? → **Block**
|
|
250
|
+
4. Does it scaffold a page/flow with routing/providers and replaceable regions? → **Template**
|
|
251
|
+
5. Is it documentation of a recurring solution, independent of implementation? → **Pattern**
|
|
252
|
+
6. Is it non-visual logic for ergonomics/composition? → **Utility**
|
|
253
|
+
|
|
254
|
+
## 7. Non-Goals and Clarifications
|
|
255
|
+
|
|
256
|
+
- Web Components vs. "Components." In this spec, "component" refers to a reusable UI unit (examples in React). It does not imply the HTML Custom Elements standard unless explicitly stated. Equivalent principles apply across frameworks.
|
|
257
|
+
- Widgets. The term “widget” is avoided due to ambiguity; use component (general) or pattern (documentation-only solution).
|
|
258
|
+
- Themes vs. Styles. A theme is a parameterization of styles (via tokens). Styles are the concrete presentation. Components should support themes; blocks/templates may ship opinionated styles plus theming hooks.
|