@sarjallab09/figma-intelligence 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +26 -0
- package/README.md +327 -0
- package/bin/cli.js +859 -0
- package/design-bridge/.env.example +5 -0
- package/design-bridge/bridge.js +196 -0
- package/design-bridge/lib/assets.js +367 -0
- package/design-bridge/lib/prompt.js +85 -0
- package/design-bridge/lib/server.js +66 -0
- package/design-bridge/lib/stitch.js +37 -0
- package/design-bridge/lib/tokens.js +82 -0
- package/design-bridge/package-lock.json +579 -0
- package/design-bridge/package.json +19 -0
- package/figma-bridge-plugin/README.md +97 -0
- package/figma-bridge-plugin/anthropic-chat-runner.js +192 -0
- package/figma-bridge-plugin/bridge-relay.js +2363 -0
- package/figma-bridge-plugin/chat-runner.js +459 -0
- package/figma-bridge-plugin/code.js +1528 -0
- package/figma-bridge-plugin/codex-runner.js +505 -0
- package/figma-bridge-plugin/component-schemas.js +110 -0
- package/figma-bridge-plugin/content-context.js +869 -0
- package/figma-bridge-plugin/create-button.js +216 -0
- package/figma-bridge-plugin/gemini-cli-runner.js +291 -0
- package/figma-bridge-plugin/gemini-runner.js +187 -0
- package/figma-bridge-plugin/html-to-figma.js +927 -0
- package/figma-bridge-plugin/knowledge-hub/.gitkeep +0 -0
- package/figma-bridge-plugin/knowledge-hub/uspec-references/anatomy-spec.md +159 -0
- package/figma-bridge-plugin/knowledge-hub/uspec-references/api-spec.md +162 -0
- package/figma-bridge-plugin/knowledge-hub/uspec-references/color-spec.md +148 -0
- package/figma-bridge-plugin/knowledge-hub/uspec-references/full-spec-template.md +314 -0
- package/figma-bridge-plugin/knowledge-hub/uspec-references/property-spec.md +175 -0
- package/figma-bridge-plugin/knowledge-hub/uspec-references/screen-reader-spec.md +180 -0
- package/figma-bridge-plugin/knowledge-hub/uspec-references/structure-spec.md +165 -0
- package/figma-bridge-plugin/manifest.json +21 -0
- package/figma-bridge-plugin/package-lock.json +1936 -0
- package/figma-bridge-plugin/package.json +20 -0
- package/figma-bridge-plugin/perplexity-runner.js +188 -0
- package/figma-bridge-plugin/references/SKILL.md +178 -0
- package/figma-bridge-plugin/references/anatomy-spec.md +159 -0
- package/figma-bridge-plugin/references/api-spec.md +162 -0
- package/figma-bridge-plugin/references/color-spec.md +148 -0
- package/figma-bridge-plugin/references/full-spec-template.md +314 -0
- package/figma-bridge-plugin/references/property-spec.md +175 -0
- package/figma-bridge-plugin/references/screen-reader-spec.md +180 -0
- package/figma-bridge-plugin/references/structure-spec.md +165 -0
- package/figma-bridge-plugin/shared-prompt-config.js +604 -0
- package/figma-bridge-plugin/spec-helpers/build-table.js +269 -0
- package/figma-bridge-plugin/spec-helpers/classify-elements.js +189 -0
- package/figma-bridge-plugin/spec-helpers/index.js +35 -0
- package/figma-bridge-plugin/spec-helpers/parse-figma-link.js +49 -0
- package/figma-bridge-plugin/spec-helpers/position-markers.js +158 -0
- package/figma-bridge-plugin/stitch-auth.js +322 -0
- package/figma-bridge-plugin/stitch-runner.js +1427 -0
- package/figma-bridge-plugin/token-resolver.js +107 -0
- package/figma-bridge-plugin/ui.html +4467 -0
- package/figma-intelligence-layer/.env.example +39 -0
- package/figma-intelligence-layer/docs/local-image-generation.md +60 -0
- package/figma-intelligence-layer/examples/comfyui-workflow-template.example.json +101 -0
- package/figma-intelligence-layer/jest.config.js +14 -0
- package/figma-intelligence-layer/mcp-config.json +19 -0
- package/figma-intelligence-layer/package-lock.json +5892 -0
- package/figma-intelligence-layer/package.json +48 -0
- package/figma-intelligence-layer/scripts/setup-comfyui-local.sh +67 -0
- package/figma-intelligence-layer/scripts/start-comfyui.sh +33 -0
- package/figma-intelligence-layer/src/index.ts +2233 -0
- package/figma-intelligence-layer/src/shared/auto-layout-validator.ts +404 -0
- package/figma-intelligence-layer/src/shared/cache.ts +187 -0
- package/figma-intelligence-layer/src/shared/color-operations.ts +533 -0
- package/figma-intelligence-layer/src/shared/color-utils.ts +138 -0
- package/figma-intelligence-layer/src/shared/component-script-builder.ts +413 -0
- package/figma-intelligence-layer/src/shared/component-templates.ts +2767 -0
- package/figma-intelligence-layer/src/shared/concept-taxonomy.ts +694 -0
- package/figma-intelligence-layer/src/shared/decision-log.ts +128 -0
- package/figma-intelligence-layer/src/shared/design-system-context.ts +568 -0
- package/figma-intelligence-layer/src/shared/design-system-intelligence.ts +131 -0
- package/figma-intelligence-layer/src/shared/design-system-matcher.ts +184 -0
- package/figma-intelligence-layer/src/shared/design-system-normalizers.ts +196 -0
- package/figma-intelligence-layer/src/shared/design-system-tokens.ts +295 -0
- package/figma-intelligence-layer/src/shared/dtcg-validator.ts +530 -0
- package/figma-intelligence-layer/src/shared/enrichment-pipeline.ts +671 -0
- package/figma-intelligence-layer/src/shared/figma-bridge.ts +1408 -0
- package/figma-intelligence-layer/src/shared/font-config.ts +126 -0
- package/figma-intelligence-layer/src/shared/icon-catalog.ts +360 -0
- package/figma-intelligence-layer/src/shared/icon-fetch.ts +80 -0
- package/figma-intelligence-layer/src/shared/prototype-script-builder.ts +162 -0
- package/figma-intelligence-layer/src/shared/response-compression.ts +440 -0
- package/figma-intelligence-layer/src/shared/semantic-token-catalog.ts +324 -0
- package/figma-intelligence-layer/src/shared/token-binder.ts +505 -0
- package/figma-intelligence-layer/src/shared/token-math.ts +427 -0
- package/figma-intelligence-layer/src/shared/token-naming.ts +468 -0
- package/figma-intelligence-layer/src/shared/token-utils.ts +420 -0
- package/figma-intelligence-layer/src/shared/types.ts +346 -0
- package/figma-intelligence-layer/src/shared/typography-presets.ts +94 -0
- package/figma-intelligence-layer/src/shared/unsplash.ts +165 -0
- package/figma-intelligence-layer/src/shared/vision-client.ts +607 -0
- package/figma-intelligence-layer/src/shared/vision-provider-anthropic.ts +334 -0
- package/figma-intelligence-layer/src/shared/vision-provider-openai.ts +446 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-handler.ts +782 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotate-renderer.ts +496 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/a11y-annotation-kit.ts +230 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/colorblind-sim.ts +66 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/index.ts +810 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-analyzer.ts +1191 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-figma-page.ts +1346 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/keyboard-sr-order-handler.ts +148 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-figma-page.ts +499 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/vpat-report.ts +910 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-checker.ts +989 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/a11y-audit/wcag-criteria.ts +1160 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/design-from-ref/index.ts +424 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/component-recognizer.ts +38 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/ds-matcher.ts +111 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/font-matcher.ts +114 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/icon-resolver.ts +103 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/index.ts +1060 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/layout-segmenter.ts +18 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/token-inferencer.ts +39 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/screen-cloner/vision-pipeline.ts +58 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/sketch-to-design/index.ts +298 -0
- package/figma-intelligence-layer/src/tools/phase1-vision/visual-audit/index.ts +197 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/component-audit/index.ts +494 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/intent-translator/index.ts +356 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/container-patterns.ts +123 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/layout-intelligence/index.ts +663 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/built-in-rules.yaml +56 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/index.ts +614 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/lint-rules/rule-engine.ts +113 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/color-theory.ts +178 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/theme-generator/index.ts +470 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/index.ts +429 -0
- package/figma-intelligence-layer/src/tools/phase2-accuracy/variant-expander/token-override-maps.ts +226 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/ai-image-insert/index.ts +535 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/index.ts +660 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/component-archaeologist/pattern-fingerprints.ts +209 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/composition-builder/index.ts +540 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/figma-animated-build.ts +391 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/index.ts +2019 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/page-architect/screen-templates.ts +131 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/prototype-map/index.ts +381 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/prototype-wire/index.ts +565 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/swarm-build/index.ts +764 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/system-drift/index.ts +535 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/unsplash-search/index.ts +84 -0
- package/figma-intelligence-layer/src/tools/phase3-generation/url-to-frame/index.ts +401 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/css-animations.ts +68 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/framer-motion.ts +78 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/code-generators/swift-animations.ts +93 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/animation-specifier/index.ts +596 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/ci-check/index.ts +462 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/export-tokens/index.ts +1470 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/generate-component-code/index.ts +829 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/handoff-spec/index.ts +702 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/icon-library-sync/index.ts +483 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/index.ts +501 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/sync-from-code/storybook-parser.ts +106 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/watch-docs/index.ts +676 -0
- package/figma-intelligence-layer/src/tools/phase4-sync/webhook-listener/index.ts +560 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/apg-doc/index.ts +1043 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/component-detection.ts +620 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/anatomy.ts +331 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/color-tokens.ts +77 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/properties.ts +54 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/snapshot.ts +287 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/spacing.ts +71 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/states.ts +43 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/extractors/typography.ts +71 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/index.ts +221 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/_default.ts +166 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/accordion.ts +232 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/alert.ts +234 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar-group.ts +270 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/avatar.ts +249 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/badge.ts +231 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/banner.ts +293 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/breadcrumb.ts +240 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/button.ts +243 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/calendar.ts +307 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/card.ts +143 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/checkbox.ts +227 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/chip.ts +233 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/combobox.ts +282 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/datepicker.ts +276 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/divider.ts +223 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/drawer.ts +255 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/dropdown-menu.ts +289 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/empty-state.ts +261 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/file-uploader.ts +290 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/form.ts +265 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/grid.ts +238 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/icon.ts +255 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/index.ts +128 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-edit.ts +286 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/inline-message.ts +255 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/input.ts +330 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/link.ts +247 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/list.ts +250 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/menu.ts +247 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/modal.ts +144 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navbar.ts +264 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/navigation.ts +251 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/number-input.ts +261 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/pagination.ts +248 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/popover.ts +270 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/progress.ts +251 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/radio.ts +142 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/range-slider.ts +282 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/rating.ts +250 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/search.ts +258 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/segmented-control.ts +265 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/select.ts +319 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/skeleton.ts +256 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/slider.ts +232 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/spinner.ts +239 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/status-dot.ts +252 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/stepper.ts +270 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/table.ts +244 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tabs.ts +143 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tag.ts +243 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/textarea.ts +259 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/time-picker.ts +293 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toast.ts +144 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toggle.ts +289 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/toolbar.ts +267 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/tooltip.ts +232 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/treeview.ts +257 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/typography.ts +319 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/legacy-compat.ts +121 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/anatomy-diagram.ts +430 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/figma-page.ts +312 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/json.ts +129 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/markdown.ts +78 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/renderers/visual-doc.ts +2333 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/accessibility.ts +100 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/anatomy.ts +32 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/color-tokens.ts +59 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/content-guidance.ts +18 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/design-tokens.ts +53 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/interaction-rules.ts +19 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/overview.ts +91 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/properties-api.ts +71 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/qa-criteria.ts +19 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/related-components.ts +110 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/responsive.ts +19 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/size-specs.ts +67 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/spacing-structure.ts +58 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/state-specs.ts +79 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/states.ts +50 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/type-hierarchy.ts +33 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/typography.ts +55 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/usage-guidelines.ts +73 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/sections/variants.ts +81 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/types.ts +409 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/index.ts +198 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/renderer.ts +701 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/component-spec-sheet/types.ts +88 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/decision-log/index.ts +135 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/design-decision-log/index.ts +491 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/ds-primitives/index.ts +416 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/ds-scaffolder/index.ts +722 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/ds-variables/index.ts +449 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/health-report/index.ts +393 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/index.ts +406 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/figma-page.ts +292 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/json.ts +24 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/markdown.ts +172 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/taxonomy-docs/renderers/naming-guide.ts +409 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/token-analytics/index.ts +594 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/token-docs/index.ts +710 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/token-migrate/index.ts +458 -0
- package/figma-intelligence-layer/src/tools/phase5-governance/token-naming/index.ts +134 -0
- package/figma-intelligence-layer/tests/apg-doc.test.ts +101 -0
- package/figma-intelligence-layer/tests/design-system-context.test.ts +152 -0
- package/figma-intelligence-layer/tests/design-system-matcher.test.ts +144 -0
- package/figma-intelligence-layer/tests/figma-bridge.test.ts +83 -0
- package/figma-intelligence-layer/tests/generate-image-and-insert.test.ts +56 -0
- package/figma-intelligence-layer/tests/screen-cloner-regression.test.ts +69 -0
- package/figma-intelligence-layer/tests/smoke.test.ts +174 -0
- package/figma-intelligence-layer/tests/spec-generator.test.ts +127 -0
- package/figma-intelligence-layer/tests/token-migrate.test.ts +21 -0
- package/figma-intelligence-layer/tests/token-naming.test.ts +30 -0
- package/figma-intelligence-layer/tsconfig.json +19 -0
- package/package.json +35 -0
- package/scripts/clean-existing-chunks.js +179 -0
- package/scripts/connect-ai-tool.js +490 -0
- package/scripts/convert-hub-pdfs.js +425 -0
- package/scripts/figma-mcp-status.js +349 -0
- package/scripts/register-codex-mcp.js +96 -0
package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/skeleton.ts
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* skeleton.ts — Gold-standard design knowledge for Skeleton components
|
|
3
|
+
*/
|
|
4
|
+
import type { ComponentKnowledge } from "../types.js";
|
|
5
|
+
|
|
6
|
+
export const skeletonKnowledge: ComponentKnowledge = {
|
|
7
|
+
description:
|
|
8
|
+
"Loading placeholder | Previews the shape and layout of content before it loads | Supports text, circle, rectangle, and card patterns with shimmer or pulse animation",
|
|
9
|
+
|
|
10
|
+
stateSpecifications: [
|
|
11
|
+
{
|
|
12
|
+
state: "Default",
|
|
13
|
+
visualChange: "Placeholder shapes rendered in a neutral gray fill with animated shimmer or pulse effect",
|
|
14
|
+
opacity: "1",
|
|
15
|
+
cursorWeb: "default",
|
|
16
|
+
usage: "Content is loading — skeleton approximates the final layout to reduce perceived wait time",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
state: "Loaded",
|
|
20
|
+
visualChange: "Skeleton elements are removed and replaced by actual content; transition may include a brief fade-in",
|
|
21
|
+
opacity: "1",
|
|
22
|
+
cursorWeb: "default",
|
|
23
|
+
usage: "Data has finished loading — skeleton is no longer needed and must be removed from the DOM or hidden",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
state: "Error",
|
|
27
|
+
visualChange: "Skeleton may remain briefly before being replaced by an error state or empty state component",
|
|
28
|
+
opacity: "1",
|
|
29
|
+
cursorWeb: "default",
|
|
30
|
+
usage: "Data fetch failed — skeleton should be replaced with an error message, not left indefinitely",
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
|
|
34
|
+
propertyDescriptions: {
|
|
35
|
+
type: "Shape variant — 'text' (rectangular bars simulating text lines), 'circle' (round placeholder for avatars), 'rect' (generic rectangle), 'card' (full card layout with multiple placeholder elements)",
|
|
36
|
+
animation: "Animation style — 'shimmer' (left-to-right gradient sweep) or 'pulse' (opacity fade in/out)",
|
|
37
|
+
width: "Width of the skeleton element; can be a fixed value (e.g. '200px'), percentage ('100%'), or 'auto' to match parent",
|
|
38
|
+
height: "Height of the skeleton element; for text type, this is the line height; for circle, this equals width",
|
|
39
|
+
lines: "Number of text lines to render (text type only); last line is typically shorter (75% width) to simulate natural text",
|
|
40
|
+
borderRadius: "Corner rounding of the skeleton shape; circle type forces 50%; text and rect use small radius; card uses card radius",
|
|
41
|
+
speed: "Animation cycle duration in milliseconds; controls how fast the shimmer or pulse repeats; default 1500ms",
|
|
42
|
+
count: "Number of skeleton instances to render in a repeated layout (e.g. 3 list item skeletons)",
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
sizeSpecifications: [
|
|
46
|
+
{
|
|
47
|
+
size: "Text Line",
|
|
48
|
+
height: "12-16px per line",
|
|
49
|
+
paddingLR: "0px",
|
|
50
|
+
fontSize: "N/A",
|
|
51
|
+
iconSize: "N/A",
|
|
52
|
+
borderRadius: "4px",
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
size: "Circle Small",
|
|
56
|
+
height: "32px",
|
|
57
|
+
paddingLR: "0px",
|
|
58
|
+
fontSize: "N/A",
|
|
59
|
+
iconSize: "N/A",
|
|
60
|
+
borderRadius: "50%",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
size: "Circle Medium",
|
|
64
|
+
height: "40px",
|
|
65
|
+
paddingLR: "0px",
|
|
66
|
+
fontSize: "N/A",
|
|
67
|
+
iconSize: "N/A",
|
|
68
|
+
borderRadius: "50%",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
size: "Circle Large",
|
|
72
|
+
height: "48px",
|
|
73
|
+
paddingLR: "0px",
|
|
74
|
+
fontSize: "N/A",
|
|
75
|
+
iconSize: "N/A",
|
|
76
|
+
borderRadius: "50%",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
size: "Rectangle",
|
|
80
|
+
height: "variable",
|
|
81
|
+
paddingLR: "0px",
|
|
82
|
+
fontSize: "N/A",
|
|
83
|
+
iconSize: "N/A",
|
|
84
|
+
borderRadius: "6px",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
size: "Card",
|
|
88
|
+
height: "variable",
|
|
89
|
+
paddingLR: "16px internal",
|
|
90
|
+
fontSize: "N/A",
|
|
91
|
+
iconSize: "N/A",
|
|
92
|
+
borderRadius: "8px",
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
|
|
96
|
+
designTokenBindings: [
|
|
97
|
+
{
|
|
98
|
+
property: "Base Color",
|
|
99
|
+
tokenName: "$skeleton-base",
|
|
100
|
+
role: "Static background fill for the skeleton placeholder shape",
|
|
101
|
+
fallback: "#E4E7EC",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
property: "Shimmer Highlight",
|
|
105
|
+
tokenName: "$skeleton-shimmer",
|
|
106
|
+
role: "Lighter color used for the shimmer gradient sweep highlight",
|
|
107
|
+
fallback: "#F2F4F7",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
property: "Pulse Min Opacity",
|
|
111
|
+
tokenName: "$skeleton-pulse-min",
|
|
112
|
+
role: "Minimum opacity during the pulse animation cycle",
|
|
113
|
+
fallback: "0.4",
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
property: "Pulse Max Opacity",
|
|
117
|
+
tokenName: "$skeleton-pulse-max",
|
|
118
|
+
role: "Maximum opacity during the pulse animation cycle",
|
|
119
|
+
fallback: "1",
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
property: "Animation Duration",
|
|
123
|
+
tokenName: "$skeleton-duration",
|
|
124
|
+
role: "Duration of one full shimmer or pulse animation cycle",
|
|
125
|
+
fallback: "1500ms",
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
property: "Animation Easing",
|
|
129
|
+
tokenName: "$skeleton-easing",
|
|
130
|
+
role: "Easing function for the animation; linear for shimmer, ease-in-out for pulse",
|
|
131
|
+
fallback: "linear",
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
property: "Border Radius Text",
|
|
135
|
+
tokenName: "$radius-sm",
|
|
136
|
+
role: "Corner rounding for text line skeletons",
|
|
137
|
+
fallback: "4px",
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
property: "Border Radius Rect",
|
|
141
|
+
tokenName: "$radius-md",
|
|
142
|
+
role: "Corner rounding for rectangle skeletons",
|
|
143
|
+
fallback: "6px",
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
property: "Border Radius Card",
|
|
147
|
+
tokenName: "$radius-card",
|
|
148
|
+
role: "Corner rounding for card skeleton matching actual card component",
|
|
149
|
+
fallback: "8px",
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
property: "Spacing Between Lines",
|
|
153
|
+
tokenName: "$spacing-xs",
|
|
154
|
+
role: "Vertical gap between text line skeletons",
|
|
155
|
+
fallback: "8px",
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
|
|
159
|
+
structureRules: [
|
|
160
|
+
"Each skeleton element is a simple div with background-color and optional border-radius — no text content or interactive elements",
|
|
161
|
+
"Text type renders multiple horizontal bars stacked vertically with $spacing-xs gap between lines",
|
|
162
|
+
"The last text line should be 60-75% width to simulate the natural end of a text paragraph",
|
|
163
|
+
"Circle type uses equal width and height with border-radius 50% to form a perfect circle",
|
|
164
|
+
"Card type composes multiple skeleton elements: a rect for the image area, circle for avatar, and text lines for content",
|
|
165
|
+
"Shimmer animation uses a CSS gradient that translates from left to right across the element",
|
|
166
|
+
"Pulse animation uses a CSS keyframe that oscillates opacity between $skeleton-pulse-min and $skeleton-pulse-max",
|
|
167
|
+
"Skeleton elements should match the approximate dimensions and layout of the content they replace to prevent layout shift",
|
|
168
|
+
"When count > 1, render multiple skeleton instances with the same layout as the final repeated content (e.g. list items)",
|
|
169
|
+
],
|
|
170
|
+
|
|
171
|
+
typeHierarchyRules: [
|
|
172
|
+
"Skeleton has no text content — all typography rules are N/A",
|
|
173
|
+
"Text line skeleton height should approximate the font-size + line-height of the content it replaces",
|
|
174
|
+
"Heading skeleton lines should be taller and wider than body text skeleton lines to match visual hierarchy",
|
|
175
|
+
"Label skeleton lines should be shorter in width than body text lines to approximate label length",
|
|
176
|
+
],
|
|
177
|
+
|
|
178
|
+
interactionRules: [
|
|
179
|
+
{ event: "None", trigger: "N/A", action: "Skeleton elements are non-interactive — no hover, click, focus, or keyboard events" },
|
|
180
|
+
{ event: "Content Load", trigger: "Data becomes available", action: "Replace skeleton with actual content; optionally animate the transition with a fade-in" },
|
|
181
|
+
{ event: "Prefers Reduced Motion", trigger: "User OS setting prefers-reduced-motion: reduce", action: "Disable shimmer/pulse animation; show static skeleton with base color only" },
|
|
182
|
+
{ event: "Timeout", trigger: "Content fails to load within a reasonable time", action: "Replace skeleton with an error state or retry action — do not leave skeleton indefinitely" },
|
|
183
|
+
],
|
|
184
|
+
|
|
185
|
+
contentGuidance: [
|
|
186
|
+
"Use skeleton loading instead of spinners when the layout of the incoming content is predictable",
|
|
187
|
+
"Match skeleton shapes to the actual content layout as closely as possible to reduce layout shift on load",
|
|
188
|
+
"Use text type skeletons for paragraphs, descriptions, and data fields with known line counts",
|
|
189
|
+
"Use circle type skeletons for avatars and profile images",
|
|
190
|
+
"Use rect type skeletons for images, thumbnails, and custom-sized content blocks",
|
|
191
|
+
"Use card type skeletons for card components, combining image, avatar, and text placeholders",
|
|
192
|
+
"Always set a loading timeout — never leave skeletons displayed indefinitely if content fails to load",
|
|
193
|
+
"Prefer shimmer animation for primary content areas; pulse for smaller or secondary elements",
|
|
194
|
+
],
|
|
195
|
+
|
|
196
|
+
responsiveBehaviour: [
|
|
197
|
+
{ breakpoint: "Mobile (<768px)", behavior: "Skeleton widths adapt to container; text lines are full-width; circle sizes may reduce to sm" },
|
|
198
|
+
{ breakpoint: "Tablet (768-1023px)", behavior: "Standard skeleton layout; card skeletons may shift from grid to stack" },
|
|
199
|
+
{ breakpoint: "Desktop (1024-1439px)", behavior: "Full skeleton layout matching the final content grid; multiple card skeletons in a row" },
|
|
200
|
+
{ breakpoint: "Ultra-wide (>=1440px)", behavior: "Skeleton layout respects content max-width constraints; does not stretch to fill viewport" },
|
|
201
|
+
],
|
|
202
|
+
|
|
203
|
+
accessibilitySpec: {
|
|
204
|
+
intro:
|
|
205
|
+
"Skeleton elements must be invisible to assistive technologies while the loading state is clearly communicated to screen readers through the parent container's ARIA attributes.",
|
|
206
|
+
requirements: [
|
|
207
|
+
{ requirement: "Aria Busy", level: "A", notes: "The parent container of skeleton content must have aria-busy='true' while loading, removed when content appears" },
|
|
208
|
+
{ requirement: "Aria Hidden", level: "A", notes: "Individual skeleton elements must have aria-hidden='true' so they are not announced by screen readers" },
|
|
209
|
+
{ requirement: "Live Region", level: "AA", notes: "An aria-live='polite' region should announce when content has finished loading (e.g. 'Content loaded')" },
|
|
210
|
+
{ requirement: "Reduced Motion", level: "AA", notes: "Animation must respect prefers-reduced-motion media query; show static skeleton when motion is reduced" },
|
|
211
|
+
{ requirement: "Loading Announcement", level: "A", notes: "Screen readers should be informed that content is loading via aria-busy or a visually hidden 'Loading...' text" },
|
|
212
|
+
{ requirement: "Not Focusable", level: "A", notes: "Skeleton elements must not be in the tab order — they are placeholder visuals only" },
|
|
213
|
+
],
|
|
214
|
+
outro: [
|
|
215
|
+
"When skeleton is replaced by content, ensure focus management is handled correctly — focus should move to the first interactive element of the loaded content if triggered by a user action",
|
|
216
|
+
"Do not use skeleton as the only loading indicator for critical actions — pair with a screen reader announcement",
|
|
217
|
+
"Test with screen readers to verify that skeletons are truly invisible and the loading state is communicated through the parent aria-busy",
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
qaAcceptanceCriteria: [
|
|
222
|
+
{ check: "Visual Regression", platform: "All", expectedResult: "Skeleton shapes render at correct dimensions, color, and border-radius for each type" },
|
|
223
|
+
{ check: "Shimmer Animation", platform: "Web", expectedResult: "Gradient sweeps left-to-right smoothly; animation loops infinitely; no visual glitches" },
|
|
224
|
+
{ check: "Pulse Animation", platform: "Web", expectedResult: "Opacity oscillates between min and max values; timing is smooth with ease-in-out" },
|
|
225
|
+
{ check: "Reduced Motion", platform: "Web", expectedResult: "Animation disabled when prefers-reduced-motion: reduce is set; static skeleton displayed" },
|
|
226
|
+
{ check: "Text Line Layout", platform: "All", expectedResult: "Multiple lines stacked with correct spacing; last line is shorter (60-75% width)" },
|
|
227
|
+
{ check: "Circle Shape", platform: "All", expectedResult: "Perfect circle rendered; width equals height; border-radius is 50%" },
|
|
228
|
+
{ check: "Card Composition", platform: "All", expectedResult: "Card skeleton includes image rect, avatar circle, and text lines in correct layout" },
|
|
229
|
+
{ check: "Content Replacement", platform: "Web", expectedResult: "Skeleton removed cleanly when data loads; no layout shift between skeleton and content" },
|
|
230
|
+
{ check: "Aria Busy", platform: "Web", expectedResult: "Parent container has aria-busy='true' during loading; removed after content appears" },
|
|
231
|
+
{ check: "Aria Hidden", platform: "Web", expectedResult: "Skeleton elements have aria-hidden='true'; not announced by screen readers" },
|
|
232
|
+
{ check: "Screen Reader", platform: "Web", expectedResult: "Loading state announced; 'Content loaded' announced when skeleton is replaced" },
|
|
233
|
+
{ check: "Not Focusable", platform: "Web", expectedResult: "Tab key skips all skeleton elements; no focus trap during loading" },
|
|
234
|
+
{ check: "Timeout Handling", platform: "All", expectedResult: "Error state or retry action displayed if content does not load within timeout" },
|
|
235
|
+
],
|
|
236
|
+
|
|
237
|
+
dos: [
|
|
238
|
+
"Use skeleton loading for predictable content layouts where the shape of the final content is known",
|
|
239
|
+
"Match skeleton dimensions to the actual content as closely as possible to minimize layout shift",
|
|
240
|
+
"Set aria-busy='true' on the parent container while skeleton is visible",
|
|
241
|
+
"Mark individual skeleton elements with aria-hidden='true'",
|
|
242
|
+
"Respect prefers-reduced-motion by disabling shimmer/pulse animation for users who prefer reduced motion",
|
|
243
|
+
"Use consistent animation speed across all skeletons on the same page for visual cohesion",
|
|
244
|
+
"Always provide a timeout and fallback for skeleton states — never display indefinitely",
|
|
245
|
+
],
|
|
246
|
+
|
|
247
|
+
donts: [
|
|
248
|
+
"Do not use skeleton for content with unpredictable layouts — use a spinner or progress indicator instead",
|
|
249
|
+
"Do not make skeleton elements focusable or interactive — they are visual placeholders only",
|
|
250
|
+
"Do not leave skeletons visible indefinitely — always transition to content, error, or empty state",
|
|
251
|
+
"Do not animate skeleton elements when the user has prefers-reduced-motion enabled",
|
|
252
|
+
"Do not use skeleton as a design element or decorative pattern — it is strictly a loading indicator",
|
|
253
|
+
"Do not render hundreds of skeleton elements simultaneously — virtualize or limit to visible viewport",
|
|
254
|
+
"Do not place skeleton elements inside aria-live regions directly — use the parent container's aria-busy instead",
|
|
255
|
+
],
|
|
256
|
+
};
|
package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/slider.ts
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* slider.ts — Gold-standard design knowledge for Slider components
|
|
3
|
+
*/
|
|
4
|
+
import type { ComponentKnowledge } from "../types.js";
|
|
5
|
+
|
|
6
|
+
export const sliderKnowledge: ComponentKnowledge = {
|
|
7
|
+
description:
|
|
8
|
+
"Continuous value selector | Range input control | Numeric value adjuster",
|
|
9
|
+
|
|
10
|
+
stateSpecifications: [
|
|
11
|
+
{
|
|
12
|
+
state: "Default",
|
|
13
|
+
visualChange: "Track bar with filled portion and thumb positioned at current value",
|
|
14
|
+
opacity: "1",
|
|
15
|
+
cursorWeb: "pointer",
|
|
16
|
+
usage: "Resting state — slider is interactive and displays the current value",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
state: "Hover",
|
|
20
|
+
visualChange: "Thumb scales up slightly (1.15x) and gains a subtle shadow; track highlight brightens",
|
|
21
|
+
opacity: "1",
|
|
22
|
+
cursorWeb: "grab",
|
|
23
|
+
usage: "Mouse cursor enters the thumb or track hit area",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
state: "Active / Dragging",
|
|
27
|
+
visualChange: "Thumb scales to 1.2x with pronounced shadow; value tooltip appears above thumb",
|
|
28
|
+
opacity: "1",
|
|
29
|
+
cursorWeb: "grabbing",
|
|
30
|
+
usage: "User is actively dragging the thumb along the track",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
state: "Focus",
|
|
34
|
+
visualChange: "2px focus ring around the thumb element, offset by 2px",
|
|
35
|
+
opacity: "1",
|
|
36
|
+
cursorWeb: "pointer",
|
|
37
|
+
usage: "Thumb receives keyboard focus via Tab key",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
state: "Disabled",
|
|
41
|
+
visualChange: "Track, fill, and thumb switch to muted/disabled tokens; no interaction possible",
|
|
42
|
+
opacity: "0.4",
|
|
43
|
+
cursorWeb: "not-allowed",
|
|
44
|
+
usage: "Slider value cannot be changed due to form state or permissions",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
state: "Error",
|
|
48
|
+
visualChange: "Track or thumb border switches to error token; helper text shows validation message",
|
|
49
|
+
opacity: "1",
|
|
50
|
+
cursorWeb: "pointer",
|
|
51
|
+
usage: "Current value is outside an acceptable range or fails validation",
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
|
|
55
|
+
propertyDescriptions: {
|
|
56
|
+
value: "Current numeric value of the slider; must be between min and max",
|
|
57
|
+
min: "Minimum allowed value — the left/bottom end of the track",
|
|
58
|
+
max: "Maximum allowed value — the right/top end of the track",
|
|
59
|
+
step: "Increment amount for each keyboard arrow press or tick mark; 0 allows continuous values",
|
|
60
|
+
disabled: "When true the slider is non-interactive: muted visuals, aria-disabled='true'",
|
|
61
|
+
showValue: "When true, a label or tooltip displays the current numeric value near the thumb",
|
|
62
|
+
range: "When true, two thumbs define a value range (min-thumb and max-thumb) instead of a single value",
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
sizeSpecifications: [
|
|
66
|
+
{
|
|
67
|
+
size: "Small",
|
|
68
|
+
height: "24px",
|
|
69
|
+
paddingLR: "8px",
|
|
70
|
+
fontSize: "11px",
|
|
71
|
+
iconSize: "12px",
|
|
72
|
+
borderRadius: "999px",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
size: "Medium",
|
|
76
|
+
height: "32px",
|
|
77
|
+
paddingLR: "12px",
|
|
78
|
+
fontSize: "12px",
|
|
79
|
+
iconSize: "16px",
|
|
80
|
+
borderRadius: "999px",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
size: "Large",
|
|
84
|
+
height: "40px",
|
|
85
|
+
paddingLR: "16px",
|
|
86
|
+
fontSize: "14px",
|
|
87
|
+
iconSize: "20px",
|
|
88
|
+
borderRadius: "999px",
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
|
|
92
|
+
designTokenBindings: [
|
|
93
|
+
{
|
|
94
|
+
property: "Track Background",
|
|
95
|
+
tokenName: "$slider-track-bg",
|
|
96
|
+
role: "Unfilled portion of the track bar",
|
|
97
|
+
fallback: "#E4E7EC",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
property: "Track Fill",
|
|
101
|
+
tokenName: "$slider-track-fill",
|
|
102
|
+
role: "Filled/active portion of the track from min to current value",
|
|
103
|
+
fallback: "#2563EB",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
property: "Thumb Background",
|
|
107
|
+
tokenName: "$slider-thumb-bg",
|
|
108
|
+
role: "Circular draggable handle fill color",
|
|
109
|
+
fallback: "#FFFFFF",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
property: "Thumb Border",
|
|
113
|
+
tokenName: "$slider-thumb-border",
|
|
114
|
+
role: "Border around the thumb for definition against track and page",
|
|
115
|
+
fallback: "#2563EB",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
property: "Thumb Shadow",
|
|
119
|
+
tokenName: "$shadow-slider-thumb",
|
|
120
|
+
role: "Elevation shadow on the thumb during hover and drag",
|
|
121
|
+
fallback: "0 2px 6px rgba(0,0,0,0.15)",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
property: "Focus Ring",
|
|
125
|
+
tokenName: "$focus-ring",
|
|
126
|
+
role: "Keyboard focus indicator around the thumb",
|
|
127
|
+
fallback: "0 0 0 2px #FFFFFF, 0 0 0 4px #2E90FA",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
property: "Value Label",
|
|
131
|
+
tokenName: "$slider-value-text",
|
|
132
|
+
role: "Text color for the current value label or tooltip",
|
|
133
|
+
fallback: "#344054",
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
|
|
137
|
+
structureRules: [
|
|
138
|
+
"Track is a horizontal bar with border-radius 999px (fully rounded); height is 4px (sm), 6px (md), or 8px (lg)",
|
|
139
|
+
"Thumb is a circle centered vertically on the track; diameter is 16px (sm), 20px (md), or 24px (lg)",
|
|
140
|
+
"Fill region extends from the track start (min) to the thumb center position",
|
|
141
|
+
"Value tooltip floats above the thumb during drag; connected by a small arrow pointer",
|
|
142
|
+
"Dual-thumb range mode places two thumbs on the track; fill region spans between them",
|
|
143
|
+
"Tick marks are evenly spaced vertical lines on the track when step is defined and showTicks is true",
|
|
144
|
+
"Min and max labels are positioned at the track endpoints below the bar",
|
|
145
|
+
],
|
|
146
|
+
|
|
147
|
+
typeHierarchyRules: [
|
|
148
|
+
"Value label uses Tabular Nums (monospaced digits) to prevent layout shift as numbers change",
|
|
149
|
+
"Min/max labels use Regular weight (400) at a font-size one step below the value label",
|
|
150
|
+
"Value tooltip text uses Medium weight (500) on a dark background",
|
|
151
|
+
"Font variant: tabular-nums ensures digit columns stay aligned during drag",
|
|
152
|
+
"Labels use sentence case; units (%, px, etc.) are appended after a thin space",
|
|
153
|
+
],
|
|
154
|
+
|
|
155
|
+
interactionRules: [
|
|
156
|
+
{ event: "Drag", trigger: "pointerdown on thumb then pointermove", action: "Update value proportionally to horizontal pointer position along track" },
|
|
157
|
+
{ event: "Track Click", trigger: "pointerup on track (not thumb)", action: "Snap thumb to clicked position; update value immediately" },
|
|
158
|
+
{ event: "Arrow Right/Up", trigger: "Right or Up arrow while focused", action: "Increment value by one step; clamp at max" },
|
|
159
|
+
{ event: "Arrow Left/Down", trigger: "Left or Down arrow while focused", action: "Decrement value by one step; clamp at min" },
|
|
160
|
+
{ event: "Home", trigger: "Home key while focused", action: "Set value to min" },
|
|
161
|
+
{ event: "End", trigger: "End key while focused", action: "Set value to max" },
|
|
162
|
+
{ event: "Page Up/Down", trigger: "PageUp or PageDown while focused", action: "Increment or decrement by 10% of the range" },
|
|
163
|
+
],
|
|
164
|
+
|
|
165
|
+
contentGuidance: [
|
|
166
|
+
"Always show min and max labels so users understand the value range",
|
|
167
|
+
"Display the current numeric value near the thumb or in an adjacent text field",
|
|
168
|
+
"Pair the slider with an input field for users who prefer typing exact values",
|
|
169
|
+
"Use clear units of measurement (%, px, ms) appended to the value",
|
|
170
|
+
"Provide a descriptive label above the slider explaining what the value controls",
|
|
171
|
+
"For range sliders, label both the min-thumb and max-thumb values clearly",
|
|
172
|
+
],
|
|
173
|
+
|
|
174
|
+
responsiveBehaviour: [
|
|
175
|
+
{ breakpoint: "Mobile (<768px)", behavior: "Slider fills full container width; thumb size increases to 28px for touch; value tooltip shown during drag" },
|
|
176
|
+
{ breakpoint: "Tablet (768-1023px)", behavior: "Slider spans available width within form layout; standard thumb size" },
|
|
177
|
+
{ breakpoint: "Desktop (1024-1439px)", behavior: "Slider constrained by parent container; hover states fully active" },
|
|
178
|
+
{ breakpoint: "Ultra-wide (>=1440px)", behavior: "Slider max-width capped to prevent overly long tracks (~480px)" },
|
|
179
|
+
],
|
|
180
|
+
|
|
181
|
+
accessibilitySpec: {
|
|
182
|
+
intro:
|
|
183
|
+
"Sliders must communicate their value, range, and orientation to assistive technology. Full keyboard control is required.",
|
|
184
|
+
requirements: [
|
|
185
|
+
{ requirement: "role='slider'", level: "A", notes: "The thumb element must have role='slider' for screen reader identification" },
|
|
186
|
+
{ requirement: "aria-valuenow", level: "A", notes: "Must reflect the current numeric value of the slider in real time" },
|
|
187
|
+
{ requirement: "aria-valuemin / aria-valuemax", level: "A", notes: "Define the permissible range so screen readers can announce bounds" },
|
|
188
|
+
{ requirement: "aria-valuetext", level: "A", notes: "Provide a human-readable value string when the numeric value alone is insufficient (e.g., '50%')" },
|
|
189
|
+
{ requirement: "Keyboard Control", level: "A", notes: "Arrow keys adjust by step; Home/End jump to min/max; PageUp/PageDown by 10%" },
|
|
190
|
+
{ requirement: "Contrast", level: "AA", notes: "Thumb boundary must meet 3:1 against track and page; fill color must meet 3:1 against track" },
|
|
191
|
+
{ requirement: "Touch Target", level: "AA", notes: "Thumb touch target is at least 44x44px regardless of visual size" },
|
|
192
|
+
],
|
|
193
|
+
outro: [
|
|
194
|
+
"For dual-thumb range sliders, each thumb must be independently focusable with its own aria-valuenow",
|
|
195
|
+
"Announce value changes to screen readers using aria-live or by updating aria-valuenow during drag",
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
|
|
199
|
+
qaAcceptanceCriteria: [
|
|
200
|
+
{ check: "Drag Tracking", platform: "Web", expectedResult: "Thumb follows pointer precisely during drag; value updates in real time" },
|
|
201
|
+
{ check: "Track Click", platform: "Web", expectedResult: "Clicking the track snaps thumb to click position; no animation delay" },
|
|
202
|
+
{ check: "Keyboard Step", platform: "Web", expectedResult: "Arrow keys increment/decrement by configured step; Home/End reach min/max" },
|
|
203
|
+
{ check: "Value Clamping", platform: "All", expectedResult: "Value never exceeds min or max bounds via any input method" },
|
|
204
|
+
{ check: "Range Mode", platform: "All", expectedResult: "Two thumbs independently draggable; cannot cross each other; fill spans between them" },
|
|
205
|
+
{ check: "Value Display", platform: "All", expectedResult: "Current value shown in tooltip during drag and/or in a persistent label" },
|
|
206
|
+
{ check: "Screen Reader", platform: "Web", expectedResult: "Announces role, current value, min, max, and value changes" },
|
|
207
|
+
{ check: "Disabled State", platform: "All", expectedResult: "Muted visuals; drag, click, and keyboard have no effect; aria-disabled='true'" },
|
|
208
|
+
{ check: "Focus Ring", platform: "Web", expectedResult: "Focus ring visible around thumb on keyboard focus; hidden on mouse interaction" },
|
|
209
|
+
{ check: "Touch Accuracy", platform: "Mobile", expectedResult: "Thumb enlarged to 28px; drag tracking accurate with finger input" },
|
|
210
|
+
{ check: "RTL Support", platform: "Web", expectedResult: "Track direction reverses; min is on the right; keyboard arrows behave correctly" },
|
|
211
|
+
],
|
|
212
|
+
|
|
213
|
+
dos: [
|
|
214
|
+
"Always display min and max labels at the track endpoints",
|
|
215
|
+
"Show the current value in a tooltip or adjacent label during interaction",
|
|
216
|
+
"Pair sliders with a text input for precise value entry",
|
|
217
|
+
"Use appropriate step values to avoid meaningless precision (e.g., step=1 for integers)",
|
|
218
|
+
"Ensure the thumb is large enough for comfortable touch interaction (44px minimum)",
|
|
219
|
+
"Use the filled track region to give visual feedback about the selected value",
|
|
220
|
+
"Support both pointer drag and keyboard arrow keys for value adjustment",
|
|
221
|
+
],
|
|
222
|
+
|
|
223
|
+
donts: [
|
|
224
|
+
"Do not use sliders for fewer than 5 possible values — use radio buttons or a stepper instead",
|
|
225
|
+
"Do not hide the min/max range — users need context to choose meaningful values",
|
|
226
|
+
"Do not allow the dual-thumb handles to cross or overlap each other",
|
|
227
|
+
"Do not use sliders for non-numeric selections (e.g., categories or text options)",
|
|
228
|
+
"Do not make the track too short — minimum 120px to allow fine-grained control",
|
|
229
|
+
"Do not remove the filled track region — it provides essential spatial feedback",
|
|
230
|
+
"Do not ignore keyboard accessibility — arrow keys, Home, End, and Page keys are required",
|
|
231
|
+
],
|
|
232
|
+
};
|