@thierrynakoa/fire-flow 12.2.1 → 13.0.1
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/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -455
- package/TROUBLESHOOTING.md +264 -264
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -24
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/tools/uat-runner.py +179 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
# Submenu Hover Dropdown Pattern
|
|
2
|
+
|
|
3
|
+
## Category
|
|
4
|
+
patterns-standards / navigation
|
|
5
|
+
|
|
6
|
+
## Problem
|
|
7
|
+
|
|
8
|
+
Navigation menus with hierarchical items (parent/child) need hover-to-reveal dropdowns on desktop and accordion expand/collapse on mobile. A common bug is the dropdown disappearing when the mouse crosses the gap between the parent item and the dropdown panel. This happens because the `mouseleave` event fires on the parent before `mouseenter` fires on the dropdown, causing the submenu to close instantly.
|
|
9
|
+
|
|
10
|
+
Additionally, menu items with `type: 'page'` require backend JOIN queries to resolve page slugs for correct URL generation.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Solution - Desktop Hover with setTimeout Delay
|
|
15
|
+
|
|
16
|
+
Use a `useRef` for a timeout ID and a `setTimeout` delay pattern. The 150ms delay gives users time to move their mouse from the parent nav item to the dropdown panel without it closing.
|
|
17
|
+
|
|
18
|
+
```javascript
|
|
19
|
+
const submenuTimeoutRef = useRef(null);
|
|
20
|
+
const [openSubmenu, setOpenSubmenu] = useState(null);
|
|
21
|
+
|
|
22
|
+
// On mouse enter parent item:
|
|
23
|
+
const handleMouseEnter = (itemId) => {
|
|
24
|
+
if (submenuTimeoutRef.current) {
|
|
25
|
+
clearTimeout(submenuTimeoutRef.current);
|
|
26
|
+
submenuTimeoutRef.current = null;
|
|
27
|
+
}
|
|
28
|
+
setOpenSubmenu(itemId);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// On mouse leave (both parent item AND dropdown panel share this):
|
|
32
|
+
const handleMouseLeave = () => {
|
|
33
|
+
submenuTimeoutRef.current = setTimeout(() => {
|
|
34
|
+
setOpenSubmenu(null);
|
|
35
|
+
}, 150); // 150ms delay prevents flicker
|
|
36
|
+
};
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Why This Works
|
|
40
|
+
|
|
41
|
+
Both the parent menu item and the dropdown panel use the **same** `onMouseEnter` and `onMouseLeave` handlers. When the mouse leaves the parent and enters the dropdown within 150ms, `handleMouseEnter` fires on the dropdown and clears the pending timeout before it can close the submenu.
|
|
42
|
+
|
|
43
|
+
### JSX Structure (Desktop)
|
|
44
|
+
|
|
45
|
+
```jsx
|
|
46
|
+
{/* Parent wrapper - position: relative for absolute dropdown */}
|
|
47
|
+
<div
|
|
48
|
+
className="relative"
|
|
49
|
+
onMouseEnter={() => handleMouseEnter(item.id)}
|
|
50
|
+
onMouseLeave={handleMouseLeave}
|
|
51
|
+
>
|
|
52
|
+
{/* Parent nav item */}
|
|
53
|
+
<a href={getItemUrl(item)} className="flex items-center gap-1 px-3 py-2">
|
|
54
|
+
{item.label}
|
|
55
|
+
<ChevronDown className="h-4 w-4" />
|
|
56
|
+
</a>
|
|
57
|
+
|
|
58
|
+
{/* Dropdown panel - position: absolute, top: 100% */}
|
|
59
|
+
{openSubmenu === item.id && item.children?.length > 0 && (
|
|
60
|
+
<div
|
|
61
|
+
className="absolute left-0 top-full mt-1 w-48 bg-white shadow-lg rounded-md py-1 z-50"
|
|
62
|
+
onMouseEnter={() => handleMouseEnter(item.id)}
|
|
63
|
+
onMouseLeave={handleMouseLeave}
|
|
64
|
+
>
|
|
65
|
+
{item.children.map(child => (
|
|
66
|
+
<a key={child.id} href={getItemUrl(child)} className="block px-4 py-2 hover:bg-gray-100">
|
|
67
|
+
{child.label}
|
|
68
|
+
</a>
|
|
69
|
+
))}
|
|
70
|
+
</div>
|
|
71
|
+
)}
|
|
72
|
+
</div>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Cleanup on Unmount
|
|
76
|
+
|
|
77
|
+
Always clear the timeout when the component unmounts to prevent state updates on unmounted components:
|
|
78
|
+
|
|
79
|
+
```javascript
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
return () => {
|
|
82
|
+
if (submenuTimeoutRef.current) {
|
|
83
|
+
clearTimeout(submenuTimeoutRef.current);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}, []);
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Solution - Mobile Accordion
|
|
92
|
+
|
|
93
|
+
On mobile, submenus should expand/collapse via tap using a `Set` to track which items are expanded:
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
const [expandedMobileItems, setExpandedMobileItems] = useState(new Set());
|
|
97
|
+
|
|
98
|
+
const toggleMobileSubmenu = (itemId) => {
|
|
99
|
+
setExpandedMobileItems(prev => {
|
|
100
|
+
const next = new Set(prev);
|
|
101
|
+
if (next.has(itemId)) next.delete(itemId);
|
|
102
|
+
else next.add(itemId);
|
|
103
|
+
return next;
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### JSX Structure (Mobile)
|
|
109
|
+
|
|
110
|
+
```jsx
|
|
111
|
+
<div className="space-y-1">
|
|
112
|
+
{item.children?.length > 0 ? (
|
|
113
|
+
<>
|
|
114
|
+
<button
|
|
115
|
+
onClick={() => toggleMobileSubmenu(item.id)}
|
|
116
|
+
className="w-full flex items-center justify-between px-4 py-2"
|
|
117
|
+
>
|
|
118
|
+
<span>{item.label}</span>
|
|
119
|
+
<ChevronDown className={`h-4 w-4 transition-transform ${
|
|
120
|
+
expandedMobileItems.has(item.id) ? 'rotate-180' : ''
|
|
121
|
+
}`} />
|
|
122
|
+
</button>
|
|
123
|
+
{expandedMobileItems.has(item.id) && (
|
|
124
|
+
<div className="pl-6 space-y-1">
|
|
125
|
+
{item.children.map(child => (
|
|
126
|
+
<a key={child.id} href={getItemUrl(child)} className="block px-4 py-2">
|
|
127
|
+
{child.label}
|
|
128
|
+
</a>
|
|
129
|
+
))}
|
|
130
|
+
</div>
|
|
131
|
+
)}
|
|
132
|
+
</>
|
|
133
|
+
) : (
|
|
134
|
+
<a href={getItemUrl(item)} className="block px-4 py-2">
|
|
135
|
+
{item.label}
|
|
136
|
+
</a>
|
|
137
|
+
)}
|
|
138
|
+
</div>
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Solution - Backend: Page-Type Menu Items
|
|
144
|
+
|
|
145
|
+
Menu items with `type: 'page'` reference a page via `page_id`. The backend MUST JOIN with the `pages` table to include the page slug so the frontend can generate correct URLs:
|
|
146
|
+
|
|
147
|
+
```sql
|
|
148
|
+
SELECT mi.*, p.slug AS page_slug
|
|
149
|
+
FROM menu_items mi
|
|
150
|
+
LEFT JOIN pages p ON mi.page_id = p.id
|
|
151
|
+
WHERE mi.menu_id = ${menu.id}
|
|
152
|
+
ORDER BY mi.position ASC
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Frontend URL Resolution
|
|
156
|
+
|
|
157
|
+
The `getItemUrl` helper must check `page_slug` first, then fall back to `page_id` and raw URL:
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
const getItemUrl = (item) => {
|
|
161
|
+
if (item.type === 'page' && item.page_slug) {
|
|
162
|
+
return '/' + item.page_slug;
|
|
163
|
+
}
|
|
164
|
+
if (item.type === 'page' && item.page_id) {
|
|
165
|
+
return item.url || '#'; // fallback
|
|
166
|
+
}
|
|
167
|
+
if (item.url && !item.url.startsWith('http') && !item.url.startsWith('/')) {
|
|
168
|
+
return '/' + item.url;
|
|
169
|
+
}
|
|
170
|
+
return item.url || '#';
|
|
171
|
+
};
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Key Implementation Notes
|
|
177
|
+
|
|
178
|
+
1. **Both parent and dropdown use the same `onMouseEnter`/`onMouseLeave` handlers** -- this is what makes the gap-crossing work.
|
|
179
|
+
2. **Dropdown panel uses `position: absolute`** with `top: 100%` to appear below the parent.
|
|
180
|
+
3. **Desktop dropdown wrapper**: `position: relative` on the parent container so the absolute dropdown positions correctly.
|
|
181
|
+
4. **Theme compatibility**: For theme files in `/themes/`, use `useRef` and `useState` from React directly (no npm imports allowed -- see `CLAUDE.md` Theme Development CRITICAL RULES).
|
|
182
|
+
5. **Cleanup**: Clear timeout on component unmount via `useEffect` return callback.
|
|
183
|
+
6. **Mobile sidebar must have `lg:hidden`** on toggle button, panel, and backdrop (three elements).
|
|
184
|
+
7. **150ms is the sweet spot** -- shorter causes flicker, longer feels sluggish.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Files Modified (MERN LMS)
|
|
189
|
+
|
|
190
|
+
| File | Role |
|
|
191
|
+
|------|------|
|
|
192
|
+
| `client/src/components/layout/Header.jsx` | Classic theme header |
|
|
193
|
+
| `themes/aurora-borealis/components/layout/Header.jsx` | Aurora Borealis theme |
|
|
194
|
+
| `themes/celestial/components/layout/Header.jsx` | Celestial theme |
|
|
195
|
+
| `themes/melchizedek-order/components/layout/Header.jsx` | Melchizedek Order theme |
|
|
196
|
+
| `themes/royal-priesthood/components/layout/Header.jsx` | Royal Priesthood theme |
|
|
197
|
+
| `themes/prosperity/components/layout/Header.jsx` | Prosperity theme |
|
|
198
|
+
| `themes/prophetic-academy/components/layout/Header.jsx` | Prophetic Academy theme |
|
|
199
|
+
| `server/controllers/menuController.js` | Backend JOIN fix for page slugs |
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## When to Use
|
|
204
|
+
|
|
205
|
+
- Any navigation menu with parent/child hierarchy
|
|
206
|
+
- Dropdown menus that appear on hover (desktop)
|
|
207
|
+
- Mobile-responsive navigation with accordion submenus
|
|
208
|
+
- Page-type menu items that need slug resolution from the database
|
|
209
|
+
- Theme components that cannot import npm packages directly
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Common Mistakes to Avoid
|
|
214
|
+
|
|
215
|
+
1. **Forgetting to share handlers between parent and dropdown** -- the dropdown must also call `handleMouseEnter`/`handleMouseLeave` or it will close when the mouse enters it.
|
|
216
|
+
2. **Using `onMouseOver`/`onMouseOut` instead of `onMouseEnter`/`onMouseLeave`** -- the former bubble from children and cause erratic behavior.
|
|
217
|
+
3. **Not clearing the timeout on unmount** -- leads to "setState on unmounted component" warnings.
|
|
218
|
+
4. **Missing the LEFT JOIN on pages** -- page-type menu items will have no slug and render as `#` links.
|
|
219
|
+
5. **Importing `react-router-dom` Link in theme files** -- theme files are outside the Vite workspace; use plain `<a>` tags or a local Link wrapper.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Tags
|
|
224
|
+
|
|
225
|
+
navigation, submenu, hover, dropdown, accordion, mobile, menu, react, setTimeout, useRef, page-slug, backend-join, theme-compatibility
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
# Tailwind CSS Text Visibility - Overriding Parent Text Colors
|
|
2
|
+
|
|
3
|
+
## The Problem
|
|
4
|
+
|
|
5
|
+
Button text was completely invisible on pricing cards because the parent button's `text-white` class was rendering white text on a light blue/green background.
|
|
6
|
+
|
|
7
|
+
### Error Symptoms
|
|
8
|
+
|
|
9
|
+
- "Upgrade" and "Downgrade" button text not visible
|
|
10
|
+
- Text only appeared when highlighted (selection)
|
|
11
|
+
- Same button worked on some cards but not others
|
|
12
|
+
- Inline styles with `color: badgeColor` didn't override the issue
|
|
13
|
+
|
|
14
|
+
### Why It Was Hard
|
|
15
|
+
|
|
16
|
+
1. **CSS Specificity Confusion** - Inline styles should override classes, but Tailwind generates utilities with `!important`
|
|
17
|
+
2. **Dynamic Styling** - Featured cards got different classes (`text-white`) vs non-featured cards (`text-gray-800`)
|
|
18
|
+
3. **Inheritance Issues** - Button text inherited parent's text color, but inline style only applied to parent
|
|
19
|
+
4. **Cache Masking** - Browser cache made it seem like deployments weren't working
|
|
20
|
+
5. **Context-Dependent** - Problem only appeared when user had active membership (showing upgrade/downgrade)
|
|
21
|
+
|
|
22
|
+
### Impact
|
|
23
|
+
|
|
24
|
+
- Critical UX issue - users couldn't see upgrade buttons
|
|
25
|
+
- Affected conversion funnel (memberships)
|
|
26
|
+
- Required multiple deploys to fix
|
|
27
|
+
- Wasted time debugging inline styles vs class specificity
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## The Solution
|
|
32
|
+
|
|
33
|
+
### Root Cause
|
|
34
|
+
|
|
35
|
+
The button had conditional classes based on whether the card was "featured":
|
|
36
|
+
|
|
37
|
+
```jsx
|
|
38
|
+
className={`w-full py-3 px-6 rounded-lg font-semibold transition ${
|
|
39
|
+
isFeatured
|
|
40
|
+
? 'bg-primary-600 text-white hover:bg-primary-700' // ← text-white here
|
|
41
|
+
: 'bg-gray-100 text-gray-800 hover:bg-gray-200'
|
|
42
|
+
}`}
|
|
43
|
+
style={
|
|
44
|
+
!isFeatured
|
|
45
|
+
? { backgroundColor: level.badge_color + '20', color: level.badge_color }
|
|
46
|
+
: {}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**The Problem Flow:**
|
|
51
|
+
1. Partners card is marked as `isFeatured = true` in database
|
|
52
|
+
2. Button gets `text-white` class
|
|
53
|
+
3. Button text (upgrade/downgrade) inherits `text-white`
|
|
54
|
+
4. Background is light blue → invisible white text
|
|
55
|
+
|
|
56
|
+
**Why Inline Styles Didn't Work:**
|
|
57
|
+
- Inline `color` was on the `<button>` element
|
|
58
|
+
- Text was in a `<span>` child element
|
|
59
|
+
- CSS inheritance applied `text-white` to the span
|
|
60
|
+
- Needed to override on the span itself, not parent
|
|
61
|
+
|
|
62
|
+
### How to Fix
|
|
63
|
+
|
|
64
|
+
**Add explicit text color class directly to the text element:**
|
|
65
|
+
|
|
66
|
+
```jsx
|
|
67
|
+
// ❌ BAD - text inherits parent's text-white
|
|
68
|
+
<button className="text-white bg-blue-500">
|
|
69
|
+
<span className="flex items-center gap-2">
|
|
70
|
+
<ArrowUp />
|
|
71
|
+
Upgrade
|
|
72
|
+
</span>
|
|
73
|
+
</button>
|
|
74
|
+
|
|
75
|
+
// ✅ GOOD - explicit override on text element
|
|
76
|
+
<button className="text-white bg-blue-500">
|
|
77
|
+
<span className="flex items-center gap-2 text-gray-900">
|
|
78
|
+
<ArrowUp />
|
|
79
|
+
Upgrade
|
|
80
|
+
</span>
|
|
81
|
+
</button>
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Complete Fix:**
|
|
85
|
+
|
|
86
|
+
```jsx
|
|
87
|
+
{currentMembership && currentMembership.status === 'active' ? (
|
|
88
|
+
// Show upgrade/downgrade based on access_rank
|
|
89
|
+
(level.access_rank || 0) > (currentMembership.access_rank || 0) ? (
|
|
90
|
+
<span className="flex items-center justify-center gap-2 font-bold text-gray-900">
|
|
91
|
+
<ArrowUp className="w-4 h-4" />
|
|
92
|
+
Upgrade
|
|
93
|
+
</span>
|
|
94
|
+
) : (
|
|
95
|
+
<span className="flex items-center justify-center gap-2 font-bold text-gray-900">
|
|
96
|
+
<ArrowDown className="w-4 h-4" />
|
|
97
|
+
Downgrade
|
|
98
|
+
</span>
|
|
99
|
+
)
|
|
100
|
+
) : (
|
|
101
|
+
'Subscribe Now'
|
|
102
|
+
)}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Key Insight:**
|
|
106
|
+
> Don't try to override parent text color with inline styles on parent.
|
|
107
|
+
> Add explicit Tailwind class (`text-gray-900`) directly to the text element.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Testing the Fix
|
|
112
|
+
|
|
113
|
+
### Visual Test
|
|
114
|
+
1. Navigate to `/pricing` page while logged in with active membership
|
|
115
|
+
2. Look at cards where you can upgrade
|
|
116
|
+
3. Button should show dark text ("Upgrade") clearly visible
|
|
117
|
+
4. Works on both light and dark backgrounds
|
|
118
|
+
|
|
119
|
+
### Browser Cache Warning
|
|
120
|
+
⚠️ **Always hard refresh after deployment:**
|
|
121
|
+
- `Ctrl + Shift + R` (Windows/Linux)
|
|
122
|
+
- `Cmd + Shift + R` (Mac)
|
|
123
|
+
- Or open DevTools → Network tab → Check "Disable cache"
|
|
124
|
+
|
|
125
|
+
### Test Cases
|
|
126
|
+
|
|
127
|
+
```jsx
|
|
128
|
+
// Test 1: Featured card with upgrade button
|
|
129
|
+
<PricingCard
|
|
130
|
+
isFeatured={true}
|
|
131
|
+
showUpgrade={true}
|
|
132
|
+
/>
|
|
133
|
+
// Expected: Dark text on light background (visible)
|
|
134
|
+
|
|
135
|
+
// Test 2: Non-featured card with downgrade button
|
|
136
|
+
<PricingCard
|
|
137
|
+
isFeatured={false}
|
|
138
|
+
showDowngrade={true}
|
|
139
|
+
/>
|
|
140
|
+
// Expected: Dark text on badge-colored background (visible)
|
|
141
|
+
|
|
142
|
+
// Test 3: Current plan (no upgrade/downgrade)
|
|
143
|
+
<PricingCard
|
|
144
|
+
isCurrentPlan={true}
|
|
145
|
+
/>
|
|
146
|
+
// Expected: "Current Plan" text (should match card style)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Prevention
|
|
152
|
+
|
|
153
|
+
### 1. Always Consider Text Contrast
|
|
154
|
+
```jsx
|
|
155
|
+
// Check: What background will this text appear on?
|
|
156
|
+
// If background can vary (light/dark), use explicit text color
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 2. Avoid Relying on Inheritance for Important Text
|
|
160
|
+
```jsx
|
|
161
|
+
// ❌ BAD - relies on inheritance
|
|
162
|
+
<button className="text-white">
|
|
163
|
+
<span>{dynamicText}</span>
|
|
164
|
+
</button>
|
|
165
|
+
|
|
166
|
+
// ✅ GOOD - explicit control
|
|
167
|
+
<button className="text-white">
|
|
168
|
+
<span className="text-gray-900">{dynamicText}</span>
|
|
169
|
+
</button>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### 3. Test with Different Card States
|
|
173
|
+
- Test featured vs non-featured
|
|
174
|
+
- Test with/without active membership
|
|
175
|
+
- Test different badge colors (light/dark)
|
|
176
|
+
- Test on both localhost AND production (cache differences)
|
|
177
|
+
|
|
178
|
+
### 4. Use Contrast Checking Tools
|
|
179
|
+
- Browser DevTools → Accessibility tab
|
|
180
|
+
- Check color contrast ratio (WCAG AA: 4.5:1 minimum)
|
|
181
|
+
|
|
182
|
+
### 5. Document Dynamic Styling
|
|
183
|
+
```jsx
|
|
184
|
+
// Comment complex conditional styling
|
|
185
|
+
// Featured cards: bg-primary-600 text-white
|
|
186
|
+
// Non-featured: bg-gray-100 text-gray-800
|
|
187
|
+
// Upgrade text: ALWAYS text-gray-900 (overrides parent)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Related Patterns
|
|
193
|
+
|
|
194
|
+
- [Tailwind CSS Specificity Rules](https://tailwindcss.com/docs/adding-custom-styles#using-arbitrary-values)
|
|
195
|
+
- [CSS Inheritance and Cascade](https://developer.mozilla.org/en-US/docs/Web/CSS/Cascade)
|
|
196
|
+
- [WCAG Contrast Guidelines](https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html)
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Common Mistakes to Avoid
|
|
201
|
+
|
|
202
|
+
- ❌ **Using inline styles for text color** - They don't override Tailwind utilities on child elements
|
|
203
|
+
- ❌ **Assuming inheritance works like props** - CSS inheritance is parent → child only
|
|
204
|
+
- ❌ **Not testing with real data** - Featured status might come from database
|
|
205
|
+
- ❌ **Forgetting browser cache** - Hard refresh after every deployment
|
|
206
|
+
- ❌ **Overriding on wrong element** - Override on the text element, not parent
|
|
207
|
+
- ❌ **Using `!important` as band-aid** - Fix the specificity issue properly
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## CSS Specificity Refresher
|
|
212
|
+
|
|
213
|
+
**Order of specificity (low to high):**
|
|
214
|
+
1. Element selectors (`button`, `span`)
|
|
215
|
+
2. Class selectors (`.text-white`)
|
|
216
|
+
3. Inline styles (`style="color: white"`)
|
|
217
|
+
4. `!important` flag
|
|
218
|
+
|
|
219
|
+
**Tailwind utilities:**
|
|
220
|
+
- Most Tailwind utilities are just classes
|
|
221
|
+
- No `!important` by default (unless you add `!` prefix)
|
|
222
|
+
- Child elements inherit text color unless explicitly overridden
|
|
223
|
+
|
|
224
|
+
**Inheritance vs Specificity:**
|
|
225
|
+
- Inheritance: Parent's `color` flows to children
|
|
226
|
+
- Specificity: Explicit class on child beats inherited value
|
|
227
|
+
- Solution: Add explicit class to child element
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Real-World Example
|
|
232
|
+
|
|
233
|
+
**Scenario:** Pricing page with 3 tiers (Free, Partners, Premium)
|
|
234
|
+
- Partners tier is featured (light blue background)
|
|
235
|
+
- User is on Free tier, can upgrade to Partners
|
|
236
|
+
- Button shows "Upgrade" but text is invisible
|
|
237
|
+
|
|
238
|
+
**Before Fix:**
|
|
239
|
+
```jsx
|
|
240
|
+
<button className="bg-blue-100 text-white">
|
|
241
|
+
<span className="flex items-center gap-2">
|
|
242
|
+
<ArrowUp className="w-4 h-4" />
|
|
243
|
+
Upgrade {/* ← invisible white text */}
|
|
244
|
+
</span>
|
|
245
|
+
</button>
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**After Fix:**
|
|
249
|
+
```jsx
|
|
250
|
+
<button className="bg-blue-100 text-white">
|
|
251
|
+
<span className="flex items-center gap-2 text-gray-900">
|
|
252
|
+
<ArrowUp className="w-4 h-4" />
|
|
253
|
+
Upgrade {/* ← visible dark text */}
|
|
254
|
+
</span>
|
|
255
|
+
</button>
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Contrast Ratios:**
|
|
259
|
+
- Before: White on light blue = 1.5:1 (FAIL)
|
|
260
|
+
- After: Dark gray on light blue = 8.2:1 (PASS)
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## Resources
|
|
265
|
+
|
|
266
|
+
- [Tailwind CSS Docs - Text Color](https://tailwindcss.com/docs/text-color)
|
|
267
|
+
- [MDN - CSS Inheritance](https://developer.mozilla.org/en-US/docs/Web/CSS/inheritance)
|
|
268
|
+
- [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/)
|
|
269
|
+
- [Chrome DevTools - Accessibility](https://developer.chrome.com/docs/devtools/accessibility/reference/)
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Time to Implement
|
|
274
|
+
|
|
275
|
+
**5-10 minutes** once you know the pattern (add explicit text color class)
|
|
276
|
+
|
|
277
|
+
**Initial debugging time:** 30-60 minutes (finding root cause, testing inline styles, etc.)
|
|
278
|
+
|
|
279
|
+
## Difficulty Level
|
|
280
|
+
|
|
281
|
+
⭐⭐⭐ (3/5) - Easy fix once identified, but tricky to debug
|
|
282
|
+
|
|
283
|
+
**Why difficult:**
|
|
284
|
+
- CSS specificity can be confusing
|
|
285
|
+
- Inheritance isn't obvious in JSX
|
|
286
|
+
- Browser cache hides deployments
|
|
287
|
+
- Conditional styling adds complexity
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Author Notes
|
|
292
|
+
|
|
293
|
+
This bug burned 2 hours across 3 deployments because:
|
|
294
|
+
1. First fix tried inline styles (didn't work - wrong element)
|
|
295
|
+
2. Second fix removed inline color but didn't add explicit override
|
|
296
|
+
3. Third fix added `text-gray-900` to the right element (worked!)
|
|
297
|
+
|
|
298
|
+
**Key lesson:** When text is invisible, check BOTH:
|
|
299
|
+
- What background it's on (contrast)
|
|
300
|
+
- What parent text color it's inheriting
|
|
301
|
+
|
|
302
|
+
The fix is almost always: **add explicit text color class to the text element itself.**
|
|
303
|
+
|
|
304
|
+
Browser cache also made this harder - each deploy looked like it "didn't work" until hard refresh.
|
|
305
|
+
|
|
306
|
+
**Pro tip:** When debugging text visibility in Tailwind:
|
|
307
|
+
1. Use browser inspector to see actual computed color
|
|
308
|
+
2. Check parent element classes
|
|
309
|
+
3. Add explicit text color to child (don't rely on inheritance)
|
|
310
|
+
4. Hard refresh to verify deployment
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
**Related Issues:**
|
|
315
|
+
- Commit: `eff51d6` - Final fix
|
|
316
|
+
- File: `client/src/pages/Pricing.jsx:534`
|
|
317
|
+
- Date: 2026-02-15
|
|
318
|
+
- Project: MERN Community LMS
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
**Future Agents:** If you see invisible text on buttons, check this skill first. It's almost always a parent `text-white` + light background issue. Add explicit dark text class to the child element.
|