claudeinone-cli 1.0.2 → 1.0.3
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/kit/.claude/.ck.json +9 -0
- package/kit/.claude/.ckignore +12 -0
- package/kit/.claude/agents/accessibility-auditor.md +46 -0
- package/kit/.claude/agents/api-designer.md +43 -0
- package/kit/.claude/agents/backend-developer.md +54 -0
- package/kit/.claude/agents/brainstormer.md +33 -0
- package/kit/.claude/agents/campaign-manager.md +36 -0
- package/kit/.claude/agents/code-reviewer.md +39 -0
- package/kit/.claude/agents/content-creator.md +38 -0
- package/kit/.claude/agents/copywriter.md +42 -0
- package/kit/.claude/agents/database-admin.md +37 -0
- package/kit/.claude/agents/debugger.md +46 -0
- package/kit/.claude/agents/devops-engineer.md +41 -0
- package/kit/.claude/agents/docs-manager.md +33 -0
- package/kit/.claude/agents/email-wizard.md +40 -0
- package/kit/.claude/agents/frontend-developer.md +52 -0
- package/kit/.claude/agents/fullstack-developer.md +55 -0
- package/kit/.claude/agents/git-manager.md +40 -0
- package/kit/.claude/agents/i18n-specialist.md +46 -0
- package/kit/.claude/agents/integration-specialist.md +48 -0
- package/kit/.claude/agents/journal-writer.md +39 -0
- package/kit/.claude/agents/mcp-manager.md +57 -0
- package/kit/.claude/agents/mobile-developer.md +38 -0
- package/kit/.claude/agents/performance-optimizer.md +38 -0
- package/kit/.claude/agents/planner.md +56 -0
- package/kit/.claude/agents/project-manager.md +34 -0
- package/kit/.claude/agents/refactorer.md +43 -0
- package/kit/.claude/agents/researcher.md +45 -0
- package/kit/.claude/agents/risk-analyst.md +33 -0
- package/kit/.claude/agents/scalability-consultant.md +39 -0
- package/kit/.claude/agents/scout.md +25 -0
- package/kit/.claude/agents/security-auditor.md +42 -0
- package/kit/.claude/agents/seo-specialist.md +44 -0
- package/kit/.claude/agents/skill-creator.md +64 -0
- package/kit/.claude/agents/social-media-manager.md +35 -0
- package/kit/.claude/agents/systems-designer.md +35 -0
- package/kit/.claude/agents/technology-strategist.md +43 -0
- package/kit/.claude/agents/tester.md +40 -0
- package/kit/.claude/agents/ui-ux-designer.md +40 -0
- package/kit/.claude/commands/co/ask.md +29 -0
- package/kit/.claude/commands/co/bootstrap-auto-fast.md +28 -0
- package/kit/.claude/commands/co/bootstrap-auto-parallel.md +29 -0
- package/kit/.claude/commands/co/bootstrap-auto.md +30 -0
- package/kit/.claude/commands/co/bootstrap.md +31 -0
- package/kit/.claude/commands/co/brainstorm.md +27 -0
- package/kit/.claude/commands/co/campaign.md +28 -0
- package/kit/.claude/commands/co/changelog.md +25 -0
- package/kit/.claude/commands/co/checkpoint.md +25 -0
- package/kit/.claude/commands/co/ci.md +26 -0
- package/kit/.claude/commands/co/ck-help.md +24 -0
- package/kit/.claude/commands/co/coding-level.md +24 -0
- package/kit/.claude/commands/co/content-cro.md +26 -0
- package/kit/.claude/commands/co/content-enhance.md +26 -0
- package/kit/.claude/commands/co/content-fast.md +24 -0
- package/kit/.claude/commands/co/content-good.md +26 -0
- package/kit/.claude/commands/co/cook.md +33 -0
- package/kit/.claude/commands/co/debug.md +26 -0
- package/kit/.claude/commands/co/deploy.md +25 -0
- package/kit/.claude/commands/co/design-3d.md +27 -0
- package/kit/.claude/commands/co/design-describe.md +25 -0
- package/kit/.claude/commands/co/design-fast.md +25 -0
- package/kit/.claude/commands/co/design-good.md +28 -0
- package/kit/.claude/commands/co/design-screenshot.md +26 -0
- package/kit/.claude/commands/co/design-video.md +26 -0
- package/kit/.claude/commands/co/docker.md +24 -0
- package/kit/.claude/commands/co/docs-api.md +25 -0
- package/kit/.claude/commands/co/docs-init.md +26 -0
- package/kit/.claude/commands/co/docs-readme.md +24 -0
- package/kit/.claude/commands/co/docs-summarize.md +25 -0
- package/kit/.claude/commands/co/docs-update.md +25 -0
- package/kit/.claude/commands/co/env-check.md +25 -0
- package/kit/.claude/commands/co/fix-ci.md +29 -0
- package/kit/.claude/commands/co/fix-fast.md +28 -0
- package/kit/.claude/commands/co/fix-hard.md +33 -0
- package/kit/.claude/commands/co/fix-logs.md +28 -0
- package/kit/.claude/commands/co/fix-types.md +28 -0
- package/kit/.claude/commands/co/fix-ui.md +28 -0
- package/kit/.claude/commands/co/fix.md +27 -0
- package/kit/.claude/commands/co/git-cm.md +26 -0
- package/kit/.claude/commands/co/git-cp.md +26 -0
- package/kit/.claude/commands/co/git-pr.md +26 -0
- package/kit/.claude/commands/co/index.md +24 -0
- package/kit/.claude/commands/co/integrate-polar.md +29 -0
- package/kit/.claude/commands/co/integrate-sepay.md +29 -0
- package/kit/.claude/commands/co/journal.md +27 -0
- package/kit/.claude/commands/co/k8s.md +24 -0
- package/kit/.claude/commands/co/kanban.md +25 -0
- package/kit/.claude/commands/co/lint-fix.md +24 -0
- package/kit/.claude/commands/co/load.md +25 -0
- package/kit/.claude/commands/co/migrate.md +28 -0
- package/kit/.claude/commands/co/mock.md +26 -0
- package/kit/.claude/commands/co/mode.md +24 -0
- package/kit/.claude/commands/co/monitor.md +25 -0
- package/kit/.claude/commands/co/new-feature.md +27 -0
- package/kit/.claude/commands/co/optimize.md +26 -0
- package/kit/.claude/commands/co/plan-archive.md +24 -0
- package/kit/.claude/commands/co/plan-ci.md +28 -0
- package/kit/.claude/commands/co/plan-cro.md +27 -0
- package/kit/.claude/commands/co/plan-fast.md +24 -0
- package/kit/.claude/commands/co/plan-hard.md +27 -0
- package/kit/.claude/commands/co/plan-parallel.md +25 -0
- package/kit/.claude/commands/co/plan-two.md +29 -0
- package/kit/.claude/commands/co/plan-validate.md +27 -0
- package/kit/.claude/commands/co/plan.md +27 -0
- package/kit/.claude/commands/co/pr.md +25 -0
- package/kit/.claude/commands/co/preview.md +26 -0
- package/kit/.claude/commands/co/refactor.md +25 -0
- package/kit/.claude/commands/co/release.md +25 -0
- package/kit/.claude/commands/co/review-a11y.md +24 -0
- package/kit/.claude/commands/co/review-codebase-parallel.md +27 -0
- package/kit/.claude/commands/co/review-codebase.md +27 -0
- package/kit/.claude/commands/co/review-perf.md +24 -0
- package/kit/.claude/commands/co/review-security.md +25 -0
- package/kit/.claude/commands/co/scaffold.md +25 -0
- package/kit/.claude/commands/co/scout.md +26 -0
- package/kit/.claude/commands/co/secure.md +26 -0
- package/kit/.claude/commands/co/seed.md +25 -0
- package/kit/.claude/commands/co/seo-audit.md +24 -0
- package/kit/.claude/commands/co/seo-keywords.md +25 -0
- package/kit/.claude/commands/co/skill-create.md +29 -0
- package/kit/.claude/commands/co/skill-fix-logs.md +28 -0
- package/kit/.claude/commands/co/slide-create.md +24 -0
- package/kit/.claude/commands/co/spawn.md +24 -0
- package/kit/.claude/commands/co/terraform.md +24 -0
- package/kit/.claude/commands/co/test-gen.md +24 -0
- package/kit/.claude/commands/co/test-ui.md +27 -0
- package/kit/.claude/commands/co/test.md +26 -0
- package/kit/.claude/commands/co/use-mcp.md +25 -0
- package/kit/.claude/commands/co/video-script.md +25 -0
- package/kit/.claude/commands/co/watzup.md +25 -0
- package/kit/.claude/commands/co/worktree.md +25 -0
- package/kit/.claude/commands/co/write-blog.md +25 -0
- package/kit/.claude/commands/co/write-copy.md +24 -0
- package/kit/.claude/commands/co/write-email.md +25 -0
- package/kit/.claude/commands/content/content-cro.md +26 -0
- package/kit/.claude/commands/content/content-enhance.md +26 -0
- package/kit/.claude/commands/content/content-fast.md +24 -0
- package/kit/.claude/commands/content/content-good.md +26 -0
- package/kit/.claude/commands/content/enhance.md +26 -0
- package/kit/.claude/commands/content/good.md +26 -0
- package/kit/.claude/commands/core/ask.md +29 -0
- package/kit/.claude/commands/core/bootstrap-auto-fast.md +28 -0
- package/kit/.claude/commands/core/bootstrap-auto-parallel.md +29 -0
- package/kit/.claude/commands/core/bootstrap-auto.md +30 -0
- package/kit/.claude/commands/core/bootstrap.md +31 -0
- package/kit/.claude/commands/core/ck-help.md +24 -0
- package/kit/.claude/commands/core/coding-level.md +24 -0
- package/kit/.claude/commands/core/cook.md +33 -0
- package/kit/.claude/commands/core/debug.md +26 -0
- package/kit/.claude/commands/core/journal.md +27 -0
- package/kit/.claude/commands/core/kanban.md +25 -0
- package/kit/.claude/commands/core/preview.md +26 -0
- package/kit/.claude/commands/core/scout.md +26 -0
- package/kit/.claude/commands/core/test-ui.md +27 -0
- package/kit/.claude/commands/core/test.md +26 -0
- package/kit/.claude/commands/core/use-mcp.md +25 -0
- package/kit/.claude/commands/core/watzup.md +25 -0
- package/kit/.claude/commands/core/worktree.md +25 -0
- package/kit/.claude/commands/design/3d.md +27 -0
- package/kit/.claude/commands/design/design-3d.md +27 -0
- package/kit/.claude/commands/design/design-describe.md +25 -0
- package/kit/.claude/commands/design/design-fast.md +25 -0
- package/kit/.claude/commands/design/design-good.md +28 -0
- package/kit/.claude/commands/design/design-screenshot.md +26 -0
- package/kit/.claude/commands/design/design-video.md +26 -0
- package/kit/.claude/commands/design/good.md +28 -0
- package/kit/.claude/commands/design/video.md +26 -0
- package/kit/.claude/commands/docs/docs-init.md +26 -0
- package/kit/.claude/commands/docs/docs-summarize.md +25 -0
- package/kit/.claude/commands/docs/docs-update.md +25 -0
- package/kit/.claude/commands/docs/init.md +26 -0
- package/kit/.claude/commands/docs/summarize.md +25 -0
- package/kit/.claude/commands/fix/ci.md +29 -0
- package/kit/.claude/commands/fix/fast.md +28 -0
- package/kit/.claude/commands/fix/fix-ci.md +29 -0
- package/kit/.claude/commands/fix/fix-fast.md +28 -0
- package/kit/.claude/commands/fix/fix-hard.md +33 -0
- package/kit/.claude/commands/fix/fix-logs.md +28 -0
- package/kit/.claude/commands/fix/fix-types.md +28 -0
- package/kit/.claude/commands/fix/fix-ui.md +28 -0
- package/kit/.claude/commands/fix/hard.md +33 -0
- package/kit/.claude/commands/fix/logs.md +28 -0
- package/kit/.claude/commands/fix/types.md +28 -0
- package/kit/.claude/commands/fix/ui.md +28 -0
- package/kit/.claude/commands/git/cp.md +26 -0
- package/kit/.claude/commands/git/git-cm.md +26 -0
- package/kit/.claude/commands/git/git-cp.md +26 -0
- package/kit/.claude/commands/git/git-pr.md +26 -0
- package/kit/.claude/commands/integrate/integrate-polar.md +29 -0
- package/kit/.claude/commands/integrate/integrate-sepay.md +29 -0
- package/kit/.claude/commands/integrate/sepay.md +29 -0
- package/kit/.claude/commands/plan/ci.md +28 -0
- package/kit/.claude/commands/plan/cro.md +27 -0
- package/kit/.claude/commands/plan/hard.md +27 -0
- package/kit/.claude/commands/plan/plan-archive.md +24 -0
- package/kit/.claude/commands/plan/plan-ci.md +28 -0
- package/kit/.claude/commands/plan/plan-cro.md +27 -0
- package/kit/.claude/commands/plan/plan-fast.md +24 -0
- package/kit/.claude/commands/plan/plan-hard.md +27 -0
- package/kit/.claude/commands/plan/plan-parallel.md +25 -0
- package/kit/.claude/commands/plan/plan-two.md +29 -0
- package/kit/.claude/commands/plan/plan-validate.md +27 -0
- package/kit/.claude/commands/plan/plan.md +27 -0
- package/kit/.claude/commands/plan/validate.md +27 -0
- package/kit/.claude/commands/skill/fix-logs.md +28 -0
- package/kit/.claude/commands/skill/skill-create.md +29 -0
- package/kit/.claude/commands/skill/skill-fix-logs.md +28 -0
- package/kit/.claude/settings.json +16 -0
- package/kit/.claude/skills/ai-anthropic.md +100 -0
- package/kit/.claude/skills/ai-context-engineering.md +113 -0
- package/kit/.claude/skills/ai-gemini.md +152 -0
- package/kit/.claude/skills/ai-langchain.md +93 -0
- package/kit/.claude/skills/ai-llamaindex.md +179 -0
- package/kit/.claude/skills/ai-mcp-builder.md +101 -0
- package/kit/.claude/skills/ai-openai.md +250 -0
- package/kit/.claude/skills/ai-prompt-engineering.md +173 -0
- package/kit/.claude/skills/ai-rag.md +91 -0
- package/kit/.claude/skills/ai-vectordb.md +215 -0
- package/kit/.claude/skills/analytics-segment.md +161 -0
- package/kit/.claude/skills/api-caching.md +103 -0
- package/kit/.claude/skills/api-documentation.md +50 -0
- package/kit/.claude/skills/api-graphql.md +234 -0
- package/kit/.claude/skills/api-openapi.md +116 -0
- package/kit/.claude/skills/api-pagination-filtering.md +239 -0
- package/kit/.claude/skills/api-rate-limiting.md +179 -0
- package/kit/.claude/skills/api-rest-advanced.md +50 -0
- package/kit/.claude/skills/api-rest.md +217 -0
- package/kit/.claude/skills/api-trpc.md +173 -0
- package/kit/.claude/skills/api-versioning.md +70 -0
- package/kit/.claude/skills/api-webhooks.md +226 -0
- package/kit/.claude/skills/arch-clean-code.md +226 -0
- package/kit/.claude/skills/arch-clean.md +91 -0
- package/kit/.claude/skills/arch-cqrs.md +229 -0
- package/kit/.claude/skills/arch-ddd.md +85 -0
- package/kit/.claude/skills/arch-event-driven.md +189 -0
- package/kit/.claude/skills/arch-microservices.md +80 -0
- package/kit/.claude/skills/arch-monorepo.md +87 -0
- package/kit/.claude/skills/arch-multi-tenant.md +81 -0
- package/kit/.claude/skills/arch-serverless.md +86 -0
- package/kit/.claude/skills/auth-clerk.md +97 -0
- package/kit/.claude/skills/auth-jwt.md +143 -0
- package/kit/.claude/skills/auth-lucia.md +93 -0
- package/kit/.claude/skills/auth-nextauth.md +446 -0
- package/kit/.claude/skills/auth-oauth.md +208 -0
- package/kit/.claude/skills/auth-oauth2.md +110 -0
- package/kit/.claude/skills/auth-passkeys.md +109 -0
- package/kit/.claude/skills/auth-session.md +88 -0
- package/kit/.claude/skills/backend-dotnet.md +414 -0
- package/kit/.claude/skills/backend-express.md +129 -0
- package/kit/.claude/skills/backend-fastify.md +104 -0
- package/kit/.claude/skills/backend-go.md +205 -0
- package/kit/.claude/skills/backend-graphql.md +149 -0
- package/kit/.claude/skills/backend-grpc.md +382 -0
- package/kit/.claude/skills/backend-hono.md +95 -0
- package/kit/.claude/skills/backend-java-spring.md +198 -0
- package/kit/.claude/skills/backend-nodejs-express.md +165 -0
- package/kit/.claude/skills/backend-nodejs.md +143 -0
- package/kit/.claude/skills/backend-php-laravel.md +156 -0
- package/kit/.claude/skills/backend-python-django.md +200 -0
- package/kit/.claude/skills/backend-python-fastapi.md +169 -0
- package/kit/.claude/skills/backend-ruby-rails.md +190 -0
- package/kit/.claude/skills/backend-rust.md +182 -0
- package/kit/.claude/skills/backend-websockets.md +392 -0
- package/kit/.claude/skills/cache-redis.md +195 -0
- package/kit/.claude/skills/caching-strategies.md +100 -0
- package/kit/.claude/skills/cloud-aws.md +165 -0
- package/kit/.claude/skills/cloud-azure.md +187 -0
- package/kit/.claude/skills/cloud-cloudflare.md +74 -0
- package/kit/.claude/skills/cloud-fly.md +94 -0
- package/kit/.claude/skills/cloud-gcp.md +160 -0
- package/kit/.claude/skills/cloud-railway.md +92 -0
- package/kit/.claude/skills/cloud-render.md +70 -0
- package/kit/.claude/skills/cloud-serverless.md +68 -0
- package/kit/.claude/skills/cloud-vercel.md +76 -0
- package/kit/.claude/skills/component-patterns.md +50 -0
- package/kit/.claude/skills/content-management.md +197 -0
- package/kit/.claude/skills/cors-security.md +50 -0
- package/kit/.claude/skills/data-csv-excel.md +210 -0
- package/kit/.claude/skills/database-optimization.md +196 -0
- package/kit/.claude/skills/databases-transactions.md +68 -0
- package/kit/.claude/skills/db-cassandra.md +89 -0
- package/kit/.claude/skills/db-drizzle.md +363 -0
- package/kit/.claude/skills/db-dynamodb.md +83 -0
- package/kit/.claude/skills/db-elasticsearch.md +105 -0
- package/kit/.claude/skills/db-firebase-firestore.md +191 -0
- package/kit/.claude/skills/db-mongodb.md +198 -0
- package/kit/.claude/skills/db-mysql.md +50 -0
- package/kit/.claude/skills/db-neon.md +72 -0
- package/kit/.claude/skills/db-planetscale.md +76 -0
- package/kit/.claude/skills/db-postgresql.md +50 -0
- package/kit/.claude/skills/db-prisma.md +414 -0
- package/kit/.claude/skills/db-redis.md +50 -0
- package/kit/.claude/skills/db-sqlite.md +149 -0
- package/kit/.claude/skills/db-supabase.md +445 -0
- package/kit/.claude/skills/devops-ci-cd.md +271 -0
- package/kit/.claude/skills/devops-database-backup.md +77 -0
- package/kit/.claude/skills/devops-docker.md +93 -0
- package/kit/.claude/skills/devops-github-actions.md +82 -0
- package/kit/.claude/skills/devops-health-checks.md +50 -0
- package/kit/.claude/skills/devops-kubernetes.md +109 -0
- package/kit/.claude/skills/devops-logging.md +163 -0
- package/kit/.claude/skills/devops-monitoring.md +203 -0
- package/kit/.claude/skills/devops-pulumi.md +94 -0
- package/kit/.claude/skills/devops-secrets.md +166 -0
- package/kit/.claude/skills/devops-terraform.md +226 -0
- package/kit/.claude/skills/error-boundaries.md +84 -0
- package/kit/.claude/skills/file-storage.md +50 -0
- package/kit/.claude/skills/frontend-angular.md +104 -0
- package/kit/.claude/skills/frontend-astro.md +94 -0
- package/kit/.claude/skills/frontend-bundle-analysis.md +147 -0
- package/kit/.claude/skills/frontend-forms.md +134 -0
- package/kit/.claude/skills/frontend-htmx.md +86 -0
- package/kit/.claude/skills/frontend-nextjs.md +188 -0
- package/kit/.claude/skills/frontend-pwa.md +105 -0
- package/kit/.claude/skills/frontend-react-hooks.md +238 -0
- package/kit/.claude/skills/frontend-react.md +129 -0
- package/kit/.claude/skills/frontend-remix-advanced.md +106 -0
- package/kit/.claude/skills/frontend-remix.md +101 -0
- package/kit/.claude/skills/frontend-solid.md +99 -0
- package/kit/.claude/skills/frontend-state-management.md +134 -0
- package/kit/.claude/skills/frontend-state.md +106 -0
- package/kit/.claude/skills/frontend-svelte.md +121 -0
- package/kit/.claude/skills/frontend-testing.md +100 -0
- package/kit/.claude/skills/frontend-vite.md +94 -0
- package/kit/.claude/skills/frontend-vue.md +133 -0
- package/kit/.claude/skills/frontend-webpack.md +93 -0
- package/kit/.claude/skills/functional-programming.md +50 -0
- package/kit/.claude/skills/hooks-custom.md +50 -0
- package/kit/.claude/skills/http-server.md +50 -0
- package/kit/.claude/skills/i18n-general.md +89 -0
- package/kit/.claude/skills/i18n-localization.md +191 -0
- package/kit/.claude/skills/i18n-nextjs.md +127 -0
- package/kit/.claude/skills/infrastructure-docker-compose.md +77 -0
- package/kit/.claude/skills/infrastructure-serverless.md +177 -0
- package/kit/.claude/skills/jwt-tokens.md +50 -0
- package/kit/.claude/skills/logging-winston.md +106 -0
- package/kit/.claude/skills/messaging-kafka.md +102 -0
- package/kit/.claude/skills/messaging-rabbitmq.md +50 -0
- package/kit/.claude/skills/mobile-capacitor.md +109 -0
- package/kit/.claude/skills/mobile-expo.md +101 -0
- package/kit/.claude/skills/mobile-flutter.md +259 -0
- package/kit/.claude/skills/mobile-react-native.md +238 -0
- package/kit/.claude/skills/monitoring-apm.md +50 -0
- package/kit/.claude/skills/monitoring-error-tracking.md +217 -0
- package/kit/.claude/skills/nodejs-streams.md +168 -0
- package/kit/.claude/skills/oauth-integration.md +50 -0
- package/kit/.claude/skills/patterns-dependency-injection.md +218 -0
- package/kit/.claude/skills/patterns-factory-singleton.md +209 -0
- package/kit/.claude/skills/patterns-observer-pubsub.md +210 -0
- package/kit/.claude/skills/payment-lemonsqueezy.md +101 -0
- package/kit/.claude/skills/payment-square.md +178 -0
- package/kit/.claude/skills/payment-stripe.md +206 -0
- package/kit/.claude/skills/perf-bundle.md +100 -0
- package/kit/.claude/skills/perf-web-vitals.md +102 -0
- package/kit/.claude/skills/performance-database-connection-pooling.md +67 -0
- package/kit/.claude/skills/performance-metrics.md +73 -0
- package/kit/.claude/skills/performance-optimization.md +208 -0
- package/kit/.claude/skills/performance-web-vitals.md +169 -0
- package/kit/.claude/skills/rate-limiting.md +77 -0
- package/kit/.claude/skills/reactive-programming.md +50 -0
- package/kit/.claude/skills/realtime-database.md +50 -0
- package/kit/.claude/skills/realtime-subscriptions.md +218 -0
- package/kit/.claude/skills/saas-ab-testing.md +90 -0
- package/kit/.claude/skills/saas-analytics.md +113 -0
- package/kit/.claude/skills/saas-billing.md +106 -0
- package/kit/.claude/skills/saas-email.md +88 -0
- package/kit/.claude/skills/saas-feature-flags.md +83 -0
- package/kit/.claude/skills/saas-onboarding.md +96 -0
- package/kit/.claude/skills/saas-user-onboarding.md +207 -0
- package/kit/.claude/skills/security-encryption.md +216 -0
- package/kit/.claude/skills/security-owasp.md +212 -0
- package/kit/.claude/skills/security-secrets-rotation.md +64 -0
- package/kit/.claude/skills/seo-content.md +94 -0
- package/kit/.claude/skills/seo-technical.md +101 -0
- package/kit/.claude/skills/serverless-framework.md +151 -0
- package/kit/.claude/skills/sharding-scaling.md +50 -0
- package/kit/.claude/skills/styling-css-modules.md +219 -0
- package/kit/.claude/skills/styling-styled-components.md +206 -0
- package/kit/.claude/skills/styling-tailwind.md +206 -0
- package/kit/.claude/skills/test-e2e.md +86 -0
- package/kit/.claude/skills/test-integration.md +216 -0
- package/kit/.claude/skills/test-performance.md +162 -0
- package/kit/.claude/skills/test-tdd.md +170 -0
- package/kit/.claude/skills/test-unit.md +301 -0
- package/kit/.claude/skills/testing-accessibility.md +117 -0
- package/kit/.claude/skills/testing-contract.md +75 -0
- package/kit/.claude/skills/testing-e2e-advanced.md +50 -0
- package/kit/.claude/skills/testing-load-stress.md +79 -0
- package/kit/.claude/skills/testing-mutation.md +92 -0
- package/kit/.claude/skills/testing-snapshot.md +50 -0
- package/kit/.claude/skills/testing-vitest.md +172 -0
- package/kit/.claude/skills/tooling-biome.md +91 -0
- package/kit/.claude/skills/tooling-build-tools.md +166 -0
- package/kit/.claude/skills/tooling-bun.md +94 -0
- package/kit/.claude/skills/tooling-eslint.md +103 -0
- package/kit/.claude/skills/tooling-git.md +79 -0
- package/kit/.claude/skills/tooling-monorepo.md +162 -0
- package/kit/.claude/skills/tooling-testing-frameworks.md +207 -0
- package/kit/.claude/skills/tooling-typescript.md +156 -0
- package/kit/.claude/skills/ui-a11y.md +106 -0
- package/kit/.claude/skills/ui-framer.md +106 -0
- package/kit/.claude/skills/ui-gsap.md +102 -0
- package/kit/.claude/skills/ui-radix.md +82 -0
- package/kit/.claude/skills/ui-shadcn.md +463 -0
- package/kit/.claude/skills/ui-tailwind.md +98 -0
- package/kit/.claude/skills/ui-threejs.md +110 -0
- package/kit/.claude/skills/ui-tokens.md +97 -0
- package/kit/.claude/skills/utilities-date-time.md +170 -0
- package/kit/.claude/skills/validation-schemas.md +110 -0
- package/kit/.claude/skills/version-control-git.md +144 -0
- package/kit/.claude/skills/web-accessibility-wcag.md +102 -0
- package/kit/.claude/skills/web-astro.md +197 -0
- package/kit/.claude/skills/web-html-css.md +224 -0
- package/kit/.claude/skills/web-htmx.md +99 -0
- package/kit/.claude/skills/web-nextjs-advanced.md +202 -0
- package/kit/.claude/skills/web-remix.md +194 -0
- package/kit/.claude/skills/web-seo.md +99 -0
- package/kit/.claude/skills/web-svelte.md +234 -0
- package/kit/.claude/skills/websocket-server.md +50 -0
- package/kit/.claude/skills/writing-marketing.md +89 -0
- package/kit/.claude/skills/writing-technical.md +119 -0
- package/kit/CLAUDE.md +206 -0
- package/kit/README.md +150 -0
- package/kit/SKILLS_INDEX.md +188 -0
- package/kit/docs/README.md +3 -0
- package/kit/journals/README.md +3 -0
- package/kit/plans/README.md +3 -0
- package/package.json +3 -1
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# CSS Modules
|
|
2
|
+
|
|
3
|
+
Scoped CSS with automatic naming and no conflicts.
|
|
4
|
+
|
|
5
|
+
## Basic Usage
|
|
6
|
+
|
|
7
|
+
```module.css
|
|
8
|
+
/* Button.module.css */
|
|
9
|
+
.button {
|
|
10
|
+
display: inline-block;
|
|
11
|
+
padding: 10px 20px;
|
|
12
|
+
background-color: #007bff;
|
|
13
|
+
color: white;
|
|
14
|
+
border: none;
|
|
15
|
+
border-radius: 4px;
|
|
16
|
+
cursor: pointer;
|
|
17
|
+
font-weight: 600;
|
|
18
|
+
transition: background-color 0.3s;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.button:hover {
|
|
22
|
+
background-color: #0056b3;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.button.primary {
|
|
26
|
+
background-color: #28a745;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.button.primary:hover {
|
|
30
|
+
background-color: #218838;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.button:disabled {
|
|
34
|
+
opacity: 0.6;
|
|
35
|
+
cursor: not-allowed;
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```jsx
|
|
40
|
+
// Button.jsx
|
|
41
|
+
import styles from './Button.module.css';
|
|
42
|
+
|
|
43
|
+
export function Button({ variant = 'primary', disabled = false, children }) {
|
|
44
|
+
return (
|
|
45
|
+
<button
|
|
46
|
+
className={`${styles.button} ${styles[variant]}`}
|
|
47
|
+
disabled={disabled}
|
|
48
|
+
>
|
|
49
|
+
{children}
|
|
50
|
+
</button>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Composition
|
|
56
|
+
|
|
57
|
+
```module.css
|
|
58
|
+
/* Form.module.css */
|
|
59
|
+
.form {
|
|
60
|
+
max-width: 500px;
|
|
61
|
+
margin: 0 auto;
|
|
62
|
+
padding: 20px;
|
|
63
|
+
background-color: #f9f9f9;
|
|
64
|
+
border-radius: 8px;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.group {
|
|
68
|
+
margin-bottom: 20px;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.label {
|
|
72
|
+
display: block;
|
|
73
|
+
margin-bottom: 8px;
|
|
74
|
+
font-weight: 600;
|
|
75
|
+
color: #333;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.input {
|
|
79
|
+
width: 100%;
|
|
80
|
+
padding: 10px;
|
|
81
|
+
border: 1px solid #ddd;
|
|
82
|
+
border-radius: 4px;
|
|
83
|
+
font-size: 16px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.input:focus {
|
|
87
|
+
outline: none;
|
|
88
|
+
border-color: #007bff;
|
|
89
|
+
box-shadow: 0 0 5px rgba(0, 123, 255, 0.5);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.error {
|
|
93
|
+
composes: input;
|
|
94
|
+
border-color: #dc3545;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.error:focus {
|
|
98
|
+
box-shadow: 0 0 5px rgba(220, 53, 69, 0.5);
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```jsx
|
|
103
|
+
// LoginForm.jsx
|
|
104
|
+
import styles from './Form.module.css';
|
|
105
|
+
|
|
106
|
+
export function LoginForm() {
|
|
107
|
+
const [email, setEmail] = useState('');
|
|
108
|
+
const [error, setError] = useState('');
|
|
109
|
+
|
|
110
|
+
return (
|
|
111
|
+
<form className={styles.form}>
|
|
112
|
+
<div className={styles.group}>
|
|
113
|
+
<label className={styles.label}>Email</label>
|
|
114
|
+
<input
|
|
115
|
+
className={error ? styles.error : styles.input}
|
|
116
|
+
type="email"
|
|
117
|
+
value={email}
|
|
118
|
+
onChange={(e) => setEmail(e.target.value)}
|
|
119
|
+
/>
|
|
120
|
+
</div>
|
|
121
|
+
</form>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## TypeScript Support
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// Button.module.css
|
|
130
|
+
export const button: string;
|
|
131
|
+
export const primary: string;
|
|
132
|
+
export const disabled: string;
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// Button.tsx
|
|
137
|
+
import styles from './Button.module.css';
|
|
138
|
+
|
|
139
|
+
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
140
|
+
variant?: 'primary' | 'secondary';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export const Button: React.FC<ButtonProps> = ({
|
|
144
|
+
variant = 'primary',
|
|
145
|
+
className,
|
|
146
|
+
...props
|
|
147
|
+
}) => {
|
|
148
|
+
return (
|
|
149
|
+
<button
|
|
150
|
+
className={`${styles.button} ${styles[variant]} ${className || ''}`}
|
|
151
|
+
{...props}
|
|
152
|
+
/>
|
|
153
|
+
);
|
|
154
|
+
};
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Mixins with PostCSS
|
|
158
|
+
|
|
159
|
+
```module.css
|
|
160
|
+
/* mixins.css */
|
|
161
|
+
@define-mixin flex-center {
|
|
162
|
+
display: flex;
|
|
163
|
+
justify-content: center;
|
|
164
|
+
align-items: center;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
@define-mixin button-base {
|
|
168
|
+
padding: 10px 20px;
|
|
169
|
+
border: none;
|
|
170
|
+
border-radius: 4px;
|
|
171
|
+
cursor: pointer;
|
|
172
|
+
font-weight: 600;
|
|
173
|
+
transition: all 0.3s;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Component.module.css */
|
|
177
|
+
.container {
|
|
178
|
+
@mixin flex-center;
|
|
179
|
+
height: 100vh;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.button {
|
|
183
|
+
@mixin button-base;
|
|
184
|
+
background-color: #007bff;
|
|
185
|
+
color: white;
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Organization Pattern
|
|
190
|
+
|
|
191
|
+
```
|
|
192
|
+
src/
|
|
193
|
+
├── components/
|
|
194
|
+
│ ├── Button/
|
|
195
|
+
│ │ ├── Button.tsx
|
|
196
|
+
│ │ └── Button.module.css
|
|
197
|
+
│ ├── Card/
|
|
198
|
+
│ │ ├── Card.tsx
|
|
199
|
+
│ │ └── Card.module.css
|
|
200
|
+
│ └── Form/
|
|
201
|
+
│ ├── Form.tsx
|
|
202
|
+
│ └── Form.module.css
|
|
203
|
+
└── styles/
|
|
204
|
+
├── globals.css
|
|
205
|
+
└── variables.css
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Best Practices
|
|
209
|
+
|
|
210
|
+
✅ **Namespace by component** - One module per component
|
|
211
|
+
✅ **Avoid nesting** - Keep selectors simple
|
|
212
|
+
✅ **Composition** - Use composes for DRY styles
|
|
213
|
+
✅ **TypeScript** - Get type safety for classes
|
|
214
|
+
✅ **Global styles** - Use separate global file
|
|
215
|
+
|
|
216
|
+
## Resources
|
|
217
|
+
|
|
218
|
+
- [CSS Modules Spec](https://github.com/css-modules/css-modules)
|
|
219
|
+
- [PostCSS Documentation](https://postcss.org/)
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# styled-components
|
|
2
|
+
|
|
3
|
+
CSS-in-JS library for component-scoped styling with full JavaScript support.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install styled-components
|
|
9
|
+
npm install -D @types/styled-components
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Basic Usage
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import styled from 'styled-components';
|
|
16
|
+
|
|
17
|
+
const StyledButton = styled.button`
|
|
18
|
+
display: inline-block;
|
|
19
|
+
padding: 10px 20px;
|
|
20
|
+
background-color: #007bff;
|
|
21
|
+
color: white;
|
|
22
|
+
border: none;
|
|
23
|
+
border-radius: 4px;
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
font-weight: 600;
|
|
26
|
+
transition: background-color 0.3s;
|
|
27
|
+
|
|
28
|
+
&:hover {
|
|
29
|
+
background-color: #0056b3;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
&:disabled {
|
|
33
|
+
opacity: 0.6;
|
|
34
|
+
cursor: not-allowed;
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
|
|
38
|
+
export function Button({ children, ...props }) {
|
|
39
|
+
return <StyledButton {...props}>{children}</StyledButton>;
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Props & Theming
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
const StyledInput = styled.input<{ hasError: boolean }>`
|
|
47
|
+
width: 100%;
|
|
48
|
+
padding: 10px;
|
|
49
|
+
border: 2px solid ${props => props.hasError ? '#dc3545' : '#ddd'};
|
|
50
|
+
border-radius: 4px;
|
|
51
|
+
font-size: 16px;
|
|
52
|
+
|
|
53
|
+
&:focus {
|
|
54
|
+
outline: none;
|
|
55
|
+
border-color: ${props => props.hasError ? '#dc3545' : '#007bff'};
|
|
56
|
+
box-shadow: 0 0 5px ${props => props.hasError ? 'rgba(220, 53, 69, 0.5)' : 'rgba(0, 123, 255, 0.5)'};
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
|
|
60
|
+
export function FormInput({ error, ...props }) {
|
|
61
|
+
return <StyledInput hasError={!!error} {...props} />;
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Global Styles
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
import { createGlobalStyle } from 'styled-components';
|
|
69
|
+
|
|
70
|
+
const GlobalStyles = createGlobalStyle`
|
|
71
|
+
* {
|
|
72
|
+
margin: 0;
|
|
73
|
+
padding: 0;
|
|
74
|
+
box-sizing: border-box;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
body {
|
|
78
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
79
|
+
background-color: #f5f5f5;
|
|
80
|
+
color: #333;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
button {
|
|
84
|
+
font-family: inherit;
|
|
85
|
+
}
|
|
86
|
+
`;
|
|
87
|
+
|
|
88
|
+
export function App() {
|
|
89
|
+
return (
|
|
90
|
+
<>
|
|
91
|
+
<GlobalStyles />
|
|
92
|
+
<MyComponent />
|
|
93
|
+
</>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Theme Provider
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { ThemeProvider } from 'styled-components';
|
|
102
|
+
|
|
103
|
+
const lightTheme = {
|
|
104
|
+
colors: {
|
|
105
|
+
primary: '#007bff',
|
|
106
|
+
secondary: '#6c757d',
|
|
107
|
+
danger: '#dc3545',
|
|
108
|
+
background: '#ffffff',
|
|
109
|
+
text: '#333333'
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const darkTheme = {
|
|
114
|
+
colors: {
|
|
115
|
+
primary: '#0d6efd',
|
|
116
|
+
secondary: '#6c757d',
|
|
117
|
+
danger: '#dc3545',
|
|
118
|
+
background: '#1a1a1a',
|
|
119
|
+
text: '#ffffff'
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export function App() {
|
|
124
|
+
const [isDark, setIsDark] = useState(false);
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<ThemeProvider theme={isDark ? darkTheme : lightTheme}>
|
|
128
|
+
<GlobalStyles />
|
|
129
|
+
<MyComponent onToggleTheme={() => setIsDark(!isDark)} />
|
|
130
|
+
</ThemeProvider>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Complex Components
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
const Card = styled.div`
|
|
139
|
+
background-color: ${props => props.theme.colors.background};
|
|
140
|
+
border-radius: 8px;
|
|
141
|
+
padding: 20px;
|
|
142
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
143
|
+
`;
|
|
144
|
+
|
|
145
|
+
const CardTitle = styled.h2`
|
|
146
|
+
color: ${props => props.theme.colors.primary};
|
|
147
|
+
margin-bottom: 10px;
|
|
148
|
+
`;
|
|
149
|
+
|
|
150
|
+
const CardContent = styled.p`
|
|
151
|
+
color: ${props => props.theme.colors.text};
|
|
152
|
+
line-height: 1.6;
|
|
153
|
+
`;
|
|
154
|
+
|
|
155
|
+
export function UserCard({ user }) {
|
|
156
|
+
return (
|
|
157
|
+
<Card>
|
|
158
|
+
<CardTitle>{user.name}</CardTitle>
|
|
159
|
+
<CardContent>{user.bio}</CardContent>
|
|
160
|
+
</Card>
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Extending Styles
|
|
166
|
+
|
|
167
|
+
```typescript
|
|
168
|
+
const BaseButton = styled.button`
|
|
169
|
+
padding: 10px 20px;
|
|
170
|
+
border: none;
|
|
171
|
+
border-radius: 4px;
|
|
172
|
+
cursor: pointer;
|
|
173
|
+
font-weight: 600;
|
|
174
|
+
`;
|
|
175
|
+
|
|
176
|
+
const PrimaryButton = styled(BaseButton)`
|
|
177
|
+
background-color: #007bff;
|
|
178
|
+
color: white;
|
|
179
|
+
|
|
180
|
+
&:hover {
|
|
181
|
+
background-color: #0056b3;
|
|
182
|
+
}
|
|
183
|
+
`;
|
|
184
|
+
|
|
185
|
+
const DangerButton = styled(BaseButton)`
|
|
186
|
+
background-color: #dc3545;
|
|
187
|
+
color: white;
|
|
188
|
+
|
|
189
|
+
&:hover {
|
|
190
|
+
background-color: #c82333;
|
|
191
|
+
}
|
|
192
|
+
`;
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
## Best Practices
|
|
196
|
+
|
|
197
|
+
✅ **Theme Provider** - Centralize color/style values
|
|
198
|
+
✅ **Extend components** - Reuse styles
|
|
199
|
+
✅ **Component API** - Pass props for customization
|
|
200
|
+
✅ **Performance** - Use React.memo for styled components
|
|
201
|
+
✅ **TypeScript** - Strong typing for props
|
|
202
|
+
|
|
203
|
+
## Resources
|
|
204
|
+
|
|
205
|
+
- [styled-components Docs](https://styled-components.com/)
|
|
206
|
+
- [Emotion (alternative)](https://emotion.sh/)
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# Tailwind CSS v4
|
|
2
|
+
|
|
3
|
+
Utility-first CSS framework with rapid styling capabilities.
|
|
4
|
+
|
|
5
|
+
## Setup (Next.js)
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -D tailwindcss postcss autoprefixer
|
|
9
|
+
npx tailwindcss init -p
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Configuration
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
// tailwind.config.ts
|
|
16
|
+
import type { Config } from 'tailwindcss'
|
|
17
|
+
|
|
18
|
+
export default {
|
|
19
|
+
content: [
|
|
20
|
+
'./src/**/*.{js,ts,jsx,tsx}',
|
|
21
|
+
'./pages/**/*.{js,ts,jsx,tsx}'
|
|
22
|
+
],
|
|
23
|
+
theme: {
|
|
24
|
+
extend: {
|
|
25
|
+
colors: {
|
|
26
|
+
primary: '#3B82F6',
|
|
27
|
+
secondary: '#10B981'
|
|
28
|
+
},
|
|
29
|
+
spacing: {
|
|
30
|
+
'128': '32rem'
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
plugins: [require('@tailwindcss/forms')]
|
|
35
|
+
} satisfies Config
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Utility Classes
|
|
39
|
+
|
|
40
|
+
```jsx
|
|
41
|
+
export function Button({ variant = 'primary', size = 'md', ...props }) {
|
|
42
|
+
const baseClasses = 'font-semibold rounded-lg transition-colors';
|
|
43
|
+
|
|
44
|
+
const variants = {
|
|
45
|
+
primary: 'bg-blue-500 text-white hover:bg-blue-600',
|
|
46
|
+
secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300',
|
|
47
|
+
danger: 'bg-red-500 text-white hover:bg-red-600'
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const sizes = {
|
|
51
|
+
sm: 'px-3 py-1 text-sm',
|
|
52
|
+
md: 'px-4 py-2 text-base',
|
|
53
|
+
lg: 'px-6 py-3 text-lg'
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<button
|
|
58
|
+
className={`${baseClasses} ${variants[variant]} ${sizes[size]}`}
|
|
59
|
+
{...props}
|
|
60
|
+
/>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Responsive Design
|
|
66
|
+
|
|
67
|
+
```jsx
|
|
68
|
+
export function Grid() {
|
|
69
|
+
return (
|
|
70
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
71
|
+
{items.map(item => (
|
|
72
|
+
<div key={item.id} className="bg-white p-4 rounded-lg shadow">
|
|
73
|
+
<h3 className="text-lg font-bold">{item.title}</h3>
|
|
74
|
+
<p className="text-gray-600 mt-2">{item.description}</p>
|
|
75
|
+
</div>
|
|
76
|
+
))}
|
|
77
|
+
</div>
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Dark Mode
|
|
83
|
+
|
|
84
|
+
```jsx
|
|
85
|
+
// tailwind.config.ts with darkMode: 'class'
|
|
86
|
+
|
|
87
|
+
export function ThemeToggle() {
|
|
88
|
+
const [isDark, setIsDark] = useState(false);
|
|
89
|
+
|
|
90
|
+
useEffect(() => {
|
|
91
|
+
if (isDark) {
|
|
92
|
+
document.documentElement.classList.add('dark');
|
|
93
|
+
} else {
|
|
94
|
+
document.documentElement.classList.remove('dark');
|
|
95
|
+
}
|
|
96
|
+
}, [isDark]);
|
|
97
|
+
|
|
98
|
+
return (
|
|
99
|
+
<>
|
|
100
|
+
<div className="bg-white dark:bg-slate-900 text-black dark:text-white">
|
|
101
|
+
Content
|
|
102
|
+
</div>
|
|
103
|
+
<button onClick={() => setIsDark(!isDark)}>
|
|
104
|
+
Toggle Dark Mode
|
|
105
|
+
</button>
|
|
106
|
+
</>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Custom CSS with Tailwind
|
|
112
|
+
|
|
113
|
+
```css
|
|
114
|
+
/* globals.css */
|
|
115
|
+
@import "tailwindcss";
|
|
116
|
+
|
|
117
|
+
@layer components {
|
|
118
|
+
.btn-primary {
|
|
119
|
+
@apply px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.input-base {
|
|
123
|
+
@apply px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@layer utilities {
|
|
128
|
+
.text-balance {
|
|
129
|
+
text-wrap: balance;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.truncate-2 {
|
|
133
|
+
display: -webkit-box;
|
|
134
|
+
-webkit-line-clamp: 2;
|
|
135
|
+
-webkit-box-orient: vertical;
|
|
136
|
+
overflow: hidden;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Forms
|
|
142
|
+
|
|
143
|
+
```jsx
|
|
144
|
+
export function LoginForm() {
|
|
145
|
+
return (
|
|
146
|
+
<form className="space-y-4">
|
|
147
|
+
<div>
|
|
148
|
+
<label className="block text-sm font-medium text-gray-700">
|
|
149
|
+
Email
|
|
150
|
+
</label>
|
|
151
|
+
<input
|
|
152
|
+
type="email"
|
|
153
|
+
className="mt-1 w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500"
|
|
154
|
+
placeholder="you@example.com"
|
|
155
|
+
/>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
<div>
|
|
159
|
+
<label className="block text-sm font-medium text-gray-700">
|
|
160
|
+
Password
|
|
161
|
+
</label>
|
|
162
|
+
<input
|
|
163
|
+
type="password"
|
|
164
|
+
className="mt-1 w-full rounded-lg border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500"
|
|
165
|
+
/>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<button className="w-full bg-blue-500 text-white py-2 rounded-lg hover:bg-blue-600">
|
|
169
|
+
Sign In
|
|
170
|
+
</button>
|
|
171
|
+
</form>
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## Performance
|
|
177
|
+
|
|
178
|
+
```jsx
|
|
179
|
+
// Use clsx for conditional classes (lighter than classnames)
|
|
180
|
+
import clsx from 'clsx';
|
|
181
|
+
|
|
182
|
+
export function Card({ highlighted }) {
|
|
183
|
+
return (
|
|
184
|
+
<div className={clsx(
|
|
185
|
+
'p-4 rounded-lg border',
|
|
186
|
+
highlighted && 'border-blue-500 bg-blue-50'
|
|
187
|
+
)}>
|
|
188
|
+
Content
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Best Practices
|
|
195
|
+
|
|
196
|
+
✅ **Use @layer** - Organize custom utilities
|
|
197
|
+
✅ **Extract components** - DRY up repeated patterns
|
|
198
|
+
✅ **Responsive-first** - Mobile first approach
|
|
199
|
+
✅ **Plugins** - Leverage community plugins
|
|
200
|
+
✅ **PurgeCSS** - Automatic unused CSS removal
|
|
201
|
+
|
|
202
|
+
## Resources
|
|
203
|
+
|
|
204
|
+
- [Tailwind CSS Documentation](https://tailwindcss.com/docs)
|
|
205
|
+
- [Tailwind UI](https://tailwindui.com/)
|
|
206
|
+
- [Headless UI](https://headlessui.com/)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# End-to-End Testing
|
|
2
|
+
|
|
3
|
+
Full-stack testing using Playwright or Cypress to test complete user workflows.
|
|
4
|
+
|
|
5
|
+
## Playwright Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -D @playwright/test
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Basic Test
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { test, expect } from '@playwright/test';
|
|
15
|
+
|
|
16
|
+
test('user can login and view dashboard', async ({ page }) => {
|
|
17
|
+
// Navigate
|
|
18
|
+
await page.goto('http://localhost:3000/login');
|
|
19
|
+
|
|
20
|
+
// Fill form
|
|
21
|
+
await page.fill('input[name="email"]', 'user@example.com');
|
|
22
|
+
await page.fill('input[name="password"]', 'password123');
|
|
23
|
+
|
|
24
|
+
// Click button
|
|
25
|
+
await page.click('button:has-text("Sign In")');
|
|
26
|
+
|
|
27
|
+
// Wait for navigation
|
|
28
|
+
await page.waitForURL('http://localhost:3000/dashboard');
|
|
29
|
+
|
|
30
|
+
// Verify content
|
|
31
|
+
expect(await page.locator('h1').textContent()).toBe('Dashboard');
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Assertions
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Wait for element
|
|
39
|
+
await expect(page.locator('.success-message')).toBeVisible();
|
|
40
|
+
|
|
41
|
+
// Check URL
|
|
42
|
+
await expect(page).toHaveURL('/dashboard');
|
|
43
|
+
|
|
44
|
+
// Check text
|
|
45
|
+
await expect(page.locator('h1')).toHaveText('Welcome');
|
|
46
|
+
|
|
47
|
+
// Count elements
|
|
48
|
+
await expect(page.locator('.item')).toHaveCount(5);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Page Objects
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
class LoginPage {
|
|
55
|
+
constructor(private page: Page) {}
|
|
56
|
+
|
|
57
|
+
async goto() {
|
|
58
|
+
await this.page.goto('http://localhost:3000/login');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async login(email: string, password: string) {
|
|
62
|
+
await this.page.fill('input[name="email"]', email);
|
|
63
|
+
await this.page.fill('input[name="password"]', password);
|
|
64
|
+
await this.page.click('button:has-text("Sign In")');
|
|
65
|
+
await this.page.waitForURL('/dashboard');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Usage
|
|
70
|
+
const loginPage = new LoginPage(page);
|
|
71
|
+
await loginPage.goto();
|
|
72
|
+
await loginPage.login('user@example.com', 'password123');
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Best Practices
|
|
76
|
+
|
|
77
|
+
✅ **Use Page Objects** - Maintainable test code
|
|
78
|
+
✅ **Wait for elements** - Don't hardcode waits
|
|
79
|
+
✅ **Test critical flows** - Focus on user journeys
|
|
80
|
+
✅ **Run in CI/CD** - Automate testing
|
|
81
|
+
✅ **Use test data** - Reset state between tests
|
|
82
|
+
|
|
83
|
+
## Resources
|
|
84
|
+
|
|
85
|
+
- [Playwright Docs](https://playwright.dev/)
|
|
86
|
+
- [Cypress Docs](https://cypress.io/)
|