@salesforce/b2c-dx-mcp 3.2.0 → 3.3.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/run.js +5 -9
- package/content/guidance/b2c/b2c-hooks/references/ORDER-HOOK-LIFECYCLE.md +1 -1
- package/content/guidance/b2c/b2c-onboarding/SKILL.md +4 -4
- package/content/guidance/b2c/b2c-ordering/SKILL.md +2 -2
- package/content/guidance/b2c/b2c-querying-data/SKILL.md +2 -2
- package/content/guidance/b2c/b2c-scapi-admin/SKILL.md +3 -3
- package/content/guidance/b2c/b2c-scapi-admin/references/CLIENT-EXAMPLES.md +4 -4
- package/content/guidance/b2c/b2c-scapi-shopper/SKILL.md +6 -6
- package/content/guidance/b2c/b2c-scapi-shopper/references/CLIENT-EXAMPLES.md +8 -9
- package/content/guidance/b2c-cli/b2c-cip/SKILL.md +3 -3
- package/content/guidance/b2c-cli/b2c-cip/references/SALES_ANALYSIS.md +1 -1
- package/content/guidance/b2c-cli/b2c-config/SKILL.md +31 -21
- package/content/guidance/b2c-cli/b2c-content/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-debug/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-docs/SKILL.md +23 -2
- package/content/guidance/b2c-cli/b2c-ecdn/references/ADVANCED.md +1 -1
- package/content/guidance/b2c-cli/b2c-job/references/IMPORT.md +1 -1
- package/content/guidance/b2c-cli/b2c-metrics/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-mrt/SKILL.md +3 -3
- package/content/guidance/b2c-cli/b2c-scapi-custom/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-scapi-schemas/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-site-import-export/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-sites/SKILL.md +1 -1
- package/content/guidance/b2c-cli/b2c-slas/SKILL.md +1 -1
- package/content/guidance/b2c-ops/b2c-checkout-triage/SKILL.md +2 -2
- package/content/guidance/b2c-ops/b2c-job-health/SKILL.md +2 -2
- package/content/guidance/b2c-ops/b2c-order-failure-triage/SKILL.md +1 -1
- package/content/guidance/b2c-ops/b2c-order-failure-triage/references/order-evidence.md +2 -2
- package/content/guidance/b2c-ops/b2c-production-triage/SKILL.md +4 -4
- package/content/guidance/index.json +935 -258
- package/content/guidance/mcp/{cip → b2c-mcp-cip}/SKILL.md +10 -8
- package/content/guidance/mcp/{b2c-config → b2c-mcp-config}/SKILL.md +10 -9
- package/content/guidance/mcp/{debugger → b2c-mcp-debugger}/SKILL.md +9 -8
- package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/SKILL.md +81 -10
- package/content/guidance/mcp/{server → b2c-mcp-server}/SKILL.md +49 -25
- package/content/guidance/storefront-next/sfnext-accessibility/SKILL.md +103 -0
- package/content/guidance/storefront-next/sfnext-accessibility/references/checklist.md +64 -0
- package/content/guidance/storefront-next/sfnext-analytics-consent/SKILL.md +91 -0
- package/content/guidance/storefront-next/sfnext-analytics-consent/references/CUSTOM-ADAPTER.md +49 -0
- package/content/guidance/storefront-next/sfnext-authentication/SKILL.md +86 -79
- package/content/guidance/storefront-next/sfnext-authentication/references/COOKIES.md +39 -0
- package/content/guidance/storefront-next/sfnext-authentication/references/LOGIN-FLOWS.md +59 -0
- package/content/guidance/storefront-next/sfnext-commerce-features/SKILL.md +67 -0
- package/content/guidance/storefront-next/sfnext-commerce-features/references/FEATURE-PREREQUISITES.md +37 -0
- package/content/guidance/storefront-next/sfnext-components/SKILL.md +98 -136
- package/content/guidance/storefront-next/sfnext-components/references/COMPONENT-AUTHORING.md +118 -0
- package/content/guidance/storefront-next/sfnext-components/references/SHAPE-TOKENS.md +51 -0
- package/content/guidance/storefront-next/sfnext-components/references/STORYBOOK.md +54 -0
- package/content/guidance/storefront-next/sfnext-components/references/TOKEN-SYSTEM.md +53 -0
- package/content/guidance/storefront-next/sfnext-components/references/TROUBLESHOOTING.md +19 -0
- package/content/guidance/storefront-next/sfnext-configuration/SKILL.md +116 -113
- package/content/guidance/storefront-next/sfnext-configuration/references/ENV-VARIABLES.md +55 -0
- package/content/guidance/storefront-next/sfnext-configuration/references/MULTI-SITE-URLS.md +137 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/SKILL.md +100 -150
- package/content/guidance/storefront-next/sfnext-data-fetching/references/ACTIONS.md +53 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/API-CLIENTS.md +34 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/LOADERS.md +73 -0
- package/content/guidance/storefront-next/sfnext-data-fetching/references/SCAPI-FETCHER.md +23 -77
- package/content/guidance/storefront-next/sfnext-deployment/SKILL.md +83 -97
- package/content/guidance/storefront-next/sfnext-deployment/references/MRT-DEPLOYMENT.md +37 -68
- package/content/guidance/storefront-next/sfnext-extensions/SKILL.md +73 -97
- package/content/guidance/storefront-next/sfnext-extensions/references/ACTION-HOOKS.md +57 -0
- package/content/guidance/storefront-next/sfnext-extensions/references/BASE-AUDIT.md +47 -44
- package/content/guidance/storefront-next/sfnext-extensions/references/CLI-AND-INSTALL.md +58 -0
- package/content/guidance/storefront-next/sfnext-extensions/references/EXTENSION-EXAMPLES.md +49 -86
- package/content/guidance/storefront-next/sfnext-hybrid-storefronts/SKILL.md +59 -114
- package/content/guidance/storefront-next/sfnext-hybrid-storefronts/references/HYBRID-PROXY-CONFIG.md +53 -90
- package/content/guidance/storefront-next/sfnext-i18n/SKILL.md +96 -131
- package/content/guidance/storefront-next/sfnext-i18n/references/locale-config.md +35 -0
- package/content/guidance/storefront-next/sfnext-overview/SKILL.md +101 -0
- package/content/guidance/storefront-next/sfnext-page-designer/SKILL.md +152 -131
- package/content/guidance/storefront-next/sfnext-page-designer/references/BUSINESS-MANAGER.md +46 -0
- package/content/guidance/storefront-next/sfnext-page-designer/references/COMPONENT-REGISTRY.md +86 -53
- package/content/guidance/storefront-next/sfnext-page-designer/references/DECORATOR-PATTERNS.md +119 -131
- package/content/guidance/storefront-next/sfnext-page-designer/references/REVIEW-CHECKLIST.md +83 -0
- package/content/guidance/storefront-next/sfnext-page-designer/references/TROUBLESHOOTING.md +35 -0
- package/content/guidance/storefront-next/sfnext-performance/SKILL.md +75 -105
- package/content/guidance/storefront-next/sfnext-performance/references/PERFORMANCE-REVIEW-CHECKLIST.md +85 -0
- package/content/guidance/storefront-next/sfnext-performance/references/SUSPENSE-AND-STREAMING.md +58 -0
- package/content/guidance/storefront-next/sfnext-project-setup/SKILL.md +103 -116
- package/content/guidance/storefront-next/sfnext-project-setup/references/PROJECT-STRUCTURE.md +61 -99
- package/content/guidance/storefront-next/sfnext-project-setup/references/SCRIPTS.md +47 -0
- package/content/guidance/storefront-next/sfnext-project-setup/references/SFNEXT-CLI.md +63 -0
- package/content/guidance/storefront-next/sfnext-quality-gates/SKILL.md +70 -0
- package/content/guidance/storefront-next/sfnext-quality-gates/references/lint-and-budgets.md +39 -0
- package/content/guidance/storefront-next/sfnext-revalidation/SKILL.md +121 -0
- package/content/guidance/storefront-next/sfnext-revalidation/references/POLICIES-AND-TAGS.md +55 -0
- package/content/guidance/storefront-next/sfnext-routing/SKILL.md +86 -143
- package/content/guidance/storefront-next/sfnext-routing/references/ROUTE-CONVENTIONS.md +51 -51
- package/content/guidance/storefront-next/sfnext-routing/references/URLS-AND-SEO-ROUTES.md +22 -0
- package/content/guidance/storefront-next/sfnext-scapi/SKILL.md +126 -0
- package/content/guidance/storefront-next/sfnext-scapi/references/WORKED-EXAMPLE.md +39 -0
- package/content/guidance/storefront-next/sfnext-security/SKILL.md +129 -0
- package/content/guidance/storefront-next/sfnext-security/references/COOKIE-DOMAIN.md +39 -0
- package/content/guidance/storefront-next/sfnext-security/references/TURNSTILE.md +43 -0
- package/content/guidance/storefront-next/sfnext-seo/SKILL.md +95 -0
- package/content/guidance/storefront-next/sfnext-seo/references/MULTI-DOMAIN-BASE-PATH.md +17 -0
- package/content/guidance/storefront-next/sfnext-seo/references/SEO-ROUTES.md +31 -0
- package/content/guidance/storefront-next/sfnext-state-management/SKILL.md +80 -89
- package/content/guidance/storefront-next/sfnext-state-management/references/PATTERNS.md +45 -0
- package/content/guidance/storefront-next/sfnext-testing/SKILL.md +105 -138
- package/content/guidance/storefront-next/sfnext-testing/references/E2E.md +38 -0
- package/content/guidance/storefront-next/sfnext-testing/references/STORYBOOK-PATTERNS.md +73 -94
- package/content/guidance/storefront-next/sfnext-testing/references/UNIT-AND-ROUTE-TESTS.md +60 -0
- package/content/guidance/storefront-next/sfnext-theming/SKILL.md +104 -0
- package/content/guidance/storefront-next/sfnext-theming/references/REBRAND-CHECKLIST.md +29 -0
- package/dist/commands/mcp.d.ts +8 -2
- package/dist/commands/mcp.js +54 -20
- package/dist/guidance.d.ts +4 -1
- package/dist/guidance.js +23 -5
- package/dist/registry.d.ts +2 -1
- package/dist/registry.js +3 -3
- package/dist/server.d.ts +10 -0
- package/dist/server.js +21 -0
- package/dist/skill-references.js +5 -5
- package/dist/tools/cartridges/index.js +1 -0
- package/dist/tools/cip/index.js +6 -3
- package/dist/tools/diagnostics/debug-capture-at-breakpoint.js +1 -1
- package/dist/tools/diagnostics/debug-set-breakpoints.js +1 -1
- package/dist/tools/diagnostics/debug-start-session.js +1 -1
- package/dist/tools/scapi/execution-registry.js +9 -9
- package/dist/tools/scapi/index.d.ts +4 -1
- package/dist/tools/scapi/index.js +4 -2
- package/dist/tools/scapi/scapi-code.d.ts +2 -2
- package/dist/tools/scapi/scapi-code.js +17 -61
- package/dist/utils/types.d.ts +6 -0
- package/node_modules/@salesforce/b2c-agent-plugins/CHANGELOG.md +20 -0
- package/node_modules/@salesforce/b2c-agent-plugins/README.md +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-hooks/references/ORDER-HOOK-LIFECYCLE.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-onboarding/SKILL.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-ordering/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-querying-data/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-admin/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-admin/references/CLIENT-EXAMPLES.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-shopper/SKILL.md +6 -6
- package/node_modules/@salesforce/b2c-agent-plugins/b2c/skills/b2c-scapi-shopper/references/CLIENT-EXAMPLES.md +8 -9
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-cip/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-cip/references/SALES_ANALYSIS.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-config/SKILL.md +31 -21
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-content/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-debug/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-docs/SKILL.md +23 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-ecdn/references/ADVANCED.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-job/references/IMPORT.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-metrics/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-mrt/SKILL.md +3 -3
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-scapi-custom/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-scapi-schemas/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-site-import-export/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-sites/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-cli/skills/b2c-slas/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/.codex-plugin/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/plugin.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-checkout-triage/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-job-health/SKILL.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-order-failure-triage/SKILL.md +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-order-failure-triage/references/order-evidence.md +2 -2
- package/node_modules/@salesforce/b2c-agent-plugins/b2c-ops/skills/b2c-production-triage/SKILL.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/README.md +4 -4
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/SKILL.md +76 -73
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/evals/trigger-evals.json +12 -10
- package/node_modules/@salesforce/b2c-agent-plugins/figma-to-sfnext-pagedesigner/skills/figma-to-sfnext-pagedesigner/references/PAGE-DESIGNER-SFN.md +49 -74
- package/node_modules/@salesforce/b2c-agent-plugins/package.json +1 -1
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/.codex-plugin/plugin.json +9 -6
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/README.md +43 -22
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/plugin.json +9 -6
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/SKILL.md +103 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-accessibility/references/checklist.md +64 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/SKILL.md +91 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-analytics-consent/references/CUSTOM-ADAPTER.md +49 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/SKILL.md +86 -79
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/references/COOKIES.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-authentication/references/LOGIN-FLOWS.md +59 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/SKILL.md +67 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-commerce-features/references/FEATURE-PREREQUISITES.md +37 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/SKILL.md +98 -136
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/COMPONENT-AUTHORING.md +118 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/SHAPE-TOKENS.md +51 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/STORYBOOK.md +54 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/TOKEN-SYSTEM.md +53 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-components/references/TROUBLESHOOTING.md +19 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/SKILL.md +116 -113
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/references/ENV-VARIABLES.md +55 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-configuration/references/MULTI-SITE-URLS.md +137 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/SKILL.md +100 -150
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/ACTIONS.md +53 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/API-CLIENTS.md +34 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/LOADERS.md +73 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/SCAPI-FETCHER.md +23 -77
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/SKILL.md +83 -97
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-deployment/references/MRT-DEPLOYMENT.md +37 -68
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/SKILL.md +73 -97
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/ACTION-HOOKS.md +57 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/BASE-AUDIT.md +47 -44
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/CLI-AND-INSTALL.md +58 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-extensions/references/EXTENSION-EXAMPLES.md +49 -86
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/SKILL.md +59 -114
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-hybrid-storefronts/references/HYBRID-PROXY-CONFIG.md +53 -90
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/SKILL.md +96 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-i18n/references/locale-config.md +35 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-overview/SKILL.md +101 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-overview/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/SKILL.md +152 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/BUSINESS-MANAGER.md +46 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/COMPONENT-REGISTRY.md +86 -53
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/DECORATOR-PATTERNS.md +119 -131
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/REVIEW-CHECKLIST.md +83 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-page-designer/references/TROUBLESHOOTING.md +35 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/SKILL.md +75 -105
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/references/PERFORMANCE-REVIEW-CHECKLIST.md +85 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-performance/references/SUSPENSE-AND-STREAMING.md +58 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/SKILL.md +103 -116
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/PROJECT-STRUCTURE.md +61 -99
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/SCRIPTS.md +47 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/SFNEXT-CLI.md +63 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/SKILL.md +70 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-quality-gates/references/lint-and-budgets.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/SKILL.md +121 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-revalidation/references/POLICIES-AND-TAGS.md +55 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/SKILL.md +86 -143
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/references/ROUTE-CONVENTIONS.md +51 -51
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-routing/references/URLS-AND-SEO-ROUTES.md +22 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/SKILL.md +126 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi/references/WORKED-EXAMPLE.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/SKILL.md +129 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/references/COOKIE-DOMAIN.md +39 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-security/references/TURNSTILE.md +43 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/SKILL.md +95 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/references/MULTI-DOMAIN-BASE-PATH.md +17 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-seo/references/SEO-ROUTES.md +31 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/SKILL.md +80 -89
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-state-management/references/PATTERNS.md +45 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/SKILL.md +105 -138
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/E2E.md +38 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/STORYBOOK-PATTERNS.md +73 -94
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-testing/references/UNIT-AND-ROUTE-TESTS.md +60 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/SKILL.md +104 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/evals/trigger-evals.json +5 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/references/REBRAND-CHECKLIST.md +29 -0
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next-figma/skills/sfnext-create-figma-kit/SKILL.md +3 -3
- package/oclif.manifest.json +21 -4
- package/package.json +3 -3
- package/content/guidance/storefront-next/sfnext-create-component/SKILL.md +0 -195
- package/content/guidance/storefront-next/sfnext-create-component/references/COMPONENT-AUTHORING.md +0 -206
- package/content/guidance/storefront-next/sfnext-create-component/references/PROJECT-STRUCTURE.md +0 -43
- package/content/guidance/storefront-next/sfnext-create-component/references/TOKEN-SYSTEM.md +0 -130
- package/content/guidance/storefront-next/sfnext-create-component/references/TROUBLESHOOTING.md +0 -34
- package/content/guidance/storefront-next/sfnext-create-vertical/SKILL.md +0 -135
- package/content/guidance/storefront-next/sfnext-create-vertical/references/COMPONENT-AUTHORING.md +0 -206
- package/content/guidance/storefront-next/sfnext-create-vertical/references/PROJECT-STRUCTURE.md +0 -43
- package/content/guidance/storefront-next/sfnext-create-vertical/references/TOKEN-SYSTEM.md +0 -130
- package/content/guidance/storefront-next/sfnext-create-vertical/references/TROUBLESHOOTING.md +0 -34
- package/content/guidance/storefront-next/sfnext-custom-apis/SKILL.md +0 -221
- package/content/guidance/storefront-next/sfnext-custom-apis/references/WORKFLOW-EXAMPLES.md +0 -294
- package/content/guidance/storefront-next/sfnext-data-fetching/references/LOADER-PATTERNS.md +0 -102
- package/content/guidance/storefront-next/sfnext-project-setup/references/ENV-VARIABLES.md +0 -82
- package/content/guidance/storefront-next/sfnext-scapi-management/SKILL.md +0 -203
- package/content/guidance/storefront-next/sfnext-scapi-management/references/CLI-COMMANDS.md +0 -122
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/SKILL.md +0 -195
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/COMPONENT-AUTHORING.md +0 -206
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/PROJECT-STRUCTURE.md +0 -43
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/TOKEN-SYSTEM.md +0 -130
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-component/references/TROUBLESHOOTING.md +0 -34
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/SKILL.md +0 -135
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/COMPONENT-AUTHORING.md +0 -206
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/PROJECT-STRUCTURE.md +0 -43
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/TOKEN-SYSTEM.md +0 -130
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-create-vertical/references/TROUBLESHOOTING.md +0 -34
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/SKILL.md +0 -221
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-custom-apis/references/WORKFLOW-EXAMPLES.md +0 -294
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-data-fetching/references/LOADER-PATTERNS.md +0 -102
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-project-setup/references/ENV-VARIABLES.md +0 -82
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/SKILL.md +0 -203
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/evals/trigger-evals.json +0 -12
- package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-scapi-management/references/CLI-COMMANDS.md +0 -122
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/custom-apis.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/custom-properties.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/jobs.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/products.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/promotions.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/saving.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/snippets.md +0 -0
- /package/content/guidance/mcp/{scapi → b2c-mcp-scapi}/references/tokens.md +0 -0
- /package/content/guidance/mcp/{server → b2c-mcp-server}/references/files.md +0 -0
package/node_modules/@salesforce/b2c-agent-plugins/storefront-next/skills/sfnext-theming/SKILL.md
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sfnext-theming
|
|
3
|
+
description: >-
|
|
4
|
+
Re-brand and re-skin a Storefront Next storefront: change the color palette, corner radius and shadows (shape tokens), header and footer colors, typography and web fonts, logo, favicon, hero scrims, and brand copy, with WCAG contrast checks. Use when asked to rebrand or restyle the storefront, change the primary color, swap the font, make the header dark, make cards rounded or flat, replace the logo, edit src/theme, core.css, header.css, brand.css, tailwind.css, base.css, or src/lib/fonts.ts, or verify a theme change in the Design System Storybook stories. Do not use for building or styling an individual component (use `storefront-next:sfnext-components`), Figma kit sync (use `storefront-next-figma:sfnext-create-figma-kit`), or site configuration (use `storefront-next:sfnext-configuration`).
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Theming a Storefront Next Storefront
|
|
8
|
+
|
|
9
|
+
Your storefront has exactly one theme, in `src/theme/`, and it is yours to edit. Rebranding is mostly value changes in a few CSS files; components pick the new look up through token classes. Choose a starting look with `sfnext create-storefront --vertical <id>` (a starter theme) and then customize it as below.
|
|
10
|
+
|
|
11
|
+
## Where things live
|
|
12
|
+
|
|
13
|
+
| Concern | File |
|
|
14
|
+
|---|---|
|
|
15
|
+
| Entry point and Tailwind `@source` scoping | `src/theme/index.css` (imports `shared.css`, which sets import order) |
|
|
16
|
+
| Palette: background, foreground, primary, secondary, accent, muted, border, ring, destructive/success/warning/info | `src/theme/tokens/core.css` |
|
|
17
|
+
| Shape: `--ui-radius`, `--ui-shadow`, `--ui-border-width` | `src/theme/tokens/core.css` |
|
|
18
|
+
| Header, menu, footer, newsletter band, `--header-logo-filter` | `src/theme/tokens/header.css` |
|
|
19
|
+
| Status and feedback colors | `src/theme/tokens/status.css` |
|
|
20
|
+
| Swatches, sidebar, agentic UI, payment and cart extras, focus helpers | `tokens/swatch.css`, `sidebar.css`, `agentic.css`, `components.css`, `custom.css` |
|
|
21
|
+
| `--brand-*` color primitives and hero scrims (`--hero-overlay-*`, `--hero-scrim`) | `src/theme/tokens/brand.css` |
|
|
22
|
+
| Font stacks `--font-sans/-serif/-mono`; token-to-utility bridge | `src/theme/tailwind.css` (`@theme inline`) |
|
|
23
|
+
| `@font-face`, base layer, `.section-container`, section-scoped shape rules | `src/theme/base.css` |
|
|
24
|
+
| Component-level CSS (navigation, cart sheet, toasts, store locator) | `src/theme/overrides/*.css` |
|
|
25
|
+
| Font binding and preload | `public/fonts/*.woff2`, `src/lib/fonts.ts` (used by `src/root.tsx`) |
|
|
26
|
+
| Logo, favicon, hero and payment images | `public/images/`, `public/favicon.ico` |
|
|
27
|
+
| Site name and brand strings | `src/locales/<locale>/translations.json` (`common.defaultSiteName`) |
|
|
28
|
+
|
|
29
|
+
Palette values are not all derived from `brand.css`: `core.css` sets `--primary` and friends directly, so change them there. Token-to-class wiring and the full token file list are covered in `storefront-next:sfnext-components` (token system reference).
|
|
30
|
+
|
|
31
|
+
## Workflow
|
|
32
|
+
|
|
33
|
+
### 1. Read the current theme
|
|
34
|
+
|
|
35
|
+
Open `src/theme/index.css`, `tokens/core.css`, `tokens/header.css`, and `tailwind.css` before editing. Keep variable names; change values.
|
|
36
|
+
|
|
37
|
+
### 2. Palette
|
|
38
|
+
|
|
39
|
+
Edit `:root` in `tokens/core.css`: `--primary`/`--primary-foreground`, `--background`/`--foreground`, `--secondary`, `--accent`, `--muted`, borders, `--ring`. Comments in the file record WCAG contrast ratios for the current values; recompute for yours. Minimums: 4.5:1 for text (`--primary` on `--primary-foreground`, `--foreground` on `--background`, each status color on its `-foreground`), 3:1 for borders and focus rings against the surface.
|
|
40
|
+
|
|
41
|
+
Update `tokens/status.css` if semantic colors clash with the new palette, and `tokens/swatch.css`, `tokens/components.css` where defaults look off.
|
|
42
|
+
|
|
43
|
+
### 3. Header, footer, and newsletter chrome
|
|
44
|
+
|
|
45
|
+
`tokens/header.css` is deliberately decoupled from `--primary`, so changing the primary color does not recolor the header. Set `--header-background`/`--header-foreground`, menu hover/active colors, and `--footer-*` yourself. The logo is an image: for a dark header with a dark logo, set `--header-logo-filter` (for example `brightness(0) invert(1)` turns a black logo white; `none` leaves it alone). `--newsletter-background` defaults to `var(--primary)`.
|
|
46
|
+
|
|
47
|
+
### 4. Shape
|
|
48
|
+
|
|
49
|
+
Set `--ui-radius`, `--ui-shadow`, `--ui-border-width` in `core.css` to re-skin every shadcn primitive at once. Flat and square: `0`, `none`, `0`. Soft and raised: `var(--radius-xl)`, a light shadow, `0`. Do not edit primitives or add `rounded-*`/`shadow-*` classes, and never write `--radius-ui` / `--shadow-ui` (compile-time bridges, silent no-op). Scoped overrides, section rules, and the Card border exception are covered in `storefront-next:sfnext-components` (shape tokens reference). If your default border width is 0, the section rules at the bottom of `base.css` re-enable 1px Card borders on account, auth, and checkout pages; adjust those to taste.
|
|
50
|
+
|
|
51
|
+
### 5. Typography
|
|
52
|
+
|
|
53
|
+
Four touch points, all must agree:
|
|
54
|
+
|
|
55
|
+
1. Put the variable `.woff2` in `public/fonts/`.
|
|
56
|
+
2. `src/lib/fonts.ts`: `import font from '/fonts/<file>.woff2'; export const primaryFont = font;` (`root.tsx` preloads it).
|
|
57
|
+
3. `@font-face` in `src/theme/base.css` (same URL, weight range, `font-display: swap`).
|
|
58
|
+
4. `--font-sans` / `--font-serif` / `--font-mono` in `src/theme/tailwind.css`, with a fallback stack of similar metrics.
|
|
59
|
+
|
|
60
|
+
Self-host fonts (WOFF2, preloaded, no third-party CDN). Remove the old font file if unused.
|
|
61
|
+
|
|
62
|
+
### 6. Assets and copy
|
|
63
|
+
|
|
64
|
+
- Logo: replace `public/images/logo.svg` (the `Logo` component in `src/components/logo` renders it; you can replace that component for an inline-SVG logo).
|
|
65
|
+
- Favicon: `public/favicon.ico`.
|
|
66
|
+
- Hero and promo images: `public/images/` (and the Page Designer content that references them).
|
|
67
|
+
- Brand name: `common.defaultSiteName` in each `src/locales/<locale>/translations.json` you ship (used in page titles).
|
|
68
|
+
- Hero text scrims: `--brand-black`/`--brand-white` in `brand.css` feed `--hero-overlay-dark/-light` and `--hero-scrim`; update them with the brand so hero text stays legible.
|
|
69
|
+
|
|
70
|
+
### 7. Dark mode
|
|
71
|
+
|
|
72
|
+
The shipped theme has one palette and no `.dark` token block. Do not promise dark mode; it would be new work (a `.dark` scope for every token file).
|
|
73
|
+
|
|
74
|
+
### 8. Verify
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pnpm dev # look at home, PLP, PDP, cart, checkout, account
|
|
78
|
+
pnpm storybook # Design System/Theme/Colors, Typography, Radius, Shadows
|
|
79
|
+
pnpm lint # color-linter flags hard-coded colors
|
|
80
|
+
pnpm typecheck
|
|
81
|
+
pnpm storybook:test --type=snapshot # add --update only after reviewing intended changes
|
|
82
|
+
pnpm storybook:test --type=a11y # contrast and ARIA via axe-core
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The `Design System/Theme/*` stories (`src/design-system/stories/`) render the live tokens and are the quickest visual check.
|
|
86
|
+
|
|
87
|
+
## Guardrails
|
|
88
|
+
|
|
89
|
+
- Change values in token files; do not sprinkle hex codes or `bg-[#...]` in components.
|
|
90
|
+
- Need a new token? Define it in a `tokens/*.css` file and bridge it in `@theme inline` in `tailwind.css` (see TOKEN-SYSTEM).
|
|
91
|
+
- Component-level CSS goes in `src/theme/overrides/*.css` (import it from `shared.css`) or `base.css`; prefer `[data-slot="..."]` selectors over utility-class selectors.
|
|
92
|
+
|
|
93
|
+
## Design handoff
|
|
94
|
+
|
|
95
|
+
If your designers work in Figma, keep the Figma variables and code tokens aligned with `storefront-next-figma:sfnext-create-figma-kit` (requires the Figma MCP server). Change the tokens in code first, then sync the kit.
|
|
96
|
+
|
|
97
|
+
## Related Skills
|
|
98
|
+
|
|
99
|
+
- `storefront-next:sfnext-components` - Build and style components with token classes and shape tokens
|
|
100
|
+
- `storefront-next:sfnext-accessibility` - Contrast, focus, and accessibility scans
|
|
101
|
+
- `storefront-next:sfnext-i18n` - Locale files that hold brand copy
|
|
102
|
+
- `storefront-next:sfnext-performance` - Font and image loading guidance
|
|
103
|
+
- `storefront-next:sfnext-page-designer` - Content and hero components authored in Page Designer
|
|
104
|
+
- `storefront-next-figma:sfnext-create-figma-kit` - Sync the Figma design kit with your tokens
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
[
|
|
2
|
+
{"query": "Re-skin my Storefront Next storefront: change the primary color to a deep green, swap the font to Inter, and make the header dark.", "should_trigger": true},
|
|
3
|
+
{"query": "Make the cards and buttons rounded with a soft shadow across the whole site. Where do I change that?", "should_trigger": true},
|
|
4
|
+
{"query": "Create a new ProductBadge component with CVA variants and a Storybook story that passes the snapshot tests.", "should_trigger": false}
|
|
5
|
+
]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Rebrand Checklist
|
|
2
|
+
|
|
3
|
+
Work top to bottom; each item names the file to touch.
|
|
4
|
+
|
|
5
|
+
- [ ] `src/theme/tokens/core.css`: `--primary`, `--primary-foreground`, `--background`, `--foreground`, `--secondary`, `--accent`, `--muted`, `--border`, `--input`, `--ring`
|
|
6
|
+
- [ ] `src/theme/tokens/core.css`: contrast re-checked (text 4.5:1, borders and focus rings 3:1); update the ratio comments
|
|
7
|
+
- [ ] `src/theme/tokens/core.css`: `--ui-radius`, `--ui-shadow`, `--ui-border-width`
|
|
8
|
+
- [ ] `src/theme/base.css`: section-scoped Card border rules still match the chosen border width
|
|
9
|
+
- [ ] `src/theme/tokens/header.css`: header, menu, footer, newsletter colors; `--header-logo-filter`
|
|
10
|
+
- [ ] `src/theme/tokens/status.css`: status colors still readable against the new surfaces
|
|
11
|
+
- [ ] `src/theme/tokens/brand.css`: `--brand-*` primitives and hero scrims
|
|
12
|
+
- [ ] `src/theme/tokens/swatch.css`, `components.css`: swatch and badge defaults
|
|
13
|
+
- [ ] Font: `public/fonts/`, `src/lib/fonts.ts`, `@font-face` in `src/theme/base.css`, `--font-*` in `src/theme/tailwind.css`
|
|
14
|
+
- [ ] `public/images/logo.svg`, `public/favicon.ico`, hero images
|
|
15
|
+
- [ ] `common.defaultSiteName` in `src/locales/*/translations.json`
|
|
16
|
+
- [ ] Page Designer content referencing old imagery or colors
|
|
17
|
+
- [ ] `pnpm lint`, `pnpm typecheck`, `pnpm storybook:test --type=snapshot`, `--type=a11y`
|
|
18
|
+
- [ ] Visual pass: home, PLP, PDP, cart, checkout, account, error pages
|
|
19
|
+
|
|
20
|
+
## Common mistakes
|
|
21
|
+
|
|
22
|
+
| Mistake | Result |
|
|
23
|
+
|---|---|
|
|
24
|
+
| Editing only `brand.css` | Little changes; the palette is in `core.css` |
|
|
25
|
+
| Writing `--radius-ui` or `--shadow-ui` | Silent no-op; use `--ui-radius` / `--ui-shadow` |
|
|
26
|
+
| Changing the font file but not `base.css` `@font-face` | Old font still loads or fallback shows |
|
|
27
|
+
| Forgetting `--header-logo-filter` after a header color change | Logo unreadable |
|
|
28
|
+
| Hard-coding hex in components | `pnpm lint` fails (`custom/color-linter`) and the theme no longer controls it |
|
|
29
|
+
| Changing `--primary` and expecting the header to follow | Header tokens are independent; edit `header.css` |
|
|
@@ -7,7 +7,7 @@ description: Build or sync a Storefront Next vertical's Figma design kit — dup
|
|
|
7
7
|
|
|
8
8
|
This skill is the entrypoint for setting up or syncing the **Figma design kit** for a Storefront Next vertical, so the kit stays aligned with the brand tokens defined in code.
|
|
9
9
|
|
|
10
|
-
It is the design-kit companion to `sfnext-
|
|
10
|
+
It is the design-kit companion to `sfnext-theming` (in the `storefront-next` plugin): create or change the brand tokens in code first, then run this skill to mirror them in Figma.
|
|
11
11
|
|
|
12
12
|
## Step 0 — Verify prerequisites (required)
|
|
13
13
|
|
|
@@ -121,8 +121,8 @@ All three must pass with zero errors and zero warnings.
|
|
|
121
121
|
|
|
122
122
|
## Related Skills
|
|
123
123
|
|
|
124
|
-
- `storefront-next:sfnext-
|
|
125
|
-
- `storefront-next:sfnext-
|
|
124
|
+
- `storefront-next:sfnext-theming` - Define the brand tokens in code (run this first)
|
|
125
|
+
- `storefront-next:sfnext-components` - Author the React component a Code Connect mapping points to
|
|
126
126
|
|
|
127
127
|
## Reference Documentation
|
|
128
128
|
|
package/oclif.manifest.json
CHANGED
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"type": "option"
|
|
82
82
|
},
|
|
83
83
|
"config": {
|
|
84
|
-
"description": "Path to config file (in dw.json format; defaults to ./dw.json)",
|
|
84
|
+
"description": "Path to config file (in dw.json format; defaults to ./dw.json; empty for none)",
|
|
85
85
|
"env": "SFCC_CONFIG",
|
|
86
86
|
"helpGroup": "GLOBAL",
|
|
87
87
|
"name": "config",
|
|
@@ -99,6 +99,15 @@
|
|
|
99
99
|
"multiple": false,
|
|
100
100
|
"type": "option"
|
|
101
101
|
},
|
|
102
|
+
"dotenv-file": {
|
|
103
|
+
"description": "Path to .env file used instead of ./.env (empty for none)",
|
|
104
|
+
"env": "SFCC_DOTENV_FILE",
|
|
105
|
+
"helpGroup": "GLOBAL",
|
|
106
|
+
"name": "dotenv-file",
|
|
107
|
+
"hasDynamicHelp": false,
|
|
108
|
+
"multiple": false,
|
|
109
|
+
"type": "option"
|
|
110
|
+
},
|
|
102
111
|
"project-directory": {
|
|
103
112
|
"aliases": [
|
|
104
113
|
"working-directory"
|
|
@@ -326,7 +335,7 @@
|
|
|
326
335
|
"type": "option"
|
|
327
336
|
},
|
|
328
337
|
"mrt-backend": {
|
|
329
|
-
"description": "MRT backend: auto (prefer SCAPI MRT when configured, else legacy),
|
|
338
|
+
"description": "MRT backend: legacy (default), auto (prefer SCAPI MRT when configured, else legacy), or scapi",
|
|
330
339
|
"env": "MRT_BACKEND",
|
|
331
340
|
"name": "mrt-backend",
|
|
332
341
|
"hasDynamicHelp": false,
|
|
@@ -458,12 +467,20 @@
|
|
|
458
467
|
"type": "option"
|
|
459
468
|
},
|
|
460
469
|
"docs-topics": {
|
|
461
|
-
"description": "Limit the documentation exposed by the docs tools to these categories (comma-separated allowlist). Options: script-api, job-step, commerce-api, pwa-kit-managed-runtime, sfnext, sfra, b2c-commerce, ocapi, tooling, help-admin, help-merchant, help-kb. Bounds the whole docs corpus; per-call category/storefront narrow within it. Unknown names are ignored.",
|
|
470
|
+
"description": "Limit the documentation exposed by the docs tools to these categories (comma-separated allowlist). Options: script-api, job-step, commerce-api, pwa-kit-managed-runtime, sfnext, sfra, b2c-commerce, commerce-solutions, ocapi, tooling, help-admin, help-merchant, help-kb. Bounds the whole docs corpus; per-call category/storefront narrow within it. Unknown names are ignored.",
|
|
462
471
|
"env": "SFCC_DOCS_TOPICS",
|
|
463
472
|
"name": "docs-topics",
|
|
464
473
|
"hasDynamicHelp": false,
|
|
465
474
|
"multiple": false,
|
|
466
475
|
"type": "option"
|
|
476
|
+
},
|
|
477
|
+
"scapi-schemas": {
|
|
478
|
+
"description": "Local SCAPI OpenAPI contracts for scapi_search and scapi_execute (comma-separated JSON files or directories). Each replaces the bundled or live contract with the same family/name/version from servers[0].url, or adds an API. Developer option for beta and pre-release APIs.",
|
|
479
|
+
"env": "SFCC_SCAPI_SCHEMAS",
|
|
480
|
+
"name": "scapi-schemas",
|
|
481
|
+
"hasDynamicHelp": false,
|
|
482
|
+
"multiple": false,
|
|
483
|
+
"type": "option"
|
|
467
484
|
}
|
|
468
485
|
},
|
|
469
486
|
"hasDynamicHelp": false,
|
|
@@ -476,5 +493,5 @@
|
|
|
476
493
|
"enableJsonFlag": false
|
|
477
494
|
}
|
|
478
495
|
},
|
|
479
|
-
"version": "3.
|
|
496
|
+
"version": "3.3.0"
|
|
480
497
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/b2c-dx-mcp",
|
|
3
3
|
"description": "MCP server for B2C Commerce developer experience tools",
|
|
4
|
-
"version": "3.
|
|
4
|
+
"version": "3.3.0",
|
|
5
5
|
"author": "Salesforce",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"repository": "SalesforceCommerceCloud/b2c-developer-tooling",
|
|
@@ -80,8 +80,8 @@
|
|
|
80
80
|
"ts-morph": "27.0.2",
|
|
81
81
|
"yaml": "2.9.0",
|
|
82
82
|
"zod": "4.5.4",
|
|
83
|
-
"@salesforce/b2c-agent-plugins": "1.
|
|
84
|
-
"@salesforce/b2c-tooling-sdk": "2.
|
|
83
|
+
"@salesforce/b2c-agent-plugins": "1.11.0",
|
|
84
|
+
"@salesforce/b2c-tooling-sdk": "2.4.0"
|
|
85
85
|
},
|
|
86
86
|
"bundledDependencies": [
|
|
87
87
|
"@modelcontextprotocol/server",
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sfnext-create-component
|
|
3
|
-
description: Author a new Storefront Next design-system component the right way — pick the correct layer (primitive vs composite), reuse-or-extend before creating, define CVA variants bound to semantic tokens, add data-slot attributes, satisfy the accessibility checklist, and ship a Storybook story. Use when asked to create, add, or build a new UI component, button/badge/tile/card variant, or design-system primitive. This is the design-system authoring discipline; for createPage/Suspense/shadcn page-rendering patterns see sfnext-components.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Create a Component Skill
|
|
7
|
-
|
|
8
|
-
This skill is the authoring discipline for adding a new component to a Storefront Next storefront: choosing the right layer, reusing before creating, and meeting the token / a11y / Storybook requirements that keep the design system consistent.
|
|
9
|
-
|
|
10
|
-
> **It complements `sfnext-components`.** That skill covers engineering patterns — `createPage`, Suspense/`Await` streaming, shadcn/ui setup, the `cn()` utility. **This** skill covers design-system authoring — the layer model, the extend-before-create gate, CVA variants bound to semantic tokens, `data-slot`, accessibility, and story coverage. Use both together when building UI.
|
|
11
|
-
|
|
12
|
-
## Before you start — scan first (extend before create)
|
|
13
|
-
|
|
14
|
-
Do not create a new component file until you have run this scan:
|
|
15
|
-
|
|
16
|
-
1. Search `src/components/` for components with a similar name or behaviour.
|
|
17
|
-
2. Search `src/components/ui/` for Shadcn primitives — run `npx shadcn@latest add <name>` to check whether it exists before hand-rolling one.
|
|
18
|
-
3. Apply the REUSE / EXTEND / CREATE decision:
|
|
19
|
-
- **REUSE** — an existing component already does this → use it as-is.
|
|
20
|
-
- **EXTEND** — an existing component is close → add a new CVA variant (cheaper than a new file).
|
|
21
|
-
- **CREATE** — nothing exists → proceed with this skill.
|
|
22
|
-
|
|
23
|
-
See [Component Authoring Reference](references/COMPONENT-AUTHORING.md) for the full layer model and the extend-before-create rule.
|
|
24
|
-
|
|
25
|
-
## Step 1 — Decide the layer
|
|
26
|
-
|
|
27
|
-
| Question | Layer | Location |
|
|
28
|
-
|----------|-------|----------|
|
|
29
|
-
| Pure UI element, no data or business logic? | **Primitive** | `src/components/ui/` (check shadcn first) |
|
|
30
|
-
| Assembles primitives or takes data props? | **Composite** | `src/components/` |
|
|
31
|
-
|
|
32
|
-
For primitives, always check shadcn before hand-rolling:
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
# from packages/template-retail-rsc-app
|
|
36
|
-
npx shadcn@latest add <component-name>
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Shadcn components land in `src/components/ui/` already wired to the token system. If it exists in shadcn, use it — do not hand-roll a replacement.
|
|
40
|
-
|
|
41
|
-
## Step 2 — Create the file with the copyright header
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
src/components/<feature>/<component-name>.tsx ← preferred (feature-grouped)
|
|
45
|
-
src/components/<component-name>.tsx ← acceptable for standalone components
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
Start every `.ts`/`.tsx` file with the Apache 2.0 copyright header (ESLint enforces it), then imports:
|
|
49
|
-
|
|
50
|
-
```tsx
|
|
51
|
-
import * as React from 'react'
|
|
52
|
-
import { cva, type VariantProps } from 'class-variance-authority'
|
|
53
|
-
import { cn } from '@/lib/utils'
|
|
54
|
-
// Import primitives from src/components/ui/ — not from @radix-ui directly
|
|
55
|
-
import { Button } from '@/components/ui/button'
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Step 3 — Type the props explicitly
|
|
59
|
-
|
|
60
|
-
```tsx
|
|
61
|
-
interface ProductTileProps {
|
|
62
|
-
productId: string
|
|
63
|
-
name: string
|
|
64
|
-
price: number
|
|
65
|
-
imageUrl: string
|
|
66
|
-
currency?: string
|
|
67
|
-
className?: string
|
|
68
|
-
}
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
No `any`. Extend `React.ComponentProps<'element'>` for native passthrough. Use discriminated unions for mutually exclusive prop shapes.
|
|
72
|
-
|
|
73
|
-
## Step 4 — Define CVA variants (if the component has visual states)
|
|
74
|
-
|
|
75
|
-
```tsx
|
|
76
|
-
const productTileVariants = cva(
|
|
77
|
-
'relative flex flex-col overflow-hidden rounded-md bg-card text-card-foreground',
|
|
78
|
-
{
|
|
79
|
-
variants: {
|
|
80
|
-
density: {
|
|
81
|
-
comfortable: 'gap-4 p-4',
|
|
82
|
-
compact: 'gap-2 p-2',
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
defaultVariants: { density: 'comfortable' },
|
|
86
|
-
}
|
|
87
|
-
)
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
**Token rules:** every class that affects color MUST use a semantic token utility (`bg-primary`, `text-foreground`, `border-border`, …). No raw hex, no `bg-black`, no `text-gray-500`. See [Token System Reference](references/TOKEN-SYSTEM.md).
|
|
91
|
-
|
|
92
|
-
## Step 5 — Write the component
|
|
93
|
-
|
|
94
|
-
```tsx
|
|
95
|
-
export function ProductTile({
|
|
96
|
-
productId,
|
|
97
|
-
name,
|
|
98
|
-
price,
|
|
99
|
-
imageUrl,
|
|
100
|
-
currency = 'USD',
|
|
101
|
-
className,
|
|
102
|
-
density,
|
|
103
|
-
...props
|
|
104
|
-
}: ProductTileProps & VariantProps<typeof productTileVariants>) {
|
|
105
|
-
return (
|
|
106
|
-
<article
|
|
107
|
-
data-slot="product-tile"
|
|
108
|
-
data-product-id={productId}
|
|
109
|
-
className={cn(productTileVariants({ density }), className)}
|
|
110
|
-
{...props}
|
|
111
|
-
>
|
|
112
|
-
<div data-slot="product-tile-image">{/* image */}</div>
|
|
113
|
-
<div data-slot="product-tile-body" className="flex flex-col gap-1">
|
|
114
|
-
<span data-slot="product-tile-name" className="text-sm font-medium text-foreground">
|
|
115
|
-
{name}
|
|
116
|
-
</span>
|
|
117
|
-
<span data-slot="product-tile-price" className="text-sm text-muted-foreground">
|
|
118
|
-
{new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(price)}
|
|
119
|
-
</span>
|
|
120
|
-
</div>
|
|
121
|
-
</article>
|
|
122
|
-
)
|
|
123
|
-
}
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
Required on every component:
|
|
127
|
-
- `data-slot` on the root and each named region.
|
|
128
|
-
- `className` accepted and merged via `cn()` **last** so callers can override.
|
|
129
|
-
- Native props spread via `{...props}`.
|
|
130
|
-
|
|
131
|
-
## Step 6 — Create the Storybook story
|
|
132
|
-
|
|
133
|
-
Every new component in `src/components/` needs a `.stories.tsx` — one story per CVA variant plus a `Snapshot` story for CI diffing.
|
|
134
|
-
|
|
135
|
-
```tsx
|
|
136
|
-
import type { Meta, StoryObj } from '@storybook/react'
|
|
137
|
-
import { ProductTile } from './product-tile'
|
|
138
|
-
|
|
139
|
-
const meta: Meta<typeof ProductTile> = {
|
|
140
|
-
title: 'Components/Product/ProductTile',
|
|
141
|
-
component: ProductTile,
|
|
142
|
-
}
|
|
143
|
-
export default meta
|
|
144
|
-
|
|
145
|
-
type Story = StoryObj<typeof ProductTile>
|
|
146
|
-
|
|
147
|
-
const defaultProps = { productId: 'P001', name: 'Classic Shirt', price: 89.99, imageUrl: '/placeholder.jpg' }
|
|
148
|
-
|
|
149
|
-
export const Default: Story = { args: defaultProps }
|
|
150
|
-
export const Compact: Story = { args: { ...defaultProps, density: 'compact' } }
|
|
151
|
-
|
|
152
|
-
export const Snapshot: Story = {
|
|
153
|
-
name: 'Snapshot',
|
|
154
|
-
render: () => (
|
|
155
|
-
<div className="grid grid-cols-2 gap-4">
|
|
156
|
-
<ProductTile {...defaultProps} density="comfortable" />
|
|
157
|
-
<ProductTile {...defaultProps} density="compact" />
|
|
158
|
-
</div>
|
|
159
|
-
),
|
|
160
|
-
}
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
## Step 7 — Accessibility check
|
|
164
|
-
|
|
165
|
-
- [ ] Interactive elements are `<button>` or `<a>`, never `<div onClick>`.
|
|
166
|
-
- [ ] All form inputs have `<Label htmlFor>`.
|
|
167
|
-
- [ ] Focus ring: `focus-visible:ring-ring focus-visible:ring-[3px]`.
|
|
168
|
-
- [ ] No color-only information (pair with icon or text).
|
|
169
|
-
- [ ] `aria-label` on icon-only buttons.
|
|
170
|
-
|
|
171
|
-
## Verification
|
|
172
|
-
|
|
173
|
-
Before marking the task complete, run from the monorepo root:
|
|
174
|
-
|
|
175
|
-
```bash
|
|
176
|
-
pnpm typecheck
|
|
177
|
-
pnpm lint
|
|
178
|
-
pnpm test-storybook:snapshot:agent
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
All three must pass with zero errors and zero warnings. Lint runs with `--max-warnings 0`.
|
|
182
|
-
|
|
183
|
-
## Related Skills
|
|
184
|
-
|
|
185
|
-
- `storefront-next:sfnext-components` - createPage HOC, Suspense/Await, shadcn/ui, Tailwind page-rendering patterns
|
|
186
|
-
- `storefront-next:sfnext-testing` - Vitest unit tests and Storybook interaction/a11y tests
|
|
187
|
-
- `storefront-next:sfnext-create-vertical` - Brand theming via the token layer
|
|
188
|
-
- `storefront-next:sfnext-extensions` - Injecting a component into a page via UITarget
|
|
189
|
-
|
|
190
|
-
## Reference Documentation
|
|
191
|
-
|
|
192
|
-
- [Component Authoring Reference](references/COMPONENT-AUTHORING.md) - Layer model, CVA, data-slot, extend-before-create
|
|
193
|
-
- [Token System Reference](references/TOKEN-SYSTEM.md) - Semantic token classes and dark mode rules
|
|
194
|
-
- [Project Structure Reference](references/PROJECT-STRUCTURE.md) - Where components live in the monorepo
|
|
195
|
-
- [Troubleshooting Reference](references/TROUBLESHOOTING.md) - Token, lint, and snapshot pitfalls
|
package/content/guidance/storefront-next/sfnext-create-component/references/COMPONENT-AUTHORING.md
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
# Component authoring standards
|
|
2
|
-
|
|
3
|
-
## Vertical extensions — existing components always have priority
|
|
4
|
-
|
|
5
|
-
When building a vertical extension (`src/extensions/<vertical>/`), check what the **base template already renders** before creating anything new.
|
|
6
|
-
|
|
7
|
-
**The rule**: if a base component already renders equivalent content at the same location, do NOT create an extension component that duplicates it. Extensions add what is missing — they never recreate what already exists.
|
|
8
|
-
|
|
9
|
-
### Decision gate (run this before creating any extension component)
|
|
10
|
-
|
|
11
|
-
1. **Find the base component** — read the relevant route and trace what components it renders.
|
|
12
|
-
2. **Check every rendered section** — does the base already render this content (description, accordion, badge, banner, etc.)?
|
|
13
|
-
3. **If yes** — use a UITarget slot on the existing content, or customise it via token/variant. Do not create a parallel extension component that renders the same thing.
|
|
14
|
-
4. **If no** — the extension is justified. Register it at the correct UITarget.
|
|
15
|
-
|
|
16
|
-
### Concrete examples
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
❌ WRONG — base ProductView already renders a description accordion ("Overview").
|
|
20
|
-
ProductDetailsExtension adds its own "Overview" section → duplicate.
|
|
21
|
-
|
|
22
|
-
✅ CORRECT — base already renders description + adapter sections (Specifications, Care Instructions…).
|
|
23
|
-
ProductDetailsExtension only adds the two sections the base does NOT have:
|
|
24
|
-
Shipping & Returns, Warranty Info.
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
❌ WRONG — base renders product title in ProductInfo.
|
|
29
|
-
The vertical extension renders product title again in a brand stamp.
|
|
30
|
-
|
|
31
|
-
✅ CORRECT — brand stamp adds ONLY the brand line ("<BRAND> · <tagline>")
|
|
32
|
-
above the existing ProductInfo, not the title.
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
**Do not create duplicates unless the user explicitly asks for them.**
|
|
36
|
-
The cost of a duplicate is paid on every page load, in every test, in every Figma sync. The correct
|
|
37
|
-
approach is almost always a UITarget slot or a CSS token override.
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Extend before create — mandatory check before any new component
|
|
42
|
-
|
|
43
|
-
Before writing a single line of a new component, answer these questions in order:
|
|
44
|
-
|
|
45
|
-
1. **Does an existing component already do this?** Search `src/components/` and `src/components/ui/` by name and by behaviour.
|
|
46
|
-
2. **Can an existing component cover this with a new CVA variant?** A new `variant` or `size` value is always cheaper than a new file.
|
|
47
|
-
3. **Can composition cover this?** Wrap an existing component in a thin composite rather than duplicating it.
|
|
48
|
-
4. **Only if all three answers are no** — create a new component.
|
|
49
|
-
|
|
50
|
-
```tsx
|
|
51
|
-
// ❌ WRONG — creating BrandPrimaryButton when Button already exists
|
|
52
|
-
export function BrandPrimaryButton({ children }: Props) {
|
|
53
|
-
return <button className="bg-[#1e6f3a] text-white ...">{children}</button>
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// ✅ CORRECT — new CVA variant on the existing Button primitive
|
|
57
|
-
// In src/components/ui/button.tsx, add to buttonVariants:
|
|
58
|
-
brand: 'bg-primary text-primary-foreground hover:bg-primary/90',
|
|
59
|
-
|
|
60
|
-
// ✅ CORRECT — thin composite when behaviour differs
|
|
61
|
-
export function AddToCartButton(props: AddToCartButtonProps) {
|
|
62
|
-
return <Button variant="default" {...props}>Add to Cart</Button>
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## Multi-vertical extension governance
|
|
69
|
-
|
|
70
|
-
When a vertical needs to extend a component, choose the right maintenance model upfront:
|
|
71
|
-
|
|
72
|
-
```
|
|
73
|
-
Does the change only affect visual tokens (color, font, spacing)?
|
|
74
|
-
└─ YES → CVA variant on the existing component. Token system handles most of this via brand.css.
|
|
75
|
-
└─ NO → Is this structural change needed by only one vertical?
|
|
76
|
-
└─ YES → src/extensions/<vertical-name>/ via UITarget injection. Never touch core.
|
|
77
|
-
└─ NO → Will another vertical need the same structural pattern?
|
|
78
|
-
└─ YES → Add a slot/renderProp to the BASE component.
|
|
79
|
-
Each vertical provides its own implementation of that slot.
|
|
80
|
-
└─ UNSURE → Build vertical-specific first (extensions/).
|
|
81
|
-
Promote to base when a second vertical needs the same pattern.
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
**Never add vertical-specific logic (if brandA / if brandB) to a shared component.** If you find yourself writing that, the slot/render-prop pattern is missing from the base component.
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
## Layer model — know which layer you are in before writing a line
|
|
89
|
-
|
|
90
|
-
| Layer | Where | What lives here |
|
|
91
|
-
|-------|-------|----------------|
|
|
92
|
-
| **Primitive** | `src/components/ui/` | Shadcn-sourced, Radix-backed primitives. Pure rendering, no business logic, no SCAPI. |
|
|
93
|
-
| **Composite** | `src/components/` | Assembled from primitives. May accept loaders/data props. No direct SCAPI calls. |
|
|
94
|
-
| **Page / Route** | `src/routes/` | Loader, action, error boundary, page layout. Fetches data, passes to composites. |
|
|
95
|
-
| **Extension** | `src/extensions/<name>/` | Opt-in additions via UITarget. Self-contained. Never modify core from inside an extension. |
|
|
96
|
-
|
|
97
|
-
Do not skip layers. A page component should not build raw `<button>` elements. A primitive should not call `useFetcher`.
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## Primitives (`src/components/ui/`)
|
|
102
|
-
|
|
103
|
-
These files come from Shadcn and must be treated as infrastructure, not business components.
|
|
104
|
-
|
|
105
|
-
**When extending a primitive:**
|
|
106
|
-
- Do not edit the primitive file directly (it may be refreshed from Shadcn upstream).
|
|
107
|
-
- Create a wrapper component in `src/components/` instead.
|
|
108
|
-
- Re-export from the wrapper so imports stay consistent.
|
|
109
|
-
|
|
110
|
-
**Allowed changes to primitive files:**
|
|
111
|
-
- Adding a new CVA variant that maps to an existing semantic token — that's it.
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
## CVA — class-variance-authority
|
|
116
|
-
|
|
117
|
-
All styled components with more than one visual state use CVA.
|
|
118
|
-
|
|
119
|
-
```tsx
|
|
120
|
-
import { cva, type VariantProps } from 'class-variance-authority'
|
|
121
|
-
import { cn } from '@/lib/utils'
|
|
122
|
-
|
|
123
|
-
const badgeVariants = cva(
|
|
124
|
-
'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors',
|
|
125
|
-
{
|
|
126
|
-
variants: {
|
|
127
|
-
variant: {
|
|
128
|
-
default: 'border-transparent bg-primary text-primary-foreground',
|
|
129
|
-
secondary: 'border-transparent bg-secondary text-secondary-foreground',
|
|
130
|
-
destructive: 'border-transparent bg-destructive text-white',
|
|
131
|
-
outline: 'text-foreground',
|
|
132
|
-
},
|
|
133
|
-
},
|
|
134
|
-
defaultVariants: { variant: 'default' },
|
|
135
|
-
}
|
|
136
|
-
)
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
Rules:
|
|
140
|
-
- Every variant value must use semantic token classes only. No raw hex.
|
|
141
|
-
- `cn()` from `@/lib/utils` is always the last call — enables external className overrides.
|
|
142
|
-
- Export the `*Variants` function alongside the component so it can be reused in related components.
|
|
143
|
-
|
|
144
|
-
---
|
|
145
|
-
|
|
146
|
-
## data-slot attributes
|
|
147
|
-
|
|
148
|
-
Every presentational element in a component tree must carry a `data-slot` attribute for testing and Figma tracing.
|
|
149
|
-
|
|
150
|
-
```tsx
|
|
151
|
-
// ✅
|
|
152
|
-
<div data-slot="product-tile">
|
|
153
|
-
<div data-slot="product-tile-image">…</div>
|
|
154
|
-
<div data-slot="product-tile-body">…</div>
|
|
155
|
-
</div>
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
The slot name should be kebab-case and match the component name.
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
## TypeScript requirements
|
|
163
|
-
|
|
164
|
-
- All props are explicitly typed. No `any`.
|
|
165
|
-
- Use `React.ComponentProps<'element'>` to extend native element props.
|
|
166
|
-
- Discriminated unions for components with mutually exclusive prop shapes.
|
|
167
|
-
- `asChild` pattern (via Radix `Slot`) for polymorphic rendering — never accept an `as` prop.
|
|
168
|
-
|
|
169
|
-
---
|
|
170
|
-
|
|
171
|
-
## Copyright header
|
|
172
|
-
|
|
173
|
-
Every `.ts` / `.tsx` file must begin with the Apache 2.0 header. ESLint enforces this.
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## Naming conventions
|
|
178
|
-
|
|
179
|
-
| Thing | Convention | Example |
|
|
180
|
-
|-------|-----------|---------|
|
|
181
|
-
| Component files | kebab-case | `product-tile.tsx` |
|
|
182
|
-
| Component exports | PascalCase | `ProductTile` |
|
|
183
|
-
| Variant objects (CVA) | camelCase + "Variants" suffix | `productTileVariants` |
|
|
184
|
-
| data-slot values | kebab-case matching component | `product-tile` |
|
|
185
|
-
| Hook files | kebab-case prefixed with "use-" | `use-cart.ts` |
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## Storybook requirement
|
|
190
|
-
|
|
191
|
-
Every new component in `src/components/` must have a `.stories.tsx` file.
|
|
192
|
-
- One story per CVA variant.
|
|
193
|
-
- Default export: `{ title: 'Components/ComponentName', component: ComponentName }`.
|
|
194
|
-
- Include a snapshot story (`name: 'Snapshot'`) so CI can diff it.
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
## Accessibility checklist
|
|
199
|
-
|
|
200
|
-
Before marking a component complete, verify:
|
|
201
|
-
|
|
202
|
-
- [ ] Interactive elements are native `<button>` or `<a>`, not `<div onClick>`.
|
|
203
|
-
- [ ] All inputs have an associated `<Label>` using `htmlFor` (or Radix `Label` with `asChild`).
|
|
204
|
-
- [ ] Focus ring uses `focus-visible:ring-ring focus-visible:ring-[3px]` — matches the button primitive.
|
|
205
|
-
- [ ] Color information is not communicated by color alone (pair with icon or text).
|
|
206
|
-
- [ ] Motion: wrap animations in `prefers-reduced-motion` if not handled by Tailwind's `motion-safe:` prefix.
|