@ngxtm/devkit 3.7.0 → 3.8.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/merged-commands/3d-web-experience.md +254 -0
- package/merged-commands/ab-test-setup.md +232 -0
- package/merged-commands/accessibility-compliance-accessibility-audit.md +42 -0
- package/merged-commands/active-directory-attacks.md +383 -0
- package/merged-commands/address-github-comments.md +55 -0
- package/merged-commands/aesthetic.md +134 -0
- package/merged-commands/agent-evaluation.md +64 -0
- package/merged-commands/agent-framework-azure-hosted-agents.md +332 -0
- package/merged-commands/agent-manager-skill.md +40 -0
- package/merged-commands/agent-memory-mcp.md +82 -0
- package/merged-commands/agent-memory-systems.md +67 -0
- package/merged-commands/agent-orchestration-improve-agent.md +349 -0
- package/merged-commands/agent-orchestration-multi-agent-optimize.md +239 -0
- package/merged-commands/agent-tool-builder.md +53 -0
- package/merged-commands/agile-product-owner.md +31 -0
- package/merged-commands/ai-agents-architect.md +90 -0
- package/merged-commands/ai-artist.md +75 -0
- package/merged-commands/ai-engineer.md +171 -0
- package/merged-commands/ai-multimodal.md +109 -0
- package/merged-commands/ai-product.md +54 -0
- package/merged-commands/ai-wrapper-product.md +273 -0
- package/merged-commands/airflow-dag-patterns.md +41 -0
- package/merged-commands/algolia-search.md +66 -0
- package/merged-commands/algorithmic-art.md +405 -0
- package/merged-commands/analytics-tracking.md +404 -0
- package/merged-commands/angular-architect.md +97 -0
- package/merged-commands/angular-migration.md +428 -0
- package/merged-commands/anti-reversing-techniques.md +42 -0
- package/merged-commands/api-design-principles.md +37 -0
- package/merged-commands/api-designer.md +101 -0
- package/merged-commands/api-documentation-generator.md +484 -0
- package/merged-commands/api-documenter.md +184 -0
- package/merged-commands/api-fuzzing-bug-bounty.md +433 -0
- package/merged-commands/api-patterns.md +81 -0
- package/merged-commands/api-security-best-practices.md +907 -0
- package/merged-commands/api-testing-observability-api-mock.md +46 -0
- package/merged-commands/app-builder.md +75 -0
- package/merged-commands/app-store-optimization.md +403 -0
- package/merged-commands/application-performance-performance-optimization.md +154 -0
- package/merged-commands/architect-review.md +174 -0
- package/merged-commands/architecture-decision-records.md +441 -0
- package/merged-commands/architecture-designer.md +89 -0
- package/merged-commands/architecture-patterns.md +37 -0
- package/merged-commands/architecture.md +55 -0
- package/merged-commands/arm-cortex-expert.md +306 -0
- package/merged-commands/artifacts-builder.md +74 -0
- package/merged-commands/ask-questions-if-underspecified.md +81 -0
- package/merged-commands/async-python-patterns.md +39 -0
- package/merged-commands/atlassian-mcp.md +100 -0
- package/merged-commands/attack-tree-construction.md +38 -0
- package/merged-commands/auth-implementation-patterns.md +39 -0
- package/merged-commands/automate-whatsapp.md +257 -0
- package/merged-commands/autonomous-agent-patterns.md +761 -0
- package/merged-commands/autonomous-agents.md +68 -0
- package/merged-commands/avalonia-layout-zafiro.md +59 -0
- package/merged-commands/avalonia-viewmodels-zafiro.md +29 -0
- package/merged-commands/avalonia-zafiro-development.md +29 -0
- package/merged-commands/aws-agentic-ai.md +117 -0
- package/merged-commands/aws-cdk-development.md +278 -0
- package/merged-commands/aws-cost-operations.md +317 -0
- package/merged-commands/aws-penetration-testing.md +405 -0
- package/merged-commands/aws-serverless-eda.md +757 -0
- package/merged-commands/aws-serverless.md +323 -0
- package/merged-commands/aws-skills.md +22 -0
- package/merged-commands/azd-deployment.md +296 -0
- package/merged-commands/azure-ai-agents-python.md +277 -0
- package/merged-commands/azure-ai-search-python.md +198 -0
- package/merged-commands/azure-ai-voicelive-skill.md +294 -0
- package/merged-commands/azure-functions.md +42 -0
- package/merged-commands/backend-architect.md +333 -0
- package/merged-commands/backend-dev-guidelines.md +342 -0
- package/merged-commands/backend-development-feature-development.md +180 -0
- package/merged-commands/backend-development.md +155 -0
- package/merged-commands/backend-security-coder.md +156 -0
- package/merged-commands/backtesting-frameworks.md +39 -0
- package/merged-commands/bash-defensive-patterns.md +43 -0
- package/merged-commands/bash-linux.md +199 -0
- package/merged-commands/bash-pro.md +310 -0
- package/merged-commands/bats-testing-patterns.md +34 -0
- package/merged-commands/bazel-build-optimization.md +397 -0
- package/merged-commands/beautiful-prose.md +22 -0
- package/merged-commands/behavioral-modes.md +242 -0
- package/merged-commands/best-practices.md +500 -0
- package/merged-commands/better-auth.md +204 -0
- package/merged-commands/billing-automation.md +42 -0
- package/merged-commands/binary-analysis-patterns.md +450 -0
- package/merged-commands/blockchain-developer.md +208 -0
- package/merged-commands/blockrun.md +292 -0
- package/merged-commands/brainstorming.md +230 -0
- package/merged-commands/brand-guidelines-anthropic.md +73 -0
- package/merged-commands/brand-guidelines-community.md +73 -0
- package/merged-commands/brand-guidelines.md +73 -0
- package/merged-commands/broken-authentication.md +476 -0
- package/merged-commands/browser-automation.md +70 -0
- package/merged-commands/browser-extension-builder.md +261 -0
- package/merged-commands/building-ai-agent-on-cloudflare.md +391 -0
- package/merged-commands/building-mcp-server-on-cloudflare.md +265 -0
- package/merged-commands/bullmq-specialist.md +57 -0
- package/merged-commands/bun-development.md +691 -0
- package/merged-commands/burp-suite-testing.md +380 -0
- package/merged-commands/business-analyst.md +182 -0
- package/merged-commands/busybox-on-windows.md +30 -0
- package/merged-commands/c-pro.md +56 -0
- package/merged-commands/c4-architecture-c4-architecture.md +389 -0
- package/merged-commands/c4-code.md +244 -0
- package/merged-commands/c4-component.md +153 -0
- package/merged-commands/c4-container.md +171 -0
- package/merged-commands/c4-context.md +150 -0
- package/merged-commands/canvas-design.md +130 -0
- package/merged-commands/cc-skill-backend-patterns.md +584 -0
- package/merged-commands/cc-skill-clickhouse-io.md +431 -0
- package/merged-commands/cc-skill-coding-standards.md +522 -0
- package/merged-commands/cc-skill-continuous-learning.md +10 -0
- package/merged-commands/cc-skill-frontend-patterns.md +633 -0
- package/merged-commands/cc-skill-project-guidelines-example.md +352 -0
- package/merged-commands/cc-skill-security-review.md +496 -0
- package/merged-commands/cc-skill-strategic-compact.md +10 -0
- package/merged-commands/changelog-automation.md +38 -0
- package/merged-commands/changelog-generator.md +104 -0
- package/merged-commands/chaos-engineer.md +98 -0
- package/merged-commands/chrome-devtools.md +407 -0
- package/merged-commands/cicd-automation-workflow-automate.md +51 -0
- package/merged-commands/clarity-gate.md +22 -0
- package/merged-commands/claude-ally-health.md +22 -0
- package/merged-commands/claude-code-guide.md +68 -0
- package/merged-commands/claude-d3js-skill.md +820 -0
- package/merged-commands/claude-scientific-skills.md +22 -0
- package/merged-commands/claude-speed-reader.md +22 -0
- package/merged-commands/claude-win11-speckit-update-skill.md +22 -0
- package/merged-commands/clean-code.md +201 -0
- package/merged-commands/clerk-auth.md +56 -0
- package/merged-commands/cli-developer.md +97 -0
- package/merged-commands/cloud-architect.md +135 -0
- package/merged-commands/cloud-penetration-testing.md +501 -0
- package/merged-commands/cloudflare-expert.md +227 -0
- package/merged-commands/code-documentation-code-explain.md +46 -0
- package/merged-commands/code-documentation-doc-generate.md +48 -0
- package/merged-commands/code-documentation.md +263 -0
- package/merged-commands/code-documenter.md +95 -0
- package/merged-commands/code-refactoring-context-restore.md +179 -0
- package/merged-commands/code-refactoring-refactor-clean.md +51 -0
- package/merged-commands/code-refactoring-tech-debt.md +386 -0
- package/merged-commands/code-refactoring.md +209 -0
- package/merged-commands/code-review-ai-ai-review.md +450 -0
- package/merged-commands/code-review-checklist.md +444 -0
- package/merged-commands/code-review-excellence.md +40 -0
- package/merged-commands/code-review.md +121 -0
- package/merged-commands/code-reviewer.md +178 -0
- package/merged-commands/codebase-cleanup-deps-audit.md +51 -0
- package/merged-commands/codebase-cleanup-refactor-clean.md +51 -0
- package/merged-commands/codebase-cleanup-tech-debt.md +386 -0
- package/merged-commands/codex-review.md +37 -0
- package/merged-commands/commit.md +171 -0
- package/merged-commands/competitive-ads-extractor.md +293 -0
- package/merged-commands/competitive-landscape.md +34 -0
- package/merged-commands/competitor-alternatives.md +750 -0
- package/merged-commands/comprehensive-review-full-review.md +146 -0
- package/merged-commands/comprehensive-review-pr-enhance.md +46 -0
- package/merged-commands/computer-use-agents.md +315 -0
- package/merged-commands/concise-planning.md +62 -0
- package/merged-commands/conductor-implement.md +388 -0
- package/merged-commands/conductor-manage.md +39 -0
- package/merged-commands/conductor-new-track.md +433 -0
- package/merged-commands/conductor-revert.md +372 -0
- package/merged-commands/conductor-setup.md +426 -0
- package/merged-commands/conductor-status.md +338 -0
- package/merged-commands/conductor-validator.md +62 -0
- package/merged-commands/content-creator.md +248 -0
- package/merged-commands/content-marketer.md +170 -0
- package/merged-commands/content-research-writer.md +538 -0
- package/merged-commands/context-compression.md +266 -0
- package/merged-commands/context-degradation.md +238 -0
- package/merged-commands/context-driven-development.md +400 -0
- package/merged-commands/context-engineering.md +107 -0
- package/merged-commands/context-fundamentals.md +192 -0
- package/merged-commands/context-management-context-restore.md +179 -0
- package/merged-commands/context-management-context-save.md +177 -0
- package/merged-commands/context-manager.md +185 -0
- package/merged-commands/context-optimization.md +186 -0
- package/merged-commands/context-window-management.md +53 -0
- package/merged-commands/context7-auto-research.md +36 -0
- package/merged-commands/conversation-memory.md +61 -0
- package/merged-commands/copy-editing.md +439 -0
- package/merged-commands/copywriting.md +225 -0
- package/merged-commands/core-components.md +264 -0
- package/merged-commands/cosmos-db-python-skill.md +198 -0
- package/merged-commands/cost-optimization.md +286 -0
- package/merged-commands/cpp-pro.md +59 -0
- package/merged-commands/cqrs-implementation.md +35 -0
- package/merged-commands/create-pr.md +192 -0
- package/merged-commands/crewai.md +243 -0
- package/merged-commands/csharp-developer.md +94 -0
- package/merged-commands/csharp-pro.md +59 -0
- package/merged-commands/culture-index.md +43 -0
- package/merged-commands/customer-support.md +170 -0
- package/merged-commands/daily-news-report.md +356 -0
- package/merged-commands/data-engineer.md +224 -0
- package/merged-commands/data-engineering-data-driven-feature.md +182 -0
- package/merged-commands/data-engineering-data-pipeline.md +201 -0
- package/merged-commands/data-quality-frameworks.md +40 -0
- package/merged-commands/data-scientist.md +199 -0
- package/merged-commands/data-storytelling.md +465 -0
- package/merged-commands/database-admin.md +165 -0
- package/merged-commands/database-architect.md +268 -0
- package/merged-commands/database-cloud-optimization-cost-optimize.md +44 -0
- package/merged-commands/database-design.md +52 -0
- package/merged-commands/database-migration.md +436 -0
- package/merged-commands/database-migrations-migration-observability.md +420 -0
- package/merged-commands/database-migrations-sql-migrations.md +53 -0
- package/merged-commands/database-optimizer.md +167 -0
- package/merged-commands/databases.md +232 -0
- package/merged-commands/dbt-transformation-patterns.md +34 -0
- package/merged-commands/debugger.md +49 -0
- package/merged-commands/debugging-strategies.md +34 -0
- package/merged-commands/debugging-toolkit-smart-debug.md +197 -0
- package/merged-commands/debugging-wizard.md +93 -0
- package/merged-commands/debugging.md +84 -0
- package/merged-commands/deep-research.md +114 -0
- package/merged-commands/defi-protocol-templates.md +466 -0
- package/merged-commands/dependency-management-deps-audit.md +44 -0
- package/merged-commands/dependency-upgrade.md +421 -0
- package/merged-commands/deployment-engineer.md +170 -0
- package/merged-commands/deployment-pipeline-design.md +371 -0
- package/merged-commands/deployment-procedures.md +241 -0
- package/merged-commands/deployment-validation-config-validate.md +496 -0
- package/merged-commands/design-md.md +178 -0
- package/merged-commands/design-orchestration.md +167 -0
- package/merged-commands/developer-growth-analysis.md +322 -0
- package/merged-commands/devops-engineer.md +92 -0
- package/merged-commands/devops-troubleshooter.md +161 -0
- package/merged-commands/devops.md +285 -0
- package/merged-commands/discord-bot-architect.md +277 -0
- package/merged-commands/dispatching-parallel-agents.md +180 -0
- package/merged-commands/distributed-debugging-debug-trace.md +44 -0
- package/merged-commands/distributed-tracing.md +450 -0
- package/merged-commands/django-expert.md +89 -0
- package/merged-commands/django-pro.md +180 -0
- package/merged-commands/doc-coauthoring.md +375 -0
- package/merged-commands/docker-expert.md +409 -0
- package/merged-commands/docs-architect.md +98 -0
- package/merged-commands/docs-seeker.md +102 -0
- package/merged-commands/documentation-generation-doc-generate.md +48 -0
- package/merged-commands/documentation-templates.md +194 -0
- package/merged-commands/docx-official.md +197 -0
- package/merged-commands/docx.md +197 -0
- package/merged-commands/domain-name-brainstormer.md +212 -0
- package/merged-commands/dotnet-architect.md +197 -0
- package/merged-commands/dotnet-backend-patterns.md +37 -0
- package/merged-commands/dotnet-core-expert.md +96 -0
- package/merged-commands/dx-optimizer.md +83 -0
- package/merged-commands/e2e-testing-patterns.md +41 -0
- package/merged-commands/elixir-pro.md +59 -0
- package/merged-commands/email-sequence.md +925 -0
- package/merged-commands/email-systems.md +54 -0
- package/merged-commands/embedded-systems.md +98 -0
- package/merged-commands/embedding-strategies.md +491 -0
- package/merged-commands/employment-contract-templates.md +39 -0
- package/merged-commands/environment-setup-guide.md +479 -0
- package/merged-commands/error-debugging-error-analysis.md +47 -0
- package/merged-commands/error-debugging-error-trace.md +43 -0
- package/merged-commands/error-debugging-multi-agent-review.md +216 -0
- package/merged-commands/error-detective.md +53 -0
- package/merged-commands/error-diagnostics-error-analysis.md +47 -0
- package/merged-commands/error-diagnostics-error-trace.md +48 -0
- package/merged-commands/error-diagnostics-smart-debug.md +197 -0
- package/merged-commands/error-handling-patterns.md +35 -0
- package/merged-commands/ethical-hacking-methodology.md +466 -0
- package/merged-commands/evaluation.md +238 -0
- package/merged-commands/event-sourcing-architect.md +58 -0
- package/merged-commands/event-store-design.md +449 -0
- package/merged-commands/exa-search.md +36 -0
- package/merged-commands/executing-plans.md +76 -0
- package/merged-commands/expo-app-design.md +22 -0
- package/merged-commands/expo-deployment.md +72 -0
- package/merged-commands/fal-audio.md +22 -0
- package/merged-commands/fal-generate.md +22 -0
- package/merged-commands/fal-image-edit.md +22 -0
- package/merged-commands/fal-platform.md +22 -0
- package/merged-commands/fal-upscale.md +22 -0
- package/merged-commands/fal-workflow.md +22 -0
- package/merged-commands/fastapi-expert.md +93 -0
- package/merged-commands/fastapi-pro.md +192 -0
- package/merged-commands/fastapi-router.md +52 -0
- package/merged-commands/fastapi-templates.md +32 -0
- package/merged-commands/feature-forge.md +90 -0
- package/merged-commands/ffuf-claude-skill.md +22 -0
- package/merged-commands/file-organizer.md +250 -0
- package/merged-commands/file-path-traversal.md +486 -0
- package/merged-commands/file-uploads.md +22 -0
- package/merged-commands/find-bugs.md +86 -0
- package/merged-commands/fine-tuning-expert.md +98 -0
- package/merged-commands/finishing-a-development-branch.md +200 -0
- package/merged-commands/firebase.md +56 -0
- package/merged-commands/firecrawl-scraper.md +37 -0
- package/merged-commands/firmware-analyst.md +320 -0
- package/merged-commands/fix-review.md +53 -0
- package/merged-commands/fixing.md +72 -0
- package/merged-commands/flutter-expert.md +200 -0
- package/merged-commands/form-cro.md +441 -0
- package/merged-commands/foundry-iq-agent.md +15 -0
- package/merged-commands/foundry-iq-python.md +275 -0
- package/merged-commands/foundry-nextgen-frontend.md +555 -0
- package/merged-commands/foundry-sdk-python.md +290 -0
- package/merged-commands/fp-ts-errors.md +856 -0
- package/merged-commands/fp-ts-pragmatic.md +598 -0
- package/merged-commands/fp-ts-react.md +796 -0
- package/merged-commands/framework-migration-code-migrate.md +48 -0
- package/merged-commands/framework-migration-deps-upgrade.md +48 -0
- package/merged-commands/framework-migration-legacy-modernize.md +132 -0
- package/merged-commands/free-tool-strategy.md +576 -0
- package/merged-commands/frontend-design.md +272 -0
- package/merged-commands/frontend-dev-guidelines.md +359 -0
- package/merged-commands/frontend-developer.md +171 -0
- package/merged-commands/frontend-development.md +399 -0
- package/merged-commands/frontend-mobile-development-component-scaffold.md +403 -0
- package/merged-commands/frontend-mobile-security-xss-scan.md +322 -0
- package/merged-commands/frontend-security-coder.md +170 -0
- package/merged-commands/frontend-slides.md +770 -0
- package/merged-commands/full-stack-orchestration-full-stack-feature.md +135 -0
- package/merged-commands/fullstack-guardian.md +99 -0
- package/merged-commands/game-developer.md +94 -0
- package/merged-commands/game-development.md +167 -0
- package/merged-commands/gcp-cloud-run.md +288 -0
- package/merged-commands/gdpr-data-handling.md +33 -0
- package/merged-commands/geo-fundamentals.md +156 -0
- package/merged-commands/git-advanced-workflows.md +412 -0
- package/merged-commands/git-pr-workflows-git-workflow.md +140 -0
- package/merged-commands/git-pr-workflows-onboard.md +416 -0
- package/merged-commands/git-pr-workflows-pr-enhance.md +48 -0
- package/merged-commands/git-pushing.md +33 -0
- package/merged-commands/github-actions-templates.md +345 -0
- package/merged-commands/github-workflow-automation.md +846 -0
- package/merged-commands/gitlab-ci-patterns.md +283 -0
- package/merged-commands/gitops-workflow.md +303 -0
- package/merged-commands/go-concurrency-patterns.md +33 -0
- package/merged-commands/godot-gdscript-patterns.md +33 -0
- package/merged-commands/golang-pro.md +179 -0
- package/merged-commands/google-adk-python.md +243 -0
- package/merged-commands/grafana-dashboards.md +381 -0
- package/merged-commands/graphql-architect.md +182 -0
- package/merged-commands/graphql.md +68 -0
- package/merged-commands/haskell-pro.md +56 -0
- package/merged-commands/helm-chart-scaffolding.md +34 -0
- package/merged-commands/hr-pro.md +126 -0
- package/merged-commands/html-injection-testing.md +498 -0
- package/merged-commands/hubspot-integration.md +42 -0
- package/merged-commands/hugging-face-cli.md +198 -0
- package/merged-commands/hugging-face-jobs.md +1038 -0
- package/merged-commands/hybrid-cloud-architect.md +168 -0
- package/merged-commands/hybrid-cloud-networking.md +238 -0
- package/merged-commands/hybrid-search-implementation.md +32 -0
- package/merged-commands/i18n-localization.md +154 -0
- package/merged-commands/idor-testing.md +442 -0
- package/merged-commands/image-enhancer.md +99 -0
- package/merged-commands/imagen.md +77 -0
- package/merged-commands/incident-responder.md +213 -0
- package/merged-commands/incident-response-incident-response.md +168 -0
- package/merged-commands/incident-response-smart-fix.md +29 -0
- package/merged-commands/incident-runbook-templates.md +395 -0
- package/merged-commands/infinite-gratitude.md +26 -0
- package/merged-commands/inngest.md +55 -0
- package/merged-commands/interactive-portfolio.md +223 -0
- package/merged-commands/internal-comms-anthropic.md +32 -0
- package/merged-commands/internal-comms-community.md +32 -0
- package/merged-commands/internal-comms.md +32 -0
- package/merged-commands/invoice-organizer.md +446 -0
- package/merged-commands/ios-developer.md +219 -0
- package/merged-commands/issue-creator.md +137 -0
- package/merged-commands/istio-traffic-management.md +337 -0
- package/merged-commands/iterate-pr.md +150 -0
- package/merged-commands/java-architect.md +95 -0
- package/merged-commands/java-pro.md +177 -0
- package/merged-commands/javascript-mastery.md +645 -0
- package/merged-commands/javascript-pro.md +57 -0
- package/merged-commands/javascript-testing-patterns.md +35 -0
- package/merged-commands/javascript-typescript-typescript-scaffold.md +361 -0
- package/merged-commands/javascript-typescript.md +142 -0
- package/merged-commands/jira-issues.md +181 -0
- package/merged-commands/job-application.md +90 -0
- package/merged-commands/julia-pro.md +209 -0
- package/merged-commands/k8s-manifest-generator.md +35 -0
- package/merged-commands/k8s-security-policies.md +346 -0
- package/merged-commands/kaizen.md +730 -0
- package/merged-commands/kotlin-specialist.md +94 -0
- package/merged-commands/kpi-dashboard-design.md +440 -0
- package/merged-commands/kubernetes-architect.md +170 -0
- package/merged-commands/kubernetes-specialist.md +117 -0
- package/merged-commands/langchain-architecture.md +350 -0
- package/merged-commands/langfuse.md +238 -0
- package/merged-commands/langgraph.md +287 -0
- package/merged-commands/laravel-specialist.md +101 -0
- package/merged-commands/last30days.md +421 -0
- package/merged-commands/launch-strategy.md +344 -0
- package/merged-commands/lead-research-assistant.md +199 -0
- package/merged-commands/learn.md +476 -0
- package/merged-commands/legacy-modernizer.md +53 -0
- package/merged-commands/legal-advisor.md +70 -0
- package/merged-commands/linear-claude-skill.md +543 -0
- package/merged-commands/linkerd-patterns.md +321 -0
- package/merged-commands/lint-and-validate.md +45 -0
- package/merged-commands/linux-privilege-escalation.md +504 -0
- package/merged-commands/linux-shell-scripting.md +504 -0
- package/merged-commands/llm-app-patterns.md +760 -0
- package/merged-commands/llm-application-dev-ai-assistant.md +35 -0
- package/merged-commands/llm-application-dev-langchain-agent.md +246 -0
- package/merged-commands/llm-application-dev-prompt-optimize.md +37 -0
- package/merged-commands/llm-application-dev.md +216 -0
- package/merged-commands/llm-evaluation.md +483 -0
- package/merged-commands/loki-mode.md +721 -0
- package/merged-commands/machine-learning-ops-ml-pipeline.md +314 -0
- package/merged-commands/makepad-skills.md +22 -0
- package/merged-commands/malware-analyst.md +247 -0
- package/merged-commands/markdown-novel-viewer.md +281 -0
- package/merged-commands/market-sizing-analysis.md +425 -0
- package/merged-commands/marketing-ideas.md +221 -0
- package/merged-commands/marketing-psychology.md +255 -0
- package/merged-commands/mcp-builder.md +236 -0
- package/merged-commands/mcp-developer.md +94 -0
- package/merged-commands/mcp-management.md +209 -0
- package/merged-commands/media-processing.md +358 -0
- package/merged-commands/meeting-insights-analyzer.md +327 -0
- package/merged-commands/memory-forensics.md +491 -0
- package/merged-commands/memory-safety-patterns.md +33 -0
- package/merged-commands/memory-systems.md +228 -0
- package/merged-commands/mermaid-expert.md +59 -0
- package/merged-commands/mermaidjs-v11.md +115 -0
- package/merged-commands/metasploit-framework.md +478 -0
- package/merged-commands/micro-saas-launcher.md +212 -0
- package/merged-commands/microservices-architect.md +102 -0
- package/merged-commands/microservices-patterns.md +35 -0
- package/merged-commands/minecraft-bukkit-pro.md +126 -0
- package/merged-commands/ml-engineer.md +168 -0
- package/merged-commands/ml-pipeline-workflow.md +257 -0
- package/merged-commands/ml-pipeline.md +111 -0
- package/merged-commands/mlops-engineer.md +219 -0
- package/merged-commands/mobile-design.md +284 -0
- package/merged-commands/mobile-developer.md +205 -0
- package/merged-commands/mobile-development.md +212 -0
- package/merged-commands/mobile-security-coder.md +184 -0
- package/merged-commands/modern-javascript-patterns.md +35 -0
- package/merged-commands/monitoring-expert.md +92 -0
- package/merged-commands/monorepo-architect.md +61 -0
- package/merged-commands/monorepo-management.md +35 -0
- package/merged-commands/moodle-external-api-development.md +597 -0
- package/merged-commands/mtls-configuration.md +359 -0
- package/merged-commands/multi-agent-brainstorming.md +256 -0
- package/merged-commands/multi-agent-patterns.md +262 -0
- package/merged-commands/multi-cloud-architecture.md +189 -0
- package/merged-commands/multi-platform-apps-multi-platform.md +203 -0
- package/merged-commands/n8n-code-python.md +750 -0
- package/merged-commands/n8n-mcp-tools-expert.md +654 -0
- package/merged-commands/n8n-node-configuration.md +796 -0
- package/merged-commands/nanobanana-ppt-skills.md +22 -0
- package/merged-commands/neon-postgres.md +56 -0
- package/merged-commands/nestjs-expert.md +552 -0
- package/merged-commands/network-101.md +342 -0
- package/merged-commands/network-engineer.md +169 -0
- package/merged-commands/nextjs-app-router-patterns.md +33 -0
- package/merged-commands/nextjs-best-practices.md +203 -0
- package/merged-commands/nextjs-developer.md +97 -0
- package/merged-commands/nextjs-supabase-auth.md +56 -0
- package/merged-commands/nft-standards.md +395 -0
- package/merged-commands/nodejs-backend-patterns.md +35 -0
- package/merged-commands/nodejs-best-practices.md +333 -0
- package/merged-commands/nosql-expert.md +111 -0
- package/merged-commands/notebooklm-skill.md +269 -0
- package/merged-commands/notebooklm.md +269 -0
- package/merged-commands/notion-template-business.md +216 -0
- package/merged-commands/nx-workspace-patterns.md +464 -0
- package/merged-commands/observability-engineer.md +237 -0
- package/merged-commands/observability-monitoring-monitor-setup.md +48 -0
- package/merged-commands/observability-monitoring-slo-implement.md +43 -0
- package/merged-commands/observe-whatsapp.md +109 -0
- package/merged-commands/obsidian-clipper-template-creator.md +64 -0
- package/merged-commands/on-call-handoff-patterns.md +453 -0
- package/merged-commands/onboarding-cro.md +433 -0
- package/merged-commands/openapi-spec-generation.md +33 -0
- package/merged-commands/page-cro.md +343 -0
- package/merged-commands/paid-ads.md +551 -0
- package/merged-commands/pandas-pro.md +96 -0
- package/merged-commands/parallel-agents.md +175 -0
- package/merged-commands/payment-integration.md +77 -0
- package/merged-commands/paypal-integration.md +479 -0
- package/merged-commands/paywall-upgrade-cro.md +570 -0
- package/merged-commands/pci-compliance.md +478 -0
- package/merged-commands/pdf-official.md +294 -0
- package/merged-commands/pdf.md +294 -0
- package/merged-commands/pentest-checklist.md +334 -0
- package/merged-commands/pentest-commands.md +438 -0
- package/merged-commands/performance-engineer.md +180 -0
- package/merged-commands/performance-profiling.md +143 -0
- package/merged-commands/performance-testing-review-ai-review.md +450 -0
- package/merged-commands/performance-testing-review-multi-agent-review.md +216 -0
- package/merged-commands/personal-tool-builder.md +289 -0
- package/merged-commands/php-pro.md +63 -0
- package/merged-commands/plaid-fintech.md +50 -0
- package/merged-commands/plan-writing.md +152 -0
- package/merged-commands/planning-with-files.md +211 -0
- package/merged-commands/planning.md +95 -0
- package/merged-commands/plans-kanban.md +166 -0
- package/merged-commands/playwright-expert.md +87 -0
- package/merged-commands/playwright-skill.md +453 -0
- package/merged-commands/podcast-generation.md +121 -0
- package/merged-commands/popup-cro.md +346 -0
- package/merged-commands/posix-shell-pro.md +304 -0
- package/merged-commands/postgres-best-practices.md +57 -0
- package/merged-commands/postgres-pro.md +98 -0
- package/merged-commands/postgresql.md +230 -0
- package/merged-commands/postmortem-writing.md +386 -0
- package/merged-commands/powershell-windows.md +167 -0
- package/merged-commands/pptx-official.md +484 -0
- package/merged-commands/pptx.md +484 -0
- package/merged-commands/pricing-strategy.md +356 -0
- package/merged-commands/prisma-expert.md +355 -0
- package/merged-commands/privilege-escalation-methods.md +333 -0
- package/merged-commands/problem-solving.md +96 -0
- package/merged-commands/product-manager-toolkit.md +351 -0
- package/merged-commands/product-strategist.md +26 -0
- package/merged-commands/production-code-audit.md +540 -0
- package/merged-commands/programmatic-seo.md +351 -0
- package/merged-commands/projection-patterns.md +33 -0
- package/merged-commands/prometheus-configuration.md +404 -0
- package/merged-commands/prompt-caching.md +61 -0
- package/merged-commands/prompt-engineer.md +272 -0
- package/merged-commands/prompt-engineering-patterns.md +213 -0
- package/merged-commands/prompt-engineering.md +171 -0
- package/merged-commands/prompt-library.md +322 -0
- package/merged-commands/protocol-reverse-engineering.md +29 -0
- package/merged-commands/pydantic-models.md +58 -0
- package/merged-commands/pypict-skill.md +22 -0
- package/merged-commands/python-development-python-scaffold.md +331 -0
- package/merged-commands/python-development.md +139 -0
- package/merged-commands/python-packaging.md +36 -0
- package/merged-commands/python-patterns.md +441 -0
- package/merged-commands/python-performance-optimization.md +36 -0
- package/merged-commands/python-pro.md +158 -0
- package/merged-commands/python-testing-patterns.md +37 -0
- package/merged-commands/qa-regression.md +337 -0
- package/merged-commands/quant-analyst.md +53 -0
- package/merged-commands/radix-ui-design-system.md +847 -0
- package/merged-commands/raffle-winner-picker.md +159 -0
- package/merged-commands/rag-architect.md +100 -0
- package/merged-commands/rag-engineer.md +90 -0
- package/merged-commands/rag-implementation.md +421 -0
- package/merged-commands/rails-expert.md +97 -0
- package/merged-commands/react-best-practices.md +121 -0
- package/merged-commands/react-expert.md +98 -0
- package/merged-commands/react-flow-node.md +66 -0
- package/merged-commands/react-modernization.md +34 -0
- package/merged-commands/react-native-architecture.md +33 -0
- package/merged-commands/react-native-expert.md +88 -0
- package/merged-commands/react-patterns.md +198 -0
- package/merged-commands/react-state-management.md +441 -0
- package/merged-commands/react-ui-patterns.md +289 -0
- package/merged-commands/readme.md +775 -0
- package/merged-commands/receiving-code-review.md +213 -0
- package/merged-commands/red-team-tactics.md +199 -0
- package/merged-commands/red-team-tools.md +310 -0
- package/merged-commands/reference-builder.md +188 -0
- package/merged-commands/referral-program.md +602 -0
- package/merged-commands/remotion-best-practices.md +45 -0
- package/merged-commands/repomix.md +275 -0
- package/merged-commands/requesting-code-review.md +105 -0
- package/merged-commands/research-engineer.md +135 -0
- package/merged-commands/research.md +191 -0
- package/merged-commands/reverse-engineer.md +173 -0
- package/merged-commands/risk-manager.md +61 -0
- package/merged-commands/risk-metrics-calculation.md +33 -0
- package/merged-commands/ruby-pro.md +56 -0
- package/merged-commands/rust-async-patterns.md +33 -0
- package/merged-commands/rust-engineer.md +96 -0
- package/merged-commands/rust-pro.md +178 -0
- package/merged-commands/saga-orchestration.md +496 -0
- package/merged-commands/sales-automator.md +55 -0
- package/merged-commands/salesforce-developer.md +105 -0
- package/merged-commands/salesforce-development.md +51 -0
- package/merged-commands/sast-configuration.md +212 -0
- package/merged-commands/scala-pro.md +82 -0
- package/merged-commands/scanning-tools.md +589 -0
- package/merged-commands/schema-markup.md +360 -0
- package/merged-commands/screen-reader-testing.md +33 -0
- package/merged-commands/screenshots.md +401 -0
- package/merged-commands/scroll-experience.md +263 -0
- package/merged-commands/search-specialist.md +80 -0
- package/merged-commands/secrets-management.md +364 -0
- package/merged-commands/secure-code-guardian.md +93 -0
- package/merged-commands/security-auditor.md +169 -0
- package/merged-commands/security-bluebook-builder.md +22 -0
- package/merged-commands/security-compliance-compliance-check.md +55 -0
- package/merged-commands/security-requirement-extraction.md +33 -0
- package/merged-commands/security-reviewer.md +94 -0
- package/merged-commands/security-scanning-security-dependencies.md +43 -0
- package/merged-commands/security-scanning-security-hardening.md +147 -0
- package/merged-commands/security-scanning-security-sast.md +495 -0
- package/merged-commands/segment-cdp.md +50 -0
- package/merged-commands/senior-architect.md +209 -0
- package/merged-commands/senior-backend.md +209 -0
- package/merged-commands/senior-computer-vision.md +226 -0
- package/merged-commands/senior-data-engineer.md +226 -0
- package/merged-commands/senior-data-scientist.md +226 -0
- package/merged-commands/senior-devops.md +209 -0
- package/merged-commands/senior-frontend.md +209 -0
- package/merged-commands/senior-fullstack.md +209 -0
- package/merged-commands/senior-ml-engineer.md +226 -0
- package/merged-commands/senior-prompt-engineer.md +226 -0
- package/merged-commands/senior-qa.md +209 -0
- package/merged-commands/senior-secops.md +209 -0
- package/merged-commands/senior-security.md +209 -0
- package/merged-commands/seo-audit.md +487 -0
- package/merged-commands/seo-authority-builder.md +136 -0
- package/merged-commands/seo-cannibalization-detector.md +123 -0
- package/merged-commands/seo-content-auditor.md +83 -0
- package/merged-commands/seo-content-planner.md +108 -0
- package/merged-commands/seo-content-refresher.md +118 -0
- package/merged-commands/seo-content-writer.md +96 -0
- package/merged-commands/seo-fundamentals.md +173 -0
- package/merged-commands/seo-keyword-strategist.md +95 -0
- package/merged-commands/seo-meta-optimizer.md +92 -0
- package/merged-commands/seo-snippet-hunter.md +114 -0
- package/merged-commands/seo-structure-architect.md +108 -0
- package/merged-commands/sequential-thinking.md +94 -0
- package/merged-commands/server-management.md +161 -0
- package/merged-commands/service-mesh-expert.md +58 -0
- package/merged-commands/service-mesh-observability.md +395 -0
- package/merged-commands/sharp-edges.md +70 -0
- package/merged-commands/shellcheck-configuration.md +466 -0
- package/merged-commands/shodan-reconnaissance.md +503 -0
- package/merged-commands/shopify-apps.md +42 -0
- package/merged-commands/shopify-development.md +366 -0
- package/merged-commands/shopify-expert.md +102 -0
- package/merged-commands/signup-flow-cro.md +355 -0
- package/merged-commands/similarity-search-patterns.md +33 -0
- package/merged-commands/skill-creator.md +356 -0
- package/merged-commands/skill-developer.md +426 -0
- package/merged-commands/skill-rails-upgrade.md +408 -0
- package/merged-commands/skill-seekers.md +22 -0
- package/merged-commands/skill-share.md +80 -0
- package/merged-commands/slack-bot-builder.md +264 -0
- package/merged-commands/slack-gif-creator.md +254 -0
- package/merged-commands/slo-implementation.md +341 -0
- package/merged-commands/smtp-penetration-testing.md +500 -0
- package/merged-commands/social-content.md +807 -0
- package/merged-commands/software-architecture.md +75 -0
- package/merged-commands/solidity-security.md +34 -0
- package/merged-commands/spark-engineer.md +100 -0
- package/merged-commands/spark-optimization.md +427 -0
- package/merged-commands/spec-miner.md +88 -0
- package/merged-commands/spring-boot-engineer.md +104 -0
- package/merged-commands/sql-injection-testing.md +448 -0
- package/merged-commands/sql-optimization-patterns.md +35 -0
- package/merged-commands/sql-pro.md +173 -0
- package/merged-commands/sqlmap-database-pentesting.md +400 -0
- package/merged-commands/sre-engineer.md +98 -0
- package/merged-commands/ssh-penetration-testing.md +488 -0
- package/merged-commands/startup-analyst.md +328 -0
- package/merged-commands/startup-business-analyst-business-case.md +487 -0
- package/merged-commands/startup-business-analyst-financial-projections.md +353 -0
- package/merged-commands/startup-business-analyst-market-opportunity.md +240 -0
- package/merged-commands/startup-financial-modeling.md +467 -0
- package/merged-commands/startup-metrics-framework.md +34 -0
- package/merged-commands/stitch-ui-design.md +378 -0
- package/merged-commands/stride-analysis-patterns.md +33 -0
- package/merged-commands/stripe-integration.md +454 -0
- package/merged-commands/subagent-driven-development.md +240 -0
- package/merged-commands/superpowers-lab.md +22 -0
- package/merged-commands/swift-expert.md +94 -0
- package/merged-commands/swiftui-expert-skill.md +275 -0
- package/merged-commands/systematic-debugging.md +296 -0
- package/merged-commands/systems-programming-rust-project.md +440 -0
- package/merged-commands/tailwind-design-system.md +33 -0
- package/merged-commands/tailwind-patterns.md +269 -0
- package/merged-commands/tavily-web.md +36 -0
- package/merged-commands/tdd-orchestrator.md +205 -0
- package/merged-commands/tdd-workflow.md +149 -0
- package/merged-commands/tdd-workflows-tdd-cycle.md +221 -0
- package/merged-commands/tdd-workflows-tdd-green.md +73 -0
- package/merged-commands/tdd-workflows-tdd-red.md +164 -0
- package/merged-commands/tdd-workflows-tdd-refactor.md +187 -0
- package/merged-commands/team-collaboration-issue.md +37 -0
- package/merged-commands/team-collaboration-standup-notes.md +44 -0
- package/merged-commands/team-composition-analysis.md +413 -0
- package/merged-commands/telegram-bot-builder.md +254 -0
- package/merged-commands/telegram-mini-app.md +279 -0
- package/merged-commands/template-skill.md +6 -0
- package/merged-commands/temporal-python-pro.md +370 -0
- package/merged-commands/temporal-python-testing.md +170 -0
- package/merged-commands/terraform-engineer.md +97 -0
- package/merged-commands/terraform-module-library.md +261 -0
- package/merged-commands/terraform-skill.md +517 -0
- package/merged-commands/terraform-specialist.md +166 -0
- package/merged-commands/test-automator.md +224 -0
- package/merged-commands/test-driven-development.md +371 -0
- package/merged-commands/test-fixing.md +119 -0
- package/merged-commands/test-master.md +104 -0
- package/merged-commands/testing-patterns.md +259 -0
- package/merged-commands/theme-factory.md +59 -0
- package/merged-commands/threat-mitigation-mapping.md +33 -0
- package/merged-commands/threat-modeling-expert.md +60 -0
- package/merged-commands/threejs-skills.md +22 -0
- package/merged-commands/threejs.md +89 -0
- package/merged-commands/tool-design.md +318 -0
- package/merged-commands/top-web-vulnerabilities.md +543 -0
- package/merged-commands/track-management.md +38 -0
- package/merged-commands/trigger-dev.md +67 -0
- package/merged-commands/turborepo-caching.md +419 -0
- package/merged-commands/tutorial-engineer.md +139 -0
- package/merged-commands/twilio-communications.md +295 -0
- package/merged-commands/typescript-advanced-types.md +35 -0
- package/merged-commands/typescript-expert.md +429 -0
- package/merged-commands/typescript-pro.md +55 -0
- package/merged-commands/ui-design-system.md +32 -0
- package/merged-commands/ui-skills.md +22 -0
- package/merged-commands/ui-styling.md +321 -0
- package/merged-commands/ui-ux-designer.md +209 -0
- package/merged-commands/ui-ux-pro-max.md +351 -0
- package/merged-commands/ui-visual-validator.md +214 -0
- package/merged-commands/unit-testing-test-generate.md +319 -0
- package/merged-commands/unity-developer.md +230 -0
- package/merged-commands/unity-ecs-patterns.md +33 -0
- package/merged-commands/unreal-engine-cpp-pro.md +114 -0
- package/merged-commands/upgrading-expo.md +118 -0
- package/merged-commands/upstash-qstash.md +68 -0
- package/merged-commands/using-git-worktrees.md +217 -0
- package/merged-commands/using-neon.md +84 -0
- package/merged-commands/using-superpowers.md +87 -0
- package/merged-commands/uv-package-manager.md +37 -0
- package/merged-commands/ux-researcher-designer.md +30 -0
- package/merged-commands/varlock-claude-skill.md +22 -0
- package/merged-commands/vector-database-engineer.md +60 -0
- package/merged-commands/vector-index-tuning.md +42 -0
- package/merged-commands/vercel-deploy-claimable.md +120 -0
- package/merged-commands/vercel-deploy.md +22 -0
- package/merged-commands/vercel-deployment.md +79 -0
- package/merged-commands/verification-before-completion.md +139 -0
- package/merged-commands/vexor.md +22 -0
- package/merged-commands/video-downloader.md +106 -0
- package/merged-commands/viral-generator-builder.md +199 -0
- package/merged-commands/voice-agents.md +68 -0
- package/merged-commands/voice-ai-development.md +302 -0
- package/merged-commands/voice-ai-engine-development.md +721 -0
- package/merged-commands/vue-expert-js.md +91 -0
- package/merged-commands/vue-expert.md +374 -0
- package/merged-commands/vulnerability-scanner.md +276 -0
- package/merged-commands/wcag-audit-patterns.md +41 -0
- package/merged-commands/web-artifacts-builder.md +74 -0
- package/merged-commands/web-design-guidelines.md +36 -0
- package/merged-commands/web-frameworks.md +324 -0
- package/merged-commands/web-performance-optimization.md +646 -0
- package/merged-commands/web3-testing.md +427 -0
- package/merged-commands/webapp-testing.md +96 -0
- package/merged-commands/websocket-engineer.md +96 -0
- package/merged-commands/windows-privilege-escalation.md +496 -0
- package/merged-commands/wireshark-analysis.md +497 -0
- package/merged-commands/wordpress-penetration-testing.md +485 -0
- package/merged-commands/wordpress-pro.md +105 -0
- package/merged-commands/workflow-automation.md +68 -0
- package/merged-commands/workflow-orchestration-patterns.md +333 -0
- package/merged-commands/workflow-patterns.md +38 -0
- package/merged-commands/writing-plans.md +116 -0
- package/merged-commands/writing-skills.md +125 -0
- package/merged-commands/x-article-publisher-skill.md +22 -0
- package/merged-commands/xlsx-official.md +289 -0
- package/merged-commands/xlsx.md +289 -0
- package/merged-commands/xss-html-injection.md +499 -0
- package/merged-commands/youtube-transcript.md +415 -0
- package/merged-commands/zapier-make-patterns.md +67 -0
- package/merged-commands/zustand-store.md +68 -0
- package/package.json +1 -1
- package/scripts/merge-commands.js +21 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-state-management
|
|
3
|
+
description: Master modern React state management with Redux Toolkit, Zustand, Jotai, and React Query. Use when setting up global state, managing server state, or choosing between state management solutions.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# React State Management
|
|
7
|
+
|
|
8
|
+
Comprehensive guide to modern React state management patterns, from local component state to global stores and server state synchronization.
|
|
9
|
+
|
|
10
|
+
## Do not use this skill when
|
|
11
|
+
|
|
12
|
+
- The task is unrelated to react state management
|
|
13
|
+
- You need a different domain or tool outside this scope
|
|
14
|
+
|
|
15
|
+
## Instructions
|
|
16
|
+
|
|
17
|
+
- Clarify goals, constraints, and required inputs.
|
|
18
|
+
- Apply relevant best practices and validate outcomes.
|
|
19
|
+
- Provide actionable steps and verification.
|
|
20
|
+
- If detailed examples are required, open `resources/implementation-playbook.md`.
|
|
21
|
+
|
|
22
|
+
## Use this skill when
|
|
23
|
+
|
|
24
|
+
- Setting up global state management in a React app
|
|
25
|
+
- Choosing between Redux Toolkit, Zustand, or Jotai
|
|
26
|
+
- Managing server state with React Query or SWR
|
|
27
|
+
- Implementing optimistic updates
|
|
28
|
+
- Debugging state-related issues
|
|
29
|
+
- Migrating from legacy Redux to modern patterns
|
|
30
|
+
|
|
31
|
+
## Core Concepts
|
|
32
|
+
|
|
33
|
+
### 1. State Categories
|
|
34
|
+
|
|
35
|
+
| Type | Description | Solutions |
|
|
36
|
+
|------|-------------|-----------|
|
|
37
|
+
| **Local State** | Component-specific, UI state | useState, useReducer |
|
|
38
|
+
| **Global State** | Shared across components | Redux Toolkit, Zustand, Jotai |
|
|
39
|
+
| **Server State** | Remote data, caching | React Query, SWR, RTK Query |
|
|
40
|
+
| **URL State** | Route parameters, search | React Router, nuqs |
|
|
41
|
+
| **Form State** | Input values, validation | React Hook Form, Formik |
|
|
42
|
+
|
|
43
|
+
### 2. Selection Criteria
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
Small app, simple state → Zustand or Jotai
|
|
47
|
+
Large app, complex state → Redux Toolkit
|
|
48
|
+
Heavy server interaction → React Query + light client state
|
|
49
|
+
Atomic/granular updates → Jotai
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Quick Start
|
|
53
|
+
|
|
54
|
+
### Zustand (Simplest)
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// store/useStore.ts
|
|
58
|
+
import { create } from 'zustand'
|
|
59
|
+
import { devtools, persist } from 'zustand/middleware'
|
|
60
|
+
|
|
61
|
+
interface AppState {
|
|
62
|
+
user: User | null
|
|
63
|
+
theme: 'light' | 'dark'
|
|
64
|
+
setUser: (user: User | null) => void
|
|
65
|
+
toggleTheme: () => void
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export const useStore = create<AppState>()(
|
|
69
|
+
devtools(
|
|
70
|
+
persist(
|
|
71
|
+
(set) => ({
|
|
72
|
+
user: null,
|
|
73
|
+
theme: 'light',
|
|
74
|
+
setUser: (user) => set({ user }),
|
|
75
|
+
toggleTheme: () => set((state) => ({
|
|
76
|
+
theme: state.theme === 'light' ? 'dark' : 'light'
|
|
77
|
+
})),
|
|
78
|
+
}),
|
|
79
|
+
{ name: 'app-storage' }
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
// Usage in component
|
|
85
|
+
function Header() {
|
|
86
|
+
const { user, theme, toggleTheme } = useStore()
|
|
87
|
+
return (
|
|
88
|
+
<header className={theme}>
|
|
89
|
+
{user?.name}
|
|
90
|
+
<button onClick={toggleTheme}>Toggle Theme</button>
|
|
91
|
+
</header>
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Patterns
|
|
97
|
+
|
|
98
|
+
### Pattern 1: Redux Toolkit with TypeScript
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// store/index.ts
|
|
102
|
+
import { configureStore } from '@reduxjs/toolkit'
|
|
103
|
+
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
|
|
104
|
+
import userReducer from './slices/userSlice'
|
|
105
|
+
import cartReducer from './slices/cartSlice'
|
|
106
|
+
|
|
107
|
+
export const store = configureStore({
|
|
108
|
+
reducer: {
|
|
109
|
+
user: userReducer,
|
|
110
|
+
cart: cartReducer,
|
|
111
|
+
},
|
|
112
|
+
middleware: (getDefaultMiddleware) =>
|
|
113
|
+
getDefaultMiddleware({
|
|
114
|
+
serializableCheck: {
|
|
115
|
+
ignoredActions: ['persist/PERSIST'],
|
|
116
|
+
},
|
|
117
|
+
}),
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
export type RootState = ReturnType<typeof store.getState>
|
|
121
|
+
export type AppDispatch = typeof store.dispatch
|
|
122
|
+
|
|
123
|
+
// Typed hooks
|
|
124
|
+
export const useAppDispatch: () => AppDispatch = useDispatch
|
|
125
|
+
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
```typescript
|
|
129
|
+
// store/slices/userSlice.ts
|
|
130
|
+
import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'
|
|
131
|
+
|
|
132
|
+
interface User {
|
|
133
|
+
id: string
|
|
134
|
+
email: string
|
|
135
|
+
name: string
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
interface UserState {
|
|
139
|
+
current: User | null
|
|
140
|
+
status: 'idle' | 'loading' | 'succeeded' | 'failed'
|
|
141
|
+
error: string | null
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const initialState: UserState = {
|
|
145
|
+
current: null,
|
|
146
|
+
status: 'idle',
|
|
147
|
+
error: null,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export const fetchUser = createAsyncThunk(
|
|
151
|
+
'user/fetchUser',
|
|
152
|
+
async (userId: string, { rejectWithValue }) => {
|
|
153
|
+
try {
|
|
154
|
+
const response = await fetch(`/api/users/${userId}`)
|
|
155
|
+
if (!response.ok) throw new Error('Failed to fetch user')
|
|
156
|
+
return await response.json()
|
|
157
|
+
} catch (error) {
|
|
158
|
+
return rejectWithValue((error as Error).message)
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
const userSlice = createSlice({
|
|
164
|
+
name: 'user',
|
|
165
|
+
initialState,
|
|
166
|
+
reducers: {
|
|
167
|
+
setUser: (state, action: PayloadAction<User>) => {
|
|
168
|
+
state.current = action.payload
|
|
169
|
+
state.status = 'succeeded'
|
|
170
|
+
},
|
|
171
|
+
clearUser: (state) => {
|
|
172
|
+
state.current = null
|
|
173
|
+
state.status = 'idle'
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
extraReducers: (builder) => {
|
|
177
|
+
builder
|
|
178
|
+
.addCase(fetchUser.pending, (state) => {
|
|
179
|
+
state.status = 'loading'
|
|
180
|
+
state.error = null
|
|
181
|
+
})
|
|
182
|
+
.addCase(fetchUser.fulfilled, (state, action) => {
|
|
183
|
+
state.status = 'succeeded'
|
|
184
|
+
state.current = action.payload
|
|
185
|
+
})
|
|
186
|
+
.addCase(fetchUser.rejected, (state, action) => {
|
|
187
|
+
state.status = 'failed'
|
|
188
|
+
state.error = action.payload as string
|
|
189
|
+
})
|
|
190
|
+
},
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
export const { setUser, clearUser } = userSlice.actions
|
|
194
|
+
export default userSlice.reducer
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Pattern 2: Zustand with Slices (Scalable)
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// store/slices/createUserSlice.ts
|
|
201
|
+
import { StateCreator } from 'zustand'
|
|
202
|
+
|
|
203
|
+
export interface UserSlice {
|
|
204
|
+
user: User | null
|
|
205
|
+
isAuthenticated: boolean
|
|
206
|
+
login: (credentials: Credentials) => Promise<void>
|
|
207
|
+
logout: () => void
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export const createUserSlice: StateCreator<
|
|
211
|
+
UserSlice & CartSlice, // Combined store type
|
|
212
|
+
[],
|
|
213
|
+
[],
|
|
214
|
+
UserSlice
|
|
215
|
+
> = (set, get) => ({
|
|
216
|
+
user: null,
|
|
217
|
+
isAuthenticated: false,
|
|
218
|
+
login: async (credentials) => {
|
|
219
|
+
const user = await authApi.login(credentials)
|
|
220
|
+
set({ user, isAuthenticated: true })
|
|
221
|
+
},
|
|
222
|
+
logout: () => {
|
|
223
|
+
set({ user: null, isAuthenticated: false })
|
|
224
|
+
// Can access other slices
|
|
225
|
+
// get().clearCart()
|
|
226
|
+
},
|
|
227
|
+
})
|
|
228
|
+
|
|
229
|
+
// store/index.ts
|
|
230
|
+
import { create } from 'zustand'
|
|
231
|
+
import { createUserSlice, UserSlice } from './slices/createUserSlice'
|
|
232
|
+
import { createCartSlice, CartSlice } from './slices/createCartSlice'
|
|
233
|
+
|
|
234
|
+
type StoreState = UserSlice & CartSlice
|
|
235
|
+
|
|
236
|
+
export const useStore = create<StoreState>()((...args) => ({
|
|
237
|
+
...createUserSlice(...args),
|
|
238
|
+
...createCartSlice(...args),
|
|
239
|
+
}))
|
|
240
|
+
|
|
241
|
+
// Selective subscriptions (prevents unnecessary re-renders)
|
|
242
|
+
export const useUser = () => useStore((state) => state.user)
|
|
243
|
+
export const useCart = () => useStore((state) => state.cart)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Pattern 3: Jotai for Atomic State
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
// atoms/userAtoms.ts
|
|
250
|
+
import { atom } from 'jotai'
|
|
251
|
+
import { atomWithStorage } from 'jotai/utils'
|
|
252
|
+
|
|
253
|
+
// Basic atom
|
|
254
|
+
export const userAtom = atom<User | null>(null)
|
|
255
|
+
|
|
256
|
+
// Derived atom (computed)
|
|
257
|
+
export const isAuthenticatedAtom = atom((get) => get(userAtom) !== null)
|
|
258
|
+
|
|
259
|
+
// Atom with localStorage persistence
|
|
260
|
+
export const themeAtom = atomWithStorage<'light' | 'dark'>('theme', 'light')
|
|
261
|
+
|
|
262
|
+
// Async atom
|
|
263
|
+
export const userProfileAtom = atom(async (get) => {
|
|
264
|
+
const user = get(userAtom)
|
|
265
|
+
if (!user) return null
|
|
266
|
+
const response = await fetch(`/api/users/${user.id}/profile`)
|
|
267
|
+
return response.json()
|
|
268
|
+
})
|
|
269
|
+
|
|
270
|
+
// Write-only atom (action)
|
|
271
|
+
export const logoutAtom = atom(null, (get, set) => {
|
|
272
|
+
set(userAtom, null)
|
|
273
|
+
set(cartAtom, [])
|
|
274
|
+
localStorage.removeItem('token')
|
|
275
|
+
})
|
|
276
|
+
|
|
277
|
+
// Usage
|
|
278
|
+
function Profile() {
|
|
279
|
+
const [user] = useAtom(userAtom)
|
|
280
|
+
const [, logout] = useAtom(logoutAtom)
|
|
281
|
+
const [profile] = useAtom(userProfileAtom) // Suspense-enabled
|
|
282
|
+
|
|
283
|
+
return (
|
|
284
|
+
<Suspense fallback={<Skeleton />}>
|
|
285
|
+
<ProfileContent profile={profile} onLogout={logout} />
|
|
286
|
+
</Suspense>
|
|
287
|
+
)
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### Pattern 4: React Query for Server State
|
|
292
|
+
|
|
293
|
+
```typescript
|
|
294
|
+
// hooks/useUsers.ts
|
|
295
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
|
|
296
|
+
|
|
297
|
+
// Query keys factory
|
|
298
|
+
export const userKeys = {
|
|
299
|
+
all: ['users'] as const,
|
|
300
|
+
lists: () => [...userKeys.all, 'list'] as const,
|
|
301
|
+
list: (filters: UserFilters) => [...userKeys.lists(), filters] as const,
|
|
302
|
+
details: () => [...userKeys.all, 'detail'] as const,
|
|
303
|
+
detail: (id: string) => [...userKeys.details(), id] as const,
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Fetch hook
|
|
307
|
+
export function useUsers(filters: UserFilters) {
|
|
308
|
+
return useQuery({
|
|
309
|
+
queryKey: userKeys.list(filters),
|
|
310
|
+
queryFn: () => fetchUsers(filters),
|
|
311
|
+
staleTime: 5 * 60 * 1000, // 5 minutes
|
|
312
|
+
gcTime: 30 * 60 * 1000, // 30 minutes (formerly cacheTime)
|
|
313
|
+
})
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Single user hook
|
|
317
|
+
export function useUser(id: string) {
|
|
318
|
+
return useQuery({
|
|
319
|
+
queryKey: userKeys.detail(id),
|
|
320
|
+
queryFn: () => fetchUser(id),
|
|
321
|
+
enabled: !!id, // Don't fetch if no id
|
|
322
|
+
})
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Mutation with optimistic update
|
|
326
|
+
export function useUpdateUser() {
|
|
327
|
+
const queryClient = useQueryClient()
|
|
328
|
+
|
|
329
|
+
return useMutation({
|
|
330
|
+
mutationFn: updateUser,
|
|
331
|
+
onMutate: async (newUser) => {
|
|
332
|
+
// Cancel outgoing refetches
|
|
333
|
+
await queryClient.cancelQueries({ queryKey: userKeys.detail(newUser.id) })
|
|
334
|
+
|
|
335
|
+
// Snapshot previous value
|
|
336
|
+
const previousUser = queryClient.getQueryData(userKeys.detail(newUser.id))
|
|
337
|
+
|
|
338
|
+
// Optimistically update
|
|
339
|
+
queryClient.setQueryData(userKeys.detail(newUser.id), newUser)
|
|
340
|
+
|
|
341
|
+
return { previousUser }
|
|
342
|
+
},
|
|
343
|
+
onError: (err, newUser, context) => {
|
|
344
|
+
// Rollback on error
|
|
345
|
+
queryClient.setQueryData(
|
|
346
|
+
userKeys.detail(newUser.id),
|
|
347
|
+
context?.previousUser
|
|
348
|
+
)
|
|
349
|
+
},
|
|
350
|
+
onSettled: (data, error, variables) => {
|
|
351
|
+
// Refetch after mutation
|
|
352
|
+
queryClient.invalidateQueries({ queryKey: userKeys.detail(variables.id) })
|
|
353
|
+
},
|
|
354
|
+
})
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### Pattern 5: Combining Client + Server State
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
// Zustand for client state
|
|
362
|
+
const useUIStore = create<UIState>((set) => ({
|
|
363
|
+
sidebarOpen: true,
|
|
364
|
+
modal: null,
|
|
365
|
+
toggleSidebar: () => set((s) => ({ sidebarOpen: !s.sidebarOpen })),
|
|
366
|
+
openModal: (modal) => set({ modal }),
|
|
367
|
+
closeModal: () => set({ modal: null }),
|
|
368
|
+
}))
|
|
369
|
+
|
|
370
|
+
// React Query for server state
|
|
371
|
+
function Dashboard() {
|
|
372
|
+
const { sidebarOpen, toggleSidebar } = useUIStore()
|
|
373
|
+
const { data: users, isLoading } = useUsers({ active: true })
|
|
374
|
+
const { data: stats } = useStats()
|
|
375
|
+
|
|
376
|
+
if (isLoading) return <DashboardSkeleton />
|
|
377
|
+
|
|
378
|
+
return (
|
|
379
|
+
<div className={sidebarOpen ? 'with-sidebar' : ''}>
|
|
380
|
+
<Sidebar open={sidebarOpen} onToggle={toggleSidebar} />
|
|
381
|
+
<main>
|
|
382
|
+
<StatsCards stats={stats} />
|
|
383
|
+
<UserTable users={users} />
|
|
384
|
+
</main>
|
|
385
|
+
</div>
|
|
386
|
+
)
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## Best Practices
|
|
391
|
+
|
|
392
|
+
### Do's
|
|
393
|
+
- **Colocate state** - Keep state as close to where it's used as possible
|
|
394
|
+
- **Use selectors** - Prevent unnecessary re-renders with selective subscriptions
|
|
395
|
+
- **Normalize data** - Flatten nested structures for easier updates
|
|
396
|
+
- **Type everything** - Full TypeScript coverage prevents runtime errors
|
|
397
|
+
- **Separate concerns** - Server state (React Query) vs client state (Zustand)
|
|
398
|
+
|
|
399
|
+
### Don'ts
|
|
400
|
+
- **Don't over-globalize** - Not everything needs to be in global state
|
|
401
|
+
- **Don't duplicate server state** - Let React Query manage it
|
|
402
|
+
- **Don't mutate directly** - Always use immutable updates
|
|
403
|
+
- **Don't store derived data** - Compute it instead
|
|
404
|
+
- **Don't mix paradigms** - Pick one primary solution per category
|
|
405
|
+
|
|
406
|
+
## Migration Guides
|
|
407
|
+
|
|
408
|
+
### From Legacy Redux to RTK
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
// Before (legacy Redux)
|
|
412
|
+
const ADD_TODO = 'ADD_TODO'
|
|
413
|
+
const addTodo = (text) => ({ type: ADD_TODO, payload: text })
|
|
414
|
+
function todosReducer(state = [], action) {
|
|
415
|
+
switch (action.type) {
|
|
416
|
+
case ADD_TODO:
|
|
417
|
+
return [...state, { text: action.payload, completed: false }]
|
|
418
|
+
default:
|
|
419
|
+
return state
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
// After (Redux Toolkit)
|
|
424
|
+
const todosSlice = createSlice({
|
|
425
|
+
name: 'todos',
|
|
426
|
+
initialState: [],
|
|
427
|
+
reducers: {
|
|
428
|
+
addTodo: (state, action: PayloadAction<string>) => {
|
|
429
|
+
// Immer allows "mutations"
|
|
430
|
+
state.push({ text: action.payload, completed: false })
|
|
431
|
+
},
|
|
432
|
+
},
|
|
433
|
+
})
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## Resources
|
|
437
|
+
|
|
438
|
+
- [Redux Toolkit Documentation](https://redux-toolkit.js.org/)
|
|
439
|
+
- [Zustand GitHub](https://github.com/pmndrs/zustand)
|
|
440
|
+
- [Jotai Documentation](https://jotai.org/)
|
|
441
|
+
- [TanStack Query](https://tanstack.com/query)
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: react-ui-patterns
|
|
3
|
+
description: Modern React UI patterns for loading states, error handling, and data fetching. Use when building UI components, handling async data, or managing UI states.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# React UI Patterns
|
|
7
|
+
|
|
8
|
+
## Core Principles
|
|
9
|
+
|
|
10
|
+
1. **Never show stale UI** - Loading spinners only when actually loading
|
|
11
|
+
2. **Always surface errors** - Users must know when something fails
|
|
12
|
+
3. **Optimistic updates** - Make the UI feel instant
|
|
13
|
+
4. **Progressive disclosure** - Show content as it becomes available
|
|
14
|
+
5. **Graceful degradation** - Partial data is better than no data
|
|
15
|
+
|
|
16
|
+
## Loading State Patterns
|
|
17
|
+
|
|
18
|
+
### The Golden Rule
|
|
19
|
+
|
|
20
|
+
**Show loading indicator ONLY when there's no data to display.**
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// CORRECT - Only show loading when no data exists
|
|
24
|
+
const { data, loading, error } = useGetItemsQuery();
|
|
25
|
+
|
|
26
|
+
if (error) return <ErrorState error={error} onRetry={refetch} />;
|
|
27
|
+
if (loading && !data) return <LoadingState />;
|
|
28
|
+
if (!data?.items.length) return <EmptyState />;
|
|
29
|
+
|
|
30
|
+
return <ItemList items={data.items} />;
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
// WRONG - Shows spinner even when we have cached data
|
|
35
|
+
if (loading) return <LoadingState />; // Flashes on refetch!
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Loading State Decision Tree
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Is there an error?
|
|
42
|
+
→ Yes: Show error state with retry option
|
|
43
|
+
→ No: Continue
|
|
44
|
+
|
|
45
|
+
Is it loading AND we have no data?
|
|
46
|
+
→ Yes: Show loading indicator (spinner/skeleton)
|
|
47
|
+
→ No: Continue
|
|
48
|
+
|
|
49
|
+
Do we have data?
|
|
50
|
+
→ Yes, with items: Show the data
|
|
51
|
+
→ Yes, but empty: Show empty state
|
|
52
|
+
→ No: Show loading (fallback)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Skeleton vs Spinner
|
|
56
|
+
|
|
57
|
+
| Use Skeleton When | Use Spinner When |
|
|
58
|
+
|-------------------|------------------|
|
|
59
|
+
| Known content shape | Unknown content shape |
|
|
60
|
+
| List/card layouts | Modal actions |
|
|
61
|
+
| Initial page load | Button submissions |
|
|
62
|
+
| Content placeholders | Inline operations |
|
|
63
|
+
|
|
64
|
+
## Error Handling Patterns
|
|
65
|
+
|
|
66
|
+
### The Error Handling Hierarchy
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
1. Inline error (field-level) → Form validation errors
|
|
70
|
+
2. Toast notification → Recoverable errors, user can retry
|
|
71
|
+
3. Error banner → Page-level errors, data still partially usable
|
|
72
|
+
4. Full error screen → Unrecoverable, needs user action
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Always Show Errors
|
|
76
|
+
|
|
77
|
+
**CRITICAL: Never swallow errors silently.**
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// CORRECT - Error always surfaced to user
|
|
81
|
+
const [createItem, { loading }] = useCreateItemMutation({
|
|
82
|
+
onCompleted: () => {
|
|
83
|
+
toast.success({ title: 'Item created' });
|
|
84
|
+
},
|
|
85
|
+
onError: (error) => {
|
|
86
|
+
console.error('createItem failed:', error);
|
|
87
|
+
toast.error({ title: 'Failed to create item' });
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// WRONG - Error silently caught, user has no idea
|
|
92
|
+
const [createItem] = useCreateItemMutation({
|
|
93
|
+
onError: (error) => {
|
|
94
|
+
console.error(error); // User sees nothing!
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Error State Component Pattern
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
interface ErrorStateProps {
|
|
103
|
+
error: Error;
|
|
104
|
+
onRetry?: () => void;
|
|
105
|
+
title?: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const ErrorState = ({ error, onRetry, title }: ErrorStateProps) => (
|
|
109
|
+
<div className="error-state">
|
|
110
|
+
<Icon name="exclamation-circle" />
|
|
111
|
+
<h3>{title ?? 'Something went wrong'}</h3>
|
|
112
|
+
<p>{error.message}</p>
|
|
113
|
+
{onRetry && (
|
|
114
|
+
<Button onClick={onRetry}>Try Again</Button>
|
|
115
|
+
)}
|
|
116
|
+
</div>
|
|
117
|
+
);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Button State Patterns
|
|
121
|
+
|
|
122
|
+
### Button Loading State
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
<Button
|
|
126
|
+
onClick={handleSubmit}
|
|
127
|
+
isLoading={isSubmitting}
|
|
128
|
+
disabled={!isValid || isSubmitting}
|
|
129
|
+
>
|
|
130
|
+
Submit
|
|
131
|
+
</Button>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Disable During Operations
|
|
135
|
+
|
|
136
|
+
**CRITICAL: Always disable triggers during async operations.**
|
|
137
|
+
|
|
138
|
+
```tsx
|
|
139
|
+
// CORRECT - Button disabled while loading
|
|
140
|
+
<Button
|
|
141
|
+
disabled={isSubmitting}
|
|
142
|
+
isLoading={isSubmitting}
|
|
143
|
+
onClick={handleSubmit}
|
|
144
|
+
>
|
|
145
|
+
Submit
|
|
146
|
+
</Button>
|
|
147
|
+
|
|
148
|
+
// WRONG - User can tap multiple times
|
|
149
|
+
<Button onClick={handleSubmit}>
|
|
150
|
+
{isSubmitting ? 'Submitting...' : 'Submit'}
|
|
151
|
+
</Button>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Empty States
|
|
155
|
+
|
|
156
|
+
### Empty State Requirements
|
|
157
|
+
|
|
158
|
+
Every list/collection MUST have an empty state:
|
|
159
|
+
|
|
160
|
+
```tsx
|
|
161
|
+
// WRONG - No empty state
|
|
162
|
+
return <FlatList data={items} />;
|
|
163
|
+
|
|
164
|
+
// CORRECT - Explicit empty state
|
|
165
|
+
return (
|
|
166
|
+
<FlatList
|
|
167
|
+
data={items}
|
|
168
|
+
ListEmptyComponent={<EmptyState />}
|
|
169
|
+
/>
|
|
170
|
+
);
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Contextual Empty States
|
|
174
|
+
|
|
175
|
+
```tsx
|
|
176
|
+
// Search with no results
|
|
177
|
+
<EmptyState
|
|
178
|
+
icon="search"
|
|
179
|
+
title="No results found"
|
|
180
|
+
description="Try different search terms"
|
|
181
|
+
/>
|
|
182
|
+
|
|
183
|
+
// List with no items yet
|
|
184
|
+
<EmptyState
|
|
185
|
+
icon="plus-circle"
|
|
186
|
+
title="No items yet"
|
|
187
|
+
description="Create your first item"
|
|
188
|
+
action={{ label: 'Create Item', onClick: handleCreate }}
|
|
189
|
+
/>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Form Submission Pattern
|
|
193
|
+
|
|
194
|
+
```tsx
|
|
195
|
+
const MyForm = () => {
|
|
196
|
+
const [submit, { loading }] = useSubmitMutation({
|
|
197
|
+
onCompleted: handleSuccess,
|
|
198
|
+
onError: handleError,
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
const handleSubmit = async () => {
|
|
202
|
+
if (!isValid) {
|
|
203
|
+
toast.error({ title: 'Please fix errors' });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
await submit({ variables: { input: values } });
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
return (
|
|
210
|
+
<form>
|
|
211
|
+
<Input
|
|
212
|
+
value={values.name}
|
|
213
|
+
onChange={handleChange('name')}
|
|
214
|
+
error={touched.name ? errors.name : undefined}
|
|
215
|
+
/>
|
|
216
|
+
<Button
|
|
217
|
+
type="submit"
|
|
218
|
+
onClick={handleSubmit}
|
|
219
|
+
disabled={!isValid || loading}
|
|
220
|
+
isLoading={loading}
|
|
221
|
+
>
|
|
222
|
+
Submit
|
|
223
|
+
</Button>
|
|
224
|
+
</form>
|
|
225
|
+
);
|
|
226
|
+
};
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Anti-Patterns
|
|
230
|
+
|
|
231
|
+
### Loading States
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
// WRONG - Spinner when data exists (causes flash)
|
|
235
|
+
if (loading) return <Spinner />;
|
|
236
|
+
|
|
237
|
+
// CORRECT - Only show loading without data
|
|
238
|
+
if (loading && !data) return <Spinner />;
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Error Handling
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
// WRONG - Error swallowed
|
|
245
|
+
try {
|
|
246
|
+
await mutation();
|
|
247
|
+
} catch (e) {
|
|
248
|
+
console.log(e); // User has no idea!
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// CORRECT - Error surfaced
|
|
252
|
+
onError: (error) => {
|
|
253
|
+
console.error('operation failed:', error);
|
|
254
|
+
toast.error({ title: 'Operation failed' });
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Button States
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// WRONG - Button not disabled during submission
|
|
262
|
+
<Button onClick={submit}>Submit</Button>
|
|
263
|
+
|
|
264
|
+
// CORRECT - Disabled and shows loading
|
|
265
|
+
<Button onClick={submit} disabled={loading} isLoading={loading}>
|
|
266
|
+
Submit
|
|
267
|
+
</Button>
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Checklist
|
|
271
|
+
|
|
272
|
+
Before completing any UI component:
|
|
273
|
+
|
|
274
|
+
**UI States:**
|
|
275
|
+
- [ ] Error state handled and shown to user
|
|
276
|
+
- [ ] Loading state shown only when no data exists
|
|
277
|
+
- [ ] Empty state provided for collections
|
|
278
|
+
- [ ] Buttons disabled during async operations
|
|
279
|
+
- [ ] Buttons show loading indicator when appropriate
|
|
280
|
+
|
|
281
|
+
**Data & Mutations:**
|
|
282
|
+
- [ ] Mutations have onError handler
|
|
283
|
+
- [ ] All user actions have feedback (toast/visual)
|
|
284
|
+
|
|
285
|
+
## Integration with Other Skills
|
|
286
|
+
|
|
287
|
+
- **graphql-schema**: Use mutation patterns with proper error handling
|
|
288
|
+
- **testing-patterns**: Test all UI states (loading, error, empty, success)
|
|
289
|
+
- **formik-patterns**: Apply form submission patterns
|