cfsa-antigravity 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.mjs +324 -0
- package/package.json +34 -0
- package/template/.agent/instructions/commands.md +48 -0
- package/template/.agent/instructions/patterns.md +61 -0
- package/template/.agent/instructions/structure.md +29 -0
- package/template/.agent/instructions/tech-stack.md +43 -0
- package/template/.agent/instructions/workflow.md +41 -0
- package/template/.agent/kit-sync.md +15 -0
- package/template/.agent/rules/boundary-not-placeholder.md +146 -0
- package/template/.agent/rules/completion-checklist.md +48 -0
- package/template/.agent/rules/decision-classification.md +103 -0
- package/template/.agent/rules/extensibility.md +47 -0
- package/template/.agent/rules/question-vs-command.md +81 -0
- package/template/.agent/rules/security-first.md +43 -0
- package/template/.agent/rules/specificity-standards.md +54 -0
- package/template/.agent/rules/tdd-contract-first.md +57 -0
- package/template/.agent/rules/vertical-slices.md +42 -0
- package/template/.agent/skill-library/MANIFEST.md +480 -0
- package/template/.agent/skill-library/README.md +38 -0
- package/template/.agent/skill-library/meta/brand-guidelines/SKILL.md +73 -0
- package/template/.agent/skill-library/meta/claude-code/README.md +9 -0
- package/template/.agent/skill-library/meta/claude-code/agent-development/SKILL.md +415 -0
- package/template/.agent/skill-library/meta/claude-code/hook-development/SKILL.md +712 -0
- package/template/.agent/skill-library/meta/claude-code/plugin-structure/SKILL.md +476 -0
- package/template/.agent/skill-library/meta/git-advanced/SKILL.md +972 -0
- package/template/.agent/skill-library/meta/mcp-builder/SKILL.md +236 -0
- package/template/.agent/skill-library/meta/product-marketing-context/SKILL.md +241 -0
- package/template/.agent/skill-library/meta/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skill-library/meta/tmux-processes/SKILL.md +210 -0
- package/template/.agent/skill-library/meta/using-tmux-for-interactive-commands/SKILL.md +178 -0
- package/template/.agent/skill-library/stack/3d/threejs-pro/SKILL.md +300 -0
- package/template/.agent/skill-library/stack/ai/ai-sdk/SKILL.md +77 -0
- package/template/.agent/skill-library/stack/ai/langchain/SKILL.md +530 -0
- package/template/.agent/skill-library/stack/ai/ollama/SKILL.md +321 -0
- package/template/.agent/skill-library/stack/ai/openai-sdk/SKILL.md +549 -0
- package/template/.agent/skill-library/stack/analytics/google-analytics/SKILL.md +153 -0
- package/template/.agent/skill-library/stack/api/graphql/SKILL.md +1061 -0
- package/template/.agent/skill-library/stack/api/trpc/SKILL.md +576 -0
- package/template/.agent/skill-library/stack/auth/authjs/SKILL.md +569 -0
- package/template/.agent/skill-library/stack/auth/clerk/SKILL.md +590 -0
- package/template/.agent/skill-library/stack/auth/firebase-auth/SKILL.md +734 -0
- package/template/.agent/skill-library/stack/cms/payload-cms/SKILL.md +573 -0
- package/template/.agent/skill-library/stack/cms/shopify/SKILL.md +1193 -0
- package/template/.agent/skill-library/stack/cms/wordpress/SKILL.md +1104 -0
- package/template/.agent/skill-library/stack/css/sass-scss/SKILL.md +1121 -0
- package/template/.agent/skill-library/stack/css/tailwind-css-patterns/SKILL.md +863 -0
- package/template/.agent/skill-library/stack/css/tailwind-design-system/SKILL.md +490 -0
- package/template/.agent/skill-library/stack/css/vanilla-css/SKILL.md +1078 -0
- package/template/.agent/skill-library/stack/databases/clickhouse/SKILL.md +311 -0
- package/template/.agent/skill-library/stack/databases/influxdb/SKILL.md +280 -0
- package/template/.agent/skill-library/stack/databases/lancedb/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/databases/mongodb/SKILL.md +1169 -0
- package/template/.agent/skill-library/stack/databases/neo4j/SKILL.md +839 -0
- package/template/.agent/skill-library/stack/databases/pgvector/SKILL.md +241 -0
- package/template/.agent/skill-library/stack/databases/pinecone/SKILL.md +212 -0
- package/template/.agent/skill-library/stack/databases/postgresql/SKILL.md +658 -0
- package/template/.agent/skill-library/stack/databases/qdrant/SKILL.md +312 -0
- package/template/.agent/skill-library/stack/databases/redis/SKILL.md +1079 -0
- package/template/.agent/skill-library/stack/databases/spacetimedb/SKILL.md +532 -0
- package/template/.agent/skill-library/stack/databases/sqlite/SKILL.md +1132 -0
- package/template/.agent/skill-library/stack/databases/supabase/SKILL.md +640 -0
- package/template/.agent/skill-library/stack/databases/surrealdb-expert/SKILL.md +945 -0
- package/template/.agent/skill-library/stack/databases/timescaledb/SKILL.md +745 -0
- package/template/.agent/skill-library/stack/databases/weaviate/SKILL.md +218 -0
- package/template/.agent/skill-library/stack/devops/github-actions/SKILL.md +554 -0
- package/template/.agent/skill-library/stack/devops/kubernetes/SKILL.md +950 -0
- package/template/.agent/skill-library/stack/devops/nginx/SKILL.md +841 -0
- package/template/.agent/skill-library/stack/devops/terraform/SKILL.md +860 -0
- package/template/.agent/skill-library/stack/email/resend/SKILL.md +391 -0
- package/template/.agent/skill-library/stack/engines/godot/SKILL.md +488 -0
- package/template/.agent/skill-library/stack/extensions/chrome-extension/SKILL.md +375 -0
- package/template/.agent/skill-library/stack/extensions/vscode-extension/SKILL.md +453 -0
- package/template/.agent/skill-library/stack/frameworks/astro-framework/SKILL.md +162 -0
- package/template/.agent/skill-library/stack/frameworks/electron/SKILL.md +1286 -0
- package/template/.agent/skill-library/stack/frameworks/fastapi/SKILL.md +650 -0
- package/template/.agent/skill-library/stack/frameworks/hono/SKILL.md +90 -0
- package/template/.agent/skill-library/stack/frameworks/nestjs/SKILL.md +878 -0
- package/template/.agent/skill-library/stack/frameworks/nextjs/SKILL.md +635 -0
- package/template/.agent/skill-library/stack/frameworks/nuxt/SKILL.md +564 -0
- package/template/.agent/skill-library/stack/frameworks/sveltekit/SKILL.md +614 -0
- package/template/.agent/skill-library/stack/frameworks/tauri/SKILL.md +920 -0
- package/template/.agent/skill-library/stack/gamedev/godot/SKILL.md +1032 -0
- package/template/.agent/skill-library/stack/gamedev/unity/SKILL.md +1175 -0
- package/template/.agent/skill-library/stack/hosting/aws/SKILL.md +467 -0
- package/template/.agent/skill-library/stack/hosting/cloudflare/SKILL.md +201 -0
- package/template/.agent/skill-library/stack/hosting/docker-expert/SKILL.md +409 -0
- package/template/.agent/skill-library/stack/hosting/vercel/SKILL.md +484 -0
- package/template/.agent/skill-library/stack/languages/bash-scripting/SKILL.md +773 -0
- package/template/.agent/skill-library/stack/languages/c-cpp/SKILL.md +712 -0
- package/template/.agent/skill-library/stack/languages/gdscript/SKILL.md +789 -0
- package/template/.agent/skill-library/stack/languages/go/SKILL.md +664 -0
- package/template/.agent/skill-library/stack/languages/java/SKILL.md +778 -0
- package/template/.agent/skill-library/stack/languages/kotlin/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/languages/python/SKILL.md +678 -0
- package/template/.agent/skill-library/stack/languages/rust/SKILL.md +673 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/SKILL.md +141 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/advanced-generics.md +90 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/branded-types.md +57 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/builder-pattern.md +71 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/common-pitfalls.md +135 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/conditional-types.md +27 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/decorators.md +98 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/discriminated-unions.md +62 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/mapped-types.md +53 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/performance-best-practices.md +104 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/template-literal-types.md +49 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/testing-types.md +112 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-guards.md +70 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/type-inference.md +101 -0
- package/template/.agent/skill-library/stack/languages/typescript-advanced-patterns/references/utility-types.md +98 -0
- package/template/.agent/skill-library/stack/languages/vanilla-javascript/SKILL.md +803 -0
- package/template/.agent/skill-library/stack/messaging/kafka/SKILL.md +235 -0
- package/template/.agent/skill-library/stack/mobile/expo-react-native/SKILL.md +665 -0
- package/template/.agent/skill-library/stack/mobile/flutter/SKILL.md +316 -0
- package/template/.agent/skill-library/stack/mobile/react-native/SKILL.md +337 -0
- package/template/.agent/skill-library/stack/monitoring/posthog/SKILL.md +396 -0
- package/template/.agent/skill-library/stack/monitoring/sentry/SKILL.md +509 -0
- package/template/.agent/skill-library/stack/observability/datadog/SKILL.md +179 -0
- package/template/.agent/skill-library/stack/observability/distributed-tracing/SKILL.md +140 -0
- package/template/.agent/skill-library/stack/observability/logging-best-practices/SKILL.md +168 -0
- package/template/.agent/skill-library/stack/observability/opentelemetry/SKILL.md +164 -0
- package/template/.agent/skill-library/stack/observability/prometheus-grafana/SKILL.md +246 -0
- package/template/.agent/skill-library/stack/observability/python-observability/SKILL.md +158 -0
- package/template/.agent/skill-library/stack/orm/drizzle-orm/SKILL.md +613 -0
- package/template/.agent/skill-library/stack/orm/prisma/SKILL.md +744 -0
- package/template/.agent/skill-library/stack/payments/lemonsqueezy/SKILL.md +393 -0
- package/template/.agent/skill-library/stack/payments/stripe-integration/SKILL.md +457 -0
- package/template/.agent/skill-library/stack/queue/bullmq/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/queue/inngest/SKILL.md +438 -0
- package/template/.agent/skill-library/stack/realtime/socketio/SKILL.md +595 -0
- package/template/.agent/skill-library/stack/search/elasticsearch/SKILL.md +248 -0
- package/template/.agent/skill-library/stack/search/meilisearch/SKILL.md +385 -0
- package/template/.agent/skill-library/stack/security/crypto-patterns/SKILL.md +437 -0
- package/template/.agent/skill-library/stack/security/csp-cors-headers/SKILL.md +588 -0
- package/template/.agent/skill-library/stack/security/dependency-auditing/SKILL.md +560 -0
- package/template/.agent/skill-library/stack/security/input-sanitization/SKILL.md +430 -0
- package/template/.agent/skill-library/stack/security/owasp-web-security/SKILL.md +421 -0
- package/template/.agent/skill-library/stack/state/tanstack-query/SKILL.md +637 -0
- package/template/.agent/skill-library/stack/state/zustand/SKILL.md +483 -0
- package/template/.agent/skill-library/stack/storage/aws-s3/SKILL.md +415 -0
- package/template/.agent/skill-library/stack/testing/playwright/SKILL.md +641 -0
- package/template/.agent/skill-library/stack/testing/storybook/SKILL.md +923 -0
- package/template/.agent/skill-library/stack/testing/testing-library/SKILL.md +872 -0
- package/template/.agent/skill-library/stack/testing/vitest/SKILL.md +714 -0
- package/template/.agent/skill-library/stack/ui/react-best-practices/SKILL.md +877 -0
- package/template/.agent/skill-library/stack/ui/react-composition-patterns/SKILL.md +1107 -0
- package/template/.agent/skill-library/stack/ui/react-flow/SKILL.md +425 -0
- package/template/.agent/skill-library/stack/ui/shadcn-ui/SKILL.md +703 -0
- package/template/.agent/skill-library/surface/api/api-caching/SKILL.md +458 -0
- package/template/.agent/skill-library/surface/api/api-documentation-openapi/SKILL.md +697 -0
- package/template/.agent/skill-library/surface/api/api-error-handling/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/api-security-checklist/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/api-versioning/SKILL.md +420 -0
- package/template/.agent/skill-library/surface/api/email-best-practices/SKILL.md +59 -0
- package/template/.agent/skill-library/surface/api/rate-limiting-abuse-protection/SKILL.md +147 -0
- package/template/.agent/skill-library/surface/api/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skill-library/surface/api/webhook-design/SKILL.md +752 -0
- package/template/.agent/skill-library/surface/cli/cli-configuration-management/SKILL.md +445 -0
- package/template/.agent/skill-library/surface/cli/cli-error-diagnostics/SKILL.md +515 -0
- package/template/.agent/skill-library/surface/cli/cli-shell-integration/SKILL.md +479 -0
- package/template/.agent/skill-library/surface/cli/cli-ux-design/SKILL.md +477 -0
- package/template/.agent/skill-library/surface/desktop/desktop-app-distribution/SKILL.md +416 -0
- package/template/.agent/skill-library/surface/desktop/desktop-security-sandboxing/SKILL.md +407 -0
- package/template/.agent/skill-library/surface/desktop/desktop-ux-conventions/SKILL.md +361 -0
- package/template/.agent/skill-library/surface/desktop/native-os-integration/SKILL.md +563 -0
- package/template/.agent/skill-library/surface/extension/browser-extension-patterns/SKILL.md +482 -0
- package/template/.agent/skill-library/surface/extension/plugin-architecture-design/SKILL.md +632 -0
- package/template/.agent/skill-library/surface/extension/vscode-extension-development/SKILL.md +728 -0
- package/template/.agent/skill-library/surface/mobile/app-store-submission/SKILL.md +304 -0
- package/template/.agent/skill-library/surface/mobile/mobile-offline-sync/SKILL.md +443 -0
- package/template/.agent/skill-library/surface/mobile/mobile-responsive-patterns/SKILL.md +432 -0
- package/template/.agent/skill-library/surface/mobile/push-notifications/SKILL.md +495 -0
- package/template/.agent/skill-library/surface/web/accessibility-compliance/SKILL.md +827 -0
- package/template/.agent/skill-library/surface/web/ai-seo/SKILL.md +398 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/content-patterns.md +285 -0
- package/template/.agent/skill-library/surface/web/ai-seo/references/platform-ranking-factors.md +152 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/SKILL.md +309 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/event-library.md +260 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/ga4-implementation.md +300 -0
- package/template/.agent/skill-library/surface/web/analytics-tracking/references/gtm-implementation.md +390 -0
- package/template/.agent/skill-library/surface/web/authentication-ui-flows/SKILL.md +530 -0
- package/template/.agent/skill-library/surface/web/dark-mode-theming/SKILL.md +516 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/SKILL.md +105 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/charts.csv +26 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/colors.csv +97 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/landing.csv +31 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/styles.csv +59 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/typography.csv +58 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/data/ux-guidelines.csv +100 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/core.py +258 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/design_system.py +1067 -0
- package/template/.agent/skill-library/surface/web/design-reference-data/scripts/search.py +106 -0
- package/template/.agent/skill-library/surface/web/form-handling-validation/SKILL.md +675 -0
- package/template/.agent/skill-library/surface/web/frontend-design/SKILL.md +1393 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/cppn-hero.tsx +299 -0
- package/template/.agent/skill-library/surface/web/frontend-design/templates/wave-hero.tsx +875 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/SKILL.md +111 -0
- package/template/.agent/skill-library/surface/web/frontend-verification/scripts/ux_audit.py +739 -0
- package/template/.agent/skill-library/surface/web/i18n-localization/SKILL.md +154 -0
- package/template/.agent/skill-library/surface/web/offline-first-pwa/SKILL.md +657 -0
- package/template/.agent/skill-library/surface/web/page-cro/SKILL.md +182 -0
- package/template/.agent/skill-library/surface/web/page-cro/references/experiments.md +248 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/SKILL.md +238 -0
- package/template/.agent/skill-library/surface/web/programmatic-seo/references/playbooks.md +308 -0
- package/template/.agent/skill-library/surface/web/schema-markup/SKILL.md +179 -0
- package/template/.agent/skill-library/surface/web/schema-markup/references/schema-examples.md +398 -0
- package/template/.agent/skill-library/surface/web/seo-audit/SKILL.md +394 -0
- package/template/.agent/skill-library/surface/web/seo-audit/references/ai-writing-detection.md +200 -0
- package/template/.agent/skill-library/surface/web/web-performance-optimization/SKILL.md +646 -0
- package/template/.agent/skill-library/surface/web/web-scraping/SKILL.md +58 -0
- package/template/.agent/skills/accessibility/SKILL.md +522 -0
- package/template/.agent/skills/accessibility/references/WCAG.md +162 -0
- package/template/.agent/skills/adversarial-review/SKILL.md +90 -0
- package/template/.agent/skills/antigravity-workflows/SKILL.md +81 -0
- package/template/.agent/skills/antigravity-workflows/resources/implementation-playbook.md +36 -0
- package/template/.agent/skills/api-design-principles/SKILL.md +37 -0
- package/template/.agent/skills/api-design-principles/assets/api-design-checklist.md +155 -0
- package/template/.agent/skills/api-design-principles/assets/rest-api-template.py +182 -0
- package/template/.agent/skills/api-design-principles/references/graphql-schema-design.md +583 -0
- package/template/.agent/skills/api-design-principles/references/rest-best-practices.md +408 -0
- package/template/.agent/skills/api-design-principles/resources/implementation-playbook.md +513 -0
- package/template/.agent/skills/api-versioning/SKILL.md +420 -0
- package/template/.agent/skills/architecture-mapping/SKILL.md +219 -0
- package/template/.agent/skills/bootstrap-agents/SKILL.md +259 -0
- package/template/.agent/skills/brainstorming/SKILL.md +236 -0
- package/template/.agent/skills/brand-guidelines/SKILL.md +44 -0
- package/template/.agent/skills/clean-code/SKILL.md +94 -0
- package/template/.agent/skills/code-review-pro/SKILL.md +152 -0
- package/template/.agent/skills/concise-planning/SKILL.md +68 -0
- package/template/.agent/skills/cross-layer-consistency/SKILL.md +117 -0
- package/template/.agent/skills/database-schema-design/SKILL.md +429 -0
- package/template/.agent/skills/deployment-procedures/SKILL.md +241 -0
- package/template/.agent/skills/design-anti-cliche/SKILL.md +159 -0
- package/template/.agent/skills/design-direction/SKILL.md +45 -0
- package/template/.agent/skills/error-handling-patterns/SKILL.md +721 -0
- package/template/.agent/skills/find-skills/SKILL.md +145 -0
- package/template/.agent/skills/git-advanced/SKILL.md +972 -0
- package/template/.agent/skills/git-workflow/SKILL.md +420 -0
- package/template/.agent/skills/idea-extraction/SKILL.md +271 -0
- package/template/.agent/skills/logging-best-practices/SKILL.md +851 -0
- package/template/.agent/skills/migration-management/SKILL.md +384 -0
- package/template/.agent/skills/minimalist-surgical-development/SKILL.md +69 -0
- package/template/.agent/skills/parallel-agents/SKILL.md +165 -0
- package/template/.agent/skills/parallel-debugging/SKILL.md +135 -0
- package/template/.agent/skills/parallel-feature-development/SKILL.md +166 -0
- package/template/.agent/skills/performance-budgeting/SKILL.md +144 -0
- package/template/.agent/skills/pipeline-rubrics/SKILL.md +51 -0
- package/template/.agent/skills/pipeline-rubrics/references/architecture-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/be-rubric.md +21 -0
- package/template/.agent/skills/pipeline-rubrics/references/fe-rubric.md +20 -0
- package/template/.agent/skills/pipeline-rubrics/references/ia-rubric.md +19 -0
- package/template/.agent/skills/pipeline-rubrics/references/scoring.md +28 -0
- package/template/.agent/skills/pipeline-rubrics/references/vision-rubric.md +11 -0
- package/template/.agent/skills/prd-templates/SKILL.md +88 -0
- package/template/.agent/skills/prd-templates/references/architecture-design-template.md +88 -0
- package/template/.agent/skills/prd-templates/references/be-spec-template.md +101 -0
- package/template/.agent/skills/prd-templates/references/data-placement-template.md +74 -0
- package/template/.agent/skills/prd-templates/references/decomposition-templates.md +211 -0
- package/template/.agent/skills/prd-templates/references/design-system-decisions.md +198 -0
- package/template/.agent/skills/prd-templates/references/engineering-standards-template.md +124 -0
- package/template/.agent/skills/prd-templates/references/fe-classification-procedures.md +47 -0
- package/template/.agent/skills/prd-templates/references/fe-spec-template.md +84 -0
- package/template/.agent/skills/prd-templates/references/infrastructure-report-template.md +71 -0
- package/template/.agent/skills/prd-templates/references/operational-templates.md +116 -0
- package/template/.agent/skills/prd-templates/references/placeholder-guard-template.md +21 -0
- package/template/.agent/skills/prd-templates/references/surface-model.md +61 -0
- package/template/.agent/skills/prd-templates/references/vision-template.md +66 -0
- package/template/.agent/skills/prompt-engineer/README.md +659 -0
- package/template/.agent/skills/prompt-engineer/SKILL.md +249 -0
- package/template/.agent/skills/regex-patterns/SKILL.md +751 -0
- package/template/.agent/skills/resolve-ambiguity/SKILL.md +278 -0
- package/template/.agent/skills/rest-api-design/SKILL.md +478 -0
- package/template/.agent/skills/security-scanning-security-hardening/SKILL.md +231 -0
- package/template/.agent/skills/session-continuity/SKILL.md +730 -0
- package/template/.agent/skills/session-continuity/protocols/01-session-resumption.md +38 -0
- package/template/.agent/skills/session-continuity/protocols/02-progress-generation.md +85 -0
- package/template/.agent/skills/session-continuity/protocols/03-progress-update.md +70 -0
- package/template/.agent/skills/session-continuity/protocols/04-pattern-extraction.md +60 -0
- package/template/.agent/skills/session-continuity/protocols/05-session-close.md +37 -0
- package/template/.agent/skills/session-continuity/protocols/06-decision-analysis.md +84 -0
- package/template/.agent/skills/session-continuity/protocols/07-spec-pipeline-generation.md +48 -0
- package/template/.agent/skills/session-continuity/protocols/08-spec-pipeline-update.md +43 -0
- package/template/.agent/skills/session-continuity/protocols/09-parallel-claim.md +122 -0
- package/template/.agent/skills/session-continuity/protocols/10-placeholder-verification-gate.md +104 -0
- package/template/.agent/skills/session-continuity/protocols/ambiguity-gates.md +48 -0
- package/template/.agent/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agent/skills/skill-creator/README.md +270 -0
- package/template/.agent/skills/skill-creator/SKILL.md +590 -0
- package/template/.agent/skills/skill-creator/references/output-patterns.md +82 -0
- package/template/.agent/skills/skill-creator/references/workflows.md +28 -0
- package/template/.agent/skills/skill-creator/scripts/init_skill.py +303 -0
- package/template/.agent/skills/skill-creator/scripts/package_skill.py +110 -0
- package/template/.agent/skills/skill-creator/scripts/quick_validate.py +95 -0
- package/template/.agent/skills/spec-writing/SKILL.md +110 -0
- package/template/.agent/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/template/.agent/skills/systematic-debugging/SKILL.md +297 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/template/.agent/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/template/.agent/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/template/.agent/skills/systematic-debugging/find-polluter.sh +63 -0
- package/template/.agent/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/template/.agent/skills/systematic-debugging/test-academic.md +14 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/template/.agent/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/template/.agent/skills/tdd-workflow/SKILL.md +409 -0
- package/template/.agent/skills/tech-stack-catalog/SKILL.md +49 -0
- package/template/.agent/skills/tech-stack-catalog/references/constraint-questions.md +21 -0
- package/template/.agent/skills/tech-stack-catalog/references/dev-tooling-decisions.md +37 -0
- package/template/.agent/skills/tech-stack-catalog/references/surface-decision-tables.md +69 -0
- package/template/.agent/skills/technical-writer/SKILL.md +242 -0
- package/template/.agent/skills/testing-strategist/SKILL.md +932 -0
- package/template/.agent/skills/verification-before-completion/SKILL.md +145 -0
- package/template/.agent/skills/workflow-automation/SKILL.md +73 -0
- package/template/.agent/workflows/audit-ambiguity-execute.md +165 -0
- package/template/.agent/workflows/audit-ambiguity-rubrics.md +83 -0
- package/template/.agent/workflows/audit-ambiguity.md +64 -0
- package/template/.agent/workflows/bootstrap-agents-fill.md +201 -0
- package/template/.agent/workflows/bootstrap-agents-provision.md +197 -0
- package/template/.agent/workflows/bootstrap-agents.md +66 -0
- package/template/.agent/workflows/create-prd-architecture.md +119 -0
- package/template/.agent/workflows/create-prd-compile.md +138 -0
- package/template/.agent/workflows/create-prd-design-system.md +135 -0
- package/template/.agent/workflows/create-prd-security.md +113 -0
- package/template/.agent/workflows/create-prd-stack.md +91 -0
- package/template/.agent/workflows/create-prd.md +168 -0
- package/template/.agent/workflows/decompose-architecture-structure.md +82 -0
- package/template/.agent/workflows/decompose-architecture-validate.md +119 -0
- package/template/.agent/workflows/decompose-architecture.md +111 -0
- package/template/.agent/workflows/evolve-contract.md +98 -0
- package/template/.agent/workflows/evolve-feature-cascade.md +140 -0
- package/template/.agent/workflows/evolve-feature-classify.md +116 -0
- package/template/.agent/workflows/evolve-feature.md +56 -0
- package/template/.agent/workflows/ideate-discover.md +144 -0
- package/template/.agent/workflows/ideate-extract.md +129 -0
- package/template/.agent/workflows/ideate-validate.md +117 -0
- package/template/.agent/workflows/ideate.md +113 -0
- package/template/.agent/workflows/implement-slice-setup.md +113 -0
- package/template/.agent/workflows/implement-slice-tdd.md +198 -0
- package/template/.agent/workflows/implement-slice.md +50 -0
- package/template/.agent/workflows/plan-phase.md +202 -0
- package/template/.agent/workflows/propagate-decision-apply.md +135 -0
- package/template/.agent/workflows/propagate-decision-scan.md +147 -0
- package/template/.agent/workflows/propagate-decision.md +56 -0
- package/template/.agent/workflows/remediate-pipeline-assess.md +138 -0
- package/template/.agent/workflows/remediate-pipeline-execute.md +135 -0
- package/template/.agent/workflows/remediate-pipeline.md +55 -0
- package/template/.agent/workflows/resolve-ambiguity.md +82 -0
- package/template/.agent/workflows/sync-kit.md +209 -0
- package/template/.agent/workflows/update-architecture-map.md +74 -0
- package/template/.agent/workflows/validate-phase.md +219 -0
- package/template/.agent/workflows/verify-infrastructure.md +207 -0
- package/template/.agent/workflows/write-architecture-spec-deepen.md +139 -0
- package/template/.agent/workflows/write-architecture-spec-design.md +202 -0
- package/template/.agent/workflows/write-architecture-spec.md +63 -0
- package/template/.agent/workflows/write-be-spec-classify.md +165 -0
- package/template/.agent/workflows/write-be-spec-write.md +98 -0
- package/template/.agent/workflows/write-be-spec.md +76 -0
- package/template/.agent/workflows/write-fe-spec-classify.md +170 -0
- package/template/.agent/workflows/write-fe-spec-write.md +94 -0
- package/template/.agent/workflows/write-fe-spec.md +71 -0
- package/template/AGENTS.md +176 -0
- package/template/GEMINI.md +177 -0
- package/template/docs/README.md +187 -0
- package/template/docs/audits/.gitkeep +0 -0
- package/template/docs/audits/README.md +10 -0
- package/template/docs/plans/.gitkeep +0 -0
- package/template/docs/plans/README.md +21 -0
- package/template/docs/plans/be/.gitkeep +0 -0
- package/template/docs/plans/be/README.md +11 -0
- package/template/docs/plans/fe/.gitkeep +0 -0
- package/template/docs/plans/fe/README.md +11 -0
- package/template/docs/plans/ia/.gitkeep +0 -0
- package/template/docs/plans/ia/README.md +17 -0
- package/template/docs/plans/ia/deep-dives/.gitkeep +0 -0
- package/template/docs/plans/ia/deep-dives/README.md +5 -0
- package/template/docs/plans/phases/.gitkeep +0 -0
- package/template/docs/plans/phases/README.md +11 -0
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dark-mode-theming
|
|
3
|
+
description: "Implement dark mode and theming systems with CSS custom properties, system preference detection, FOUC prevention, Tailwind dark variants, and accessible contrast maintenance across themes. Use when adding dark mode, theme switching, or design token systems."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Dark Mode & Theming
|
|
8
|
+
|
|
9
|
+
Build a robust theming system that respects user preferences, avoids flash-of-unstyled-content, and maintains accessibility across all themes.
|
|
10
|
+
|
|
11
|
+
## CSS Custom Properties as Theme Tokens
|
|
12
|
+
|
|
13
|
+
Define your entire color system as CSS custom properties. Every color in your app should reference a token, never a hardcoded hex value.
|
|
14
|
+
|
|
15
|
+
```css
|
|
16
|
+
/* src/styles/tokens.css */
|
|
17
|
+
|
|
18
|
+
/* Light theme (default) */
|
|
19
|
+
:root {
|
|
20
|
+
/* Surfaces */
|
|
21
|
+
--color-bg-primary: #ffffff;
|
|
22
|
+
--color-bg-secondary: #f5f5f5;
|
|
23
|
+
--color-bg-tertiary: #e8e8e8;
|
|
24
|
+
--color-bg-elevated: #ffffff;
|
|
25
|
+
|
|
26
|
+
/* Text */
|
|
27
|
+
--color-text-primary: #111111;
|
|
28
|
+
--color-text-secondary: #555555;
|
|
29
|
+
--color-text-muted: #888888;
|
|
30
|
+
--color-text-inverse: #ffffff;
|
|
31
|
+
|
|
32
|
+
/* Interactive */
|
|
33
|
+
--color-accent: #0066cc;
|
|
34
|
+
--color-accent-hover: #0052a3;
|
|
35
|
+
--color-accent-text: #ffffff;
|
|
36
|
+
|
|
37
|
+
/* Borders */
|
|
38
|
+
--color-border: #d4d4d4;
|
|
39
|
+
--color-border-strong: #999999;
|
|
40
|
+
|
|
41
|
+
/* Status */
|
|
42
|
+
--color-success: #157a3e;
|
|
43
|
+
--color-warning: #9a6700;
|
|
44
|
+
--color-error: #cc1a1a;
|
|
45
|
+
--color-info: #0066cc;
|
|
46
|
+
|
|
47
|
+
/* Shadows */
|
|
48
|
+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
49
|
+
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07);
|
|
50
|
+
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Dark theme */
|
|
54
|
+
[data-theme="dark"] {
|
|
55
|
+
--color-bg-primary: #0d0d0d;
|
|
56
|
+
--color-bg-secondary: #1a1a1a;
|
|
57
|
+
--color-bg-tertiary: #262626;
|
|
58
|
+
--color-bg-elevated: #1f1f1f;
|
|
59
|
+
|
|
60
|
+
--color-text-primary: #eeeeee;
|
|
61
|
+
--color-text-secondary: #aaaaaa;
|
|
62
|
+
--color-text-muted: #777777;
|
|
63
|
+
--color-text-inverse: #111111;
|
|
64
|
+
|
|
65
|
+
--color-accent: #4da6ff;
|
|
66
|
+
--color-accent-hover: #80bfff;
|
|
67
|
+
--color-accent-text: #000000;
|
|
68
|
+
|
|
69
|
+
--color-border: #333333;
|
|
70
|
+
--color-border-strong: #555555;
|
|
71
|
+
|
|
72
|
+
--color-success: #3fb950;
|
|
73
|
+
--color-warning: #d29922;
|
|
74
|
+
--color-error: #f85149;
|
|
75
|
+
--color-info: #58a6ff;
|
|
76
|
+
|
|
77
|
+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
|
|
78
|
+
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.4);
|
|
79
|
+
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.5);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Usage in components:**
|
|
84
|
+
```css
|
|
85
|
+
.card {
|
|
86
|
+
background: var(--color-bg-elevated);
|
|
87
|
+
color: var(--color-text-primary);
|
|
88
|
+
border: 1px solid var(--color-border);
|
|
89
|
+
box-shadow: var(--shadow-md);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.card-title {
|
|
93
|
+
color: var(--color-text-primary);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.card-description {
|
|
97
|
+
color: var(--color-text-secondary);
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## System vs User Preference Detection
|
|
104
|
+
|
|
105
|
+
### Detecting System Preference
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
function getSystemTheme(): 'light' | 'dark' {
|
|
109
|
+
if (typeof window === 'undefined') return 'light';
|
|
110
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Three-Way Preference: System, Light, Dark
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
type ThemePreference = 'system' | 'light' | 'dark';
|
|
118
|
+
type ResolvedTheme = 'light' | 'dark';
|
|
119
|
+
|
|
120
|
+
function resolveTheme(preference: ThemePreference): ResolvedTheme {
|
|
121
|
+
if (preference === 'system') return getSystemTheme();
|
|
122
|
+
return preference;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function saveThemePreference(preference: ThemePreference): void {
|
|
126
|
+
localStorage.setItem('theme-preference', preference);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function loadThemePreference(): ThemePreference {
|
|
130
|
+
const saved = localStorage.getItem('theme-preference');
|
|
131
|
+
if (saved === 'light' || saved === 'dark' || saved === 'system') return saved;
|
|
132
|
+
return 'system';
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Listening for System Changes
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
function watchSystemTheme(callback: (theme: ResolvedTheme) => void): () => void {
|
|
140
|
+
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
|
|
141
|
+
|
|
142
|
+
function handler(event: MediaQueryListEvent) {
|
|
143
|
+
const preference = loadThemePreference();
|
|
144
|
+
if (preference === 'system') {
|
|
145
|
+
callback(event.matches ? 'dark' : 'light');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
mediaQuery.addEventListener('change', handler);
|
|
150
|
+
return () => mediaQuery.removeEventListener('change', handler);
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## Avoiding FOUC (Flash of Unstyled Content)
|
|
157
|
+
|
|
158
|
+
The theme must be applied **before** the page renders. This requires a blocking inline script in `<head>`.
|
|
159
|
+
|
|
160
|
+
### Blocking Script Technique
|
|
161
|
+
|
|
162
|
+
```html
|
|
163
|
+
<!-- Place this in <head> BEFORE any stylesheets -->
|
|
164
|
+
<script>
|
|
165
|
+
(function() {
|
|
166
|
+
var preference = 'system';
|
|
167
|
+
try { preference = localStorage.getItem('theme-preference') || 'system'; } catch(e) {}
|
|
168
|
+
|
|
169
|
+
var theme;
|
|
170
|
+
if (preference === 'system') {
|
|
171
|
+
theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
172
|
+
} else {
|
|
173
|
+
theme = preference;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
document.documentElement.setAttribute('data-theme', theme);
|
|
177
|
+
})();
|
|
178
|
+
</script>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Why this works:** The script runs synchronously before the browser paints, so the `data-theme` attribute is set before CSS is applied.
|
|
182
|
+
|
|
183
|
+
### Astro Implementation
|
|
184
|
+
|
|
185
|
+
```astro
|
|
186
|
+
---
|
|
187
|
+
// src/layouts/BaseLayout.astro
|
|
188
|
+
---
|
|
189
|
+
<html lang="en">
|
|
190
|
+
<head>
|
|
191
|
+
<script is:inline>
|
|
192
|
+
(function() {
|
|
193
|
+
var p = 'system';
|
|
194
|
+
try { p = localStorage.getItem('theme-preference') || 'system'; } catch(e) {}
|
|
195
|
+
var t = p === 'system'
|
|
196
|
+
? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')
|
|
197
|
+
: p;
|
|
198
|
+
document.documentElement.setAttribute('data-theme', t);
|
|
199
|
+
})();
|
|
200
|
+
</script>
|
|
201
|
+
<!-- Stylesheets load AFTER theme attribute is set -->
|
|
202
|
+
<link rel="stylesheet" href="/styles/tokens.css" />
|
|
203
|
+
</head>
|
|
204
|
+
<body>
|
|
205
|
+
<slot />
|
|
206
|
+
</body>
|
|
207
|
+
</html>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Image and SVG Adaptation
|
|
213
|
+
|
|
214
|
+
### CSS Filter Approach (Quick)
|
|
215
|
+
|
|
216
|
+
```css
|
|
217
|
+
/* Invert images in dark mode (useful for diagrams, charts) */
|
|
218
|
+
[data-theme="dark"] img.invertible {
|
|
219
|
+
filter: invert(1) hue-rotate(180deg);
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Source Switching (Preferred for Quality)
|
|
224
|
+
|
|
225
|
+
```html
|
|
226
|
+
<picture>
|
|
227
|
+
<source srcset="/images/hero-dark.webp" media="(prefers-color-scheme: dark)" />
|
|
228
|
+
<img src="/images/hero-light.webp" alt="Hero illustration" />
|
|
229
|
+
</picture>
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### SVG with currentColor
|
|
233
|
+
|
|
234
|
+
```html
|
|
235
|
+
<!-- SVGs using currentColor automatically adapt to theme -->
|
|
236
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
237
|
+
<path d="M12 2L2 7l10 5 10-5-10-5z" />
|
|
238
|
+
</svg>
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
```css
|
|
242
|
+
.icon { color: var(--color-text-primary); }
|
|
243
|
+
.icon-muted { color: var(--color-text-muted); }
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Background Images
|
|
247
|
+
|
|
248
|
+
```css
|
|
249
|
+
.hero {
|
|
250
|
+
background-image: var(--hero-image);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
:root {
|
|
254
|
+
--hero-image: url('/images/hero-light.jpg');
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
[data-theme="dark"] {
|
|
258
|
+
--hero-image: url('/images/hero-dark.jpg');
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Third-Party Widget Theming
|
|
265
|
+
|
|
266
|
+
Many third-party widgets (embedded forms, maps, code blocks) do not follow your theme. Handle them explicitly.
|
|
267
|
+
|
|
268
|
+
```css
|
|
269
|
+
/* Syntax highlighting with theme tokens */
|
|
270
|
+
[data-theme="dark"] .shiki {
|
|
271
|
+
background-color: var(--color-bg-secondary) !important;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/* Embedded iframes: some support color-scheme parameter */
|
|
275
|
+
[data-theme="dark"] iframe.themeable {
|
|
276
|
+
filter: invert(1) hue-rotate(180deg);
|
|
277
|
+
/* Last resort --- use sparingly */
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**For widgets that support a theme parameter:**
|
|
282
|
+
```typescript
|
|
283
|
+
// Re-initialize widget when theme changes
|
|
284
|
+
function onThemeChange(theme: ResolvedTheme): void {
|
|
285
|
+
// Recaptcha
|
|
286
|
+
grecaptcha.render('captcha', { theme });
|
|
287
|
+
|
|
288
|
+
// Stripe Elements
|
|
289
|
+
elements.update({ appearance: { theme: theme === 'dark' ? 'night' : 'stripe' } });
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Contrast Maintenance Across Themes
|
|
296
|
+
|
|
297
|
+
Every color pairing must meet WCAG AA contrast ratios in both themes.
|
|
298
|
+
|
|
299
|
+
| Pairing | Minimum Ratio | Verification |
|
|
300
|
+
|---------|--------------|--------------|
|
|
301
|
+
| `--color-text-primary` on `--color-bg-primary` | 7:1 (AAA) | Both themes |
|
|
302
|
+
| `--color-text-secondary` on `--color-bg-primary` | 4.5:1 (AA) | Both themes |
|
|
303
|
+
| `--color-text-muted` on `--color-bg-primary` | 4.5:1 (AA) | Both themes |
|
|
304
|
+
| `--color-accent` on `--color-bg-primary` | 4.5:1 (AA) | Both themes |
|
|
305
|
+
| `--color-accent-text` on `--color-accent` | 4.5:1 (AA) | Both themes |
|
|
306
|
+
| Status colors on background | 4.5:1 (AA) | Both themes |
|
|
307
|
+
|
|
308
|
+
**Testing contrast programmatically:**
|
|
309
|
+
```typescript
|
|
310
|
+
// Use a tool like `wcag-contrast` to verify at build time
|
|
311
|
+
import { getContrastRatio } from 'wcag-contrast';
|
|
312
|
+
|
|
313
|
+
const ratio = getContrastRatio('#eeeeee', '#0d0d0d');
|
|
314
|
+
console.assert(ratio >= 4.5, `Contrast ratio ${ratio} is below 4.5:1`);
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Theme Toggle Component
|
|
320
|
+
|
|
321
|
+
```tsx
|
|
322
|
+
function ThemeToggle() {
|
|
323
|
+
const [preference, setPreference] = useState<ThemePreference>(() => loadThemePreference());
|
|
324
|
+
const resolvedTheme = resolveTheme(preference);
|
|
325
|
+
|
|
326
|
+
function cycleTheme() {
|
|
327
|
+
const next: ThemePreference =
|
|
328
|
+
preference === 'system' ? 'light'
|
|
329
|
+
: preference === 'light' ? 'dark'
|
|
330
|
+
: 'system';
|
|
331
|
+
|
|
332
|
+
setPreference(next);
|
|
333
|
+
saveThemePreference(next);
|
|
334
|
+
document.documentElement.setAttribute('data-theme', resolveTheme(next));
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const label =
|
|
338
|
+
preference === 'system' ? 'Theme: System'
|
|
339
|
+
: preference === 'light' ? 'Theme: Light'
|
|
340
|
+
: 'Theme: Dark';
|
|
341
|
+
|
|
342
|
+
return (
|
|
343
|
+
<button
|
|
344
|
+
onClick={cycleTheme}
|
|
345
|
+
aria-label={label}
|
|
346
|
+
title={label}
|
|
347
|
+
type="button"
|
|
348
|
+
>
|
|
349
|
+
{preference === 'system' && <MonitorIcon aria-hidden="true" />}
|
|
350
|
+
{preference === 'light' && <SunIcon aria-hidden="true" />}
|
|
351
|
+
{preference === 'dark' && <MoonIcon aria-hidden="true" />}
|
|
352
|
+
</button>
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Alternative: dropdown select for clarity:**
|
|
358
|
+
```tsx
|
|
359
|
+
function ThemeSelect() {
|
|
360
|
+
const [preference, setPreference] = useState<ThemePreference>(loadThemePreference());
|
|
361
|
+
|
|
362
|
+
function handleChange(value: ThemePreference) {
|
|
363
|
+
setPreference(value);
|
|
364
|
+
saveThemePreference(value);
|
|
365
|
+
document.documentElement.setAttribute('data-theme', resolveTheme(value));
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
return (
|
|
369
|
+
<label>
|
|
370
|
+
Theme
|
|
371
|
+
<select value={preference} onChange={(e) => handleChange(e.target.value as ThemePreference)}>
|
|
372
|
+
<option value="system">System</option>
|
|
373
|
+
<option value="light">Light</option>
|
|
374
|
+
<option value="dark">Dark</option>
|
|
375
|
+
</select>
|
|
376
|
+
</label>
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
---
|
|
382
|
+
|
|
383
|
+
## Tailwind CSS Dark Mode
|
|
384
|
+
|
|
385
|
+
### Class Strategy (Recommended for User Control)
|
|
386
|
+
|
|
387
|
+
```javascript
|
|
388
|
+
// tailwind.config.js
|
|
389
|
+
export default {
|
|
390
|
+
darkMode: 'selector', // Tailwind v4: uses [data-theme="dark"] or .dark
|
|
391
|
+
};
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
```html
|
|
395
|
+
<!-- Usage in templates -->
|
|
396
|
+
<div class="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100">
|
|
397
|
+
<p class="text-gray-600 dark:text-gray-400">Secondary text</p>
|
|
398
|
+
<button class="bg-blue-600 dark:bg-blue-400 text-white dark:text-black">
|
|
399
|
+
Action
|
|
400
|
+
</button>
|
|
401
|
+
</div>
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### Combining Tailwind with CSS Custom Properties
|
|
405
|
+
|
|
406
|
+
Use Tailwind for layout/spacing and custom properties for theme colors:
|
|
407
|
+
|
|
408
|
+
```css
|
|
409
|
+
/* In your Tailwind CSS */
|
|
410
|
+
@theme {
|
|
411
|
+
--color-surface: var(--color-bg-primary);
|
|
412
|
+
--color-on-surface: var(--color-text-primary);
|
|
413
|
+
}
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
```html
|
|
417
|
+
<div class="bg-surface text-on-surface p-4 rounded-lg">
|
|
418
|
+
Theme-aware via tokens, layout via Tailwind
|
|
419
|
+
</div>
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
## Smooth Theme Transitions
|
|
425
|
+
|
|
426
|
+
```css
|
|
427
|
+
/* Apply transition only to theme-related properties */
|
|
428
|
+
* {
|
|
429
|
+
transition: background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease,
|
|
430
|
+
box-shadow 0.2s ease;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/* Disable transitions during theme load to prevent FOUC */
|
|
434
|
+
html.no-transitions * {
|
|
435
|
+
transition: none !important;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/* Respect reduced motion */
|
|
439
|
+
@media (prefers-reduced-motion: reduce) {
|
|
440
|
+
* {
|
|
441
|
+
transition: none !important;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
**Apply no-transitions class during theme switch:**
|
|
447
|
+
```typescript
|
|
448
|
+
function setTheme(theme: ResolvedTheme): void {
|
|
449
|
+
document.documentElement.classList.add('no-transitions');
|
|
450
|
+
document.documentElement.setAttribute('data-theme', theme);
|
|
451
|
+
|
|
452
|
+
// Re-enable transitions after a single frame
|
|
453
|
+
requestAnimationFrame(() => {
|
|
454
|
+
requestAnimationFrame(() => {
|
|
455
|
+
document.documentElement.classList.remove('no-transitions');
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## Color Palette Design for Dual Themes
|
|
464
|
+
|
|
465
|
+
### Design Principles
|
|
466
|
+
|
|
467
|
+
1. **Do not just invert colors.** Dark mode needs its own palette with adjusted saturation and lightness.
|
|
468
|
+
2. **Reduce saturation in dark mode.** Fully saturated colors on dark backgrounds cause eye strain.
|
|
469
|
+
3. **Elevate with lighter surfaces, not shadows.** In dark mode, higher elevation = lighter surface (Material Design principle).
|
|
470
|
+
4. **Test with real content.** A palette that looks good on a demo page may fail with actual text and images.
|
|
471
|
+
|
|
472
|
+
### Common Mistakes
|
|
473
|
+
|
|
474
|
+
| Mistake | Fix |
|
|
475
|
+
|---------|-----|
|
|
476
|
+
| Pure black (#000) background | Use very dark gray (#0d0d0d or #121212) |
|
|
477
|
+
| White text on pure black (#fff on #000) | Use off-white (#eeeeee) for less harsh contrast |
|
|
478
|
+
| Same border color in both themes | Borders need to be lighter in dark mode |
|
|
479
|
+
| Colored backgrounds unchanged | Adjust saturation and lightness per theme |
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## Testing Themes
|
|
484
|
+
|
|
485
|
+
### Automated
|
|
486
|
+
|
|
487
|
+
```typescript
|
|
488
|
+
// Playwright test for both themes
|
|
489
|
+
import { test, expect } from '@playwright/test';
|
|
490
|
+
|
|
491
|
+
for (const theme of ['light', 'dark'] as const) {
|
|
492
|
+
test(`renders correctly in ${theme} mode`, async ({ page }) => {
|
|
493
|
+
await page.emulateMedia({ colorScheme: theme });
|
|
494
|
+
await page.goto('/');
|
|
495
|
+
await expect(page).toHaveScreenshot(`homepage-${theme}.png`);
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### Manual Checklist
|
|
501
|
+
|
|
502
|
+
- [ ] Toggle between light, dark, and system --- no FOUC
|
|
503
|
+
- [ ] All text meets contrast requirements in both themes
|
|
504
|
+
- [ ] Images and icons are visible and appropriate in both themes
|
|
505
|
+
- [ ] Form inputs, borders, and placeholders are visible in both themes
|
|
506
|
+
- [ ] Status colors (error, success, warning) are distinguishable in both themes
|
|
507
|
+
- [ ] Third-party widgets adapt or remain usable
|
|
508
|
+
- [ ] Preference persists across page reloads and sessions
|
|
509
|
+
- [ ] System preference change is reflected when set to "system"
|
|
510
|
+
|
|
511
|
+
## References
|
|
512
|
+
|
|
513
|
+
- [Material Design Dark Theme](https://m3.material.io/styles/color/dark-theme)
|
|
514
|
+
- [Tailwind CSS Dark Mode](https://tailwindcss.com/docs/dark-mode)
|
|
515
|
+
- [prefers-color-scheme on MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme)
|
|
516
|
+
- [A Complete Guide to Dark Mode on the Web](https://css-tricks.com/a-complete-guide-to-dark-mode-on-the-web/)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design-reference-data
|
|
3
|
+
description: "Searchable reference database of 58 design styles, color palettes, typography pairings, chart styles, and UX patterns. Use during /create-prd-design-system to provide data-backed design recommendations after the direction interview."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Design Reference Database
|
|
7
|
+
|
|
8
|
+
> **When to use:** During `/create-prd-design-system`, after the user has selected a design direction via the `design-direction` skill. Query this database to ground your design system recommendations in concrete, researched data rather than relying on training data defaults.
|
|
9
|
+
|
|
10
|
+
## What This Skill Contains
|
|
11
|
+
|
|
12
|
+
### Data Files (`data/`)
|
|
13
|
+
|
|
14
|
+
| File | Records | What It Contains |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| `styles.csv` | 58 | Design styles with colors, effects, accessibility, framework compat, complexity, best-for/don't-use-for |
|
|
17
|
+
| `colors.csv` | — | Color palettes organized by mood, industry, and design style |
|
|
18
|
+
| `typography.csv` | — | Font pairings by style category with usage guidance |
|
|
19
|
+
| `charts.csv` | — | Chart and data visualization style patterns |
|
|
20
|
+
| `ux-guidelines.csv` | — | UX patterns and interaction design reference |
|
|
21
|
+
| `landing.csv` | — | Landing page design patterns and conversion strategies |
|
|
22
|
+
|
|
23
|
+
### Search Scripts (`scripts/`)
|
|
24
|
+
|
|
25
|
+
| Script | Purpose |
|
|
26
|
+
|---|---|
|
|
27
|
+
| `search.py` | CLI entry point — accepts queries, routes to core |
|
|
28
|
+
| `core.py` | BM25 search engine — loads CSVs, scores matches |
|
|
29
|
+
| `design_system.py` | Generates complete design system recommendations from search results |
|
|
30
|
+
|
|
31
|
+
## Pipeline Integration
|
|
32
|
+
|
|
33
|
+
### When in the Pipeline
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
/create-prd-design-system
|
|
37
|
+
├── Step 1: design-direction interview (5 questions)
|
|
38
|
+
├── Step 2: User picks direction
|
|
39
|
+
├── ★ Step 3: Query this database ← YOU ARE HERE
|
|
40
|
+
├── Step 4: brand-guidelines locks with data-backed values
|
|
41
|
+
└── Step 5: design-system.md output
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### How to Use
|
|
45
|
+
|
|
46
|
+
After the user confirms their design direction, run these searches to get concrete reference data:
|
|
47
|
+
|
|
48
|
+
#### 1. Find matching design styles
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
python .agent/skills/design-reference-data/scripts/search.py \
|
|
52
|
+
"<direction + project context>" \
|
|
53
|
+
--domain style --max-results 5
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Example: `"modern dark mode SaaS dashboard"` or `"warm friendly wellness app"`
|
|
57
|
+
|
|
58
|
+
#### 2. Find specific color palettes
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
python .agent/skills/design-reference-data/scripts/search.py \
|
|
62
|
+
"<mood + industry>" \
|
|
63
|
+
--domain color --max-results 3
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Example: `"professional trust-building fintech"` or `"vibrant playful consumer"`
|
|
67
|
+
|
|
68
|
+
#### 3. Find typography pairings
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
python .agent/skills/design-reference-data/scripts/search.py \
|
|
72
|
+
"<style + readability needs>" \
|
|
73
|
+
--domain typography --max-results 3
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Example: `"clean serif editorial"` or `"modern sans-serif technical"`
|
|
77
|
+
|
|
78
|
+
#### 4. Generate full design system recommendation
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
python .agent/skills/design-reference-data/scripts/search.py \
|
|
82
|
+
"<project description>" \
|
|
83
|
+
--design-system -p "ProjectName"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
This returns a comprehensive recommendation covering style, colors, typography, and effects.
|
|
87
|
+
|
|
88
|
+
### Using the Results
|
|
89
|
+
|
|
90
|
+
Search results include:
|
|
91
|
+
- **Primary/Secondary Colors** — exact hex values
|
|
92
|
+
- **Effects & Animation** — specific CSS patterns and timing recommendations
|
|
93
|
+
- **Best For / Don't Use For** — context-appropriate usage guidance
|
|
94
|
+
- **Framework Compatibility** — scores for Tailwind, Bootstrap, MUI, etc.
|
|
95
|
+
- **Accessibility Rating** — WCAG compliance level
|
|
96
|
+
- **Performance Rating** — render cost assessment
|
|
97
|
+
- **Complexity** — Low/Medium/High implementation effort
|
|
98
|
+
|
|
99
|
+
Feed these results into the `brand-guidelines` skill to lock specific, researched values instead of AI-generated guesses.
|
|
100
|
+
|
|
101
|
+
## Important Notes
|
|
102
|
+
|
|
103
|
+
- **This is a reference, not a mandate.** The user's design direction (from `design-direction` skill) always takes priority. Use this data to provide concrete options within their chosen direction.
|
|
104
|
+
- **Cross-reference with `design-anti-cliche`** — if search results return a style that matches a Safe Harbor forbidden default (e.g., glassmorphism), note the conflict and present alternatives.
|
|
105
|
+
- **The database is curated, not exhaustive.** If the user's vision doesn't map to any style here, don't force-fit. Use the data as inspiration, not constraint.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
No,Data Type,Keywords,Best Chart Type,Secondary Options,Color Guidance,Performance Impact,Accessibility Notes,Library Recommendation,Interactive Level
|
|
2
|
+
1,Trend Over Time,"trend, time-series, line, growth, timeline, progress",Line Chart,"Area Chart, Smooth Area",Primary: #0080FF. Multiple series: use distinct colors. Fill: 20% opacity,⚡ Excellent (optimized),✓ Clear line patterns for colorblind users. Add pattern overlays.,"Chart.js, Recharts, ApexCharts",Hover + Zoom
|
|
3
|
+
2,Compare Categories,"compare, categories, bar, comparison, ranking",Bar Chart (Horizontal or Vertical),"Column Chart, Grouped Bar",Each bar: distinct color. Category: grouped same color. Sorted: descending order,⚡ Excellent,✓ Easy to compare. Add value labels on bars for clarity.,"Chart.js, Recharts, D3.js",Hover + Sort
|
|
4
|
+
3,Part-to-Whole,"part-to-whole, pie, donut, percentage, proportion, share",Pie Chart or Donut,"Stacked Bar, Treemap",Colors: 5-6 max. Contrasting palette. Large slices first. Use labels.,⚡ Good (limit 6 slices),⚠ Hard for accessibility. Better: Stacked bar with legend. Avoid pie if >5 items.,"Chart.js, Recharts, D3.js",Hover + Drill
|
|
5
|
+
4,Correlation/Distribution,"correlation, distribution, scatter, relationship, pattern",Scatter Plot or Bubble Chart,"Heat Map, Matrix",Color axis: gradient (blue-red). Size: relative. Opacity: 0.6-0.8 to show density,⚠ Moderate (many points),⚠ Provide data table alternative. Use pattern + color distinction.,"D3.js, Plotly, Recharts",Hover + Brush
|
|
6
|
+
5,Heatmap/Intensity,"heatmap, heat-map, intensity, density, matrix",Heat Map or Choropleth,"Grid Heat Map, Bubble Heat",Gradient: Cool (blue) to Hot (red). Scale: clear legend. Divergent for ±data,⚡ Excellent (color CSS),⚠ Colorblind: Use pattern overlay. Provide numerical legend.,"D3.js, Plotly, ApexCharts",Hover + Zoom
|
|
7
|
+
6,Geographic Data,"geographic, map, location, region, geo, spatial","Choropleth Map, Bubble Map",Geographic Heat Map,Regional: single color gradient or categorized colors. Legend: clear scale,⚠ Moderate (rendering),⚠ Include text labels for regions. Provide data table alternative.,"D3.js, Mapbox, Leaflet",Pan + Zoom + Drill
|
|
8
|
+
7,Funnel/Flow,funnel/flow,"Funnel Chart, Sankey",Waterfall (for flows),Stages: gradient (starting color → ending color). Show conversion %,⚡ Good,✓ Clear stage labels + percentages. Good for accessibility if labeled.,"D3.js, Recharts, Custom SVG",Hover + Drill
|
|
9
|
+
8,Performance vs Target,performance-vs-target,Gauge Chart or Bullet Chart,"Dial, Thermometer",Performance: Red→Yellow→Green gradient. Target: marker line. Threshold colors,⚡ Good,✓ Add numerical value + percentage label beside gauge.,"D3.js, ApexCharts, Custom SVG",Hover
|
|
10
|
+
9,Time-Series Forecast,time-series-forecast,Line with Confidence Band,Ribbon Chart,Actual: solid line #0080FF. Forecast: dashed #FF9500. Band: light shading,⚡ Good,✓ Clearly distinguish actual vs forecast. Add legend.,"Chart.js, ApexCharts, Plotly",Hover + Toggle
|
|
11
|
+
10,Anomaly Detection,anomaly-detection,Line Chart with Highlights,Scatter with Alert,Normal: blue #0080FF. Anomaly: red #FF0000 circle/square marker + alert,⚡ Good,✓ Circle/marker for anomalies. Add text alert annotation.,"D3.js, Plotly, ApexCharts",Hover + Alert
|
|
12
|
+
11,Hierarchical/Nested Data,hierarchical/nested-data,Treemap,"Sunburst, Nested Donut, Icicle",Parent: distinct hues. Children: lighter shades. White borders 2-3px.,⚠ Moderate,⚠ Poor - provide table alternative. Label large areas.,"D3.js, Recharts, ApexCharts",Hover + Drilldown
|
|
13
|
+
12,Flow/Process Data,flow/process-data,Sankey Diagram,"Alluvial, Chord Diagram",Gradient from source to target. Opacity 0.4-0.6 for flows.,⚠ Moderate,⚠ Poor - provide flow table alternative.,"D3.js (d3-sankey), Plotly",Hover + Drilldown
|
|
14
|
+
13,Cumulative Changes,cumulative-changes,Waterfall Chart,"Stacked Bar, Cascade",Increases: #4CAF50. Decreases: #F44336. Start: #2196F3. End: #0D47A1.,⚡ Good,✓ Good - clear directional colors with labels.,"ApexCharts, Highcharts, Plotly",Hover
|
|
15
|
+
14,Multi-Variable Comparison,multi-variable-comparison,Radar/Spider Chart,"Parallel Coordinates, Grouped Bar",Single: #0080FF 20% fill. Multiple: distinct colors per dataset.,⚡ Good,⚠ Moderate - limit 5-8 axes. Add data table.,"Chart.js, Recharts, ApexCharts",Hover + Toggle
|
|
16
|
+
15,Stock/Trading OHLC,stock/trading-ohlc,Candlestick Chart,"OHLC Bar, Heikin-Ashi",Bullish: #26A69A. Bearish: #EF5350. Volume: 40% opacity below.,⚡ Good,⚠ Moderate - provide OHLC data table.,"Lightweight Charts (TradingView), ApexCharts",Real-time + Hover + Zoom
|
|
17
|
+
16,Relationship/Connection Data,relationship/connection-data,Network Graph,"Hierarchical Tree, Adjacency Matrix",Node types: categorical colors. Edges: #90A4AE 60% opacity.,❌ Poor (500+ nodes struggles),❌ Very Poor - provide adjacency list alternative.,"D3.js (d3-force), Vis.js, Cytoscape.js",Drilldown + Hover + Drag
|
|
18
|
+
17,Distribution/Statistical,distribution/statistical,Box Plot,"Violin Plot, Beeswarm",Box: #BBDEFB. Border: #1976D2. Median: #D32F2F. Outliers: #F44336.,⚡ Excellent,"✓ Good - include stats table (min, Q1, median, Q3, max).","Plotly, D3.js, Chart.js (plugin)",Hover
|
|
19
|
+
18,Performance vs Target (Compact),performance-vs-target-(compact),Bullet Chart,"Gauge, Progress Bar","Ranges: #FFCDD2, #FFF9C4, #C8E6C9. Performance: #1976D2. Target: black 3px.",⚡ Excellent,✓ Excellent - compact with clear values.,"D3.js, Plotly, Custom SVG",Hover
|
|
20
|
+
19,Proportional/Percentage,proportional/percentage,Waffle Chart,"Pictogram, Stacked Bar 100%",10x10 grid. 3-5 categories max. 2-3px spacing between squares.,⚡ Good,✓ Good - better than pie for accessibility.,"D3.js, React-Waffle, Custom CSS Grid",Hover
|
|
21
|
+
20,Hierarchical Proportional,hierarchical-proportional,Sunburst Chart,"Treemap, Icicle, Circle Packing",Center to outer: darker to lighter. 15-20% lighter per level.,⚠ Moderate,⚠ Poor - provide hierarchy table alternative.,"D3.js (d3-hierarchy), Recharts, ApexCharts",Drilldown + Hover
|
|
22
|
+
21,Root Cause Analysis,"root cause, decomposition, tree, hierarchy, drill-down, ai-split",Decomposition Tree,"Decision Tree, Flow Chart",Nodes: #2563EB (Primary) vs #EF4444 (Negative impact). Connectors: Neutral grey.,⚠ Moderate (calculation heavy),✓ clear hierarchy. Allow keyboard navigation for nodes.,"Power BI (native), React-Flow, Custom D3.js",Drill + Expand
|
|
23
|
+
22,3D Spatial Data,"3d, spatial, immersive, terrain, molecular, volumetric",3D Scatter/Surface Plot,"Volumetric Rendering, Point Cloud",Depth cues: lighting/shading. Z-axis: color gradient (cool to warm).,❌ Heavy (WebGL required),❌ Poor - requires alternative 2D view or data table.,"Three.js, Deck.gl, Plotly 3D",Rotate + Zoom + VR
|
|
24
|
+
23,Real-Time Streaming,"streaming, real-time, ticker, live, velocity, pulse",Streaming Area Chart,"Ticker Tape, Moving Gauge",Current: Bright Pulse (#00FF00). History: Fading opacity. Grid: Dark.,⚡ Optimized (canvas/webgl),⚠ Flashing elements - provide pause button. High contrast.,Smoothed D3.js, CanvasJS, SciChart,Real-time + Pause
|
|
25
|
+
24,Sentiment/Emotion,"sentiment, emotion, nlp, opinion, feeling",Word Cloud with Sentiment,"Sentiment Arc, Radar Chart",Positive: #22C55E. Negative: #EF4444. Neutral: #94A3B8. Size = Frequency.,⚡ Good,⚠ Word clouds poor for screen readers. Use list view.,"D3-cloud, Highcharts, Nivo",Hover + Filter
|
|
26
|
+
25,Process Mining,"process, mining, variants, path, bottleneck, log",Process Map / Graph,"Directed Acyclic Graph (DAG), Petri Net",Happy path: #10B981 (Thick). Deviations: #F59E0B (Thin). Bottlenecks: #EF4444.,⚠ Moderate to Heavy,⚠ Complex graphs hard to navigate. Provide path summary.,"React-Flow, Cytoscape.js, Recharts",Drag + Node-Click
|