@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/popover.ts
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* popover.ts — Gold-standard design knowledge for Popover components
|
|
3
|
+
*/
|
|
4
|
+
import type { ComponentKnowledge } from "../types.js";
|
|
5
|
+
|
|
6
|
+
export const popoverKnowledge: ComponentKnowledge = {
|
|
7
|
+
description:
|
|
8
|
+
"Interactive floating panel | Triggered by click | Displays rich content in context",
|
|
9
|
+
|
|
10
|
+
stateSpecifications: [
|
|
11
|
+
{
|
|
12
|
+
state: "Closed",
|
|
13
|
+
visualChange: "Popover panel is not rendered or is hidden; trigger element appears in its default state",
|
|
14
|
+
opacity: "0",
|
|
15
|
+
cursorWeb: "pointer",
|
|
16
|
+
usage: "Default resting state — popover content is not visible to the user",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
state: "Open",
|
|
20
|
+
visualChange: "Floating panel appears adjacent to the trigger with optional arrow; background overlay may dim surrounding content",
|
|
21
|
+
opacity: "1",
|
|
22
|
+
cursorWeb: "default",
|
|
23
|
+
usage: "User has clicked the trigger and the popover content is displayed for interaction",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
state: "Opening (Animating In)",
|
|
27
|
+
visualChange: "Panel fades in and scales from 95% to 100% over the transition duration; origin matches placement direction",
|
|
28
|
+
opacity: "0 → 1",
|
|
29
|
+
cursorWeb: "default",
|
|
30
|
+
usage: "Transition state between closed and fully open — content becomes visible progressively",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
state: "Closing (Animating Out)",
|
|
34
|
+
visualChange: "Panel fades out and scales from 100% to 95% over the transition duration; pointer-events disabled during animation",
|
|
35
|
+
opacity: "1 → 0",
|
|
36
|
+
cursorWeb: "default",
|
|
37
|
+
usage: "Transition state between open and fully closed — content is being dismissed",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
state: "Focus Within",
|
|
41
|
+
visualChange: "Focus ring appears on the currently focused interactive element inside the popover panel",
|
|
42
|
+
opacity: "1",
|
|
43
|
+
cursorWeb: "default",
|
|
44
|
+
usage: "Keyboard user is navigating interactive content within the popover",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
state: "Trigger Focused",
|
|
48
|
+
visualChange: "2px focus ring offset by 2px from the trigger element edge, using $focus-ring token",
|
|
49
|
+
opacity: "1",
|
|
50
|
+
cursorWeb: "pointer",
|
|
51
|
+
usage: "Trigger element receives keyboard focus via Tab; popover does not open on focus alone",
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
|
|
55
|
+
propertyDescriptions: {
|
|
56
|
+
trigger: "The element that, when clicked, opens the popover panel; can be a button, icon button, or any interactive element",
|
|
57
|
+
placement: "Preferred position of the popover relative to its trigger — top, bottom, left, right, or auto (flips to avoid viewport clipping)",
|
|
58
|
+
hasArrow: "When true renders a triangular arrow/caret connecting the popover panel to its trigger element for visual association",
|
|
59
|
+
offset: "Distance in pixels between the trigger element and the popover panel edge; default is 8px",
|
|
60
|
+
closeOnClickOutside: "When true the popover dismisses if the user clicks anywhere outside the panel boundaries; default is true",
|
|
61
|
+
closeOnEscape: "When true pressing the Escape key dismisses the popover and returns focus to the trigger; default is true",
|
|
62
|
+
isOpen: "Controlled open state — when provided the component operates in controlled mode and ignores internal toggle logic",
|
|
63
|
+
onOpenChange: "Callback fired when the popover opens or closes; receives the new boolean open state as its argument",
|
|
64
|
+
initialFocus: "Ref or selector for the element that receives focus when the popover opens; defaults to the first focusable element",
|
|
65
|
+
returnFocusOnClose: "When true focus returns to the trigger element after the popover is dismissed; default is true",
|
|
66
|
+
trapFocus: "When true keyboard focus is trapped within the popover panel, preventing Tab from leaving until dismissed",
|
|
67
|
+
role: "ARIA role applied to the popover panel — typically 'dialog' for interactive content; defaults to 'dialog'",
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
sizeSpecifications: [
|
|
71
|
+
{
|
|
72
|
+
size: "Small",
|
|
73
|
+
height: "auto (min 80px)",
|
|
74
|
+
paddingLR: "12px",
|
|
75
|
+
fontSize: "12px",
|
|
76
|
+
iconSize: "16px",
|
|
77
|
+
borderRadius: "8px",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
size: "Medium",
|
|
81
|
+
height: "auto (min 120px)",
|
|
82
|
+
paddingLR: "16px",
|
|
83
|
+
fontSize: "14px",
|
|
84
|
+
iconSize: "20px",
|
|
85
|
+
borderRadius: "10px",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
size: "Large",
|
|
89
|
+
height: "auto (min 160px)",
|
|
90
|
+
paddingLR: "20px",
|
|
91
|
+
fontSize: "16px",
|
|
92
|
+
iconSize: "24px",
|
|
93
|
+
borderRadius: "12px",
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
|
|
97
|
+
designTokenBindings: [
|
|
98
|
+
{
|
|
99
|
+
property: "Background",
|
|
100
|
+
tokenName: "$popover-bg",
|
|
101
|
+
role: "Panel surface color — elevated above the page surface",
|
|
102
|
+
fallback: "#FFFFFF",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
property: "Border",
|
|
106
|
+
tokenName: "$popover-border",
|
|
107
|
+
role: "Subtle border separating popover from surrounding content",
|
|
108
|
+
fallback: "#E5E7EB",
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
property: "Shadow",
|
|
112
|
+
tokenName: "$shadow-popover",
|
|
113
|
+
role: "Elevation shadow giving the popover a floating appearance",
|
|
114
|
+
fallback: "0 4px 16px rgba(0,0,0,0.12)",
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
property: "Arrow Fill",
|
|
118
|
+
tokenName: "$popover-arrow-bg",
|
|
119
|
+
role: "Arrow/caret fill matching the panel background",
|
|
120
|
+
fallback: "#FFFFFF",
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
property: "Arrow Border",
|
|
124
|
+
tokenName: "$popover-arrow-border",
|
|
125
|
+
role: "Arrow border matching the panel border for visual continuity",
|
|
126
|
+
fallback: "#E5E7EB",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
property: "Text Color",
|
|
130
|
+
tokenName: "$popover-text",
|
|
131
|
+
role: "Default text color for content within the popover panel",
|
|
132
|
+
fallback: "#1F2937",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
property: "Overlay",
|
|
136
|
+
tokenName: "$overlay-light",
|
|
137
|
+
role: "Optional backdrop overlay behind the popover for modal-like behavior",
|
|
138
|
+
fallback: "rgba(0,0,0,0.05)",
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
property: "Radius",
|
|
142
|
+
tokenName: "$radius-popover",
|
|
143
|
+
role: "Corner rounding applied to the floating panel",
|
|
144
|
+
fallback: "10px",
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
property: "Transition",
|
|
148
|
+
tokenName: "$transition-popover",
|
|
149
|
+
role: "Entry and exit animation timing for the floating panel",
|
|
150
|
+
fallback: "200ms ease-out",
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
property: "Focus Ring",
|
|
154
|
+
tokenName: "$focus-ring",
|
|
155
|
+
role: "Keyboard focus indicator ring for interactive elements inside the popover",
|
|
156
|
+
fallback: "0 0 0 2px #FFFFFF, 0 0 0 4px #2E90FA",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
property: "Z-Index",
|
|
160
|
+
tokenName: "$z-popover",
|
|
161
|
+
role: "Stacking context for the floating panel above page content",
|
|
162
|
+
fallback: "1000",
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
|
|
166
|
+
structureRules: [
|
|
167
|
+
"Popover consists of a trigger slot and a floating panel — trigger is inline, panel is portaled to the body",
|
|
168
|
+
"Panel uses vertical Auto Layout with top alignment and content wrapping",
|
|
169
|
+
"Arrow element is absolutely positioned relative to the panel edge closest to the trigger",
|
|
170
|
+
"Panel is positioned using a floating-UI library (Floating UI or Popper.js) for collision-aware placement",
|
|
171
|
+
"Content area supports arbitrary children: text, form fields, buttons, lists, or custom components",
|
|
172
|
+
"Maximum height is constrained to viewport height minus offset; overflow-y auto enables scrolling for tall content",
|
|
173
|
+
"Panel width defaults to the size preset but can be overridden by content; max-width is capped at 90vw on mobile",
|
|
174
|
+
"Popover is rendered via a portal to avoid clipping by parent overflow or stacking context issues",
|
|
175
|
+
],
|
|
176
|
+
|
|
177
|
+
typeHierarchyRules: [
|
|
178
|
+
"Popover headings use font-weight Semi-Bold (600) at the size-appropriate font scale",
|
|
179
|
+
"Body text within the popover uses Regular (400) weight at one step below heading size",
|
|
180
|
+
"Action links or buttons within the popover follow the standard button typography rules",
|
|
181
|
+
"Text uses sentence case throughout — no all-caps except for very short labels (e.g., 'NEW')",
|
|
182
|
+
"Line height within the popover body should be comfortable at 1.5 for readability",
|
|
183
|
+
],
|
|
184
|
+
|
|
185
|
+
interactionRules: [
|
|
186
|
+
{ event: "Click Trigger", trigger: "pointerup on trigger element", action: "Toggle popover open/closed state; animate panel in or out" },
|
|
187
|
+
{ event: "Click Outside", trigger: "pointerdown outside panel and trigger", action: "Close the popover if closeOnClickOutside is true" },
|
|
188
|
+
{ event: "Escape Key", trigger: "Escape key pressed while popover is open", action: "Close the popover and return focus to the trigger element" },
|
|
189
|
+
{ event: "Tab Key", trigger: "Tab key pressed within popover", action: "Move focus to next focusable element; if trapFocus is true, cycle within panel" },
|
|
190
|
+
{ event: "Shift+Tab", trigger: "Shift+Tab pressed on first focusable element", action: "If trapFocus is true, wrap to last focusable element; otherwise close and focus trigger" },
|
|
191
|
+
{ event: "Focus Trigger", trigger: "Tab key focuses the trigger", action: "Show focus ring on trigger; do not open popover (click-only activation)" },
|
|
192
|
+
{ event: "Scroll Parent", trigger: "User scrolls the page while popover is open", action: "Reposition popover to maintain alignment; close if trigger scrolls out of view" },
|
|
193
|
+
{ event: "Resize Viewport", trigger: "Window resize event", action: "Recalculate placement; flip to opposite side if current placement clips viewport" },
|
|
194
|
+
],
|
|
195
|
+
|
|
196
|
+
contentGuidance: [
|
|
197
|
+
"Popover content should be concise and contextual — avoid placing full forms; use a modal for complex workflows",
|
|
198
|
+
"Include a clear heading if the popover contains more than a single paragraph of text",
|
|
199
|
+
"Provide explicit close affordance (X button or 'Done' action) in addition to click-outside and Escape dismissal",
|
|
200
|
+
"Limit popover content to a single focused task or piece of information — do not stack multiple concerns",
|
|
201
|
+
"Avoid nesting popovers inside popovers; use progressive disclosure with a different pattern if deeper context is needed",
|
|
202
|
+
"Action buttons within the popover should follow the same Do/Don't rules as standalone buttons",
|
|
203
|
+
"Popover is distinct from Tooltip: tooltips are hover-triggered, non-interactive, and text-only; popovers are click-triggered and interactive",
|
|
204
|
+
],
|
|
205
|
+
|
|
206
|
+
responsiveBehaviour: [
|
|
207
|
+
{ breakpoint: "Mobile (<768px)", behavior: "Popover may convert to a bottom sheet or full-width panel anchored to the bottom of the viewport" },
|
|
208
|
+
{ breakpoint: "Tablet (768-1023px)", behavior: "Standard floating popover with auto placement; max-width constrained to 90% of viewport" },
|
|
209
|
+
{ breakpoint: "Desktop (1024-1439px)", behavior: "Floating popover positioned relative to trigger with standard offset and arrow" },
|
|
210
|
+
{ breakpoint: "Ultra-wide (>=1440px)", behavior: "Popover size remains capped at large preset — does not scale with viewport width" },
|
|
211
|
+
],
|
|
212
|
+
|
|
213
|
+
accessibilitySpec: {
|
|
214
|
+
intro:
|
|
215
|
+
"Popovers contain interactive content and must implement a full dialog-like accessibility pattern with focus management and keyboard dismissal.",
|
|
216
|
+
requirements: [
|
|
217
|
+
{ requirement: "ARIA Role", level: "A", notes: "Trigger uses aria-haspopup='dialog'; panel uses role='dialog' for interactive content" },
|
|
218
|
+
{ requirement: "ARIA Expanded", level: "A", notes: "Trigger must set aria-expanded='true' when popover is open, 'false' when closed" },
|
|
219
|
+
{ requirement: "ARIA Controls", level: "A", notes: "Trigger must reference the popover panel id via aria-controls attribute" },
|
|
220
|
+
{ requirement: "Focus Management", level: "A", notes: "Focus moves to the first focusable element inside the popover when it opens" },
|
|
221
|
+
{ requirement: "Focus Trap", level: "A", notes: "Tab and Shift+Tab must cycle within the popover when trapFocus is enabled" },
|
|
222
|
+
{ requirement: "Return Focus", level: "A", notes: "When the popover closes, focus must return to the trigger element that opened it" },
|
|
223
|
+
{ requirement: "Escape Dismissal", level: "A", notes: "Pressing Escape must close the popover from any focus position within the panel" },
|
|
224
|
+
{ requirement: "Contrast Ratio", level: "AA", notes: "All text within the popover must meet 4.5:1 contrast against the panel background" },
|
|
225
|
+
{ requirement: "Touch Target", level: "AA", notes: "Trigger and interactive elements inside the popover must have 44x44px minimum touch area" },
|
|
226
|
+
{ requirement: "Screen Reader Announcement", level: "A", notes: "Opening the popover should announce the dialog label to screen readers via aria-labelledby" },
|
|
227
|
+
],
|
|
228
|
+
outro: [
|
|
229
|
+
"Ensure that the popover does not trap keyboard users if trapFocus is disabled — Tab should exit gracefully and close the popover",
|
|
230
|
+
"Test with VoiceOver, NVDA, and JAWS to verify that the popover is announced as a dialog and dismissal is communicated",
|
|
231
|
+
"Avoid auto-opening popovers on page load as they disrupt screen reader navigation flow",
|
|
232
|
+
],
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
qaAcceptanceCriteria: [
|
|
236
|
+
{ check: "Open on Click", platform: "Web", expectedResult: "Popover panel appears on trigger click with correct placement relative to trigger" },
|
|
237
|
+
{ check: "Close on Click Outside", platform: "Web", expectedResult: "Popover dismisses when clicking outside the panel boundaries" },
|
|
238
|
+
{ check: "Close on Escape", platform: "Web", expectedResult: "Popover dismisses when Escape is pressed; focus returns to trigger" },
|
|
239
|
+
{ check: "Focus Trap", platform: "Web", expectedResult: "Tab cycles through focusable elements within the popover without escaping" },
|
|
240
|
+
{ check: "Arrow Rendering", platform: "Web", expectedResult: "Arrow points toward the trigger and repositions with placement changes" },
|
|
241
|
+
{ check: "Viewport Collision", platform: "Web", expectedResult: "Popover flips to opposite placement when it would clip the viewport edge" },
|
|
242
|
+
{ check: "Animation", platform: "Web", expectedResult: "Smooth fade-in/scale-up on open; fade-out/scale-down on close; no layout shift" },
|
|
243
|
+
{ check: "Screen Reader", platform: "Web", expectedResult: "Announces role='dialog', accessible name, and content on open" },
|
|
244
|
+
{ check: "Keyboard Navigation", platform: "Web", expectedResult: "Tab moves through interactive elements inside the popover in DOM order" },
|
|
245
|
+
{ check: "Nested Scrolling", platform: "Web", expectedResult: "Long popover content scrolls within the panel; page scroll is optionally locked" },
|
|
246
|
+
{ check: "RTL Support", platform: "Web", expectedResult: "Placement and arrow mirror correctly in RTL locales; left becomes right" },
|
|
247
|
+
{ check: "Mobile Adaptation", platform: "Mobile", expectedResult: "Converts to bottom sheet on viewports below 768px with swipe-to-dismiss" },
|
|
248
|
+
{ check: "Contrast", platform: "All", expectedResult: "All text and interactive elements pass 4.5:1 contrast against panel background" },
|
|
249
|
+
],
|
|
250
|
+
|
|
251
|
+
dos: [
|
|
252
|
+
"Use popovers for contextual information or small interactive tasks tied to a specific trigger",
|
|
253
|
+
"Always provide an explicit close button inside the popover for touch and accessibility users",
|
|
254
|
+
"Ensure focus moves into the popover on open and returns to the trigger on close",
|
|
255
|
+
"Use the arrow indicator to clearly associate the popover with its trigger element",
|
|
256
|
+
"Keep popover content focused on a single task — avoid cramming multiple unrelated actions",
|
|
257
|
+
"Use the auto placement option to handle edge cases where the preferred side clips the viewport",
|
|
258
|
+
"Match popover background and border tokens to the rest of the design system for visual consistency",
|
|
259
|
+
],
|
|
260
|
+
|
|
261
|
+
donts: [
|
|
262
|
+
"Do not use a popover for simple text hints — use a Tooltip instead (hover-triggered, non-interactive)",
|
|
263
|
+
"Do not nest popovers inside other popovers — escalate to a modal for deeper context",
|
|
264
|
+
"Do not open popovers on hover — hover-triggered floating panels should use the Tooltip pattern",
|
|
265
|
+
"Do not place full multi-step forms inside a popover — use a modal or dedicated page instead",
|
|
266
|
+
"Do not auto-open a popover on page load without user action — this disrupts focus and screen readers",
|
|
267
|
+
"Do not remove Escape key dismissal — it is a WCAG requirement for dialog-like floating content",
|
|
268
|
+
"Do not allow the popover to be clipped by parent containers — always render via a portal",
|
|
269
|
+
],
|
|
270
|
+
};
|
package/figma-intelligence-layer/src/tools/phase5-governance/component-spec/knowledge/progress.ts
ADDED
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* progress.ts — Gold-standard design knowledge for Progress Bar / Spinner / Loading Indicator components
|
|
3
|
+
*/
|
|
4
|
+
import type { ComponentKnowledge } from "../types.js";
|
|
5
|
+
|
|
6
|
+
export const progressKnowledge: ComponentKnowledge = {
|
|
7
|
+
description:
|
|
8
|
+
"Completion indicator | Loading feedback | Process status visualizer",
|
|
9
|
+
|
|
10
|
+
stateSpecifications: [
|
|
11
|
+
{
|
|
12
|
+
state: "Determinate",
|
|
13
|
+
visualChange: "Filled track proportional to the completion percentage; label shows percent or fraction",
|
|
14
|
+
opacity: "1",
|
|
15
|
+
cursorWeb: "default",
|
|
16
|
+
usage: "The total work is known and progress can be calculated as a percentage",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
state: "Indeterminate",
|
|
20
|
+
visualChange: "Animated looping bar or spinning circle with no percentage label",
|
|
21
|
+
opacity: "1",
|
|
22
|
+
cursorWeb: "default",
|
|
23
|
+
usage: "The total work is unknown — show activity without a specific completion value",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
state: "Completed",
|
|
27
|
+
visualChange: "Track fully filled; optional checkmark icon or success color replaces the progress bar",
|
|
28
|
+
opacity: "1",
|
|
29
|
+
cursorWeb: "default",
|
|
30
|
+
usage: "The operation has finished successfully — 100% reached",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
state: "Error",
|
|
34
|
+
visualChange: "Track pauses at the failure point; color shifts to error/danger token; error icon may appear",
|
|
35
|
+
opacity: "1",
|
|
36
|
+
cursorWeb: "default",
|
|
37
|
+
usage: "The operation encountered an error and cannot continue",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
state: "Paused",
|
|
41
|
+
visualChange: "Animation stops; track fill uses a muted or desaturated version of the progress color",
|
|
42
|
+
opacity: "0.7",
|
|
43
|
+
cursorWeb: "default",
|
|
44
|
+
usage: "The operation is paused and waiting for user action to resume",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
state: "Buffering",
|
|
48
|
+
visualChange: "Striped or hatched pattern animating in the track ahead of the filled portion",
|
|
49
|
+
opacity: "1",
|
|
50
|
+
cursorWeb: "default",
|
|
51
|
+
usage: "Content is buffering (e.g. media loading) — shows both loaded and buffered amounts",
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
|
|
55
|
+
propertyDescriptions: {
|
|
56
|
+
value: "Current progress value from 0 to max; null or undefined triggers indeterminate mode",
|
|
57
|
+
max: "Maximum value representing 100% completion; defaults to 100",
|
|
58
|
+
variant: "Visual style — Linear (horizontal bar) or Circular (ring/spinner)",
|
|
59
|
+
label: "Optional text label displayed alongside or inside the progress indicator",
|
|
60
|
+
showPercentage: "When true, renders the calculated percentage value as a text label",
|
|
61
|
+
size: "Dimensional preset controlling track height/diameter — Small, Medium, Large",
|
|
62
|
+
color: "Semantic color — primary, success, warning, error — controls the filled track color",
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
sizeSpecifications: [
|
|
66
|
+
{
|
|
67
|
+
size: "Small",
|
|
68
|
+
height: "4px",
|
|
69
|
+
paddingLR: "0px",
|
|
70
|
+
fontSize: "11px",
|
|
71
|
+
iconSize: "14px",
|
|
72
|
+
borderRadius: "2px",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
size: "Medium",
|
|
76
|
+
height: "8px",
|
|
77
|
+
paddingLR: "0px",
|
|
78
|
+
fontSize: "13px",
|
|
79
|
+
iconSize: "16px",
|
|
80
|
+
borderRadius: "4px",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
size: "Large",
|
|
84
|
+
height: "12px",
|
|
85
|
+
paddingLR: "0px",
|
|
86
|
+
fontSize: "14px",
|
|
87
|
+
iconSize: "20px",
|
|
88
|
+
borderRadius: "6px",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
size: "Circular Small",
|
|
92
|
+
height: "24px",
|
|
93
|
+
paddingLR: "0px",
|
|
94
|
+
fontSize: "0px",
|
|
95
|
+
iconSize: "24px",
|
|
96
|
+
borderRadius: "50%",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
size: "Circular Medium",
|
|
100
|
+
height: "40px",
|
|
101
|
+
paddingLR: "0px",
|
|
102
|
+
fontSize: "12px",
|
|
103
|
+
iconSize: "40px",
|
|
104
|
+
borderRadius: "50%",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
size: "Circular Large",
|
|
108
|
+
height: "64px",
|
|
109
|
+
paddingLR: "0px",
|
|
110
|
+
fontSize: "16px",
|
|
111
|
+
iconSize: "64px",
|
|
112
|
+
borderRadius: "50%",
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
|
|
116
|
+
designTokenBindings: [
|
|
117
|
+
{
|
|
118
|
+
property: "Track Background",
|
|
119
|
+
tokenName: "$progress-track-bg",
|
|
120
|
+
role: "Unfilled track background color — subtle neutral",
|
|
121
|
+
fallback: "#E5E7EB",
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
property: "Fill Color",
|
|
125
|
+
tokenName: "$progress-fill",
|
|
126
|
+
role: "Filled portion color representing completed progress",
|
|
127
|
+
fallback: "#2563EB",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
property: "Fill Success",
|
|
131
|
+
tokenName: "$progress-fill-success",
|
|
132
|
+
role: "Filled color used when progress reaches 100% or success state",
|
|
133
|
+
fallback: "#22C55E",
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
property: "Fill Error",
|
|
137
|
+
tokenName: "$progress-fill-error",
|
|
138
|
+
role: "Filled color when progress encounters an error",
|
|
139
|
+
fallback: "#EF4444",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
property: "Label Color",
|
|
143
|
+
tokenName: "$progress-label",
|
|
144
|
+
role: "Percentage or descriptive label text color",
|
|
145
|
+
fallback: "#374151",
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
property: "Animation Duration",
|
|
149
|
+
tokenName: "$progress-animation-duration",
|
|
150
|
+
role: "Duration of the indeterminate loop or determinate transition animation",
|
|
151
|
+
fallback: "1.5s",
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
property: "Border Radius",
|
|
155
|
+
tokenName: "$radius-progress",
|
|
156
|
+
role: "Corner rounding on the linear progress track and fill",
|
|
157
|
+
fallback: "4px",
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
|
|
161
|
+
structureRules: [
|
|
162
|
+
"Linear progress uses a container div with a nested fill div whose width is percentage-based",
|
|
163
|
+
"Both track and fill elements have matching border-radius for smooth rounded ends",
|
|
164
|
+
"Circular progress uses an SVG with a background circle (track) and a foreground circle (fill) using stroke-dasharray",
|
|
165
|
+
"Percentage label is positioned to the right of linear bars or centered inside circular indicators",
|
|
166
|
+
"Indeterminate linear animation uses a CSS keyframe translating a gradient across the track",
|
|
167
|
+
"Indeterminate circular animation uses a CSS keyframe rotating the SVG stroke",
|
|
168
|
+
"Progress container has no interactive elements — it is purely a visual indicator",
|
|
169
|
+
],
|
|
170
|
+
|
|
171
|
+
typeHierarchyRules: [
|
|
172
|
+
"Percentage label uses tabular (monospace) figures so width doesn't shift as numbers change",
|
|
173
|
+
"Font weight is Medium (500) for percentage labels and Regular (400) for descriptive labels",
|
|
174
|
+
"Descriptive labels (e.g. 'Uploading file...') appear above or below the bar, not inside it",
|
|
175
|
+
"Percentage text inside circular indicators is centered and sized relative to the ring diameter",
|
|
176
|
+
"Label text uses sentence case — 'Uploading files', not 'UPLOADING FILES'",
|
|
177
|
+
],
|
|
178
|
+
|
|
179
|
+
interactionRules: [
|
|
180
|
+
{ event: "Value Update", trigger: "value prop changes", action: "Animate the fill width/stroke smoothly from the previous value to the new value" },
|
|
181
|
+
{ event: "Completion", trigger: "value reaches max", action: "Transition to completed state; optionally show success icon and announce completion" },
|
|
182
|
+
{ event: "Error", trigger: "error prop set to true", action: "Pause animation; shift fill color to error token; show error icon if configured" },
|
|
183
|
+
{ event: "Retry", trigger: "User clicks retry action on error state", action: "Reset fill to last known value; resume animation; clear error state" },
|
|
184
|
+
{ event: "Indeterminate Start", trigger: "value is null/undefined", action: "Start continuous animation loop; hide percentage label" },
|
|
185
|
+
{ event: "Visibility Change", trigger: "Component enters/exits viewport", action: "Pause animation when off-screen to reduce CPU usage; resume when visible" },
|
|
186
|
+
],
|
|
187
|
+
|
|
188
|
+
contentGuidance: [
|
|
189
|
+
"Use determinate progress when the total work is known — file uploads, multi-step wizards, data processing",
|
|
190
|
+
"Use indeterminate progress when the duration is unpredictable — API calls, initial page loads",
|
|
191
|
+
"Include a descriptive label for long operations: 'Uploading 3 of 12 files...'",
|
|
192
|
+
"Avoid showing percentage for indeterminate progress — it creates false expectations",
|
|
193
|
+
"Consider adding a time estimate for long operations: 'About 2 minutes remaining'",
|
|
194
|
+
"Use success feedback (checkmark, color change) when progress completes to confirm the outcome",
|
|
195
|
+
],
|
|
196
|
+
|
|
197
|
+
responsiveBehaviour: [
|
|
198
|
+
{ breakpoint: "Mobile (<768px)", behavior: "Linear bars span full container width; circular indicators use Small or Medium size" },
|
|
199
|
+
{ breakpoint: "Tablet (768-1023px)", behavior: "Standard sizing; percentage labels visible for determinate progress" },
|
|
200
|
+
{ breakpoint: "Desktop (1024-1439px)", behavior: "All sizes and variants available; inline labels next to linear bars" },
|
|
201
|
+
{ breakpoint: "Ultra-wide (>=1440px)", behavior: "Progress bar widths capped at a reasonable max-width to avoid overly long bars" },
|
|
202
|
+
{ breakpoint: "Inline Context", behavior: "Small linear bar (4px) used inline within table cells, cards, or list items" },
|
|
203
|
+
],
|
|
204
|
+
|
|
205
|
+
accessibilitySpec: {
|
|
206
|
+
intro:
|
|
207
|
+
"Progress indicators must communicate current status to assistive technologies using ARIA attributes and live regions for dynamic updates.",
|
|
208
|
+
requirements: [
|
|
209
|
+
{ requirement: "Role", level: "A", notes: "Use role='progressbar' with aria-valuenow, aria-valuemin (0), and aria-valuemax" },
|
|
210
|
+
{ requirement: "Indeterminate Mode", level: "A", notes: "Omit aria-valuenow when indeterminate; add aria-label describing the operation" },
|
|
211
|
+
{ requirement: "Label", level: "A", notes: "Provide aria-label or aria-labelledby describing what is progressing (e.g. 'File upload progress')" },
|
|
212
|
+
{ requirement: "Live Updates", level: "AA", notes: "Use aria-live='polite' to announce significant milestones (25%, 50%, 75%, 100%)" },
|
|
213
|
+
{ requirement: "Contrast", level: "AA", notes: "Fill-to-track: 3:1 non-text contrast minimum; label text-to-background: 4.5:1" },
|
|
214
|
+
{ requirement: "Reduced Motion", level: "AAA", notes: "Respect prefers-reduced-motion: replace animations with static fill updates" },
|
|
215
|
+
],
|
|
216
|
+
outro: [
|
|
217
|
+
"Announce completion and error states to screen readers via aria-live assertive region",
|
|
218
|
+
"Do not rely solely on color to communicate progress state — supplement with labels or icons",
|
|
219
|
+
],
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
qaAcceptanceCriteria: [
|
|
223
|
+
{ check: "Determinate Fill", platform: "All", expectedResult: "Fill width matches the value/max ratio; smooth transition on value change" },
|
|
224
|
+
{ check: "Indeterminate Animation", platform: "All", expectedResult: "Continuous animation loops without freezing; no percentage label shown" },
|
|
225
|
+
{ check: "Completion State", platform: "All", expectedResult: "Fill reaches 100%; success color or icon displayed; screen reader announces completion" },
|
|
226
|
+
{ check: "Error State", platform: "All", expectedResult: "Fill pauses; error color applied; error icon visible; retry action available" },
|
|
227
|
+
{ check: "Reduced Motion", platform: "Web", expectedResult: "Animations replaced with static updates when prefers-reduced-motion is active" },
|
|
228
|
+
{ check: "Screen Reader", platform: "Web", expectedResult: "Announces role, current value, label, and milestone changes via aria-live" },
|
|
229
|
+
{ check: "Circular Variant", platform: "All", expectedResult: "SVG ring renders correctly; stroke-dasharray proportional to value; centered label if configured" },
|
|
230
|
+
],
|
|
231
|
+
|
|
232
|
+
dos: [
|
|
233
|
+
"Use determinate progress when the completion percentage can be calculated",
|
|
234
|
+
"Use indeterminate progress for unpredictable operations — never show a fake percentage",
|
|
235
|
+
"Include a descriptive label for context: what is loading and why",
|
|
236
|
+
"Animate value transitions smoothly for a polished user experience",
|
|
237
|
+
"Respect prefers-reduced-motion by replacing animations with static fills",
|
|
238
|
+
"Use semantic ARIA attributes — role='progressbar' with aria-valuenow and aria-valuemax",
|
|
239
|
+
"Announce completion and error states to screen readers",
|
|
240
|
+
],
|
|
241
|
+
|
|
242
|
+
donts: [
|
|
243
|
+
"Do not use a spinner when a determinate progress bar would be more informative",
|
|
244
|
+
"Do not display percentage labels on indeterminate progress — it misleads users",
|
|
245
|
+
"Do not leave progress indicators on screen after the operation completes — remove or transition to success state",
|
|
246
|
+
"Do not use progress bars for navigation or step indicators — use a stepper component instead",
|
|
247
|
+
"Do not animate progress backwards unless representing a genuine decrease (e.g. storage usage)",
|
|
248
|
+
"Do not make progress indicators interactive — they are read-only status displays",
|
|
249
|
+
"Do not use red/error colors for normal progress — reserve them for actual error states",
|
|
250
|
+
],
|
|
251
|
+
};
|