@rubix0270/arboris 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -0
- package/cli/manifest.json +323 -0
- package/dist/cli.mjs +376 -0
- package/package.json +81 -0
- package/prisma/skills/accessibility/SKILL.md +147 -0
- package/prisma/skills/agent-architecture-audit/SKILL.md +257 -0
- package/prisma/skills/agent-eval/SKILL.md +146 -0
- package/prisma/skills/agent-harness-construction/SKILL.md +74 -0
- package/prisma/skills/agent-introspection-debugging/SKILL.md +154 -0
- package/prisma/skills/agent-payment-x402/SKILL.md +225 -0
- package/prisma/skills/agent-self-evaluation/SKILL.md +182 -0
- package/prisma/skills/agent-self-evaluation/examples/high-score-example.md +87 -0
- package/prisma/skills/agent-self-evaluation/examples/low-score-example.md +86 -0
- package/prisma/skills/agent-self-evaluation/references/evaluation-criteria.md +71 -0
- package/prisma/skills/agent-self-evaluation/references/hook-integration.md +64 -0
- package/prisma/skills/agent-self-evaluation/scripts/evaluate.py +408 -0
- package/prisma/skills/agent-self-evaluation/templates/evaluation-report.md +86 -0
- package/prisma/skills/agent-sort/SKILL.md +216 -0
- package/prisma/skills/agentic-engineering/SKILL.md +64 -0
- package/prisma/skills/agentic-os/SKILL.md +388 -0
- package/prisma/skills/ai-first-engineering/SKILL.md +52 -0
- package/prisma/skills/ai-regression-testing/SKILL.md +386 -0
- package/prisma/skills/android-clean-architecture/SKILL.md +340 -0
- package/prisma/skills/angular-developer/SKILL.md +155 -0
- package/prisma/skills/angular-developer/references/angular-animations.md +160 -0
- package/prisma/skills/angular-developer/references/angular-aria.md +410 -0
- package/prisma/skills/angular-developer/references/cli.md +86 -0
- package/prisma/skills/angular-developer/references/component-harnesses.md +59 -0
- package/prisma/skills/angular-developer/references/component-styling.md +91 -0
- package/prisma/skills/angular-developer/references/components.md +117 -0
- package/prisma/skills/angular-developer/references/creating-services.md +97 -0
- package/prisma/skills/angular-developer/references/data-resolvers.md +69 -0
- package/prisma/skills/angular-developer/references/define-routes.md +67 -0
- package/prisma/skills/angular-developer/references/defining-providers.md +72 -0
- package/prisma/skills/angular-developer/references/di-fundamentals.md +120 -0
- package/prisma/skills/angular-developer/references/e2e-testing.md +56 -0
- package/prisma/skills/angular-developer/references/effects.md +83 -0
- package/prisma/skills/angular-developer/references/hierarchical-injectors.md +43 -0
- package/prisma/skills/angular-developer/references/host-elements.md +80 -0
- package/prisma/skills/angular-developer/references/injection-context.md +63 -0
- package/prisma/skills/angular-developer/references/inputs.md +101 -0
- package/prisma/skills/angular-developer/references/linked-signal.md +59 -0
- package/prisma/skills/angular-developer/references/loading-strategies.md +61 -0
- package/prisma/skills/angular-developer/references/mcp.md +108 -0
- package/prisma/skills/angular-developer/references/navigate-to-routes.md +69 -0
- package/prisma/skills/angular-developer/references/outputs.md +86 -0
- package/prisma/skills/angular-developer/references/reactive-forms.md +122 -0
- package/prisma/skills/angular-developer/references/rendering-strategies.md +44 -0
- package/prisma/skills/angular-developer/references/resource.md +77 -0
- package/prisma/skills/angular-developer/references/route-animations.md +56 -0
- package/prisma/skills/angular-developer/references/route-guards.md +52 -0
- package/prisma/skills/angular-developer/references/router-lifecycle.md +45 -0
- package/prisma/skills/angular-developer/references/router-testing.md +87 -0
- package/prisma/skills/angular-developer/references/show-routes-with-outlets.md +68 -0
- package/prisma/skills/angular-developer/references/signal-forms.md +795 -0
- package/prisma/skills/angular-developer/references/signals-overview.md +94 -0
- package/prisma/skills/angular-developer/references/tailwind-css.md +69 -0
- package/prisma/skills/angular-developer/references/template-driven-forms.md +114 -0
- package/prisma/skills/angular-developer/references/testing-fundamentals.md +65 -0
- package/prisma/skills/api-connector-builder/SKILL.md +121 -0
- package/prisma/skills/api-design/SKILL.md +524 -0
- package/prisma/skills/architecture-decision-records/SKILL.md +180 -0
- package/prisma/skills/article-writing/SKILL.md +80 -0
- package/prisma/skills/automation-audit-ops/SKILL.md +143 -0
- package/prisma/skills/autonomous-agent-harness/SKILL.md +274 -0
- package/prisma/skills/autonomous-loops/SKILL.md +611 -0
- package/prisma/skills/backend-patterns/SKILL.md +562 -0
- package/prisma/skills/benchmark/SKILL.md +94 -0
- package/prisma/skills/benchmark-methodology/SKILL.md +190 -0
- package/prisma/skills/benchmark-optimization-loop/SKILL.md +70 -0
- package/prisma/skills/blender-motion-state-inspection/SKILL.md +165 -0
- package/prisma/skills/blueprint/SKILL.md +106 -0
- package/prisma/skills/brand-discovery/SKILL.md +145 -0
- package/prisma/skills/brand-discovery/references/10_purpose-why.md +40 -0
- package/prisma/skills/brand-discovery/references/20_positioning.md +44 -0
- package/prisma/skills/brand-discovery/references/30_audience-niche.md +52 -0
- package/prisma/skills/brand-discovery/references/40_personality-archetype.md +57 -0
- package/prisma/skills/brand-discovery/references/50_voice-tone.md +59 -0
- package/prisma/skills/brand-discovery/references/60_narrative-story.md +50 -0
- package/prisma/skills/brand-discovery/references/70_founder-tension.md +49 -0
- package/prisma/skills/brand-discovery/references/90_SYNTHESIS.md +133 -0
- package/prisma/skills/brand-voice/SKILL.md +98 -0
- package/prisma/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/prisma/skills/browser-qa/SKILL.md +105 -0
- package/prisma/skills/bun-runtime/SKILL.md +85 -0
- package/prisma/skills/canary-watch/SKILL.md +108 -0
- package/prisma/skills/carrier-relationship-management/SKILL.md +212 -0
- package/prisma/skills/cisco-ios-patterns/SKILL.md +164 -0
- package/prisma/skills/ck/SKILL.md +148 -0
- package/prisma/skills/ck/commands/forget.mjs +44 -0
- package/prisma/skills/ck/commands/info.mjs +24 -0
- package/prisma/skills/ck/commands/init.mjs +143 -0
- package/prisma/skills/ck/commands/list.mjs +40 -0
- package/prisma/skills/ck/commands/migrate.mjs +202 -0
- package/prisma/skills/ck/commands/resume.mjs +36 -0
- package/prisma/skills/ck/commands/save.mjs +210 -0
- package/prisma/skills/ck/commands/shared.mjs +387 -0
- package/prisma/skills/ck/hooks/session-start.mjs +224 -0
- package/prisma/skills/claude-devfleet/SKILL.md +112 -0
- package/prisma/skills/click-path-audit/SKILL.md +245 -0
- package/prisma/skills/clickhouse-io/SKILL.md +440 -0
- package/prisma/skills/code-tour/SKILL.md +254 -0
- package/prisma/skills/codebase-onboarding/SKILL.md +234 -0
- package/prisma/skills/codehealth-mcp/SKILL.md +167 -0
- package/prisma/skills/coding-standards/SKILL.md +551 -0
- package/prisma/skills/competitive-platform-analysis/SKILL.md +214 -0
- package/prisma/skills/competitive-report-structure/SKILL.md +162 -0
- package/prisma/skills/compose-multiplatform-patterns/SKILL.md +300 -0
- package/prisma/skills/config-gc/SKILL.md +120 -0
- package/prisma/skills/configure-ecc/SKILL.md +385 -0
- package/prisma/skills/connections-optimizer/SKILL.md +190 -0
- package/prisma/skills/content-engine/SKILL.md +132 -0
- package/prisma/skills/content-hash-cache-pattern/SKILL.md +162 -0
- package/prisma/skills/context-budget/SKILL.md +136 -0
- package/prisma/skills/continuous-agent-loop/SKILL.md +46 -0
- package/prisma/skills/continuous-learning/SKILL.md +132 -0
- package/prisma/skills/continuous-learning/config.json +18 -0
- package/prisma/skills/continuous-learning/evaluate-session.sh +69 -0
- package/prisma/skills/continuous-learning-v2/SKILL.md +361 -0
- package/prisma/skills/continuous-learning-v2/agents/observer-loop.sh +359 -0
- package/prisma/skills/continuous-learning-v2/agents/observer.md +189 -0
- package/prisma/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/prisma/skills/continuous-learning-v2/agents/start-observer.sh +248 -0
- package/prisma/skills/continuous-learning-v2/config.json +8 -0
- package/prisma/skills/continuous-learning-v2/hooks/observe.sh +585 -0
- package/prisma/skills/continuous-learning-v2/scripts/detect-project.sh +322 -0
- package/prisma/skills/continuous-learning-v2/scripts/instinct-cli.py +1956 -0
- package/prisma/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -0
- package/prisma/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +68 -0
- package/prisma/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1421 -0
- package/prisma/skills/cost-aware-llm-pipeline/SKILL.md +184 -0
- package/prisma/skills/cost-tracking/SKILL.md +97 -0
- package/prisma/skills/council/SKILL.md +204 -0
- package/prisma/skills/cpp-coding-standards/SKILL.md +724 -0
- package/prisma/skills/cpp-testing/SKILL.md +325 -0
- package/prisma/skills/crosspost/SKILL.md +112 -0
- package/prisma/skills/csharp-testing/SKILL.md +322 -0
- package/prisma/skills/customer-billing-ops/SKILL.md +141 -0
- package/prisma/skills/customs-trade-compliance/SKILL.md +263 -0
- package/prisma/skills/dart-flutter-patterns/SKILL.md +564 -0
- package/prisma/skills/dashboard-builder/SKILL.md +109 -0
- package/prisma/skills/data-scraper-agent/SKILL.md +765 -0
- package/prisma/skills/data-throughput-accelerator/SKILL.md +73 -0
- package/prisma/skills/database-migrations/SKILL.md +430 -0
- package/prisma/skills/deep-research/SKILL.md +160 -0
- package/prisma/skills/defi-amm-security/SKILL.md +167 -0
- package/prisma/skills/delivery-gate/SKILL.md +126 -0
- package/prisma/skills/delivery-gate/hooks/quality-gate.py +220 -0
- package/prisma/skills/deployment-patterns/SKILL.md +428 -0
- package/prisma/skills/design-system/SKILL.md +83 -0
- package/prisma/skills/django-celery/SKILL.md +458 -0
- package/prisma/skills/django-patterns/SKILL.md +735 -0
- package/prisma/skills/django-security/SKILL.md +644 -0
- package/prisma/skills/django-tdd/SKILL.md +730 -0
- package/prisma/skills/django-verification/SKILL.md +470 -0
- package/prisma/skills/dmux-workflows/SKILL.md +192 -0
- package/prisma/skills/docker-patterns/SKILL.md +365 -0
- package/prisma/skills/documentation-lookup/SKILL.md +91 -0
- package/prisma/skills/dotnet-patterns/SKILL.md +322 -0
- package/prisma/skills/dynamic-workflow-mode/SKILL.md +124 -0
- package/prisma/skills/e2e-testing/SKILL.md +327 -0
- package/prisma/skills/ecc-guide/SKILL.md +190 -0
- package/prisma/skills/ecc-recipes/SKILL.md +149 -0
- package/prisma/skills/ecc-tools-cost-audit/SKILL.md +161 -0
- package/prisma/skills/email-ops/SKILL.md +122 -0
- package/prisma/skills/energy-procurement/SKILL.md +228 -0
- package/prisma/skills/enterprise-agent-ops/SKILL.md +51 -0
- package/prisma/skills/error-handling/SKILL.md +377 -0
- package/prisma/skills/eval-harness/SKILL.md +271 -0
- package/prisma/skills/evm-token-decimals/SKILL.md +131 -0
- package/prisma/skills/exa-search/SKILL.md +108 -0
- package/prisma/skills/fal-ai-media/SKILL.md +289 -0
- package/prisma/skills/fastapi-patterns/SKILL.md +514 -0
- package/prisma/skills/finance-billing-ops/SKILL.md +128 -0
- package/prisma/skills/flox-environments/SKILL.md +497 -0
- package/prisma/skills/flutter-dart-code-review/SKILL.md +436 -0
- package/prisma/skills/foundation-models-on-device/SKILL.md +243 -0
- package/prisma/skills/frontend-a11y/SKILL.md +446 -0
- package/prisma/skills/frontend-design-direction/SKILL.md +93 -0
- package/prisma/skills/frontend-patterns/SKILL.md +657 -0
- package/prisma/skills/frontend-slides/SKILL.md +185 -0
- package/prisma/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/prisma/skills/frontend-slides/animation-patterns.md +122 -0
- package/prisma/skills/frontend-slides/html-template.md +419 -0
- package/prisma/skills/frontend-slides/scripts/export-pdf.sh +418 -0
- package/prisma/skills/frontend-slides/scripts/extract-pptx.py +96 -0
- package/prisma/skills/frontend-slides/viewport-base.css +153 -0
- package/prisma/skills/fsharp-testing/SKILL.md +281 -0
- package/prisma/skills/gan-style-harness/SKILL.md +279 -0
- package/prisma/skills/gateguard/SKILL.md +133 -0
- package/prisma/skills/generating-python-installer/SKILL.md +820 -0
- package/prisma/skills/git-workflow/SKILL.md +716 -0
- package/prisma/skills/github-ops/SKILL.md +145 -0
- package/prisma/skills/golang-patterns/SKILL.md +675 -0
- package/prisma/skills/golang-testing/SKILL.md +721 -0
- package/prisma/skills/google-workspace-ops/SKILL.md +96 -0
- package/prisma/skills/growth-log/SKILL.md +128 -0
- package/prisma/skills/healthcare-cdss-patterns/SKILL.md +246 -0
- package/prisma/skills/healthcare-emr-patterns/SKILL.md +160 -0
- package/prisma/skills/healthcare-eval-harness/SKILL.md +208 -0
- package/prisma/skills/healthcare-phi-compliance/SKILL.md +146 -0
- package/prisma/skills/hermes-imports/SKILL.md +89 -0
- package/prisma/skills/hexagonal-architecture/SKILL.md +277 -0
- package/prisma/skills/hipaa-compliance/SKILL.md +79 -0
- package/prisma/skills/homelab-network-readiness/SKILL.md +170 -0
- package/prisma/skills/homelab-network-setup/SKILL.md +130 -0
- package/prisma/skills/homelab-pihole-dns/SKILL.md +275 -0
- package/prisma/skills/homelab-vlan-segmentation/SKILL.md +312 -0
- package/prisma/skills/homelab-wireguard-vpn/SKILL.md +306 -0
- package/prisma/skills/hookify-rules/SKILL.md +128 -0
- package/prisma/skills/inherit-legacy-style/SKILL.md +157 -0
- package/prisma/skills/intent-driven-development/SKILL.md +360 -0
- package/prisma/skills/inventory-demand-planning/SKILL.md +247 -0
- package/prisma/skills/investor-materials/SKILL.md +97 -0
- package/prisma/skills/investor-outreach/SKILL.md +92 -0
- package/prisma/skills/ios-icon-gen/SKILL.md +158 -0
- package/prisma/skills/ios-icon-gen/scripts/generate_icons.swift +258 -0
- package/prisma/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -0
- package/prisma/skills/iterative-retrieval/SKILL.md +212 -0
- package/prisma/skills/ito-basket-compare/SKILL.md +64 -0
- package/prisma/skills/ito-data-atlas-agent/SKILL.md +64 -0
- package/prisma/skills/ito-market-intelligence/SKILL.md +61 -0
- package/prisma/skills/ito-trade-planner/SKILL.md +68 -0
- package/prisma/skills/java-coding-standards/SKILL.md +384 -0
- package/prisma/skills/jira-integration/SKILL.md +303 -0
- package/prisma/skills/jpa-patterns/SKILL.md +152 -0
- package/prisma/skills/knowledge-ops/SKILL.md +155 -0
- package/prisma/skills/kotlin-coroutines-flows/SKILL.md +285 -0
- package/prisma/skills/kotlin-exposed-patterns/SKILL.md +720 -0
- package/prisma/skills/kotlin-ktor-patterns/SKILL.md +690 -0
- package/prisma/skills/kotlin-patterns/SKILL.md +712 -0
- package/prisma/skills/kotlin-testing/SKILL.md +825 -0
- package/prisma/skills/kubernetes-patterns/SKILL.md +756 -0
- package/prisma/skills/laravel-patterns/SKILL.md +416 -0
- package/prisma/skills/laravel-plugin-discovery/SKILL.md +230 -0
- package/prisma/skills/laravel-security/SKILL.md +948 -0
- package/prisma/skills/laravel-tdd/SKILL.md +675 -0
- package/prisma/skills/laravel-verification/SKILL.md +180 -0
- package/prisma/skills/latency-critical-systems/SKILL.md +74 -0
- package/prisma/skills/lead-intelligence/SKILL.md +322 -0
- package/prisma/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/prisma/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/prisma/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/prisma/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/prisma/skills/liquid-glass-design/SKILL.md +279 -0
- package/prisma/skills/llm-trading-agent-security/SKILL.md +147 -0
- package/prisma/skills/logistics-exception-management/SKILL.md +222 -0
- package/prisma/skills/loop-design-check/SKILL.md +143 -0
- package/prisma/skills/mailtrap-email-integration/SKILL.md +77 -0
- package/prisma/skills/make-interfaces-feel-better/SKILL.md +152 -0
- package/prisma/skills/manim-video/SKILL.md +90 -0
- package/prisma/skills/manim-video/assets/network_graph_scene.py +52 -0
- package/prisma/skills/market-research/SKILL.md +76 -0
- package/prisma/skills/marketing-campaign/SKILL.md +114 -0
- package/prisma/skills/mcp-server-patterns/SKILL.md +70 -0
- package/prisma/skills/messages-ops/SKILL.md +105 -0
- package/prisma/skills/ml-adoption-playbook/SKILL.md +57 -0
- package/prisma/skills/mle-workflow/SKILL.md +347 -0
- package/prisma/skills/motion-advanced/SKILL.md +596 -0
- package/prisma/skills/motion-foundations/SKILL.md +299 -0
- package/prisma/skills/motion-patterns/SKILL.md +434 -0
- package/prisma/skills/motion-ui/SKILL.md +576 -0
- package/prisma/skills/mysql-patterns/SKILL.md +413 -0
- package/prisma/skills/nanoclaw-repl/SKILL.md +34 -0
- package/prisma/skills/nestjs-patterns/SKILL.md +231 -0
- package/prisma/skills/netmiko-ssh-automation/SKILL.md +174 -0
- package/prisma/skills/network-bgp-diagnostics/SKILL.md +168 -0
- package/prisma/skills/network-config-validation/SKILL.md +211 -0
- package/prisma/skills/network-interface-health/SKILL.md +153 -0
- package/prisma/skills/nextjs-turbopack/SKILL.md +58 -0
- package/prisma/skills/nodejs-keccak256/SKILL.md +103 -0
- package/prisma/skills/nutrient-document-processing/SKILL.md +168 -0
- package/prisma/skills/nuxt4-patterns/SKILL.md +101 -0
- package/prisma/skills/openclaw-persona-forge/SKILL.md +289 -0
- package/prisma/skills/openclaw-persona-forge/gacha.py +224 -0
- package/prisma/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/prisma/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/prisma/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/prisma/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/prisma/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/prisma/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/prisma/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/prisma/skills/opensource-pipeline/SKILL.md +256 -0
- package/prisma/skills/orch-add-feature/SKILL.md +45 -0
- package/prisma/skills/orch-build-mvp/SKILL.md +49 -0
- package/prisma/skills/orch-change-feature/SKILL.md +43 -0
- package/prisma/skills/orch-fix-defect/SKILL.md +43 -0
- package/prisma/skills/orch-pipeline/SKILL.md +121 -0
- package/prisma/skills/orch-refine-code/SKILL.md +44 -0
- package/prisma/skills/parallel-execution-optimizer/SKILL.md +73 -0
- package/prisma/skills/perl-patterns/SKILL.md +505 -0
- package/prisma/skills/perl-security/SKILL.md +504 -0
- package/prisma/skills/perl-testing/SKILL.md +476 -0
- package/prisma/skills/plan-orchestrate/SKILL.md +263 -0
- package/prisma/skills/plankton-code-quality/SKILL.md +237 -0
- package/prisma/skills/postgres-patterns/SKILL.md +148 -0
- package/prisma/skills/prediction-market-oracle-research/SKILL.md +64 -0
- package/prisma/skills/prediction-market-risk-review/SKILL.md +61 -0
- package/prisma/skills/prisma-patterns/SKILL.md +401 -0
- package/prisma/skills/product-capability/SKILL.md +142 -0
- package/prisma/skills/product-lens/SKILL.md +93 -0
- package/prisma/skills/production-audit/SKILL.md +207 -0
- package/prisma/skills/production-scheduling/SKILL.md +238 -0
- package/prisma/skills/project-flow-ops/SKILL.md +112 -0
- package/prisma/skills/prompt-optimizer/SKILL.md +398 -0
- package/prisma/skills/python-patterns/SKILL.md +751 -0
- package/prisma/skills/python-testing/SKILL.md +817 -0
- package/prisma/skills/pytorch-patterns/SKILL.md +397 -0
- package/prisma/skills/quality-nonconformance/SKILL.md +260 -0
- package/prisma/skills/quarkus-patterns/SKILL.md +723 -0
- package/prisma/skills/quarkus-security/SKILL.md +468 -0
- package/prisma/skills/quarkus-tdd/SKILL.md +812 -0
- package/prisma/skills/quarkus-verification/SKILL.md +480 -0
- package/prisma/skills/ralphinho-rfc-pipeline/SKILL.md +68 -0
- package/prisma/skills/react-native-patterns/SKILL.md +326 -0
- package/prisma/skills/react-patterns/SKILL.md +342 -0
- package/prisma/skills/react-performance/SKILL.md +575 -0
- package/prisma/skills/react-testing/SKILL.md +424 -0
- package/prisma/skills/recsys-pipeline-architect/SKILL.md +115 -0
- package/prisma/skills/recursive-decision-ledger/SKILL.md +80 -0
- package/prisma/skills/redis-patterns/SKILL.md +404 -0
- package/prisma/skills/regex-vs-llm-structured-text/SKILL.md +221 -0
- package/prisma/skills/remotion-video-creation/SKILL.md +43 -0
- package/prisma/skills/remotion-video-creation/rules/3d.md +86 -0
- package/prisma/skills/remotion-video-creation/rules/animations.md +29 -0
- package/prisma/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/prisma/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/prisma/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/prisma/skills/remotion-video-creation/rules/assets.md +78 -0
- package/prisma/skills/remotion-video-creation/rules/audio.md +172 -0
- package/prisma/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/prisma/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/prisma/skills/remotion-video-creation/rules/charts.md +58 -0
- package/prisma/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/prisma/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/prisma/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/prisma/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/prisma/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/prisma/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/prisma/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/prisma/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/prisma/skills/remotion-video-creation/rules/images.md +130 -0
- package/prisma/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/prisma/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/prisma/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/prisma/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/prisma/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/prisma/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/prisma/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/prisma/skills/remotion-video-creation/rules/timing.md +179 -0
- package/prisma/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/prisma/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/prisma/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/prisma/skills/remotion-video-creation/rules/videos.md +171 -0
- package/prisma/skills/repo-scan/SKILL.md +79 -0
- package/prisma/skills/research-ops/SKILL.md +113 -0
- package/prisma/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/prisma/skills/rules-distill/SKILL.md +265 -0
- package/prisma/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/prisma/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/prisma/skills/rust-patterns/SKILL.md +500 -0
- package/prisma/skills/rust-testing/SKILL.md +501 -0
- package/prisma/skills/safety-guard/SKILL.md +76 -0
- package/prisma/skills/santa-method/SKILL.md +307 -0
- package/prisma/skills/scientific-db-pubmed-database/SKILL.md +176 -0
- package/prisma/skills/scientific-db-uspto-database/SKILL.md +178 -0
- package/prisma/skills/scientific-pkg-gget/SKILL.md +167 -0
- package/prisma/skills/scientific-thinking-literature-review/SKILL.md +193 -0
- package/prisma/skills/scientific-thinking-scholar-evaluation/SKILL.md +161 -0
- package/prisma/skills/search-first/SKILL.md +183 -0
- package/prisma/skills/security-bounty-hunter/SKILL.md +100 -0
- package/prisma/skills/security-review/SKILL.md +504 -0
- package/prisma/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/prisma/skills/security-scan/SKILL.md +166 -0
- package/prisma/skills/seo/SKILL.md +155 -0
- package/prisma/skills/skill-comply/SKILL.md +59 -0
- package/prisma/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/prisma/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/prisma/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/prisma/skills/skill-comply/prompts/classifier.md +24 -0
- package/prisma/skills/skill-comply/prompts/scenario_generator.md +62 -0
- package/prisma/skills/skill-comply/prompts/spec_generator.md +42 -0
- package/prisma/skills/skill-comply/pyproject.toml +15 -0
- package/prisma/skills/skill-comply/scripts/__init__.py +0 -0
- package/prisma/skills/skill-comply/scripts/classifier.py +85 -0
- package/prisma/skills/skill-comply/scripts/grader.py +124 -0
- package/prisma/skills/skill-comply/scripts/parser.py +107 -0
- package/prisma/skills/skill-comply/scripts/report.py +170 -0
- package/prisma/skills/skill-comply/scripts/run.py +127 -0
- package/prisma/skills/skill-comply/scripts/runner.py +194 -0
- package/prisma/skills/skill-comply/scripts/scenario_generator.py +70 -0
- package/prisma/skills/skill-comply/scripts/spec_generator.py +72 -0
- package/prisma/skills/skill-comply/scripts/utils.py +13 -0
- package/prisma/skills/skill-comply/tests/test_grader.py +197 -0
- package/prisma/skills/skill-comply/tests/test_parser.py +90 -0
- package/prisma/skills/skill-comply/tests/test_runner.py +172 -0
- package/prisma/skills/skill-scout/SKILL.md +141 -0
- package/prisma/skills/skill-stocktake/SKILL.md +195 -0
- package/prisma/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/prisma/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/prisma/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/prisma/skills/social-graph-ranker/SKILL.md +155 -0
- package/prisma/skills/social-publisher/SKILL.md +130 -0
- package/prisma/skills/springboot-patterns/SKILL.md +315 -0
- package/prisma/skills/springboot-security/SKILL.md +273 -0
- package/prisma/skills/springboot-tdd/SKILL.md +159 -0
- package/prisma/skills/springboot-verification/SKILL.md +232 -0
- package/prisma/skills/strategic-compact/SKILL.md +136 -0
- package/prisma/skills/swift-actor-persistence/SKILL.md +144 -0
- package/prisma/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/prisma/skills/swift-protocol-di-testing/SKILL.md +191 -0
- package/prisma/skills/swiftui-patterns/SKILL.md +259 -0
- package/prisma/skills/taste/SKILL.md +264 -0
- package/prisma/skills/taste/references/genre-taxonomy.md +87 -0
- package/prisma/skills/tdd-workflow/SKILL.md +583 -0
- package/prisma/skills/team-agent-orchestration/SKILL.md +111 -0
- package/prisma/skills/team-builder/SKILL.md +169 -0
- package/prisma/skills/terminal-ops/SKILL.md +110 -0
- package/prisma/skills/tinystruct-patterns/SKILL.md +279 -0
- package/prisma/skills/tinystruct-patterns/references/architecture.md +90 -0
- package/prisma/skills/tinystruct-patterns/references/data-handling.md +60 -0
- package/prisma/skills/tinystruct-patterns/references/database.md +99 -0
- package/prisma/skills/tinystruct-patterns/references/routing.md +64 -0
- package/prisma/skills/tinystruct-patterns/references/system-usage.md +97 -0
- package/prisma/skills/tinystruct-patterns/references/testing.md +72 -0
- package/prisma/skills/token-budget-advisor/SKILL.md +134 -0
- package/prisma/skills/ui-demo/SKILL.md +466 -0
- package/prisma/skills/ui-to-vue/SKILL.md +135 -0
- package/prisma/skills/uncloud/SKILL.md +344 -0
- package/prisma/skills/unified-notifications-ops/SKILL.md +188 -0
- package/prisma/skills/verification-loop/SKILL.md +127 -0
- package/prisma/skills/video-editing/SKILL.md +311 -0
- package/prisma/skills/videodb/SKILL.md +375 -0
- package/prisma/skills/videodb/reference/api-reference.md +550 -0
- package/prisma/skills/videodb/reference/capture-reference.md +407 -0
- package/prisma/skills/videodb/reference/capture.md +101 -0
- package/prisma/skills/videodb/reference/editor.md +443 -0
- package/prisma/skills/videodb/reference/generative.md +331 -0
- package/prisma/skills/videodb/reference/rtstream-reference.md +564 -0
- package/prisma/skills/videodb/reference/rtstream.md +65 -0
- package/prisma/skills/videodb/reference/search.md +230 -0
- package/prisma/skills/videodb/reference/streaming.md +406 -0
- package/prisma/skills/videodb/reference/use-cases.md +118 -0
- package/prisma/skills/videodb/scripts/ws_listener.py +282 -0
- package/prisma/skills/visa-doc-translate/README.md +86 -0
- package/prisma/skills/visa-doc-translate/SKILL.md +117 -0
- package/prisma/skills/vite-patterns/SKILL.md +450 -0
- package/prisma/skills/vue-patterns/SKILL.md +471 -0
- package/prisma/skills/windows-desktop-e2e/SKILL.md +888 -0
- package/prisma/skills/workspace-surface-audit/SKILL.md +126 -0
- package/prisma/skills/x-api/SKILL.md +235 -0
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-a11y
|
|
3
|
+
description: >
|
|
4
|
+
Accessibility patterns for React and Next.js — semantic HTML, ARIA attributes,
|
|
5
|
+
form labeling, keyboard navigation, focus management, and screen reader support.
|
|
6
|
+
Use when building any interactive UI component or form.
|
|
7
|
+
metadata:
|
|
8
|
+
origin: community
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Frontend Accessibility Patterns
|
|
12
|
+
|
|
13
|
+
Practical accessibility patterns for React and Next.js. Covers the issues most commonly flagged in code review: missing form labels, incorrect ARIA usage, non-semantic interactive elements, and broken keyboard navigation.
|
|
14
|
+
|
|
15
|
+
## When to Activate
|
|
16
|
+
|
|
17
|
+
- Building or reviewing form components (`<input>`, `<select>`, `<textarea>`)
|
|
18
|
+
- Creating interactive elements (modals, dropdowns, tooltips, tabs)
|
|
19
|
+
- Using `<div>` or `<span>` with `onClick`
|
|
20
|
+
- Adding `aria-*` attributes to any element
|
|
21
|
+
- Implementing keyboard navigation or focus management
|
|
22
|
+
- Receiving accessibility feedback from code review tools (CodeRabbit, ESLint a11y)
|
|
23
|
+
- Building components that must support screen readers
|
|
24
|
+
|
|
25
|
+
## Form Accessibility
|
|
26
|
+
|
|
27
|
+
Missing `htmlFor` / `id` pairing and disconnected error messages are the most common issues flagged in code review.
|
|
28
|
+
|
|
29
|
+
### Label Connection
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
// BAD: label has no connection to input — screen readers cannot associate them
|
|
33
|
+
<label>Email</label>
|
|
34
|
+
<input type="email" />
|
|
35
|
+
|
|
36
|
+
// GOOD: htmlFor matches input id
|
|
37
|
+
<label htmlFor="email">Email</label>
|
|
38
|
+
<input id="email" type="email" />
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Required Fields
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
// BAD: visual-only asterisk conveys nothing to screen readers
|
|
45
|
+
<label htmlFor="email">Email *</label>
|
|
46
|
+
<input id="email" type="email" />
|
|
47
|
+
|
|
48
|
+
// GOOD: required enables native browser validation; aria-required signals it to screen readers
|
|
49
|
+
<label htmlFor="email">
|
|
50
|
+
Email <span aria-hidden="true">*</span>
|
|
51
|
+
</label>
|
|
52
|
+
<input id="email" type="email" required aria-required="true" />
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Error Messages
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
// BAD: error text exists visually but is not linked to the input
|
|
59
|
+
<input id="email" type="email" />
|
|
60
|
+
<span className="error">Invalid email address</span>
|
|
61
|
+
|
|
62
|
+
// GOOD: aria-describedby connects input to its error message
|
|
63
|
+
// aria-invalid signals the invalid state to screen readers
|
|
64
|
+
<input
|
|
65
|
+
id="email"
|
|
66
|
+
type="email"
|
|
67
|
+
aria-describedby="email-error"
|
|
68
|
+
aria-invalid={!!error}
|
|
69
|
+
/>
|
|
70
|
+
{error && (
|
|
71
|
+
<span id="email-error" role="alert">
|
|
72
|
+
{error}
|
|
73
|
+
</span>
|
|
74
|
+
)}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Complete Accessible Form
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
interface LoginFormProps {
|
|
81
|
+
onSubmit: (email: string, password: string) => void;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function LoginForm({ onSubmit }: LoginFormProps) {
|
|
85
|
+
const [email, setEmail] = useState('');
|
|
86
|
+
const [password, setPassword] = useState('');
|
|
87
|
+
const [errors, setErrors] = useState<{ email?: string; password?: string }>({});
|
|
88
|
+
|
|
89
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
90
|
+
e.preventDefault();
|
|
91
|
+
const newErrors: typeof errors = {};
|
|
92
|
+
if (!email) newErrors.email = 'Email is required';
|
|
93
|
+
if (!password) newErrors.password = 'Password is required';
|
|
94
|
+
if (Object.keys(newErrors).length) {
|
|
95
|
+
setErrors(newErrors);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
onSubmit(email, password);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
return (
|
|
102
|
+
<form onSubmit={handleSubmit} noValidate>
|
|
103
|
+
<div>
|
|
104
|
+
<label htmlFor="email">
|
|
105
|
+
Email <span aria-hidden="true">*</span>
|
|
106
|
+
</label>
|
|
107
|
+
<input
|
|
108
|
+
id="email"
|
|
109
|
+
type="email"
|
|
110
|
+
value={email}
|
|
111
|
+
onChange={e => setEmail(e.target.value)}
|
|
112
|
+
aria-required="true"
|
|
113
|
+
aria-describedby={errors.email ? 'email-error' : undefined}
|
|
114
|
+
aria-invalid={!!errors.email}
|
|
115
|
+
autoComplete="email"
|
|
116
|
+
/>
|
|
117
|
+
{errors.email && (
|
|
118
|
+
<span id="email-error" role="alert">
|
|
119
|
+
{errors.email}
|
|
120
|
+
</span>
|
|
121
|
+
)}
|
|
122
|
+
</div>
|
|
123
|
+
|
|
124
|
+
<div>
|
|
125
|
+
<label htmlFor="password">
|
|
126
|
+
Password <span aria-hidden="true">*</span>
|
|
127
|
+
</label>
|
|
128
|
+
<input
|
|
129
|
+
id="password"
|
|
130
|
+
type="password"
|
|
131
|
+
value={password}
|
|
132
|
+
onChange={e => setPassword(e.target.value)}
|
|
133
|
+
aria-required="true"
|
|
134
|
+
aria-describedby={errors.password ? 'password-error' : undefined}
|
|
135
|
+
aria-invalid={!!errors.password}
|
|
136
|
+
autoComplete="current-password"
|
|
137
|
+
/>
|
|
138
|
+
{errors.password && (
|
|
139
|
+
<span id="password-error" role="alert">
|
|
140
|
+
{errors.password}
|
|
141
|
+
</span>
|
|
142
|
+
)}
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
<button type="submit">Log in</button>
|
|
146
|
+
</form>
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Semantic HTML
|
|
152
|
+
|
|
153
|
+
Use the element that matches the intent. Screen readers and keyboard users depend on native semantics.
|
|
154
|
+
|
|
155
|
+
```tsx
|
|
156
|
+
// BAD: div has no role, no keyboard support, no accessible name
|
|
157
|
+
<div onClick={handleClick}>Submit</div>
|
|
158
|
+
|
|
159
|
+
// GOOD: button is focusable, activates on Enter/Space, announces as "button"
|
|
160
|
+
<button type="button" onClick={handleClick}>Submit</button>
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
// BAD: non-semantic navigation
|
|
165
|
+
<div onClick={() => navigate('/home')}>Home</div>
|
|
166
|
+
|
|
167
|
+
// GOOD: anchor supports right-click, middle-click, and keyboard navigation
|
|
168
|
+
<a href="/home">Home</a>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
// BAD: heading hierarchy skipped (h1 to h4)
|
|
173
|
+
<h1>Dashboard</h1>
|
|
174
|
+
<h4>Recent Activity</h4>
|
|
175
|
+
|
|
176
|
+
// GOOD: sequential heading levels
|
|
177
|
+
<h1>Dashboard</h1>
|
|
178
|
+
<h2>Recent Activity</h2>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## ARIA Attributes
|
|
182
|
+
|
|
183
|
+
Use ARIA only when native HTML semantics are insufficient. Wrong ARIA is worse than no ARIA.
|
|
184
|
+
|
|
185
|
+
### aria-label vs aria-labelledby
|
|
186
|
+
|
|
187
|
+
```tsx
|
|
188
|
+
// aria-label: inline string label — use when no visible label text exists
|
|
189
|
+
<button aria-label="Close modal">
|
|
190
|
+
<XIcon />
|
|
191
|
+
</button>
|
|
192
|
+
|
|
193
|
+
// aria-labelledby: references another element's text — use when a visible label exists
|
|
194
|
+
<section aria-labelledby="section-title">
|
|
195
|
+
<h2 id="section-title">Recent Orders</h2>
|
|
196
|
+
{/* content */}
|
|
197
|
+
</section>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### aria-describedby
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
// Provides supplementary description beyond the label
|
|
204
|
+
<button
|
|
205
|
+
aria-describedby="delete-warning"
|
|
206
|
+
onClick={handleDelete}
|
|
207
|
+
> Delete account
|
|
208
|
+
</button>
|
|
209
|
+
<p id="delete-warning">This action cannot be undone.</p>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### aria-live for Dynamic Content
|
|
213
|
+
|
|
214
|
+
```tsx
|
|
215
|
+
// Use aria-live to announce content that updates without a page reload
|
|
216
|
+
// polite: waits for user to finish current action before announcing
|
|
217
|
+
// assertive: interrupts immediately — use only for urgent errors
|
|
218
|
+
|
|
219
|
+
export function StatusMessage({ message, isError }: { message: string; isError?: boolean }) {
|
|
220
|
+
return (
|
|
221
|
+
<div role="status" aria-live={isError ? 'assertive' : 'polite'} aria-atomic="true">
|
|
222
|
+
{message}
|
|
223
|
+
</div>
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### aria-expanded and aria-controls
|
|
229
|
+
|
|
230
|
+
```tsx
|
|
231
|
+
export function Accordion({ title, children }: { title: string; children: React.ReactNode }) {
|
|
232
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
233
|
+
const contentId = useId();
|
|
234
|
+
|
|
235
|
+
return (
|
|
236
|
+
<div>
|
|
237
|
+
<button aria-expanded={isOpen} aria-controls={contentId} onClick={() => setIsOpen(prev => !prev)}>
|
|
238
|
+
{title}
|
|
239
|
+
</button>
|
|
240
|
+
<div id={contentId} hidden={!isOpen}>
|
|
241
|
+
{children}
|
|
242
|
+
</div>
|
|
243
|
+
</div>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Keyboard Navigation
|
|
249
|
+
|
|
250
|
+
Every interactive element must be reachable and operable by keyboard alone.
|
|
251
|
+
|
|
252
|
+
### Custom Dropdown
|
|
253
|
+
|
|
254
|
+
```tsx
|
|
255
|
+
export function Dropdown({ options, onSelect }: { options: string[]; onSelect: (value: string) => void }) {
|
|
256
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
257
|
+
const [activeIndex, setActiveIndex] = useState(0);
|
|
258
|
+
const listId = useId();
|
|
259
|
+
|
|
260
|
+
if (!options.length) return null;
|
|
261
|
+
|
|
262
|
+
const handleKeyDown = (e: React.KeyboardEvent) => {
|
|
263
|
+
switch (e.key) {
|
|
264
|
+
case 'ArrowDown':
|
|
265
|
+
e.preventDefault();
|
|
266
|
+
setActiveIndex(i => Math.min(i + 1, options.length - 1));
|
|
267
|
+
break;
|
|
268
|
+
case 'ArrowUp':
|
|
269
|
+
e.preventDefault();
|
|
270
|
+
setActiveIndex(i => Math.max(i - 1, 0));
|
|
271
|
+
break;
|
|
272
|
+
case 'Enter':
|
|
273
|
+
case ' ':
|
|
274
|
+
e.preventDefault();
|
|
275
|
+
if (isOpen) onSelect(options[activeIndex]);
|
|
276
|
+
setIsOpen(prev => !prev);
|
|
277
|
+
break;
|
|
278
|
+
case 'Escape':
|
|
279
|
+
setIsOpen(false);
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
return (
|
|
285
|
+
<div
|
|
286
|
+
role="combobox"
|
|
287
|
+
aria-expanded={isOpen}
|
|
288
|
+
aria-haspopup="listbox"
|
|
289
|
+
aria-controls={listId}
|
|
290
|
+
tabIndex={0}
|
|
291
|
+
onKeyDown={handleKeyDown}
|
|
292
|
+
onClick={() => setIsOpen(prev => !prev)}
|
|
293
|
+
>
|
|
294
|
+
<span>{options[activeIndex]}</span>
|
|
295
|
+
{isOpen && (
|
|
296
|
+
<ul id={listId} role="listbox">
|
|
297
|
+
{options.map((option, index) => (
|
|
298
|
+
<li
|
|
299
|
+
key={option}
|
|
300
|
+
role="option"
|
|
301
|
+
aria-selected={index === activeIndex}
|
|
302
|
+
onClick={() => {
|
|
303
|
+
onSelect(option);
|
|
304
|
+
setIsOpen(false);
|
|
305
|
+
}}
|
|
306
|
+
>
|
|
307
|
+
{option}
|
|
308
|
+
</li>
|
|
309
|
+
))}
|
|
310
|
+
</ul>
|
|
311
|
+
)}
|
|
312
|
+
</div>
|
|
313
|
+
);
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Focus Management
|
|
318
|
+
|
|
319
|
+
Focus must move logically when UI state changes — especially for modals and route transitions.
|
|
320
|
+
|
|
321
|
+
### Modal Focus Restoration
|
|
322
|
+
|
|
323
|
+
> This example covers initial focus and restoration. For a full focus trap (Tab/Shift+Tab cycling within the modal), use a library like [`focus-trap-react`](https://github.com/focus-trap/focus-trap-react) which handles edge cases like dynamic content and nested portals.
|
|
324
|
+
|
|
325
|
+
```tsx
|
|
326
|
+
export function Modal({ isOpen, onClose, title, children }: { isOpen: boolean; onClose: () => void; title: string; children: React.ReactNode }) {
|
|
327
|
+
const modalRef = useRef<HTMLDivElement>(null);
|
|
328
|
+
const previousFocusRef = useRef<HTMLElement | null>(null);
|
|
329
|
+
|
|
330
|
+
useEffect(() => {
|
|
331
|
+
if (isOpen) {
|
|
332
|
+
// Save currently focused element and move focus into modal
|
|
333
|
+
previousFocusRef.current = document.activeElement as HTMLElement;
|
|
334
|
+
modalRef.current?.focus();
|
|
335
|
+
} else {
|
|
336
|
+
// Restore focus to the element that opened the modal
|
|
337
|
+
previousFocusRef.current?.focus();
|
|
338
|
+
}
|
|
339
|
+
}, [isOpen]);
|
|
340
|
+
|
|
341
|
+
if (!isOpen) return null;
|
|
342
|
+
|
|
343
|
+
return (
|
|
344
|
+
<div ref={modalRef} role="dialog" aria-modal="true" aria-labelledby="modal-title" tabIndex={-1} onKeyDown={e => e.key === 'Escape' && onClose()}>
|
|
345
|
+
<h2 id="modal-title">{title}</h2>
|
|
346
|
+
{children}
|
|
347
|
+
<button onClick={onClose}>Close</button>
|
|
348
|
+
</div>
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## Images and Icons
|
|
354
|
+
|
|
355
|
+
```tsx
|
|
356
|
+
// BAD: decorative icon announced as unlabeled image
|
|
357
|
+
<img src="/icon.svg" />
|
|
358
|
+
|
|
359
|
+
// GOOD: decorative image hidden from screen readers
|
|
360
|
+
<img src="/decoration.png" alt="" aria-hidden="true" />
|
|
361
|
+
|
|
362
|
+
// GOOD: meaningful image with descriptive alt text
|
|
363
|
+
<img src="/chart.png" alt="Monthly revenue increased 23% from January to March" />
|
|
364
|
+
|
|
365
|
+
// GOOD: icon button with accessible label
|
|
366
|
+
<button aria-label="Delete item">
|
|
367
|
+
<TrashIcon aria-hidden="true" />
|
|
368
|
+
</button>
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## Reduced Motion
|
|
372
|
+
|
|
373
|
+
Respect users who have requested reduced motion in their OS settings.
|
|
374
|
+
|
|
375
|
+
```tsx
|
|
376
|
+
export function useReducedMotion(): boolean {
|
|
377
|
+
const [prefersReduced, setPrefersReduced] = useState(false);
|
|
378
|
+
|
|
379
|
+
useEffect(() => {
|
|
380
|
+
const mq = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
381
|
+
setPrefersReduced(mq.matches);
|
|
382
|
+
const handler = (e: MediaQueryListEvent) => setPrefersReduced(e.matches);
|
|
383
|
+
mq.addEventListener('change', handler);
|
|
384
|
+
return () => mq.removeEventListener('change', handler);
|
|
385
|
+
}, []);
|
|
386
|
+
|
|
387
|
+
return prefersReduced;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Usage
|
|
391
|
+
export function AnimatedCard({ children }: { children: React.ReactNode }) {
|
|
392
|
+
const reduceMotion = useReducedMotion();
|
|
393
|
+
|
|
394
|
+
return (
|
|
395
|
+
<div
|
|
396
|
+
style={{
|
|
397
|
+
transition: reduceMotion ? 'none' : 'transform 300ms ease'
|
|
398
|
+
}}
|
|
399
|
+
>
|
|
400
|
+
{children}
|
|
401
|
+
</div>
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## Anti-Patterns
|
|
407
|
+
|
|
408
|
+
```tsx
|
|
409
|
+
// BAD: onClick on non-interactive element with no keyboard support
|
|
410
|
+
<div onClick={handleClick}>Click me</div>
|
|
411
|
+
|
|
412
|
+
// BAD: aria-label on a div that has no role
|
|
413
|
+
<div aria-label="Navigation">...</div>
|
|
414
|
+
|
|
415
|
+
// BAD: placeholder used as a substitute for label
|
|
416
|
+
<input placeholder="Enter your email" />
|
|
417
|
+
|
|
418
|
+
// BAD: positive tabIndex creates unpredictable tab order
|
|
419
|
+
<button tabIndex={3}>Submit</button>
|
|
420
|
+
|
|
421
|
+
// BAD: aria-hidden on a focusable element — keyboard users get trapped
|
|
422
|
+
<button aria-hidden="true">Open</button>
|
|
423
|
+
|
|
424
|
+
// BAD: role="button" on div without keyboard handler
|
|
425
|
+
<div role="button" onClick={handleClick}>Submit</div>
|
|
426
|
+
// Missing: tabIndex={0}, onKeyDown for Enter/Space
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## Checklist
|
|
430
|
+
|
|
431
|
+
Before submitting any interactive component for review:
|
|
432
|
+
|
|
433
|
+
- [ ] Every `<input>`, `<select>`, and `<textarea>` has a connected `<label>` via `htmlFor`/`id`
|
|
434
|
+
- [ ] Error messages are linked with `aria-describedby` and marked `role="alert"`
|
|
435
|
+
- [ ] No `onClick` on `<div>` or `<span>` without `role`, `tabIndex`, and `onKeyDown`
|
|
436
|
+
- [ ] Icon-only buttons have `aria-label`
|
|
437
|
+
- [ ] Decorative images use `alt=""` and `aria-hidden="true"`
|
|
438
|
+
- [ ] Modals restore focus on close (for full focus trapping with Tab/Shift+Tab cycling, use a library like `focus-trap-react`)
|
|
439
|
+
- [ ] Dynamic content updates use `aria-live`
|
|
440
|
+
- [ ] `prefers-reduced-motion` is respected for animations
|
|
441
|
+
|
|
442
|
+
## Related Skills
|
|
443
|
+
|
|
444
|
+
- `frontend-patterns` — general React component and state patterns
|
|
445
|
+
- `design-system` — design token and component consistency
|
|
446
|
+
- `motion-ui` — animation patterns with accessibility considerations
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: frontend-design-direction
|
|
3
|
+
description: Set an ECC-specific frontend design direction for production UI work. Use when building or improving websites, dashboards, applications, components, landing pages, visual tools, or any web UI that needs stronger product-specific design judgment.
|
|
4
|
+
metadata:
|
|
5
|
+
origin: community
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Frontend Design Direction
|
|
9
|
+
|
|
10
|
+
Use this skill when the work is not just making UI function, but making it feel
|
|
11
|
+
purposeful, polished, and appropriate to the product domain.
|
|
12
|
+
|
|
13
|
+
Source: salvaged from stale community PR #1659 by `linus707`.
|
|
14
|
+
|
|
15
|
+
Note: ECC intentionally does not rebundle the canonical Anthropic
|
|
16
|
+
`frontend-design` skill. Install that from `anthropics/skills` when you want the
|
|
17
|
+
official upstream skill. This skill is the ECC-specific design-direction salvage
|
|
18
|
+
of the useful local guidance from #1659.
|
|
19
|
+
|
|
20
|
+
## When to Use
|
|
21
|
+
|
|
22
|
+
- The user asks to build a web page, app, dashboard, artifact, component, or UI.
|
|
23
|
+
- The user asks to make an interface more polished, distinctive, beautiful, or
|
|
24
|
+
less generic.
|
|
25
|
+
- The implementation needs visual hierarchy, typography, color, motion, layout,
|
|
26
|
+
and interaction choices.
|
|
27
|
+
- The current UI works but reads as flat, generic, templated, or mismatched to
|
|
28
|
+
the audience.
|
|
29
|
+
|
|
30
|
+
## Design Direction
|
|
31
|
+
|
|
32
|
+
Before coding, choose a specific direction:
|
|
33
|
+
|
|
34
|
+
1. Purpose: what job does the interface do?
|
|
35
|
+
2. Audience: who repeats this workflow, and what do they need to scan first?
|
|
36
|
+
3. Tone: utilitarian, editorial, playful, industrial, refined, technical,
|
|
37
|
+
maximal, minimal, dense, calm, or another explicit direction.
|
|
38
|
+
4. Memorable detail: one design idea that makes the result feel intentional.
|
|
39
|
+
5. Constraints: framework, accessibility, performance, responsiveness, and
|
|
40
|
+
existing design system.
|
|
41
|
+
|
|
42
|
+
Match the direction to the domain. A SaaS operations tool should usually be
|
|
43
|
+
dense, quiet, and scannable. A portfolio, launch page, game, or editorial piece
|
|
44
|
+
can be more expressive. Do not force a landing-page composition onto a tool that
|
|
45
|
+
needs repeated daily use.
|
|
46
|
+
|
|
47
|
+
## Implementation Guidance
|
|
48
|
+
|
|
49
|
+
- Build the actual usable experience as the first screen unless the user
|
|
50
|
+
explicitly asks for marketing copy.
|
|
51
|
+
- Use existing project components, tokens, icon libraries, and routing patterns
|
|
52
|
+
before introducing a new visual system.
|
|
53
|
+
- Use real or generated visual assets when the interface depends on images,
|
|
54
|
+
products, places, people, gameplay, charts, or inspectable media.
|
|
55
|
+
- Prefer contextual typography and spacing over generic oversized hero text.
|
|
56
|
+
- Keep palettes multi-dimensional: avoid a UI dominated by one hue family.
|
|
57
|
+
- Use CSS variables or existing design tokens so the direction remains
|
|
58
|
+
coherent across states.
|
|
59
|
+
- Design responsive constraints explicitly: grids, aspect ratios, min/max
|
|
60
|
+
sizes, stable toolbars, and fixed-format controls should not shift when labels
|
|
61
|
+
or hover states appear.
|
|
62
|
+
- Use motion sparingly but deliberately. Prefer high-signal transitions that
|
|
63
|
+
clarify state over decorative animation.
|
|
64
|
+
- Verify text fit on mobile and desktop. Long labels must wrap or resize
|
|
65
|
+
cleanly rather than overflowing.
|
|
66
|
+
|
|
67
|
+
## Anti-Patterns
|
|
68
|
+
|
|
69
|
+
- Do not default to common generated patterns: purple gradients, decorative
|
|
70
|
+
blobs, oversized cards, vague hero copy, or stock-like atmospheric media.
|
|
71
|
+
- Do not add UI cards inside other cards.
|
|
72
|
+
- Do not use a single decorative style everywhere when the domain calls for
|
|
73
|
+
restraint.
|
|
74
|
+
- Do not hide the primary product, tool, object, or workflow behind generic
|
|
75
|
+
marketing sections.
|
|
76
|
+
- Do not add a new dependency for a design flourish unless it clearly pays for
|
|
77
|
+
itself.
|
|
78
|
+
- Do not describe the UI's features inside the UI when the controls can speak
|
|
79
|
+
for themselves.
|
|
80
|
+
|
|
81
|
+
## Review Checklist
|
|
82
|
+
|
|
83
|
+
- The first viewport immediately communicates the product, workflow, or object.
|
|
84
|
+
- The visual hierarchy supports scanning and repeated use.
|
|
85
|
+
- Typography fits the container and does not overlap adjacent content.
|
|
86
|
+
- Color choices have contrast and do not collapse into a one-note palette.
|
|
87
|
+
- Icons are used for familiar tool actions where available.
|
|
88
|
+
- Responsive layout has stable dimensions for boards, grids, toolbars,
|
|
89
|
+
controls, tiles, and counters.
|
|
90
|
+
- Assets render and carry the subject matter instead of acting as filler.
|
|
91
|
+
- Motion improves orientation and does not mask sluggishness.
|
|
92
|
+
- The result matches the repo's existing frontend conventions unless there is a
|
|
93
|
+
clear reason to depart.
|