cfsa-antigravity 1.0.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/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,703 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: shadcn-ui
|
|
3
|
+
description: "Comprehensive shadcn/ui guide covering component installation, customization, theming, forms, data tables, composition patterns, and accessibility. Use when building UIs with shadcn/ui, customizing components, implementing forms with react-hook-form + zod, or building data tables."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# shadcn/ui
|
|
8
|
+
|
|
9
|
+
## 1. Philosophy
|
|
10
|
+
|
|
11
|
+
shadcn/ui is **not a component library**. It is a collection of reusable components that you copy into your project and own. You can modify them freely. There is no `node_modules` dependency to update -- the code is yours.
|
|
12
|
+
|
|
13
|
+
**Key implications**:
|
|
14
|
+
- Components live in your codebase (typically `src/components/ui/`)
|
|
15
|
+
- You can and should customize them to match your design system
|
|
16
|
+
- Updates are opt-in: re-run the CLI to pull new versions, then merge
|
|
17
|
+
- No version lock-in, no breaking upgrades forced on you
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## 2. Installation and CLI
|
|
22
|
+
|
|
23
|
+
### Initial Setup
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# Initialize shadcn/ui in your project (interactive)
|
|
27
|
+
npx shadcn@latest init
|
|
28
|
+
|
|
29
|
+
# Non-interactive with defaults
|
|
30
|
+
npx shadcn@latest init -d
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The init command:
|
|
34
|
+
1. Creates `components.json` (configuration)
|
|
35
|
+
2. Sets up CSS variables for theming
|
|
36
|
+
3. Configures `cn()` utility (`lib/utils.ts`)
|
|
37
|
+
4. Sets up Tailwind CSS configuration
|
|
38
|
+
|
|
39
|
+
### Adding Components
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Add a single component
|
|
43
|
+
npx shadcn@latest add button
|
|
44
|
+
|
|
45
|
+
# Add multiple components at once
|
|
46
|
+
npx shadcn@latest add button card dialog input label
|
|
47
|
+
|
|
48
|
+
# Add all components
|
|
49
|
+
npx shadcn@latest add --all
|
|
50
|
+
|
|
51
|
+
# View available components
|
|
52
|
+
npx shadcn@latest add --list
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Configuration (components.json)
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
60
|
+
"style": "new-york",
|
|
61
|
+
"rsc": true,
|
|
62
|
+
"tsx": true,
|
|
63
|
+
"tailwind": {
|
|
64
|
+
"config": "tailwind.config.ts",
|
|
65
|
+
"css": "src/app/globals.css",
|
|
66
|
+
"baseColor": "zinc",
|
|
67
|
+
"cssVariables": true
|
|
68
|
+
},
|
|
69
|
+
"aliases": {
|
|
70
|
+
"components": "@/components",
|
|
71
|
+
"utils": "@/lib/utils",
|
|
72
|
+
"ui": "@/components/ui",
|
|
73
|
+
"lib": "@/lib",
|
|
74
|
+
"hooks": "@/hooks"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 3. Theming with CSS Variables
|
|
82
|
+
|
|
83
|
+
### Theme Structure
|
|
84
|
+
|
|
85
|
+
```css
|
|
86
|
+
/* globals.css */
|
|
87
|
+
@layer base {
|
|
88
|
+
:root {
|
|
89
|
+
--background: 0 0% 100%;
|
|
90
|
+
--foreground: 240 10% 3.9%;
|
|
91
|
+
--card: 0 0% 100%;
|
|
92
|
+
--card-foreground: 240 10% 3.9%;
|
|
93
|
+
--popover: 0 0% 100%;
|
|
94
|
+
--popover-foreground: 240 10% 3.9%;
|
|
95
|
+
--primary: 240 5.9% 10%;
|
|
96
|
+
--primary-foreground: 0 0% 98%;
|
|
97
|
+
--secondary: 240 4.8% 95.9%;
|
|
98
|
+
--secondary-foreground: 240 5.9% 10%;
|
|
99
|
+
--muted: 240 4.8% 95.9%;
|
|
100
|
+
--muted-foreground: 240 3.8% 46.1%;
|
|
101
|
+
--accent: 240 4.8% 95.9%;
|
|
102
|
+
--accent-foreground: 240 5.9% 10%;
|
|
103
|
+
--destructive: 0 84.2% 60.2%;
|
|
104
|
+
--destructive-foreground: 0 0% 98%;
|
|
105
|
+
--border: 240 5.9% 90%;
|
|
106
|
+
--input: 240 5.9% 90%;
|
|
107
|
+
--ring: 240 5.9% 10%;
|
|
108
|
+
--radius: 0.5rem;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.dark {
|
|
112
|
+
--background: 240 10% 3.9%;
|
|
113
|
+
--foreground: 0 0% 98%;
|
|
114
|
+
--primary: 0 0% 98%;
|
|
115
|
+
--primary-foreground: 240 5.9% 10%;
|
|
116
|
+
/* ... override all variables for dark mode */
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Custom Brand Colors
|
|
122
|
+
|
|
123
|
+
```css
|
|
124
|
+
:root {
|
|
125
|
+
/* Override primary to your brand color */
|
|
126
|
+
--primary: 221 83% 53%; /* Blue */
|
|
127
|
+
--primary-foreground: 0 0% 100%;
|
|
128
|
+
|
|
129
|
+
/* Add custom semantic colors */
|
|
130
|
+
--success: 142 76% 36%;
|
|
131
|
+
--success-foreground: 0 0% 100%;
|
|
132
|
+
--warning: 38 92% 50%;
|
|
133
|
+
--warning-foreground: 0 0% 100%;
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Dark Mode Implementation
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
// Using next-themes
|
|
141
|
+
// app/providers.tsx
|
|
142
|
+
'use client';
|
|
143
|
+
import { ThemeProvider } from 'next-themes';
|
|
144
|
+
|
|
145
|
+
export function Providers({ children }: { children: React.ReactNode }) {
|
|
146
|
+
return (
|
|
147
|
+
<ThemeProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>
|
|
148
|
+
{children}
|
|
149
|
+
</ThemeProvider>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Theme toggle component
|
|
154
|
+
'use client';
|
|
155
|
+
import { useTheme } from 'next-themes';
|
|
156
|
+
import { Button } from '@/components/ui/button';
|
|
157
|
+
import { Moon, Sun } from 'lucide-react';
|
|
158
|
+
|
|
159
|
+
export function ThemeToggle() {
|
|
160
|
+
const { setTheme, theme } = useTheme();
|
|
161
|
+
|
|
162
|
+
return (
|
|
163
|
+
<Button
|
|
164
|
+
variant="ghost"
|
|
165
|
+
size="icon"
|
|
166
|
+
onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
|
|
167
|
+
>
|
|
168
|
+
<Sun className="h-5 w-5 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
|
|
169
|
+
<Moon className="absolute h-5 w-5 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
|
|
170
|
+
<span className="sr-only">Toggle theme</span>
|
|
171
|
+
</Button>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## 4. Component Composition Patterns
|
|
179
|
+
|
|
180
|
+
### Extending Components with Variants
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
// components/ui/button.tsx -- the base component (installed by CLI)
|
|
184
|
+
// Add custom variants by editing the cva() call directly
|
|
185
|
+
|
|
186
|
+
import { cva, type VariantProps } from 'class-variance-authority';
|
|
187
|
+
|
|
188
|
+
const buttonVariants = cva(
|
|
189
|
+
'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',
|
|
190
|
+
{
|
|
191
|
+
variants: {
|
|
192
|
+
variant: {
|
|
193
|
+
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
|
|
194
|
+
destructive: 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
|
|
195
|
+
outline: 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
|
|
196
|
+
secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
|
|
197
|
+
ghost: 'hover:bg-accent hover:text-accent-foreground',
|
|
198
|
+
link: 'text-primary underline-offset-4 hover:underline',
|
|
199
|
+
// Add your own variants:
|
|
200
|
+
success: 'bg-success text-success-foreground hover:bg-success/90',
|
|
201
|
+
warning: 'bg-warning text-warning-foreground hover:bg-warning/90',
|
|
202
|
+
},
|
|
203
|
+
size: {
|
|
204
|
+
default: 'h-10 px-4 py-2',
|
|
205
|
+
sm: 'h-9 rounded-md px-3',
|
|
206
|
+
lg: 'h-11 rounded-md px-8',
|
|
207
|
+
icon: 'h-10 w-10',
|
|
208
|
+
// Custom size:
|
|
209
|
+
xs: 'h-7 rounded px-2 text-xs',
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
defaultVariants: {
|
|
213
|
+
variant: 'default',
|
|
214
|
+
size: 'default',
|
|
215
|
+
},
|
|
216
|
+
}
|
|
217
|
+
);
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Composing Higher-Level Components
|
|
221
|
+
|
|
222
|
+
Build domain-specific components from shadcn/ui primitives.
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
// components/confirm-dialog.tsx
|
|
226
|
+
import {
|
|
227
|
+
AlertDialog,
|
|
228
|
+
AlertDialogAction,
|
|
229
|
+
AlertDialogCancel,
|
|
230
|
+
AlertDialogContent,
|
|
231
|
+
AlertDialogDescription,
|
|
232
|
+
AlertDialogFooter,
|
|
233
|
+
AlertDialogHeader,
|
|
234
|
+
AlertDialogTitle,
|
|
235
|
+
AlertDialogTrigger,
|
|
236
|
+
} from '@/components/ui/alert-dialog';
|
|
237
|
+
|
|
238
|
+
interface ConfirmDialogProps {
|
|
239
|
+
trigger: React.ReactNode;
|
|
240
|
+
title: string;
|
|
241
|
+
description: string;
|
|
242
|
+
confirmLabel?: string;
|
|
243
|
+
cancelLabel?: string;
|
|
244
|
+
variant?: 'default' | 'destructive';
|
|
245
|
+
onConfirm: () => void | Promise<void>;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export function ConfirmDialog({
|
|
249
|
+
trigger,
|
|
250
|
+
title,
|
|
251
|
+
description,
|
|
252
|
+
confirmLabel = 'Confirm',
|
|
253
|
+
cancelLabel = 'Cancel',
|
|
254
|
+
variant = 'default',
|
|
255
|
+
onConfirm,
|
|
256
|
+
}: ConfirmDialogProps) {
|
|
257
|
+
return (
|
|
258
|
+
<AlertDialog>
|
|
259
|
+
<AlertDialogTrigger asChild>{trigger}</AlertDialogTrigger>
|
|
260
|
+
<AlertDialogContent>
|
|
261
|
+
<AlertDialogHeader>
|
|
262
|
+
<AlertDialogTitle>{title}</AlertDialogTitle>
|
|
263
|
+
<AlertDialogDescription>{description}</AlertDialogDescription>
|
|
264
|
+
</AlertDialogHeader>
|
|
265
|
+
<AlertDialogFooter>
|
|
266
|
+
<AlertDialogCancel>{cancelLabel}</AlertDialogCancel>
|
|
267
|
+
<AlertDialogAction
|
|
268
|
+
onClick={onConfirm}
|
|
269
|
+
className={variant === 'destructive' ? 'bg-destructive text-destructive-foreground hover:bg-destructive/90' : ''}
|
|
270
|
+
>
|
|
271
|
+
{confirmLabel}
|
|
272
|
+
</AlertDialogAction>
|
|
273
|
+
</AlertDialogFooter>
|
|
274
|
+
</AlertDialogContent>
|
|
275
|
+
</AlertDialog>
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## 5. Forms with react-hook-form + Zod
|
|
283
|
+
|
|
284
|
+
This is the recommended pattern for forms in shadcn/ui.
|
|
285
|
+
|
|
286
|
+
```tsx
|
|
287
|
+
// Install dependencies: react-hook-form, @hookform/resolvers, zod
|
|
288
|
+
|
|
289
|
+
// 1. Define schema
|
|
290
|
+
import { z } from 'zod';
|
|
291
|
+
|
|
292
|
+
const profileSchema = z.object({
|
|
293
|
+
name: z.string().min(2, 'Name must be at least 2 characters'),
|
|
294
|
+
email: z.string().email('Invalid email address'),
|
|
295
|
+
bio: z.string().max(500, 'Bio must be 500 characters or less').optional(),
|
|
296
|
+
role: z.enum(['user', 'admin', 'moderator'], { required_error: 'Please select a role' }),
|
|
297
|
+
notifications: z.boolean().default(false),
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
type ProfileFormValues = z.infer<typeof profileSchema>;
|
|
301
|
+
|
|
302
|
+
// 2. Build the form
|
|
303
|
+
'use client';
|
|
304
|
+
import { useForm } from 'react-hook-form';
|
|
305
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
306
|
+
import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form';
|
|
307
|
+
import { Input } from '@/components/ui/input';
|
|
308
|
+
import { Textarea } from '@/components/ui/textarea';
|
|
309
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
|
|
310
|
+
import { Switch } from '@/components/ui/switch';
|
|
311
|
+
import { Button } from '@/components/ui/button';
|
|
312
|
+
|
|
313
|
+
export function ProfileForm() {
|
|
314
|
+
const form = useForm<ProfileFormValues>({
|
|
315
|
+
resolver: zodResolver(profileSchema),
|
|
316
|
+
defaultValues: {
|
|
317
|
+
name: '',
|
|
318
|
+
email: '',
|
|
319
|
+
bio: '',
|
|
320
|
+
notifications: false,
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
async function onSubmit(values: ProfileFormValues) {
|
|
325
|
+
// values is fully typed and validated
|
|
326
|
+
await updateProfile(values);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
return (
|
|
330
|
+
<Form {...form}>
|
|
331
|
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6">
|
|
332
|
+
<FormField
|
|
333
|
+
control={form.control}
|
|
334
|
+
name="name"
|
|
335
|
+
render={({ field }) => (
|
|
336
|
+
<FormItem>
|
|
337
|
+
<FormLabel>Name</FormLabel>
|
|
338
|
+
<FormControl>
|
|
339
|
+
<Input placeholder="Your name" {...field} />
|
|
340
|
+
</FormControl>
|
|
341
|
+
<FormMessage />
|
|
342
|
+
</FormItem>
|
|
343
|
+
)}
|
|
344
|
+
/>
|
|
345
|
+
|
|
346
|
+
<FormField
|
|
347
|
+
control={form.control}
|
|
348
|
+
name="email"
|
|
349
|
+
render={({ field }) => (
|
|
350
|
+
<FormItem>
|
|
351
|
+
<FormLabel>Email</FormLabel>
|
|
352
|
+
<FormControl>
|
|
353
|
+
<Input type="email" placeholder="email@example.com" {...field} />
|
|
354
|
+
</FormControl>
|
|
355
|
+
<FormMessage />
|
|
356
|
+
</FormItem>
|
|
357
|
+
)}
|
|
358
|
+
/>
|
|
359
|
+
|
|
360
|
+
<FormField
|
|
361
|
+
control={form.control}
|
|
362
|
+
name="bio"
|
|
363
|
+
render={({ field }) => (
|
|
364
|
+
<FormItem>
|
|
365
|
+
<FormLabel>Bio</FormLabel>
|
|
366
|
+
<FormControl>
|
|
367
|
+
<Textarea placeholder="Tell us about yourself" className="resize-none" {...field} />
|
|
368
|
+
</FormControl>
|
|
369
|
+
<FormDescription>Max 500 characters.</FormDescription>
|
|
370
|
+
<FormMessage />
|
|
371
|
+
</FormItem>
|
|
372
|
+
)}
|
|
373
|
+
/>
|
|
374
|
+
|
|
375
|
+
<FormField
|
|
376
|
+
control={form.control}
|
|
377
|
+
name="role"
|
|
378
|
+
render={({ field }) => (
|
|
379
|
+
<FormItem>
|
|
380
|
+
<FormLabel>Role</FormLabel>
|
|
381
|
+
<Select onValueChange={field.onChange} defaultValue={field.value}>
|
|
382
|
+
<FormControl>
|
|
383
|
+
<SelectTrigger>
|
|
384
|
+
<SelectValue placeholder="Select a role" />
|
|
385
|
+
</SelectTrigger>
|
|
386
|
+
</FormControl>
|
|
387
|
+
<SelectContent>
|
|
388
|
+
<SelectItem value="user">User</SelectItem>
|
|
389
|
+
<SelectItem value="admin">Admin</SelectItem>
|
|
390
|
+
<SelectItem value="moderator">Moderator</SelectItem>
|
|
391
|
+
</SelectContent>
|
|
392
|
+
</Select>
|
|
393
|
+
<FormMessage />
|
|
394
|
+
</FormItem>
|
|
395
|
+
)}
|
|
396
|
+
/>
|
|
397
|
+
|
|
398
|
+
<FormField
|
|
399
|
+
control={form.control}
|
|
400
|
+
name="notifications"
|
|
401
|
+
render={({ field }) => (
|
|
402
|
+
<FormItem className="flex items-center justify-between rounded-lg border p-4">
|
|
403
|
+
<div className="space-y-0.5">
|
|
404
|
+
<FormLabel className="text-base">Notifications</FormLabel>
|
|
405
|
+
<FormDescription>Receive email notifications.</FormDescription>
|
|
406
|
+
</div>
|
|
407
|
+
<FormControl>
|
|
408
|
+
<Switch checked={field.value} onCheckedChange={field.onChange} />
|
|
409
|
+
</FormControl>
|
|
410
|
+
</FormItem>
|
|
411
|
+
)}
|
|
412
|
+
/>
|
|
413
|
+
|
|
414
|
+
<Button type="submit" disabled={form.formState.isSubmitting}>
|
|
415
|
+
{form.formState.isSubmitting ? 'Saving...' : 'Save'}
|
|
416
|
+
</Button>
|
|
417
|
+
</form>
|
|
418
|
+
</Form>
|
|
419
|
+
);
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## 6. Data Table with TanStack Table
|
|
426
|
+
|
|
427
|
+
```tsx
|
|
428
|
+
// 1. Define columns
|
|
429
|
+
'use client';
|
|
430
|
+
import { type ColumnDef } from '@tanstack/react-table';
|
|
431
|
+
import { Badge } from '@/components/ui/badge';
|
|
432
|
+
import { Button } from '@/components/ui/button';
|
|
433
|
+
import { ArrowUpDown, MoreHorizontal } from 'lucide-react';
|
|
434
|
+
import {
|
|
435
|
+
DropdownMenu, DropdownMenuContent, DropdownMenuItem,
|
|
436
|
+
DropdownMenuTrigger,
|
|
437
|
+
} from '@/components/ui/dropdown-menu';
|
|
438
|
+
|
|
439
|
+
type User = { id: string; name: string; email: string; role: string; active: boolean };
|
|
440
|
+
|
|
441
|
+
export const columns: ColumnDef<User>[] = [
|
|
442
|
+
{
|
|
443
|
+
accessorKey: 'name',
|
|
444
|
+
header: ({ column }) => (
|
|
445
|
+
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === 'asc')}>
|
|
446
|
+
Name <ArrowUpDown className="ml-2 h-4 w-4" />
|
|
447
|
+
</Button>
|
|
448
|
+
),
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
accessorKey: 'email',
|
|
452
|
+
header: 'Email',
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
accessorKey: 'role',
|
|
456
|
+
header: 'Role',
|
|
457
|
+
cell: ({ row }) => <Badge variant="outline">{row.getValue('role')}</Badge>,
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
accessorKey: 'active',
|
|
461
|
+
header: 'Status',
|
|
462
|
+
cell: ({ row }) => (
|
|
463
|
+
<Badge variant={row.getValue('active') ? 'default' : 'secondary'}>
|
|
464
|
+
{row.getValue('active') ? 'Active' : 'Inactive'}
|
|
465
|
+
</Badge>
|
|
466
|
+
),
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
id: 'actions',
|
|
470
|
+
cell: ({ row }) => (
|
|
471
|
+
<DropdownMenu>
|
|
472
|
+
<DropdownMenuTrigger asChild>
|
|
473
|
+
<Button variant="ghost" className="h-8 w-8 p-0">
|
|
474
|
+
<MoreHorizontal className="h-4 w-4" />
|
|
475
|
+
</Button>
|
|
476
|
+
</DropdownMenuTrigger>
|
|
477
|
+
<DropdownMenuContent align="end">
|
|
478
|
+
<DropdownMenuItem onClick={() => navigator.clipboard.writeText(row.original.id)}>
|
|
479
|
+
Copy ID
|
|
480
|
+
</DropdownMenuItem>
|
|
481
|
+
<DropdownMenuItem>Edit</DropdownMenuItem>
|
|
482
|
+
<DropdownMenuItem className="text-destructive">Delete</DropdownMenuItem>
|
|
483
|
+
</DropdownMenuContent>
|
|
484
|
+
</DropdownMenu>
|
|
485
|
+
),
|
|
486
|
+
},
|
|
487
|
+
];
|
|
488
|
+
|
|
489
|
+
// 2. Use in a page (server component fetches data, client component renders table)
|
|
490
|
+
// app/users/page.tsx
|
|
491
|
+
import { DataTable } from '@/components/ui/data-table';
|
|
492
|
+
import { columns } from './columns';
|
|
493
|
+
|
|
494
|
+
export default async function UsersPage() {
|
|
495
|
+
const users = await db.query.users.findMany();
|
|
496
|
+
return <DataTable columns={columns} data={users} />;
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
## 7. Toast / Sonner Notifications
|
|
503
|
+
|
|
504
|
+
```tsx
|
|
505
|
+
// Setup: add <Toaster /> to your root layout
|
|
506
|
+
import { Toaster } from '@/components/ui/sonner';
|
|
507
|
+
|
|
508
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
509
|
+
return (
|
|
510
|
+
<html lang="en">
|
|
511
|
+
<body>
|
|
512
|
+
{children}
|
|
513
|
+
<Toaster />
|
|
514
|
+
</body>
|
|
515
|
+
</html>
|
|
516
|
+
);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// Usage anywhere in client components
|
|
520
|
+
import { toast } from 'sonner';
|
|
521
|
+
|
|
522
|
+
function handleSave() {
|
|
523
|
+
toast.promise(saveData(), {
|
|
524
|
+
loading: 'Saving...',
|
|
525
|
+
success: 'Changes saved successfully',
|
|
526
|
+
error: 'Failed to save changes',
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
// Variants
|
|
531
|
+
toast('Default notification');
|
|
532
|
+
toast.success('Operation completed');
|
|
533
|
+
toast.error('Something went wrong');
|
|
534
|
+
toast.warning('Check your input');
|
|
535
|
+
toast.info('New update available');
|
|
536
|
+
|
|
537
|
+
// With action
|
|
538
|
+
toast('File deleted', {
|
|
539
|
+
action: { label: 'Undo', onClick: () => restoreFile() },
|
|
540
|
+
});
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
---
|
|
544
|
+
|
|
545
|
+
## 8. Common Patterns
|
|
546
|
+
|
|
547
|
+
### Command Palette (cmdk)
|
|
548
|
+
|
|
549
|
+
```tsx
|
|
550
|
+
import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command';
|
|
551
|
+
|
|
552
|
+
export function CommandMenu() {
|
|
553
|
+
const [open, setOpen] = useState(false);
|
|
554
|
+
|
|
555
|
+
useEffect(() => {
|
|
556
|
+
const down = (e: KeyboardEvent) => {
|
|
557
|
+
if (e.key === 'k' && (e.metaKey || e.ctrlKey)) {
|
|
558
|
+
e.preventDefault();
|
|
559
|
+
setOpen((prev) => !prev);
|
|
560
|
+
}
|
|
561
|
+
};
|
|
562
|
+
document.addEventListener('keydown', down);
|
|
563
|
+
return () => document.removeEventListener('keydown', down);
|
|
564
|
+
}, []);
|
|
565
|
+
|
|
566
|
+
return (
|
|
567
|
+
<CommandDialog open={open} onOpenChange={setOpen}>
|
|
568
|
+
<CommandInput placeholder="Type a command or search..." />
|
|
569
|
+
<CommandList>
|
|
570
|
+
<CommandEmpty>No results found.</CommandEmpty>
|
|
571
|
+
<CommandGroup heading="Navigation">
|
|
572
|
+
<CommandItem onSelect={() => router.push('/dashboard')}>Dashboard</CommandItem>
|
|
573
|
+
<CommandItem onSelect={() => router.push('/settings')}>Settings</CommandItem>
|
|
574
|
+
</CommandGroup>
|
|
575
|
+
<CommandGroup heading="Actions">
|
|
576
|
+
<CommandItem onSelect={() => setTheme('dark')}>Dark Mode</CommandItem>
|
|
577
|
+
<CommandItem onSelect={() => setTheme('light')}>Light Mode</CommandItem>
|
|
578
|
+
</CommandGroup>
|
|
579
|
+
</CommandList>
|
|
580
|
+
</CommandDialog>
|
|
581
|
+
);
|
|
582
|
+
}
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### Responsive Sheet/Dialog
|
|
586
|
+
|
|
587
|
+
Use `Dialog` on desktop, `Drawer` on mobile.
|
|
588
|
+
|
|
589
|
+
```tsx
|
|
590
|
+
import { useMediaQuery } from '@/hooks/use-media-query';
|
|
591
|
+
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog';
|
|
592
|
+
import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '@/components/ui/drawer';
|
|
593
|
+
|
|
594
|
+
export function ResponsiveModal({ open, onOpenChange, title, children }: Props) {
|
|
595
|
+
const isDesktop = useMediaQuery('(min-width: 768px)');
|
|
596
|
+
|
|
597
|
+
if (isDesktop) {
|
|
598
|
+
return (
|
|
599
|
+
<Dialog open={open} onOpenChange={onOpenChange}>
|
|
600
|
+
<DialogContent>
|
|
601
|
+
<DialogHeader><DialogTitle>{title}</DialogTitle></DialogHeader>
|
|
602
|
+
{children}
|
|
603
|
+
</DialogContent>
|
|
604
|
+
</Dialog>
|
|
605
|
+
);
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
return (
|
|
609
|
+
<Drawer open={open} onOpenChange={onOpenChange}>
|
|
610
|
+
<DrawerContent>
|
|
611
|
+
<DrawerHeader><DrawerTitle>{title}</DrawerTitle></DrawerHeader>
|
|
612
|
+
<div className="p-4">{children}</div>
|
|
613
|
+
</DrawerContent>
|
|
614
|
+
</Drawer>
|
|
615
|
+
);
|
|
616
|
+
}
|
|
617
|
+
```
|
|
618
|
+
|
|
619
|
+
---
|
|
620
|
+
|
|
621
|
+
## 9. Accessibility
|
|
622
|
+
|
|
623
|
+
shadcn/ui components are built on Radix UI primitives, which provide:
|
|
624
|
+
|
|
625
|
+
- Full keyboard navigation (Tab, Arrow keys, Enter, Escape)
|
|
626
|
+
- ARIA attributes automatically applied
|
|
627
|
+
- Focus management and focus trapping in modals
|
|
628
|
+
- Screen reader announcements
|
|
629
|
+
|
|
630
|
+
**Your responsibilities**:
|
|
631
|
+
- Always provide text content or `sr-only` labels for icon-only buttons
|
|
632
|
+
- Use `FormLabel` with form controls (linked via `htmlFor`)
|
|
633
|
+
- Set meaningful `aria-label` on `DialogTitle` and `AlertDialogTitle`
|
|
634
|
+
- Test with keyboard navigation (no mouse)
|
|
635
|
+
- Verify color contrast meets WCAG 2.1 AA (4.5:1 for text)
|
|
636
|
+
|
|
637
|
+
```tsx
|
|
638
|
+
// Icon-only button: always include sr-only text
|
|
639
|
+
<Button variant="ghost" size="icon">
|
|
640
|
+
<Trash2 className="h-4 w-4" />
|
|
641
|
+
<span className="sr-only">Delete item</span>
|
|
642
|
+
</Button>
|
|
643
|
+
|
|
644
|
+
// Visually hidden dialog title (when using a custom header)
|
|
645
|
+
<DialogHeader>
|
|
646
|
+
<DialogTitle className="sr-only">Edit Profile</DialogTitle>
|
|
647
|
+
<div>Your custom header content</div>
|
|
648
|
+
</DialogHeader>
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
---
|
|
652
|
+
|
|
653
|
+
## 10. Extending Without Breaking
|
|
654
|
+
|
|
655
|
+
When you customize a shadcn/ui component, follow these patterns to keep future CLI updates mergeable:
|
|
656
|
+
|
|
657
|
+
```tsx
|
|
658
|
+
// GOOD: Add variants to the existing cva() config
|
|
659
|
+
// The CLI overwrites the file, but your additions are easy to re-apply
|
|
660
|
+
|
|
661
|
+
// GOOD: Wrap the base component in a domain-specific component
|
|
662
|
+
// components/app-button.tsx
|
|
663
|
+
import { Button, type ButtonProps } from '@/components/ui/button';
|
|
664
|
+
import { Loader2 } from 'lucide-react';
|
|
665
|
+
|
|
666
|
+
interface AppButtonProps extends ButtonProps {
|
|
667
|
+
loading?: boolean;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
export function AppButton({ loading, children, disabled, ...props }: AppButtonProps) {
|
|
671
|
+
return (
|
|
672
|
+
<Button disabled={disabled || loading} {...props}>
|
|
673
|
+
{loading && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
|
|
674
|
+
{children}
|
|
675
|
+
</Button>
|
|
676
|
+
);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// BAD: Modifying the base component in ways that are hard to merge
|
|
680
|
+
// If the CLI re-generates button.tsx, your changes are lost
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
---
|
|
684
|
+
|
|
685
|
+
## 11. Critical Reminders
|
|
686
|
+
|
|
687
|
+
### ALWAYS
|
|
688
|
+
|
|
689
|
+
- Use `cn()` for conditional class merging (never raw string concatenation)
|
|
690
|
+
- Provide `sr-only` text for icon-only buttons
|
|
691
|
+
- Use `FormField` + `FormItem` + `FormLabel` + `FormControl` + `FormMessage` for forms
|
|
692
|
+
- Set `asChild` on triggers when wrapping custom elements
|
|
693
|
+
- Test keyboard navigation on dialogs, dropdowns, and menus
|
|
694
|
+
- Use CSS variables for theming (not hardcoded colors)
|
|
695
|
+
|
|
696
|
+
### NEVER
|
|
697
|
+
|
|
698
|
+
- Install shadcn/ui as an npm package (it is a CLI copy tool, not a dependency)
|
|
699
|
+
- Override Radix UI accessibility attributes
|
|
700
|
+
- Remove `role`, `aria-*`, or `data-state` attributes from components
|
|
701
|
+
- Use `z-index` wars -- shadcn/ui manages stacking contexts via Radix portals
|
|
702
|
+
- Hardcode colors instead of using semantic CSS variables (`--primary`, `--destructive`, etc.)
|
|
703
|
+
- Skip the `<Toaster />` in the root layout when using toast notifications
|