@3fn/core 14.0.0 → 15.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/.kiro/steering/AI-Collaboration-Principles.md +9 -3
- package/.kiro/steering/Agent-Directory.md +31 -7
- package/.kiro/steering/Civitas-System-Overview.md +5 -14
- package/.kiro/steering/DesignerPunk-Systems-Overview.md +3 -3
- package/.kiro/steering/Spec-Feedback-Protocol.md +2 -11
- package/.kiro/steering/Task-Completion-Protocol.md +17 -16
- package/.kiro/steering/start-up-tasks.md +15 -7
- package/CHANGELOG.md +74 -0
- package/README.md +26 -21
- package/application-mcp-server/src/__tests__/consumerRootLiveReindex.test.ts +118 -0
- package/application-mcp-server/src/__tests__/errorCatalogWiring.test.ts +73 -0
- package/application-mcp-server/src/__tests__/mcpDataRootsDeclaration.test.ts +107 -0
- package/application-mcp-server/src/__tests__/tool-boundary.contract.test.ts +55 -0
- package/application-mcp-server/src/index.ts +249 -59
- package/application-mcp-server/src/indexer/ComponentIndexer.ts +273 -46
- package/application-mcp-server/src/indexer/ModeClassifier.ts +23 -16
- package/application-mcp-server/src/indexer/SemanticOverrideReader.ts +113 -0
- package/application-mcp-server/src/indexer/TokenIndexer.ts +195 -3
- package/application-mcp-server/src/indexer/__tests__/MultiRootIndexing.test.ts +134 -0
- package/application-mcp-server/src/indexer/__tests__/ThemeResolution.test.ts +241 -0
- package/application-mcp-server/src/indexer/__tests__/ThemeRootFollowsIndex.test.ts +216 -0
- package/application-mcp-server/src/indexer/__tests__/fixtures/consumerFixture.ts +84 -0
- package/application-mcp-server/src/indexer/resolveThemeTierRoot.ts +61 -0
- package/application-mcp-server/src/watcher/FileWatcher.ts +20 -7
- package/dist/ComponentTokens.android.kt +12 -12
- package/dist/ComponentTokens.ios.swift +12 -12
- package/dist/ComponentTokens.web.css +3 -3
- package/dist/DesignTokens.android.kt +1 -5
- package/dist/DesignTokens.dtcg.json +388 -122
- package/dist/DesignTokens.figma.json +281 -941
- package/dist/DesignTokens.ios.swift +1 -5
- package/dist/DesignTokens.web.css +5 -5
- package/dist/browser/designerpunk.esm.js +174 -103
- package/dist/browser/designerpunk.esm.min.js +58 -55
- package/dist/browser/designerpunk.umd.js +174 -103
- package/dist/browser/designerpunk.umd.min.js +58 -55
- package/dist/browser/tokens.css +7 -7
- package/dist/build/platforms/AndroidMotionTokenFormatter.d.ts +101 -0
- package/dist/build/platforms/AndroidMotionTokenFormatter.js +220 -0
- package/dist/build/platforms/WebMotionTokenFormatter.d.ts +85 -0
- package/dist/build/platforms/WebMotionTokenFormatter.js +167 -0
- package/dist/build/platforms/iOSMotionTokenFormatter.d.ts +99 -0
- package/dist/build/platforms/iOSMotionTokenFormatter.js +221 -0
- package/dist/build/tokens/defineComponentTokens.d.ts +10 -0
- package/dist/build/tokens/defineComponentTokens.js +26 -0
- package/dist/build/validation/index.d.ts +0 -4
- package/dist/build/validation/index.js +1 -8
- package/dist/cli/attach.d.ts +153 -0
- package/dist/cli/attach.js +423 -0
- package/dist/cli/designerpunk.d.ts +46 -0
- package/dist/cli/designerpunk.js +171 -34
- package/dist/cli/figma-extract.js +10 -1
- package/dist/cli/figma-push.js +11 -2
- package/dist/cli/init.d.ts +36 -5
- package/dist/cli/init.js +348 -143
- package/dist/cli/loadComponentTokens.d.ts +25 -0
- package/dist/cli/loadComponentTokens.js +87 -8
- package/dist/cli/shared/bornRepo.d.ts +50 -0
- package/dist/cli/shared/bornRepo.js +199 -0
- package/dist/cli/shared/errorCatalog.d.ts +130 -0
- package/dist/cli/shared/errorCatalog.js +148 -0
- package/dist/cli/shared/mcpConfig/cc.d.ts +25 -0
- package/dist/cli/shared/mcpConfig/cc.js +156 -0
- package/dist/cli/shared/mcpConfig/kiro.d.ts +53 -0
- package/dist/cli/shared/mcpConfig/kiro.js +140 -0
- package/dist/cli/shared/mcpDataRoots.d.ts +88 -1
- package/dist/cli/shared/mcpDataRoots.js +76 -2
- package/dist/cli/shared/transforms.d.ts +64 -0
- package/dist/cli/shared/transforms.js +138 -0
- package/dist/cli/shared/vocabulary.d.ts +50 -0
- package/dist/cli/shared/vocabulary.js +62 -0
- package/dist/cli/sync/Applier.d.ts +25 -26
- package/dist/cli/sync/Applier.js +37 -73
- package/dist/cli/sync/Classifier.d.ts +70 -6
- package/dist/cli/sync/Classifier.js +123 -84
- package/dist/cli/sync/FileScanner.d.ts +19 -10
- package/dist/cli/sync/FileScanner.js +33 -25
- package/dist/cli/sync/KeyGrain.d.ts +106 -0
- package/dist/cli/sync/KeyGrain.js +301 -0
- package/dist/cli/sync/Manifest.d.ts +147 -12
- package/dist/cli/sync/Manifest.js +276 -21
- package/dist/cli/sync/Migration.d.ts +271 -0
- package/dist/cli/sync/Migration.js +764 -0
- package/dist/cli/sync/NameContract.d.ts +169 -0
- package/dist/cli/sync/NameContract.js +246 -0
- package/dist/cli/sync/RegionGrain.d.ts +118 -0
- package/dist/cli/sync/RegionGrain.js +167 -0
- package/dist/cli/sync/Reporter.d.ts +33 -4
- package/dist/cli/sync/Reporter.js +112 -53
- package/dist/cli/sync/SteeringDirCheck.d.ts +32 -4
- package/dist/cli/sync/SteeringDirCheck.js +62 -14
- package/dist/cli/sync/index.d.ts +125 -6
- package/dist/cli/sync/index.js +716 -66
- package/dist/color/OklchValidator.d.ts +43 -3
- package/dist/color/OklchValidator.js +46 -8
- package/dist/components/core/Avatar-Base/avatar.tokens.d.ts +21 -26
- package/dist/components/core/Avatar-Base/avatar.tokens.js +31 -34
- package/dist/components/core/Avatar-Base/index.d.ts +1 -1
- package/dist/components/core/Avatar-Base/index.js +2 -2
- package/dist/components/core/Button-CTA/Button-CTA.refs.d.ts +83 -0
- package/dist/components/core/Button-CTA/Button-CTA.refs.js +86 -0
- package/dist/components/core/Button-CTA/Button-CTA.tokens.d.ts +20 -10
- package/dist/components/core/Button-CTA/Button-CTA.tokens.js +21 -10
- package/dist/components/core/Button-CTA/index.d.ts +2 -2
- package/dist/components/core/Button-CTA/index.js +3 -3
- package/dist/components/core/Button-Icon/buttonIcon.tokens.d.ts +28 -14
- package/dist/components/core/Button-Icon/buttonIcon.tokens.js +35 -20
- package/dist/components/core/Button-VerticalList-Item/platforms/web/ButtonVerticalListItem.web.d.ts +11 -30
- package/dist/components/core/Button-VerticalList-Item/platforms/web/ButtonVerticalListItem.web.js +16 -49
- package/dist/components/core/Container-Base/Container-Base.refs.d.ts +181 -0
- package/dist/components/core/Container-Base/Container-Base.refs.js +223 -0
- package/dist/components/core/Container-Base/index.d.ts +2 -2
- package/dist/components/core/Container-Base/index.js +10 -10
- package/dist/components/core/Container-Base/platforms/web/ContainerBase.web.js +1 -1
- package/dist/components/core/Container-Base/platforms/web/token-mapping.d.ts +27 -9
- package/dist/components/core/Container-Base/platforms/web/token-mapping.js +50 -22
- package/dist/components/core/Container-Card-Base/Container-Card-Base.refs.d.ts +149 -0
- package/dist/components/core/Container-Card-Base/Container-Card-Base.refs.js +207 -0
- package/dist/components/core/Container-Card-Base/index.d.ts +1 -1
- package/dist/components/core/Container-Card-Base/index.js +19 -19
- package/dist/components/core/Container-Card-Base/platforms/web/ContainerCardBase.web.js +7 -6
- package/dist/components/core/Input-Radio-Base/platforms/web/InputRadioBase.web.d.ts +15 -0
- package/dist/components/core/Input-Radio-Base/platforms/web/InputRadioBase.web.js +41 -1
- package/dist/components/core/Input-Text-Base/Input-Text-Base.refs.d.ts +331 -0
- package/dist/components/core/Input-Text-Base/Input-Text-Base.refs.js +164 -0
- package/dist/components/core/Input-Text-Base/platforms/web/InputTextBase.web.js +1 -1
- package/dist/components/core/Input-Text-Email/Input-Text-Email.refs.d.ts +20 -0
- package/dist/components/core/Input-Text-Email/Input-Text-Email.refs.js +34 -0
- package/dist/components/core/Input-Text-Password/Input-Text-Password.refs.d.ts +20 -0
- package/dist/components/core/Input-Text-Password/Input-Text-Password.refs.js +34 -0
- package/dist/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.d.ts +30 -0
- package/dist/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.js +72 -3
- package/dist/components/core/Input-Text-PhoneNumber/Input-Text-PhoneNumber.refs.d.ts +20 -0
- package/dist/components/core/Input-Text-PhoneNumber/Input-Text-PhoneNumber.refs.js +34 -0
- package/dist/consumer-canonical/agents/ada.md +331 -0
- package/dist/consumer-canonical/agents/data.md +429 -0
- package/dist/consumer-canonical/agents/kenya.md +400 -0
- package/dist/consumer-canonical/agents/leonardo.md +524 -0
- package/dist/consumer-canonical/agents/lina.md +501 -0
- package/dist/consumer-canonical/agents/sparky.md +395 -0
- package/dist/consumer-canonical/agents/stacy.md +515 -0
- package/dist/consumer-canonical/agents/thurgood.md +463 -0
- package/dist/consumer-canonical/always-set/agent-directory.dispositions.yaml +21 -0
- package/dist/consumer-canonical/always-set/agent-directory.overlay.md +51 -0
- package/dist/consumer-canonical/always-set/ai-collaboration-principles.dispositions.yaml +15 -0
- package/dist/consumer-canonical/always-set/ai-collaboration-principles.overlay.md +26 -0
- package/dist/consumer-canonical/always-set/civitas-system-overview.dispositions.yaml +15 -0
- package/dist/consumer-canonical/always-set/civitas-system-overview.overlay.md +70 -0
- package/dist/consumer-canonical/always-set/core-goals.dispositions.yaml +9 -0
- package/dist/consumer-canonical/always-set/core-goals.overlay.md +74 -0
- package/dist/consumer-canonical/always-set/designerpunk-systems-overview.dispositions.yaml +16 -0
- package/dist/consumer-canonical/always-set/designerpunk-systems-overview.overlay.md +44 -0
- package/dist/consumer-canonical/always-set/spec-feedback-protocol.dispositions.yaml +21 -0
- package/dist/consumer-canonical/always-set/spec-feedback-protocol.overlay.md +44 -0
- package/dist/consumer-canonical/always-set/start-up-tasks.dispositions.yaml +15 -0
- package/dist/consumer-canonical/always-set/start-up-tasks.overlay.md +25 -0
- package/dist/consumer-canonical/always-set/task-completion-protocol.dispositions.yaml +19 -0
- package/dist/consumer-canonical/always-set/task-completion-protocol.overlay.md +116 -0
- package/dist/consumer-canonical/consumer-profile.yaml +9 -0
- package/dist/consumer-canonical/shared/always-set.yaml +113 -0
- package/dist/consumer-canonical/shared/field-dispositions.yaml +85 -0
- package/dist/consumer-canonical/shared/shared-catalog.yaml +19 -0
- package/dist/consumer-canonical/shared/skills-map.yaml +33 -0
- package/dist/consumer-canonical/skills/adaptive/SKILL.md +301 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +238 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +168 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +329 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
- package/dist/consumer-canonical/skills/adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/dist/consumer-canonical/skills/edge-to-edge/SKILL.md +426 -0
- package/dist/consumer-canonical/skills/impeccable/SKILL.md +237 -0
- package/dist/consumer-canonical/skills/impeccable/detector-exclusions.md +42 -0
- package/dist/consumer-canonical/skills/impeccable/reference/adapt.md +190 -0
- package/dist/consumer-canonical/skills/impeccable/reference/animate.md +194 -0
- package/dist/consumer-canonical/skills/impeccable/reference/audit.md +150 -0
- package/dist/consumer-canonical/skills/impeccable/reference/bolder.md +113 -0
- package/dist/consumer-canonical/skills/impeccable/reference/brand-dp.md +103 -0
- package/dist/consumer-canonical/skills/impeccable/reference/clarify.md +174 -0
- package/dist/consumer-canonical/skills/impeccable/reference/codex.md +105 -0
- package/dist/consumer-canonical/skills/impeccable/reference/cognitive-load.md +106 -0
- package/dist/consumer-canonical/skills/impeccable/reference/color-and-contrast.md +122 -0
- package/dist/consumer-canonical/skills/impeccable/reference/colorize.md +155 -0
- package/dist/consumer-canonical/skills/impeccable/reference/craft.md +123 -0
- package/dist/consumer-canonical/skills/impeccable/reference/critique.md +245 -0
- package/dist/consumer-canonical/skills/impeccable/reference/delight.md +302 -0
- package/dist/consumer-canonical/skills/impeccable/reference/distill.md +111 -0
- package/dist/consumer-canonical/skills/impeccable/reference/extract-dp.md +43 -0
- package/dist/consumer-canonical/skills/impeccable/reference/harden.md +347 -0
- package/dist/consumer-canonical/skills/impeccable/reference/heuristics-scoring.md +234 -0
- package/dist/consumer-canonical/skills/impeccable/reference/interaction-design.md +195 -0
- package/dist/consumer-canonical/skills/impeccable/reference/layout.md +141 -0
- package/dist/consumer-canonical/skills/impeccable/reference/live.md +622 -0
- package/dist/consumer-canonical/skills/impeccable/reference/motion-design.md +109 -0
- package/dist/consumer-canonical/skills/impeccable/reference/onboard.md +234 -0
- package/dist/consumer-canonical/skills/impeccable/reference/optimize.md +258 -0
- package/dist/consumer-canonical/skills/impeccable/reference/overdrive.md +130 -0
- package/dist/consumer-canonical/skills/impeccable/reference/personas.md +179 -0
- package/dist/consumer-canonical/skills/impeccable/reference/polish.md +242 -0
- package/dist/consumer-canonical/skills/impeccable/reference/product-dp.md +79 -0
- package/dist/consumer-canonical/skills/impeccable/reference/quieter.md +99 -0
- package/dist/consumer-canonical/skills/impeccable/reference/responsive-design.md +114 -0
- package/dist/consumer-canonical/skills/impeccable/reference/shape.md +165 -0
- package/dist/consumer-canonical/skills/impeccable/reference/spatial-design.md +100 -0
- package/dist/consumer-canonical/skills/impeccable/reference/typeset.md +126 -0
- package/dist/consumer-canonical/skills/impeccable/reference/typography.md +159 -0
- package/dist/consumer-canonical/skills/impeccable/reference/ux-writing.md +107 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detect.mjs +21 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/browser/injected/index.mjs +1725 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/cli/main.mjs +244 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +4567 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/detect-antipatterns.mjs +43 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +252 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +535 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +986 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +208 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/findings.mjs +12 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/node/file-system.mjs +198 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/registry/antipatterns.mjs +419 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/rules/checks.mjs +2316 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/shared/color.mjs +156 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/shared/constants.mjs +101 -0
- package/dist/consumer-canonical/skills/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/dist/consumer-canonical/skills/navigation-3/SKILL.md +110 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/index.md +38 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +498 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-advanced.md +155 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-basic.md +744 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +436 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +272 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
- package/dist/consumer-canonical/skills/navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
- package/dist/consumer-canonical/skills/theming-styles/SKILL.md +220 -0
- package/dist/consumer-canonical/skills/theming-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
- package/dist/consumer-canonical/skills/theming-styles/references/android/develop/ui/compose/styles/fundamentals.md +420 -0
- package/dist/consumer-canonical/skills/theming-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
- package/dist/consumer-canonical/skills/theming-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
- package/dist/consumer-canonical/skills/theming-styles/references/android/develop/ui/compose/styles/theming.md +257 -0
- package/dist/generator/consumer-entry.js +5939 -0
- package/dist/generators/DTCGFormatGenerator.d.ts +14 -4
- package/dist/generators/DTCGFormatGenerator.js +35 -18
- package/dist/generators/TokenFileGenerator.js +20 -15
- package/dist/generators/generateTokenIndex.d.ts +14 -0
- package/dist/generators/generateTokenIndex.js +23 -0
- package/dist/generators/transformers/FigmaTransformer.d.ts +35 -0
- package/dist/generators/transformers/FigmaTransformer.js +101 -13
- package/dist/generators/types/DTCGTypes.d.ts +10 -0
- package/dist/mcp/application-mcp.js +1062 -261
- package/dist/mcp/docs-mcp.js +93 -13
- package/dist/mcp/product-mcp.js +539 -41
- package/dist/mcp/tool-manifest.json +184 -0
- package/dist/name-contract.json +4283 -0
- package/dist/tokens/BlurTokens.d.ts +3 -1
- package/dist/tokens/BlurTokens.js +6 -4
- package/dist/tokens/ShadowOffsetTokens.js +14 -14
- package/dist/tokens/SizingTokens.js +3 -3
- package/dist/tokens/TapAreaTokens.d.ts +13 -2
- package/dist/tokens/TapAreaTokens.js +19 -8
- package/dist/tokens/component/progress.d.ts +65 -5
- package/dist/tokens/component/progress.js +79 -18
- package/dist/tokens/semantic/ColorTokens.js +50 -5
- package/dist/tokens/semantic/TypographyTokens.js +10 -10
- package/dist/tokens/themes/dark/SemanticOverrides.js +21 -4
- package/dist/tools/integrity/Invariants.d.ts +23 -8
- package/dist/tools/integrity/Invariants.js +27 -8
- package/dist/tools/integrity/cli/run-audit.js +1 -1
- package/dist/types/PrimitiveToken.d.ts +15 -1
- package/dist/types/generated/TokenTypes.d.ts +1 -1
- package/dist/types/generated/TokenTypes.js +1 -1
- package/dist/types/index.d.ts +1 -0
- package/governance/AI-Collaboration-Framework.md +19 -10
- package/governance/BUILD-SYSTEM-SETUP.md +1 -2
- package/governance/Component-Development-Guide.md +1 -1
- package/governance/Component-Development-Standards.md +19 -18
- package/governance/Component-Family-Avatar.md +6 -6
- package/governance/Component-Family-Badge.md +19 -19
- package/governance/Component-Family-Button.md +26 -26
- package/governance/Component-Family-Chip.md +14 -14
- package/governance/Component-Family-Container.md +12 -12
- package/governance/Component-Family-Form-Inputs.md +61 -61
- package/governance/Component-Family-Icon.md +8 -8
- package/governance/Component-Family-Navigation.md +3 -3
- package/governance/Component-Inheritance-Structures.md +29 -28
- package/governance/Component-Readiness-Status.md +6 -7
- package/governance/Component-Templates.md +26 -26
- package/governance/Contract-System-Reference.md +1 -1
- package/governance/DTCG-Integration-Guide.md +63 -36
- package/governance/DesignerPunk-Integration-Guide.md +57 -61
- package/governance/Figma-Workflow-Guide.md +15 -8
- package/governance/Process-Development-Workflow.md +4 -4
- package/governance/Process-File-Organization.md +1 -4
- package/governance/Process-Hook-Operations.md +6 -7
- package/governance/Process-Integration-Methodology.md +5 -5
- package/governance/Process-Spec-Planning.md +187 -68
- package/governance/Product-Handoff-Protocol.md +27 -2
- package/governance/Rosetta-System-Architecture.md +7 -5
- package/governance/Test-Behavioral-Contract-Validation.md +5 -0
- package/governance/Test-Development-Standards.md +4 -4
- package/governance/Token-Family-Accessibility.md +18 -14
- package/governance/Token-Family-Blend.md +5 -4
- package/governance/Token-Family-Blur.md +8 -8
- package/governance/Token-Family-Color.md +40 -22
- package/governance/Token-Family-Glow.md +26 -24
- package/governance/Token-Family-Layering.md +1 -0
- package/governance/Token-Family-Motion.md +22 -13
- package/governance/Token-Family-Opacity.md +20 -34
- package/governance/Token-Family-Radius.md +4 -2
- package/governance/Token-Family-Responsive.md +4 -4
- package/governance/Token-Family-Shadow.md +69 -46
- package/governance/Token-Family-Spacing.md +22 -12
- package/governance/Token-Family-Typography.md +86 -85
- package/governance/Token-Governance.md +5 -1
- package/governance/Token-Quick-Reference.md +97 -80
- package/governance/Transformer-Development-Guide.md +5 -4
- package/governance/Web-Authoring-Standards.md +1 -1
- package/governance/classification-map.md +706 -10
- package/governance/completion-documentation-guide.md +298 -33
- package/governance/platform-implementation-guidelines.md +3 -3
- package/governance/release-management-system.md +28 -63
- package/mcp-server/src/index.ts +16 -12
- package/mcp-server/src/relocation-integrity-gate/__tests__/relocation-integrity-gate.test.ts +3 -3
- package/mcp-server/src/relocation-integrity-gate/relocation-integrity-gate.ts +70 -49
- package/mcp-server/src/tools/find-docs.ts +1 -0
- package/mcp-server/src/tools/get-document-full.ts +1 -0
- package/mcp-server/src/tools/get-document-summary.ts +1 -0
- package/mcp-server/src/tools/get-index-health.ts +1 -0
- package/mcp-server/src/tools/get-section.ts +1 -0
- package/mcp-server/src/tools/list-cross-references.ts +1 -0
- package/mcp-server/src/tools/rebuild-index.ts +1 -0
- package/mcp-server/src/tools/validate-metadata.ts +1 -0
- package/package.json +76 -16
- package/src/build/tokens/defineComponentTokens.ts +43 -1
- package/src/cli/templates/mcp-config.json.template +15 -20
- package/src/components/core/Avatar-Base/platforms/android/AvatarPreview.kt +9 -2
- package/src/components/core/Container-Base/Container-Base.schema.yaml +9 -11
- package/src/components/core/Container-Base/platforms/android/ContainerBase.android.kt +5 -5
- package/src/components/core/Container-Base/platforms/ios/ContainerBase.ios.swift +5 -5
- package/src/components/core/Container-Card-Base/platforms/android/ContainerCardBase.android.kt +3 -3
- package/src/components/core/Container-Card-Base/platforms/ios/ContainerCardBase.ios.swift +2 -2
- package/src/components/core/Nav-Header-App/contracts.yaml +1 -1
- package/src/components/core/Nav-Header-Base/component-meta.yaml +0 -1
- package/src/components/core/Nav-Header-Base/contracts.yaml +1 -1
- package/src/components/core/Nav-Header-Page/contracts.yaml +1 -1
- package/src/components/core/Nav-TabBar-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Bar-Base/contracts.yaml +1 -1
- package/src/tokens/BlurTokens.ts +6 -4
- package/src/tokens/ShadowOffsetTokens.ts +14 -14
- package/src/tokens/SizingTokens.ts +3 -3
- package/src/tokens/TapAreaTokens.ts +20 -8
- package/src/tokens/__tests__/BaselineGridAlignmentFlag.test.ts +116 -0
- package/src/tokens/__tests__/BlurTokens.test.ts +10 -2
- package/src/tokens/__tests__/ProgressTokenCompliance.test.ts +5 -3
- package/src/tokens/__tests__/ProgressTokenFormulas.test.ts +11 -11
- package/src/tokens/__tests__/ProgressTokenTranslation.test.ts +22 -20
- package/src/tokens/__tests__/SemanticColorContrast.test.ts +339 -0
- package/src/tokens/__tests__/ShadowOffsetTokens.test.ts +8 -7
- package/src/tokens/__tests__/SizingTokens.test.ts +10 -2
- package/src/tokens/__tests__/TokenCategories.test.ts +1 -1
- package/src/tokens/__tests__/neutral-partition.test.ts +28 -0
- package/src/tokens/component/progress.ts +83 -21
- package/src/tokens/semantic/AccessibilityTokens.README.md +2 -2
- package/src/tokens/semantic/ColorTokens.ts +50 -5
- package/src/tokens/semantic/TypographyTokens.ts +10 -10
- package/src/tokens/semantic/__tests__/ColorTokens.test.ts +8 -4
- package/src/tokens/themes/dark/SemanticOverrides.ts +23 -4
- package/src/types/PrimitiveToken.ts +15 -1
- package/token-index/components.yaml +8 -8
- package/token-index/meta.json +3 -0
- package/token-index/semantics.yaml +21 -15
- package/.kiro/agents/ada-prompt.md +0 -213
- package/.kiro/agents/ada-prompt.md.attribution.json +0 -45
- package/.kiro/agents/ada.json +0 -72
- package/.kiro/agents/ada.json.attribution.json +0 -13
- package/.kiro/agents/data-prompt.md +0 -324
- package/.kiro/agents/data-prompt.md.attribution.json +0 -53
- package/.kiro/agents/data.json +0 -51
- package/.kiro/agents/data.json.attribution.json +0 -13
- package/.kiro/agents/kenya-prompt.md +0 -309
- package/.kiro/agents/kenya-prompt.md.attribution.json +0 -53
- package/.kiro/agents/kenya.json +0 -46
- package/.kiro/agents/kenya.json.attribution.json +0 -13
- package/.kiro/agents/leonardo-prompt.md +0 -359
- package/.kiro/agents/leonardo-prompt.md.attribution.json +0 -45
- package/.kiro/agents/leonardo.json +0 -47
- package/.kiro/agents/leonardo.json.attribution.json +0 -13
- package/.kiro/agents/lina-prompt.md +0 -344
- package/.kiro/agents/lina-prompt.md.attribution.json +0 -53
- package/.kiro/agents/lina.json +0 -64
- package/.kiro/agents/lina.json.attribution.json +0 -13
- package/.kiro/agents/sparky-prompt.md +0 -312
- package/.kiro/agents/sparky-prompt.md.attribution.json +0 -53
- package/.kiro/agents/sparky.json +0 -56
- package/.kiro/agents/sparky.json.attribution.json +0 -13
- package/.kiro/agents/stacy-prompt.md +0 -304
- package/.kiro/agents/stacy-prompt.md.attribution.json +0 -45
- package/.kiro/agents/stacy.json +0 -46
- package/.kiro/agents/stacy.json.attribution.json +0 -13
- package/.kiro/agents/thurgood-prompt.md +0 -363
- package/.kiro/agents/thurgood-prompt.md.attribution.json +0 -45
- package/.kiro/agents/thurgood.json +0 -47
- package/.kiro/agents/thurgood.json.attribution.json +0 -13
- package/.kiro/steering/personal-note.md +0 -35
- package/designerpunk.config.ts +0 -27
- package/dist/android/DesignTokens.android.kt +0 -695
- package/dist/components/core/Input-Text-Base/platforms/web/InputTextBase.browser.d.ts +0 -26
- package/dist/components/core/Input-Text-Base/platforms/web/InputTextBase.browser.js +0 -224
- package/dist/components/core/Input-Text-Email/platforms/web/InputTextEmail.browser.d.ts +0 -30
- package/dist/components/core/Input-Text-Email/platforms/web/InputTextEmail.browser.js +0 -254
- package/dist/components/core/Input-Text-Password/platforms/web/InputTextPassword.browser.d.ts +0 -44
- package/dist/components/core/Input-Text-Password/platforms/web/InputTextPassword.browser.js +0 -376
- package/dist/components/core/Input-Text-PhoneNumber/platforms/web/InputTextPhoneNumber.browser.d.ts +0 -38
- package/dist/components/core/Input-Text-PhoneNumber/platforms/web/InputTextPhoneNumber.browser.js +0 -328
- package/dist/ios/DesignTokens.ios.swift +0 -697
- package/dist/web/DesignTokens.web.css +0 -929
- package/product-template/agents/README.md +0 -73
- package/product-template/agents/ada-prompt.md +0 -83
- package/product-template/agents/data-prompt.md +0 -74
- package/product-template/agents/kenya-prompt.md +0 -74
- package/product-template/agents/leonardo-prompt.md +0 -99
- package/product-template/agents/lina-prompt.md +0 -61
- package/product-template/agents/sparky-prompt.md +0 -66
- package/product-template/agents/stacy-prompt.md +0 -51
- package/product-template/agents/thurgood-prompt.md +0 -64
- package/src/TokenEngine.ts +0 -628
- package/src/__tests__/BuildSystemIntegration.test.ts +0 -485
- package/src/__tests__/ProductMCPIntegration.test.ts +0 -204
- package/src/__tests__/__mocks__/styleMock.js +0 -18
- package/src/__tests__/browser-distribution/build-error-handling.test.ts +0 -143
- package/src/__tests__/browser-distribution/bundle-loading.test.ts +0 -353
- package/src/__tests__/browser-distribution/bundler-resolution.test.ts +0 -223
- package/src/__tests__/browser-distribution/component-registration.test.ts +0 -217
- package/src/__tests__/browser-distribution/css-bundling.test.ts +0 -233
- package/src/__tests__/browser-distribution/demo-system.test.ts +0 -588
- package/src/__tests__/browser-distribution/mcp-format-compliance.property.test.ts +0 -379
- package/src/__tests__/browser-distribution/mcp-queryability.test.ts +0 -342
- package/src/__tests__/browser-distribution/minification-effectiveness.property.test.ts +0 -188
- package/src/__tests__/browser-distribution/registration-idempotency.property.test.ts +0 -372
- package/src/__tests__/browser-distribution/soft-ceiling-warning.test.ts +0 -161
- package/src/__tests__/browser-distribution/token-completeness.property.test.ts +0 -412
- package/src/__tests__/browser-distribution/token-loading.test.ts +0 -344
- package/src/__tests__/browser-distribution/umd-bundle-loading.test.ts +0 -169
- package/src/__tests__/console-allowlist.json +0 -14
- package/src/__tests__/console-fail-setup.ts +0 -169
- package/src/__tests__/examples/improved-test-example.test.ts +0 -120
- package/src/__tests__/expected-exports.json +0 -66
- package/src/__tests__/export-contracts.test.ts +0 -83
- package/src/__tests__/fixtures/acknowledged-differences.json +0 -127
- package/src/__tests__/fixtures/acknowledged-differences.schema.json +0 -113
- package/src/__tests__/fixtures/acknowledged-differences.types.ts +0 -230
- package/src/__tests__/fixtures/tokenFixtures.ts +0 -248
- package/src/__tests__/helpers/configModuleLoader.ts +0 -20
- package/src/__tests__/helpers/tsModuleLoader.ts +0 -24
- package/src/__tests__/helpers/web-component-test-utils.ts +0 -39
- package/src/__tests__/integration/BlendCrossPlatformConsistency.test.ts +0 -505
- package/src/__tests__/integration/BuildSystemCompatibility.test.ts +0 -551
- package/src/__tests__/integration/CrossPlatformConsistency.test.ts +0 -855
- package/src/__tests__/integration/EndToEndWorkflow.test.ts +0 -601
- package/src/__tests__/integration/ErrorHandling.test.ts +0 -459
- package/src/__tests__/integration/OpacityPlatformTranslation.test.ts +0 -364
- package/src/__tests__/integration/PerformanceValidation.test.ts +0 -887
- package/src/__tests__/integration/SemanticTokenGeneration.test.ts +0 -451
- package/src/__tests__/integration/Spec107-DesignLanguageContext.test.ts +0 -139
- package/src/__tests__/integration/TokenSystemIntegration.test.ts +0 -890
- package/src/__tests__/integration/ValidationPipeline.test.ts +0 -404
- package/src/__tests__/package-drift-validation.test.ts +0 -249
- package/src/__tests__/performance/GenerationPerformance.test.ts +0 -409
- package/src/__tests__/performance/OptimizationValidation.test.ts +0 -509
- package/src/__tests__/platform-parity/ProgressPlatformParity.test.ts +0 -546
- package/src/__tests__/spec073-opacity-architecture.test.ts +0 -344
- package/src/__tests__/stemma-system/behavioral-contract-validation.test.ts +0 -520
- package/src/__tests__/stemma-system/composition-compliance-validation.test.ts +0 -162
- package/src/__tests__/stemma-system/contract-catalog-name-validation.test.ts +0 -184
- package/src/__tests__/stemma-system/contract-existence-validation.test.ts +0 -43
- package/src/__tests__/stemma-system/contract-test-reporter.ts +0 -269
- package/src/__tests__/stemma-system/cross-platform-consistency.test.ts +0 -564
- package/src/__tests__/stemma-system/form-inputs-contracts.test.ts +0 -710
- package/src/__tests__/stemma-system/input-text-native-base-call-alignment.test.ts +0 -298
- package/src/__tests__/stemma-system/mcp-component-integration.test.ts +0 -445
- package/src/analytics/PrimitiveTokenFallbackTracker.ts +0 -228
- package/src/analytics/SemanticTokenUsageTracker.ts +0 -193
- package/src/analytics/StrategicFlexibilityTracker.ts +0 -226
- package/src/analytics/TokenUsageTracker.ts +0 -177
- package/src/analytics/UsagePatternAnalyzer.ts +0 -177
- package/src/analytics/__tests__/UsageTracking.test.ts +0 -647
- package/src/analytics/index.ts +0 -42
- package/src/assets/fonts/__tests__/androidFontLoadingValidation.test.ts +0 -600
- package/src/assets/fonts/__tests__/fontLoading.test.ts +0 -341
- package/src/assets/fonts/__tests__/iosFontConfiguration.test.ts +0 -256
- package/src/assets/fonts/__tests__/iosFontLoadingValidation.test.ts +0 -465
- package/src/assets/fonts/inter/Inter-Bold.ttf +0 -0
- package/src/assets/fonts/inter/Inter-Bold.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-Medium.ttf +0 -0
- package/src/assets/fonts/inter/Inter-Medium.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-Regular.ttf +0 -0
- package/src/assets/fonts/inter/Inter-Regular.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-SemiBold.ttf +0 -0
- package/src/assets/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/src/assets/fonts/inter/inter.css +0 -49
- package/src/blend/BlendCalculator.ts +0 -120
- package/src/blend/ColorSpaceUtils.ts +0 -325
- package/src/blend/OklchBlendCalculator.ts +0 -82
- package/src/blend/ThemeAwareBlendUtilities.web.ts +0 -323
- package/src/blend/__tests__/BlendCalculator.test.ts +0 -393
- package/src/blend/__tests__/BlendUtilities.property.test.ts +0 -600
- package/src/blend/__tests__/ColorSpaceUtils.test.ts +0 -885
- package/src/blend/__tests__/InteractionStateAudit.test.ts +0 -238
- package/src/blend/__tests__/OklchBlendCalculator.test.ts +0 -134
- package/src/blend/__tests__/ThemeAwareBlendUtilities.test.ts +0 -200
- package/src/blend/__tests__/ThemeSwitching.test.ts +0 -508
- package/src/blend/index.ts +0 -37
- package/src/browser-entry.ts +0 -270
- package/src/build/.gitkeep +0 -1
- package/src/build/BuildOrchestrator.ts +0 -663
- package/src/build/__tests__/AndroidBuildIntegration.test.ts +0 -437
- package/src/build/__tests__/AndroidMotionTokenGeneration.test.ts +0 -256
- package/src/build/__tests__/BuildOrchestrator.test.ts +0 -562
- package/src/build/__tests__/MotionTokenCrossPlatformIntegration.test.ts +0 -424
- package/src/build/__tests__/WebCSSTokenGeneration.test.ts +0 -271
- package/src/build/__tests__/WebMotionTokenGeneration.test.ts +0 -305
- package/src/build/__tests__/WebNPMPackageStructure.test.ts +0 -447
- package/src/build/__tests__/iOSMotionTokenGeneration.test.ts +0 -298
- package/src/build/errors/BuildError.ts +0 -140
- package/src/build/errors/ErrorDocumentation.ts +0 -638
- package/src/build/errors/ErrorHandler.ts +0 -406
- package/src/build/errors/ErrorReporter.ts +0 -573
- package/src/build/errors/PlatformGenerationError.ts +0 -201
- package/src/build/errors/README.md +0 -486
- package/src/build/errors/RecoveryStrategy.ts +0 -393
- package/src/build/errors/TokenGenerationError.ts +0 -196
- package/src/build/errors/TokenReferenceError.ts +0 -204
- package/src/build/errors/__tests__/BuildError.test.ts +0 -212
- package/src/build/errors/__tests__/ErrorDocumentation.example.ts +0 -272
- package/src/build/errors/__tests__/ErrorDocumentation.test.ts +0 -458
- package/src/build/errors/__tests__/ErrorHandler.integration.test.ts +0 -303
- package/src/build/errors/__tests__/ErrorHandler.test.ts +0 -502
- package/src/build/errors/__tests__/ErrorReporter.test.ts +0 -581
- package/src/build/errors/__tests__/MotionTokenErrors.test.ts +0 -392
- package/src/build/errors/__tests__/RecoveryStrategy.test.ts +0 -643
- package/src/build/errors/index.ts +0 -90
- package/src/build/index.ts +0 -73
- package/src/build/orchestration/IncrementalBuilder.ts +0 -532
- package/src/build/orchestration/ParallelExecutor.ts +0 -336
- package/src/build/orchestration/ProgressTracker.ts +0 -582
- package/src/build/orchestration/SequentialExecutor.ts +0 -305
- package/src/build/orchestration/__tests__/IncrementalBuilder.test.ts +0 -354
- package/src/build/orchestration/__tests__/ParallelExecutor.integration.test.ts +0 -295
- package/src/build/orchestration/__tests__/ParallelExecutor.test.ts +0 -493
- package/src/build/orchestration/__tests__/ProgressTracker.test.ts +0 -529
- package/src/build/orchestration/__tests__/SequentialExecutor.integration.test.ts +0 -202
- package/src/build/orchestration/__tests__/SequentialExecutor.test.ts +0 -232
- package/src/build/orchestration/index.ts +0 -35
- package/src/build/platforms/.gitkeep +0 -1
- package/src/build/platforms/AndroidBuilder.ts +0 -1366
- package/src/build/platforms/AndroidShadowGenerator.ts +0 -394
- package/src/build/platforms/IOSShadowGenerator.ts +0 -324
- package/src/build/platforms/PlatformBuilder.ts +0 -131
- package/src/build/platforms/WebBuilder.ts +0 -1414
- package/src/build/platforms/WebShadowGenerator.ts +0 -288
- package/src/build/platforms/__tests__/AndroidBuilder.tokenGeneration.test.ts +0 -146
- package/src/build/platforms/__tests__/AndroidShadowGenerator.test.ts +0 -195
- package/src/build/platforms/__tests__/IOSShadowGenerator.test.ts +0 -156
- package/src/build/platforms/__tests__/WebShadowGenerator.test.ts +0 -123
- package/src/build/platforms/__tests__/iOSBuilder.test.ts +0 -1599
- package/src/build/platforms/iOSBuilder.ts +0 -1746
- package/src/build/platforms/index.ts +0 -9
- package/src/build/product/ProductTokenGenerator.ts +0 -162
- package/src/build/product/TokenIndexReader.ts +0 -78
- package/src/build/product/__tests__/KotlinEmitter.test.ts +0 -109
- package/src/build/product/__tests__/ProductTokenGenerator.test.ts +0 -135
- package/src/build/product/__tests__/SwiftEmitter.test.ts +0 -90
- package/src/build/product/__tests__/TokenIndexReader.test.ts +0 -85
- package/src/build/product/__tests__/WebEmitter.test.ts +0 -111
- package/src/build/product/__tests__/fixtures/tokens/layout.yaml +0 -21
- package/src/build/product/__tests__/fixtures/tokens/motion.yaml +0 -11
- package/src/build/product/__tests__/fixtures/tokens/visualization.yaml +0 -8
- package/src/build/product/emitters/KotlinEmitter.ts +0 -83
- package/src/build/product/emitters/SwiftEmitter.ts +0 -95
- package/src/build/product/emitters/WebEmitter.ts +0 -69
- package/src/build/tokens/.gitkeep +0 -1
- package/src/build/tokens/__tests__/ClassInvariantGuard.test.ts +0 -167
- package/src/build/tokens/__tests__/ComponentTokenGenerator.test.ts +0 -285
- package/src/build/tokens/__tests__/TokenIntegrator.test.ts +0 -319
- package/src/build/tokens/__tests__/TokenSelector.test.ts +0 -264
- package/src/build/tokens/__tests__/UnitConverter.applyScaleWithRounding.test.ts +0 -160
- package/src/build/tokens/__tests__/UnitConverter.test.ts +0 -331
- package/src/build/tokens/__tests__/brand-dual-instance.test.ts +0 -135
- package/src/build/tokens/__tests__/defineComponentTokens.test.ts +0 -440
- package/src/build/types/.gitkeep +0 -1
- package/src/build/types/BuildConfig.ts +0 -123
- package/src/build/types/BuildOrchestrator.ts +0 -114
- package/src/build/types/BuildResult.ts +0 -125
- package/src/build/types/index.ts +0 -39
- package/src/build/validation/.gitkeep +0 -1
- package/src/build/validation/AndroidBuildValidator.ts +0 -630
- package/src/build/validation/CrossPlatformValidationReporter.ts +0 -1267
- package/src/build/validation/InterfaceContractValidator.ts +0 -417
- package/src/build/validation/InterfaceValidator.ts +0 -326
- package/src/build/validation/MathematicalConsistencyValidator.ts +0 -874
- package/src/build/validation/MethodSignatureValidator.ts +0 -374
- package/src/build/validation/PropertyTypeValidator.ts +0 -312
- package/src/build/validation/TokenComparator.ts +0 -796
- package/src/build/validation/ValidationReporter.example.ts +0 -310
- package/src/build/validation/ValidationReporter.ts +0 -745
- package/src/build/validation/WebBuildValidator.ts +0 -583
- package/src/build/validation/__tests__/AndroidBuildValidator.test.ts +0 -522
- package/src/build/validation/__tests__/CrossPlatformValidationReporter.test.ts +0 -593
- package/src/build/validation/__tests__/InterfaceContractValidator.test.ts +0 -647
- package/src/build/validation/__tests__/InterfaceValidation.functional.test.ts +0 -360
- package/src/build/validation/__tests__/InterfaceValidator.test.ts +0 -318
- package/src/build/validation/__tests__/MethodSignatureValidator.test.ts +0 -625
- package/src/build/validation/__tests__/MotionTokenCrossPlatformValidation.test.ts +0 -305
- package/src/build/validation/__tests__/MotionTokenValidation.test.ts +0 -309
- package/src/build/validation/__tests__/PropertyTypeValidator.test.ts +0 -557
- package/src/build/validation/__tests__/TokenComparator.test.ts +0 -358
- package/src/build/validation/__tests__/ValidationReporter.integration.test.ts +0 -424
- package/src/build/validation/__tests__/ValidationReporter.test.ts +0 -793
- package/src/build/validation/__tests__/WebBuildValidator.test.ts +0 -495
- package/src/build/validation/iOSBuildValidator.ts +0 -783
- package/src/build/validation/index.ts +0 -74
- package/src/build/validation/types/InterfaceDefinition.ts +0 -101
- package/src/build/validation/types/ValidationResult.ts +0 -114
- package/src/build/workflow/BuildMode.ts +0 -336
- package/src/build/workflow/CICDIntegration.ts +0 -503
- package/src/build/workflow/ConfigHelpers.example.ts +0 -317
- package/src/build/workflow/ConfigHelpers.ts +0 -834
- package/src/build/workflow/README.md +0 -327
- package/src/build/workflow/SourceMapGenerator.ts +0 -362
- package/src/build/workflow/__tests__/BuildMode.test.ts +0 -544
- package/src/build/workflow/__tests__/CICDIntegration.test.ts +0 -602
- package/src/build/workflow/__tests__/ConfigHelpers.test.ts +0 -559
- package/src/build/workflow/__tests__/SourceMapGenerator.test.ts +0 -421
- package/src/build/workflow/index.ts +0 -42
- package/src/cli/__tests__/Applier.test.ts +0 -202
- package/src/cli/__tests__/Classifier.test.ts +0 -187
- package/src/cli/__tests__/FileScanner.test.ts +0 -108
- package/src/cli/__tests__/IgnoreFilter.test.ts +0 -92
- package/src/cli/__tests__/Manifest.test.ts +0 -107
- package/src/cli/__tests__/PackageResolver.test.ts +0 -66
- package/src/cli/__tests__/Prompter.test.ts +0 -165
- package/src/cli/__tests__/Reporter.test.ts +0 -128
- package/src/cli/__tests__/backward-compat.test.ts +0 -142
- package/src/cli/__tests__/figma-extract.test.ts +0 -342
- package/src/cli/__tests__/figma-push.test.ts +0 -350
- package/src/cli/__tests__/init.test.ts +0 -293
- package/src/cli/__tests__/loadComponentTokens.test.ts +0 -187
- package/src/cli/__tests__/pipeline-independence.test.ts +0 -127
- package/src/cli/__tests__/product-only.test.ts +0 -130
- package/src/cli/__tests__/resolveTokens.test.ts +0 -88
- package/src/cli/__tests__/staleness.test.ts +0 -132
- package/src/cli/__tests__/sync.test.ts +0 -199
- package/src/cli/__tests__/validate.test.ts +0 -69
- package/src/cli/designerpunk.ts +0 -410
- package/src/cli/figma-extract.ts +0 -331
- package/src/cli/figma-push.ts +0 -288
- package/src/cli/generateProductTokens.ts +0 -69
- package/src/cli/init.ts +0 -481
- package/src/cli/loadComponentTokens.ts +0 -145
- package/src/cli/resolveTokens.ts +0 -123
- package/src/cli/shared/mcpDataRoots.ts +0 -122
- package/src/cli/shared/resolvePackageRoot.ts +0 -58
- package/src/cli/shared/transforms.ts +0 -18
- package/src/cli/staleness.ts +0 -81
- package/src/cli/sync/Applier.ts +0 -128
- package/src/cli/sync/Classifier.ts +0 -130
- package/src/cli/sync/FileScanner.ts +0 -64
- package/src/cli/sync/IgnoreFilter.ts +0 -44
- package/src/cli/sync/Manifest.ts +0 -64
- package/src/cli/sync/PackageResolver.ts +0 -40
- package/src/cli/sync/Prompter.ts +0 -173
- package/src/cli/sync/Reporter.ts +0 -78
- package/src/cli/sync/SteeringDirCheck.ts +0 -166
- package/src/cli/sync/index.ts +0 -115
- package/src/cli/validate.ts +0 -135
- package/src/cli/validateProductTokens.ts +0 -55
- package/src/color/OklchConverter.ts +0 -284
- package/src/color/OklchValidator.ts +0 -186
- package/src/color/__tests__/OklchConverter.test.ts +0 -232
- package/src/color/__tests__/OklchRegression.test.ts +0 -101
- package/src/color/__tests__/OklchValidator.test.ts +0 -199
- package/src/color/__tests__/WcagContrast.test.ts +0 -76
- package/src/components/__tests__/BlendTokenUsageValidation.test.ts +0 -726
- package/src/components/__tests__/DynamicImportGuard.test.ts +0 -226
- package/src/components/__tests__/ExtensionLintPolicy.test.ts +0 -113
- package/src/components/__tests__/TokenCompliance.test.ts +0 -921
- package/src/components/__tests__/colorInheritanceValidation.test.ts +0 -267
- package/src/components/__tests__/componentTypographyInheritance.test.ts +0 -326
- package/src/components/core/Avatar-Base/README.md +0 -366
- package/src/components/core/Avatar-Base/__tests__/.gitkeep +0 -3
- package/src/components/core/Avatar-Base/__tests__/Avatar.accessibility.test.ts +0 -597
- package/src/components/core/Avatar-Base/__tests__/Avatar.icon-integration.test.ts +0 -656
- package/src/components/core/Avatar-Base/__tests__/Avatar.image.test.ts +0 -396
- package/src/components/core/Avatar-Base/__tests__/Avatar.lifecycle.test.ts +0 -545
- package/src/components/core/Avatar-Base/__tests__/Avatar.rendering.test.ts +0 -505
- package/src/components/core/Avatar-Base/__tests__/Avatar.test.ts +0 -701
- package/src/components/core/Avatar-Base/avatar.tokens.ts +0 -376
- package/src/components/core/Avatar-Base/index.ts +0 -25
- package/src/components/core/Avatar-Base/platforms/ios/.gitkeep +0 -3
- package/src/components/core/Avatar-Base/platforms/web/.gitkeep +0 -3
- package/src/components/core/Avatar-Base/platforms/web/Avatar.styles.css +0 -595
- package/src/components/core/Avatar-Base/platforms/web/Avatar.web.ts +0 -892
- package/src/components/core/Avatar-Base/platforms/web/hexagon-clip.svg +0 -87
- package/src/components/core/Avatar-Base/tokens/.gitkeep +0 -4
- package/src/components/core/Avatar-Base/types.ts +0 -86
- package/src/components/core/Badge-Count-Base/README.md +0 -323
- package/src/components/core/Badge-Count-Base/__tests__/BadgeCountBase.stemma.test.ts +0 -548
- package/src/components/core/Badge-Count-Base/__tests__/BadgeCountBase.test.ts +0 -452
- package/src/components/core/Badge-Count-Base/__tests__/test-utils.ts +0 -244
- package/src/components/core/Badge-Count-Base/index.ts +0 -37
- package/src/components/core/Badge-Count-Base/platforms/ios/.gitkeep +0 -1
- package/src/components/core/Badge-Count-Base/platforms/web/BadgeCountBase.styles.css +0 -148
- package/src/components/core/Badge-Count-Base/platforms/web/BadgeCountBase.web.ts +0 -363
- package/src/components/core/Badge-Count-Base/types.ts +0 -150
- package/src/components/core/Badge-Count-Notification/README.md +0 -396
- package/src/components/core/Badge-Count-Notification/__tests__/BadgeCountNotification.stemma.test.ts +0 -571
- package/src/components/core/Badge-Count-Notification/__tests__/BadgeCountNotification.test.ts +0 -490
- package/src/components/core/Badge-Count-Notification/__tests__/test-utils.ts +0 -256
- package/src/components/core/Badge-Count-Notification/index.ts +0 -60
- package/src/components/core/Badge-Count-Notification/platforms/web/BadgeCountNotification.styles.css +0 -182
- package/src/components/core/Badge-Count-Notification/platforms/web/BadgeCountNotification.web.ts +0 -401
- package/src/components/core/Badge-Count-Notification/tokens.ts +0 -124
- package/src/components/core/Badge-Count-Notification/types.ts +0 -119
- package/src/components/core/Badge-Label-Base/README.md +0 -251
- package/src/components/core/Badge-Label-Base/__tests__/BadgeLabelBase.stemma.test.ts +0 -549
- package/src/components/core/Badge-Label-Base/__tests__/BadgeLabelBase.test.ts +0 -439
- package/src/components/core/Badge-Label-Base/__tests__/test-utils.ts +0 -269
- package/src/components/core/Badge-Label-Base/__tests__/tokens.test.ts +0 -88
- package/src/components/core/Badge-Label-Base/index.ts +0 -41
- package/src/components/core/Badge-Label-Base/platforms/web/BadgeLabelBase.styles.css +0 -166
- package/src/components/core/Badge-Label-Base/platforms/web/BadgeLabelBase.web.ts +0 -340
- package/src/components/core/Badge-Label-Base/tokens.ts +0 -80
- package/src/components/core/Badge-Label-Base/types.ts +0 -148
- package/src/components/core/Button-CTA/Button-CTA.tokens.ts +0 -79
- package/src/components/core/Button-CTA/README.md +0 -293
- package/src/components/core/Button-CTA/__tests__/ButtonCTA.alignment.test.ts +0 -355
- package/src/components/core/Button-CTA/__tests__/ButtonCTA.test.ts +0 -698
- package/src/components/core/Button-CTA/__tests__/ButtonCTA.tokens.test.ts +0 -89
- package/src/components/core/Button-CTA/__tests__/setup.test.ts +0 -209
- package/src/components/core/Button-CTA/__tests__/test-utils.ts +0 -185
- package/src/components/core/Button-CTA/examples/BasicUsage.html +0 -133
- package/src/components/core/Button-CTA/examples/BasicUsage.tsx +0 -219
- package/src/components/core/Button-CTA/examples/Variants.html +0 -263
- package/src/components/core/Button-CTA/examples/WithIcon.html +0 -166
- package/src/components/core/Button-CTA/index.ts +0 -20
- package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.css +0 -395
- package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.ts +0 -644
- package/src/components/core/Button-CTA/platforms/web/__tests__/ButtonCTA.icon-integration.test.ts +0 -476
- package/src/components/core/Button-CTA/types.ts +0 -239
- package/src/components/core/Button-Icon/README.md +0 -371
- package/src/components/core/Button-Icon/__tests__/ButtonIcon.alignment.test.ts +0 -358
- package/src/components/core/Button-Icon/__tests__/ButtonIcon.properties-8-13.test.ts +0 -953
- package/src/components/core/Button-Icon/__tests__/ButtonIcon.properties.test.ts +0 -920
- package/src/components/core/Button-Icon/__tests__/ButtonIcon.stemma.test.ts +0 -622
- package/src/components/core/Button-Icon/__tests__/ButtonIcon.unit.test.ts +0 -560
- package/src/components/core/Button-Icon/__tests__/setup.test.ts +0 -361
- package/src/components/core/Button-Icon/__tests__/test-utils.ts +0 -248
- package/src/components/core/Button-Icon/buttonIcon.tokens.ts +0 -202
- package/src/components/core/Button-Icon/platforms/web/.gitkeep +0 -4
- package/src/components/core/Button-Icon/platforms/web/ButtonIcon.web.css +0 -600
- package/src/components/core/Button-Icon/platforms/web/ButtonIcon.web.ts +0 -625
- package/src/components/core/Button-Icon/types.ts +0 -186
- package/src/components/core/Button-VerticalList-Item/Button-VerticalList-Item.tokens.ts +0 -112
- package/src/components/core/Button-VerticalList-Item/README.md +0 -450
- package/src/components/core/Button-VerticalList-Item/__tests__/.gitkeep +0 -2
- package/src/components/core/Button-VerticalList-Item/__tests__/ButtonVerticalListItem.alignment.test.ts +0 -271
- package/src/components/core/Button-VerticalList-Item/__tests__/ButtonVerticalListItem.failLoudly.test.ts +0 -106
- package/src/components/core/Button-VerticalList-Item/__tests__/ButtonVerticalListItem.integration.test.ts +0 -480
- package/src/components/core/Button-VerticalList-Item/__tests__/ButtonVerticalListItem.properties.test.ts +0 -634
- package/src/components/core/Button-VerticalList-Item/__tests__/ButtonVerticalListItem.unit.test.ts +0 -746
- package/src/components/core/Button-VerticalList-Item/__tests__/rtlSupport.test.ts +0 -206
- package/src/components/core/Button-VerticalList-Item/__tests__/test-utils.ts +0 -297
- package/src/components/core/Button-VerticalList-Item/__tests__/visualStateMapping.test.ts +0 -419
- package/src/components/core/Button-VerticalList-Item/index.ts +0 -49
- package/src/components/core/Button-VerticalList-Item/platforms/android/VerticalListButtonItemTest.kt +0 -1109
- package/src/components/core/Button-VerticalList-Item/platforms/ios/.gitkeep +0 -2
- package/src/components/core/Button-VerticalList-Item/platforms/ios/VerticalListButtonItemTests.swift +0 -794
- package/src/components/core/Button-VerticalList-Item/platforms/web/.gitkeep +0 -2
- package/src/components/core/Button-VerticalList-Item/platforms/web/ButtonVerticalListItem.styles.css +0 -459
- package/src/components/core/Button-VerticalList-Item/platforms/web/ButtonVerticalListItem.web.ts +0 -1030
- package/src/components/core/Button-VerticalList-Item/platforms/web/visualStateMapping.ts +0 -411
- package/src/components/core/Button-VerticalList-Item/types.ts +0 -338
- package/src/components/core/Button-VerticalList-Set/README.md +0 -578
- package/src/components/core/Button-VerticalList-Set/__tests__/.gitkeep +0 -5
- package/src/components/core/Button-VerticalList-Set/__tests__/ButtonVerticalListSet.integration.test.ts +0 -676
- package/src/components/core/Button-VerticalList-Set/__tests__/ButtonVerticalListSet.property.test.ts +0 -786
- package/src/components/core/Button-VerticalList-Set/__tests__/ButtonVerticalListSet.property2.test.ts +0 -1109
- package/src/components/core/Button-VerticalList-Set/__tests__/ButtonVerticalListSet.unit.test.ts +0 -924
- package/src/components/core/Button-VerticalList-Set/__tests__/animationTiming.test.ts +0 -182
- package/src/components/core/Button-VerticalList-Set/__tests__/crossPlatformConsistency.test.ts +0 -685
- package/src/components/core/Button-VerticalList-Set/__tests__/deriveItemStates.test.ts +0 -179
- package/src/components/core/Button-VerticalList-Set/__tests__/validation.test.ts +0 -275
- package/src/components/core/Button-VerticalList-Set/index.ts +0 -32
- package/src/components/core/Button-VerticalList-Set/platforms/android/ButtonVerticalListSetTest.kt +0 -961
- package/src/components/core/Button-VerticalList-Set/platforms/ios/.gitkeep +0 -0
- package/src/components/core/Button-VerticalList-Set/platforms/ios/ButtonVerticalListSetTests.swift +0 -475
- package/src/components/core/Button-VerticalList-Set/platforms/web/.gitkeep +0 -4
- package/src/components/core/Button-VerticalList-Set/platforms/web/Button-VerticalList-Set.styles.css +0 -167
- package/src/components/core/Button-VerticalList-Set/platforms/web/ButtonVerticalListSet.web.ts +0 -1446
- package/src/components/core/Button-VerticalList-Set/types.ts +0 -788
- package/src/components/core/Chip-Base/__tests__/ChipBase.test.ts +0 -534
- package/src/components/core/Chip-Base/index.ts +0 -40
- package/src/components/core/Chip-Base/platforms/ios/.gitkeep +0 -3
- package/src/components/core/Chip-Base/platforms/web/.gitkeep +0 -5
- package/src/components/core/Chip-Base/platforms/web/ChipBase.styles.css +0 -280
- package/src/components/core/Chip-Base/platforms/web/ChipBase.web.ts +0 -480
- package/src/components/core/Chip-Base/types.ts +0 -189
- package/src/components/core/Chip-Filter/__tests__/ChipFilter.test.ts +0 -592
- package/src/components/core/Chip-Filter/index.ts +0 -34
- package/src/components/core/Chip-Filter/platforms/web/ChipFilter.styles.css +0 -105
- package/src/components/core/Chip-Filter/platforms/web/ChipFilter.web.ts +0 -539
- package/src/components/core/Chip-Filter/types.ts +0 -47
- package/src/components/core/Chip-Input/__tests__/ChipInput.test.ts +0 -472
- package/src/components/core/Chip-Input/index.ts +0 -35
- package/src/components/core/Chip-Input/platforms/ios/.gitkeep +0 -3
- package/src/components/core/Chip-Input/platforms/web/ChipInput.styles.css +0 -99
- package/src/components/core/Chip-Input/platforms/web/ChipInput.web.ts +0 -485
- package/src/components/core/Chip-Input/types.ts +0 -35
- package/src/components/core/Container-Base/README.md +0 -450
- package/src/components/core/Container-Base/__tests__/ContainerBase.test.ts +0 -712
- package/src/components/core/Container-Base/index.ts +0 -47
- package/src/components/core/Container-Base/platforms/web/ContainerBase.web.ts +0 -405
- package/src/components/core/Container-Base/platforms/web/styles.css +0 -198
- package/src/components/core/Container-Base/platforms/web/token-mapping.ts +0 -573
- package/src/components/core/Container-Base/tokens.ts +0 -241
- package/src/components/core/Container-Base/types.ts +0 -307
- package/src/components/core/Container-Card-Base/README.md +0 -506
- package/src/components/core/Container-Card-Base/__tests__/ContainerCardBase.composition.test.ts +0 -167
- package/src/components/core/Container-Card-Base/__tests__/ContainerCardBase.test.ts +0 -646
- package/src/components/core/Container-Card-Base/index.ts +0 -64
- package/src/components/core/Container-Card-Base/platforms/web/ContainerCardBase.web.ts +0 -373
- package/src/components/core/Container-Card-Base/tokens.ts +0 -224
- package/src/components/core/Container-Card-Base/types.ts +0 -332
- package/src/components/core/Icon-Base/README.md +0 -168
- package/src/components/core/Icon-Base/__tests__/IconBase.test.ts +0 -192
- package/src/components/core/Icon-Base/index.ts +0 -34
- package/src/components/core/Icon-Base/platforms/ios/ASSET_CATALOG_SETUP.md +0 -239
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Contents.json +0 -6
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/Contents.json +0 -9
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/alert-circle.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/alert-circle.imageset/alert-circle.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/arrow-down.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/arrow-down.imageset/arrow-down.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/arrow-left.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/arrow-left.imageset/arrow-left.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/arrow-right.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/arrow-right.imageset/arrow-right.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/arrow-up.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/arrow-up.imageset/arrow-up.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/award.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/award.imageset/award.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/bell.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/bell.imageset/bell.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/briefcase.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/briefcase.imageset/briefcase.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/calendar.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/calendar.imageset/calendar.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/check-circle.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/check-circle.imageset/check-circle.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/check.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/check.imageset/check.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/chevron-down.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/chevron-down.imageset/chevron-down.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/chevron-left.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/chevron-left.imageset/chevron-left.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/chevron-right.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/chevron-right.imageset/chevron-right.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/circle.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/circle.imageset/circle.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/clock.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/clock.imageset/clock.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/credit-card.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/credit-card.imageset/credit-card.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/dollar-sign.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/dollar-sign.imageset/dollar-sign.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/external-link.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/external-link.imageset/external-link.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/eye-off.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/eye-off.imageset/eye-off.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/eye.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/eye.imageset/eye.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/file-text.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/file-text.imageset/file-text.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/filter.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/filter.imageset/filter.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/globe.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/globe.imageset/globe.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/heart.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/heart.imageset/heart.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/info.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/info.imageset/info.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/mail.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/mail.imageset/mail.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/map-pin.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/map-pin.imageset/map-pin.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/minus.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/minus.imageset/minus.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/more-horizontal.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/more-horizontal.imageset/more-horizontal.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/more-vertical.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/more-vertical.imageset/more-vertical.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/phone.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/phone.imageset/phone.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/plus.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/plus.imageset/plus.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/refresh-cw.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/refresh-cw.imageset/refresh-cw.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/save.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/save.imageset/save.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/search.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/search.imageset/search.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/settings.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/settings.imageset/settings.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/share-2.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/share-2.imageset/share-2.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/share.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/share.imageset/share.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/shield.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/shield.imageset/shield.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/smartphone.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/smartphone.imageset/smartphone.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/smile.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/smile.imageset/smile.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/star.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/star.imageset/star.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/trending-up.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/trending-up.imageset/trending-up.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/user-check.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/user-check.imageset/user-check.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/user-x.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/user-x.imageset/user-x.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/user.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/user.imageset/user.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/users.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/users.imageset/users.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/wifi.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/wifi.imageset/wifi.svg +0 -1
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/x.imageset/Contents.json +0 -15
- package/src/components/core/Icon-Base/platforms/ios/Icons.xcassets/Icons/x.imageset/x.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/IconBase.web.ts +0 -553
- package/src/components/core/Icon-Base/platforms/web/assets/alert-circle.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/arrow-down.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/arrow-left.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/arrow-right.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/arrow-up.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/award.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/bell.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/briefcase.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/calendar.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/check-circle.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/check.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/chevron-down.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/chevron-left.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/chevron-right.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/circle.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/clock.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/credit-card.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/dollar-sign.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/external-link.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/eye-off.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/eye.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/file-text.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/filter.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/globe.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/heart.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/info.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/mail.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/map-pin.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/minus.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/more-horizontal.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/more-vertical.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/phone.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/plus.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/refresh-cw.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/save.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/search.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/settings.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/share-2.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/share.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/shield.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/smartphone.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/smile.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/star.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/trending-up.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/user-check.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/user-x.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/user.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/users.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/wifi.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/assets/x.svg +0 -1
- package/src/components/core/Icon-Base/platforms/web/styles.css +0 -203
- package/src/components/core/Icon-Base/types.ts +0 -338
- package/src/components/core/Input-Checkbox-Base/README.md +0 -390
- package/src/components/core/Input-Checkbox-Base/__tests__/InputCheckboxBase.stemma.test.ts +0 -552
- package/src/components/core/Input-Checkbox-Base/__tests__/InputCheckboxBase.test.ts +0 -878
- package/src/components/core/Input-Checkbox-Base/checkbox-sizing.tokens.ts +0 -37
- package/src/components/core/Input-Checkbox-Base/platforms/web/InputCheckboxBase.web.css +0 -477
- package/src/components/core/Input-Checkbox-Base/platforms/web/InputCheckboxBase.web.ts +0 -561
- package/src/components/core/Input-Checkbox-Base/types.ts +0 -399
- package/src/components/core/Input-Checkbox-Legal/README.md +0 -554
- package/src/components/core/Input-Checkbox-Legal/__tests__/InputCheckboxLegal.test.ts +0 -727
- package/src/components/core/Input-Checkbox-Legal/platforms/ios/.gitkeep +0 -2
- package/src/components/core/Input-Checkbox-Legal/platforms/web/InputCheckboxLegal.web.css +0 -112
- package/src/components/core/Input-Checkbox-Legal/platforms/web/InputCheckboxLegal.web.ts +0 -505
- package/src/components/core/Input-Checkbox-Legal/types.ts +0 -348
- package/src/components/core/Input-Radio-Base/.gitkeep +0 -2
- package/src/components/core/Input-Radio-Base/README.md +0 -427
- package/src/components/core/Input-Radio-Base/__tests__/.gitkeep +0 -1
- package/src/components/core/Input-Radio-Base/__tests__/InputRadioBase.form.test.ts +0 -299
- package/src/components/core/Input-Radio-Base/__tests__/InputRadioBase.stemma.test.ts +0 -543
- package/src/components/core/Input-Radio-Base/__tests__/InputRadioBase.test.ts +0 -429
- package/src/components/core/Input-Radio-Base/platforms/ios/.gitkeep +0 -1
- package/src/components/core/Input-Radio-Base/platforms/web/.gitkeep +0 -1
- package/src/components/core/Input-Radio-Base/platforms/web/InputRadioBase.web.css +0 -504
- package/src/components/core/Input-Radio-Base/platforms/web/InputRadioBase.web.ts +0 -648
- package/src/components/core/Input-Radio-Base/radio-sizing.tokens.ts +0 -37
- package/src/components/core/Input-Radio-Base/types.ts +0 -362
- package/src/components/core/Input-Radio-Set/README.md +0 -373
- package/src/components/core/Input-Radio-Set/__tests__/.gitkeep +0 -0
- package/src/components/core/Input-Radio-Set/__tests__/InputRadioSet.stemma.test.ts +0 -493
- package/src/components/core/Input-Radio-Set/__tests__/InputRadioSet.test.ts +0 -499
- package/src/components/core/Input-Radio-Set/platforms/web/InputRadioSet.web.css +0 -99
- package/src/components/core/Input-Radio-Set/platforms/web/InputRadioSet.web.ts +0 -790
- package/src/components/core/Input-Radio-Set/types.ts +0 -301
- package/src/components/core/Input-Text-Base/README.md +0 -258
- package/src/components/core/Input-Text-Base/__tests__/focusIndicators.test.ts +0 -311
- package/src/components/core/Input-Text-Base/__tests__/keyboardNavigation.test.ts +0 -444
- package/src/components/core/Input-Text-Base/__tests__/labelAssociation.test.ts +0 -418
- package/src/components/core/Input-Text-Base/__tests__/screenReaderSupport.test.ts +0 -405
- package/src/components/core/Input-Text-Base/__tests__/setup.ts +0 -17
- package/src/components/core/Input-Text-Base/__tests__/stateManagement.test.ts +0 -718
- package/src/components/core/Input-Text-Base/__tests__/test-utils.ts +0 -81
- package/src/components/core/Input-Text-Base/__tests__/touchTargetSizing.test.ts +0 -319
- package/src/components/core/Input-Text-Base/platforms/web/InputTextBase.browser.ts +0 -241
- package/src/components/core/Input-Text-Base/platforms/web/InputTextBase.web.css +0 -293
- package/src/components/core/Input-Text-Base/platforms/web/InputTextBase.web.ts +0 -448
- package/src/components/core/Input-Text-Base/stateManagement.ts +0 -267
- package/src/components/core/Input-Text-Base/tokens.ts +0 -210
- package/src/components/core/Input-Text-Base/types.ts +0 -114
- package/src/components/core/Input-Text-Email/README.md +0 -252
- package/src/components/core/Input-Text-Email/__tests__/validation.test.ts +0 -127
- package/src/components/core/Input-Text-Email/platforms/web/InputTextEmail.browser.ts +0 -276
- package/src/components/core/Input-Text-Email/platforms/web/InputTextEmail.web.ts +0 -319
- package/src/components/core/Input-Text-Email/stateManagement.ts +0 -160
- package/src/components/core/Input-Text-Email/tokens.ts +0 -33
- package/src/components/core/Input-Text-Email/types.ts +0 -72
- package/src/components/core/Input-Text-Email/validation.ts +0 -130
- package/src/components/core/Input-Text-Password/README.md +0 -360
- package/src/components/core/Input-Text-Password/__tests__/validation.test.ts +0 -362
- package/src/components/core/Input-Text-Password/platforms/web/InputTextPassword.browser.ts +0 -434
- package/src/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.ts +0 -512
- package/src/components/core/Input-Text-Password/stateManagement.ts +0 -244
- package/src/components/core/Input-Text-Password/tokens.ts +0 -32
- package/src/components/core/Input-Text-Password/types.ts +0 -177
- package/src/components/core/Input-Text-Password/validation.ts +0 -207
- package/src/components/core/Input-Text-PhoneNumber/README.md +0 -276
- package/src/components/core/Input-Text-PhoneNumber/__tests__/validation.test.ts +0 -301
- package/src/components/core/Input-Text-PhoneNumber/platforms/web/InputTextPhoneNumber.browser.ts +0 -370
- package/src/components/core/Input-Text-PhoneNumber/platforms/web/InputTextPhoneNumber.web.ts +0 -393
- package/src/components/core/Input-Text-PhoneNumber/stateManagement.ts +0 -250
- package/src/components/core/Input-Text-PhoneNumber/tokens.ts +0 -33
- package/src/components/core/Input-Text-PhoneNumber/types.ts +0 -135
- package/src/components/core/Input-Text-PhoneNumber/validation.ts +0 -302
- package/src/components/core/Nav-Header-App/README.md +0 -29
- package/src/components/core/Nav-Header-App/index.ts +0 -5
- package/src/components/core/Nav-Header-App/platforms/web/NavHeaderApp.web.ts +0 -37
- package/src/components/core/Nav-Header-App/types.ts +0 -32
- package/src/components/core/Nav-Header-Base/README.md +0 -21
- package/src/components/core/Nav-Header-Base/index.ts +0 -12
- package/src/components/core/Nav-Header-Base/platforms/web/NavHeaderBase.styles.css +0 -75
- package/src/components/core/Nav-Header-Base/platforms/web/NavHeaderBase.web.ts +0 -120
- package/src/components/core/Nav-Header-Base/types.ts +0 -63
- package/src/components/core/Nav-Header-Page/README.md +0 -34
- package/src/components/core/Nav-Header-Page/__tests__/NavHeaderPage.test.ts +0 -250
- package/src/components/core/Nav-Header-Page/index.ts +0 -12
- package/src/components/core/Nav-Header-Page/platforms/web/NavHeaderPage.styles.css +0 -90
- package/src/components/core/Nav-Header-Page/platforms/web/NavHeaderPage.web.ts +0 -169
- package/src/components/core/Nav-Header-Page/types.ts +0 -55
- package/src/components/core/Nav-SegmentedChoice-Base/README.md +0 -327
- package/src/components/core/Nav-SegmentedChoice-Base/__tests__/NavSegmentedChoiceBase.android.test.ts +0 -218
- package/src/components/core/Nav-SegmentedChoice-Base/__tests__/NavSegmentedChoiceBase.interaction.test.ts +0 -419
- package/src/components/core/Nav-SegmentedChoice-Base/__tests__/NavSegmentedChoiceBase.ios.test.ts +0 -207
- package/src/components/core/Nav-SegmentedChoice-Base/__tests__/NavSegmentedChoiceBase.visual.test.ts +0 -371
- package/src/components/core/Nav-SegmentedChoice-Base/index.ts +0 -38
- package/src/components/core/Nav-SegmentedChoice-Base/platforms/web/NavSegmentedChoiceBase.styles.css +0 -160
- package/src/components/core/Nav-SegmentedChoice-Base/platforms/web/NavSegmentedChoiceBase.web.ts +0 -477
- package/src/components/core/Nav-SegmentedChoice-Base/types.ts +0 -65
- package/src/components/core/Nav-TabBar-Base/README.md +0 -264
- package/src/components/core/Nav-TabBar-Base/__tests__/NavTabBarBase.android.test.ts +0 -270
- package/src/components/core/Nav-TabBar-Base/__tests__/NavTabBarBase.ios.test.ts +0 -221
- package/src/components/core/Nav-TabBar-Base/__tests__/NavTabBarBase.test.ts +0 -421
- package/src/components/core/Nav-TabBar-Base/examples/BasicUsage.html +0 -2
- package/src/components/core/Nav-TabBar-Base/examples/BasicUsage.tsx +0 -2
- package/src/components/core/Nav-TabBar-Base/index.ts +0 -20
- package/src/components/core/Nav-TabBar-Base/platforms/web/NavTabBarBase.styles.css +0 -281
- package/src/components/core/Nav-TabBar-Base/platforms/web/NavTabBarBase.web.ts +0 -420
- package/src/components/core/Nav-TabBar-Base/types.ts +0 -43
- package/src/components/core/Progress-Bar-Base/README.md +0 -31
- package/src/components/core/Progress-Bar-Base/__tests__/ProgressBarBase.test.ts +0 -202
- package/src/components/core/Progress-Bar-Base/index.ts +0 -6
- package/src/components/core/Progress-Bar-Base/platforms/web/ProgressBarBase.styles.css +0 -52
- package/src/components/core/Progress-Bar-Base/platforms/web/ProgressBarBase.web.ts +0 -135
- package/src/components/core/Progress-Bar-Base/types.ts +0 -46
- package/src/components/core/Progress-Indicator-Connector-Base/README.md +0 -169
- package/src/components/core/Progress-Indicator-Connector-Base/index.ts +0 -33
- package/src/components/core/Progress-Indicator-Connector-Base/platforms/web/ProgressIndicatorConnectorBase.styles.css +0 -50
- package/src/components/core/Progress-Indicator-Connector-Base/platforms/web/ProgressIndicatorConnectorBase.web.ts +0 -141
- package/src/components/core/Progress-Indicator-Connector-Base/types.ts +0 -67
- package/src/components/core/Progress-Indicator-Label-Base/README.md +0 -191
- package/src/components/core/Progress-Indicator-Label-Base/index.ts +0 -28
- package/src/components/core/Progress-Indicator-Label-Base/platforms/web/ProgressIndicatorLabelBase.styles.css +0 -81
- package/src/components/core/Progress-Indicator-Label-Base/platforms/web/ProgressIndicatorLabelBase.web.ts +0 -174
- package/src/components/core/Progress-Indicator-Label-Base/types.ts +0 -64
- package/src/components/core/Progress-Indicator-Node-Base/README.md +0 -206
- package/src/components/core/Progress-Indicator-Node-Base/__tests__/VisualStates.test.ts +0 -259
- package/src/components/core/Progress-Indicator-Node-Base/index.ts +0 -36
- package/src/components/core/Progress-Indicator-Node-Base/platforms/web/ProgressIndicatorNodeBase.styles.css +0 -193
- package/src/components/core/Progress-Indicator-Node-Base/platforms/web/ProgressIndicatorNodeBase.web.ts +0 -226
- package/src/components/core/Progress-Indicator-Node-Base/types.ts +0 -142
- package/src/components/core/Progress-Pagination-Base/README.md +0 -290
- package/src/components/core/Progress-Pagination-Base/__tests__/PaginationBase.test.ts +0 -290
- package/src/components/core/Progress-Pagination-Base/index.ts +0 -40
- package/src/components/core/Progress-Pagination-Base/platforms/web/ProgressPaginationBase.styles.css +0 -80
- package/src/components/core/Progress-Pagination-Base/platforms/web/ProgressPaginationBase.web.ts +0 -293
- package/src/components/core/Progress-Pagination-Base/types.ts +0 -112
- package/src/components/core/Progress-Stepper-Base/README.md +0 -311
- package/src/components/core/Progress-Stepper-Base/__tests__/StepperBase.test.ts +0 -345
- package/src/components/core/Progress-Stepper-Base/index.ts +0 -43
- package/src/components/core/Progress-Stepper-Base/platforms/web/ProgressStepperBase.styles.css +0 -49
- package/src/components/core/Progress-Stepper-Base/platforms/web/ProgressStepperBase.web.ts +0 -288
- package/src/components/core/Progress-Stepper-Base/types.ts +0 -175
- package/src/components/core/Progress-Stepper-Detailed/README.md +0 -401
- package/src/components/core/Progress-Stepper-Detailed/__tests__/StepperDetailed.test.ts +0 -481
- package/src/components/core/Progress-Stepper-Detailed/index.ts +0 -48
- package/src/components/core/Progress-Stepper-Detailed/platforms/web/ProgressStepperDetailed.styles.css +0 -106
- package/src/components/core/Progress-Stepper-Detailed/platforms/web/ProgressStepperDetailed.web.ts +0 -336
- package/src/components/core/Progress-Stepper-Detailed/types.ts +0 -195
- package/src/composition/BlendComposition.ts +0 -46
- package/src/composition/BlendCompositionParser.ts +0 -215
- package/src/composition/OpacityComposition.ts +0 -62
- package/src/composition/OpacityCompositionParser.ts +0 -308
- package/src/composition/__tests__/BlendCompositionParser.test.ts +0 -431
- package/src/composition/__tests__/OpacityCompositionParser.test.ts +0 -539
- package/src/composition/index.ts +0 -20
- package/src/config/ConfigLoader.ts +0 -143
- package/src/config/__resolution-matrix__/README.md +0 -76
- package/src/config/__resolution-matrix__/fixtures/faithful-cjs/compiled/defineConfig.js +0 -9
- package/src/config/__resolution-matrix__/fixtures/faithful-cjs/designerpunk.config.ts +0 -20
- package/src/config/__resolution-matrix__/fixtures/faithful-cjs/my-overrides.ts +0 -8
- package/src/config/__resolution-matrix__/fixtures/faithful-esm/compiled/defineConfig.js +0 -11
- package/src/config/__resolution-matrix__/fixtures/faithful-esm/designerpunk.config.ts +0 -23
- package/src/config/__resolution-matrix__/fixtures/faithful-esm/my-overrides.ts +0 -6
- package/src/config/__resolution-matrix__/fixtures/source-dir-cjs/designerpunk.config.ts +0 -11
- package/src/config/__resolution-matrix__/fixtures/source-dir-cjs/src/config/index.ts +0 -15
- package/src/config/__resolution-matrix__/fixtures/source-dir-esm/designerpunk.config.ts +0 -15
- package/src/config/__resolution-matrix__/fixtures/source-dir-esm/src/config/index.ts +0 -13
- package/src/config/__resolution-matrix__/run-matrix.js +0 -107
- package/src/config/__resolution-matrix__/runner.js +0 -153
- package/src/config/__resolution-matrix__/verify-real-loadconfig.js +0 -122
- package/src/config/__tests__/ConfigLoader.test.ts +0 -115
- package/src/config/defineConfig.ts +0 -71
- package/src/config/index.ts +0 -7
- package/src/config/scopedTsRequire.ts +0 -62
- package/src/constants/BaselineGrid.ts +0 -41
- package/src/constants/SpacingTokens.ts +0 -55
- package/src/figma/ComponentAnalysis.ts +0 -292
- package/src/figma/ComponentAnalysisGenerator.ts +0 -444
- package/src/figma/ConsoleMCPClient.ts +0 -168
- package/src/figma/ConsoleMCPClientImpl.ts +0 -1034
- package/src/figma/DesignExtractor.ts +0 -3620
- package/src/figma/TokenSyncWorkflow.ts +0 -915
- package/src/figma/TokenTranslator.ts +0 -891
- package/src/figma/VariantAnalyzer.ts +0 -712
- package/src/figma/__tests__/ComponentAnalysisGenerator.json.test.ts +0 -429
- package/src/figma/__tests__/ComponentAnalysisGenerator.markdown.test.ts +0 -428
- package/src/figma/__tests__/ConsoleMCPClient.bugfix.test.ts +0 -261
- package/src/figma/__tests__/ConsoleMCPClient.preservation.test.ts +0 -395
- package/src/figma/__tests__/ConsoleMCPClient.test.ts +0 -375
- package/src/figma/__tests__/DesignExtractor.boundVariableResolution.test.ts +0 -580
- package/src/figma/__tests__/DesignExtractor.buildNodeTree.test.ts +0 -535
- package/src/figma/__tests__/DesignExtractor.captureComponentScreenshot.test.ts +0 -176
- package/src/figma/__tests__/DesignExtractor.detectBehavioralContracts.test.ts +0 -263
- package/src/figma/__tests__/DesignExtractor.detectComponentTokenDecisions.test.ts +0 -379
- package/src/figma/__tests__/DesignExtractor.detectCompositionPatterns.test.ts +0 -507
- package/src/figma/__tests__/DesignExtractor.detectPlatformParity.test.ts +0 -406
- package/src/figma/__tests__/DesignExtractor.queryContext.test.ts +0 -214
- package/src/figma/__tests__/DesignExtractor.readFigmaComponent.test.ts +0 -431
- package/src/figma/__tests__/DesignExtractor.readStyles.test.ts +0 -204
- package/src/figma/__tests__/DesignExtractor.readTokenBindings.test.ts +0 -268
- package/src/figma/__tests__/DesignExtractor.reconstructCompositeTokens.test.ts +0 -403
- package/src/figma/__tests__/DesignExtractor.resolveUnknownVariableIds.test.ts +0 -259
- package/src/figma/__tests__/DesignExtractor.translateTokens.test.ts +0 -433
- package/src/figma/__tests__/DesignExtractor.validateModes.test.ts +0 -350
- package/src/figma/__tests__/TokenSyncWorkflow.batch.test.ts +0 -277
- package/src/figma/__tests__/TokenSyncWorkflow.drift.test.ts +0 -187
- package/src/figma/__tests__/TokenSyncWorkflow.preservation.test.ts +0 -544
- package/src/figma/__tests__/TokenSyncWorkflow.styles.test.ts +0 -245
- package/src/figma/__tests__/TokenSyncWorkflow.sync.test.ts +0 -217
- package/src/figma/__tests__/TokenTranslator.test.ts +0 -757
- package/src/figma/__tests__/VariantAnalyzer.detectConflicts.test.ts +0 -126
- package/src/figma/__tests__/VariantAnalyzer.test.ts +0 -633
- package/src/figma/__tests__/error-reporting.test.ts +0 -254
- package/src/figma/__tests__/preflight.test.ts +0 -94
- package/src/figma/error-reporting.ts +0 -260
- package/src/figma/index.ts +0 -98
- package/src/figma/portCleanup.ts +0 -86
- package/src/figma/preflight.ts +0 -120
- package/src/generators/BlendUtilityGenerator.ts +0 -847
- package/src/generators/BlendValueGenerator.ts +0 -198
- package/src/generators/DTCGFormatGenerator.ts +0 -1355
- package/src/generators/DTCGGeneratorConfig.ts +0 -46
- package/src/generators/ModeResolvedTokens.ts +0 -58
- package/src/generators/ResponsiveGridGenerator.ts +0 -273
- package/src/generators/TokenFileGenerator.ts +0 -2070
- package/src/generators/__tests__/AccessibilityTokenGeneration.test.ts +0 -350
- package/src/generators/__tests__/BlendUtilityGenerator.test.ts +0 -829
- package/src/generators/__tests__/BlendValueGenerator.test.ts +0 -200
- package/src/generators/__tests__/BreakpointTokenGeneration.test.ts +0 -172
- package/src/generators/__tests__/CSSThemeScoping.test.ts +0 -153
- package/src/generators/__tests__/DTCGConfigOptions.test.ts +0 -271
- package/src/generators/__tests__/DTCGErrorHandling.test.ts +0 -139
- package/src/generators/__tests__/DTCGFormatGenerator.integration.test.ts +0 -346
- package/src/generators/__tests__/DTCGFormatGenerator.property.test.ts +0 -497
- package/src/generators/__tests__/DTCGFormatGenerator.test.ts +0 -469
- package/src/generators/__tests__/FigmaTransformer.styles.test.ts +0 -398
- package/src/generators/__tests__/FigmaTransformer.variables.test.ts +0 -540
- package/src/generators/__tests__/GridSpacingTokenGeneration.test.ts +0 -254
- package/src/generators/__tests__/IconTokenGeneration.test.ts +0 -452
- package/src/generators/__tests__/KotlinThemeTypes.test.ts +0 -110
- package/src/generators/__tests__/ModeAwareGeneration.test.ts +0 -160
- package/src/generators/__tests__/NativeOklchOutput.test.ts +0 -56
- package/src/generators/__tests__/OklchExport.test.ts +0 -71
- package/src/generators/__tests__/ProductRepoSimulation.test.ts +0 -91
- package/src/generators/__tests__/ResponsiveGridGeneration.test.ts +0 -291
- package/src/generators/__tests__/Spec076TokenMigration.test.ts +0 -106
- package/src/generators/__tests__/Spec077ModesVerification.test.ts +0 -52
- package/src/generators/__tests__/SwiftThemeTypes.test.ts +0 -122
- package/src/generators/__tests__/TokenFileGenerator.test.ts +0 -914
- package/src/generators/__tests__/TransformerRegistry.test.ts +0 -118
- package/src/generators/__tests__/WcagValueExportSupport.test.ts +0 -84
- package/src/generators/__tests__/WcagValueInfrastructure.test.ts +0 -122
- package/src/generators/__tests__/WebOklchOutput.test.ts +0 -72
- package/src/generators/__tests__/generateTokenIndex.test.ts +0 -204
- package/src/generators/__tests__/helpers/defaultSemanticOptions.ts +0 -24
- package/src/generators/generateTokenFiles.ts +0 -337
- package/src/generators/generateTokenIndex.ts +0 -258
- package/src/generators/oklch/OklchExportUtils.ts +0 -57
- package/src/generators/oklch/OklchTokenIndexMetadata.ts +0 -30
- package/src/generators/transformers/FigmaTransformer.ts +0 -912
- package/src/generators/transformers/ITokenTransformer.ts +0 -56
- package/src/generators/transformers/TransformerRegistry.ts +0 -63
- package/src/generators/transformers/index.ts +0 -52
- package/src/generators/types/DTCGTypes.ts +0 -101
- package/src/integration/BuildErrorHandler.ts +0 -440
- package/src/integration/BuildSystemInterface.ts +0 -338
- package/src/integration/PlatformFileSelector.ts +0 -288
- package/src/integration/RegistryCoordinator.ts +0 -404
- package/src/integration/TranslationCoordinator.ts +0 -458
- package/src/integration/TreeShakingOptimizer.ts +0 -350
- package/src/integration/ValidationCoordinator.ts +0 -780
- package/src/integration/__tests__/ComponentTokenValidation.test.ts +0 -762
- package/src/integration/__tests__/ValidationCoordinator.test.ts +0 -609
- package/src/integration/__tests__/performance/ComponentTokenValidationPerformance.test.ts +0 -161
- package/src/integration/index.ts +0 -55
- package/src/naming/NamingConventionManager.ts +0 -318
- package/src/naming/PlatformNamingRules.ts +0 -278
- package/src/naming/__tests__/NamingConventions.test.ts +0 -224
- package/src/naming/index.ts +0 -23
- package/src/parent-completion.md +0 -1
- package/src/performance/CachingStrategy.ts +0 -426
- package/src/performance/FileGenerationOptimizer.ts +0 -294
- package/src/performance/PerformanceMonitor.ts +0 -185
- package/src/performance/PerformanceOptimizer.ts +0 -348
- package/src/performance/index.ts +0 -30
- package/src/providers/AndroidFileOrganizer.ts +0 -241
- package/src/providers/AndroidFormatGenerator.ts +0 -750
- package/src/providers/AndroidUnitConverter.ts +0 -177
- package/src/providers/FormatProvider.ts +0 -187
- package/src/providers/PathProvider.ts +0 -197
- package/src/providers/UnitProvider.ts +0 -106
- package/src/providers/WebFileOrganizer.ts +0 -121
- package/src/providers/WebFormatGenerator.ts +0 -611
- package/src/providers/WebUnitConverter.ts +0 -116
- package/src/providers/__tests__/AndroidAccessibilityTokens.test.ts +0 -86
- package/src/providers/__tests__/AndroidFormatGenerator-semantic.test.ts +0 -494
- package/src/providers/__tests__/FormatProviders.test.ts +0 -828
- package/src/providers/__tests__/InsetTokenGeneration.test.ts +0 -627
- package/src/providers/__tests__/PathProviders.test.ts +0 -512
- package/src/providers/__tests__/PlatformOutputFormat.test.ts +0 -252
- package/src/providers/__tests__/UnitProviders.test.ts +0 -721
- package/src/providers/__tests__/WebFormatGenerator-semantic.test.ts +0 -293
- package/src/providers/__tests__/iOSFormatGenerator-semantic.test.ts +0 -410
- package/src/providers/iOSFileOrganizer.ts +0 -162
- package/src/providers/iOSFormatGenerator.ts +0 -599
- package/src/providers/iOSUnitConverter.ts +0 -125
- package/src/providers/index.ts +0 -26
- package/src/registries/ComponentTokenRegistry.ts +0 -292
- package/src/registries/IRegistry.ts +0 -170
- package/src/registries/__tests__/ComponentTokenRegistry.test.ts +0 -446
- package/src/registries/__tests__/IRegistry.test.ts +0 -250
- package/src/registries/__tests__/PrimitiveTokenRegistry.test.ts +0 -342
- package/src/registries/__tests__/SemanticTokenRegistry.test.ts +0 -444
- package/src/resolvers/AndroidColorResolver.ts +0 -333
- package/src/resolvers/ModeThemeResolver.ts +0 -152
- package/src/resolvers/SemanticOverrideResolver.ts +0 -155
- package/src/resolvers/SemanticValueResolver.ts +0 -133
- package/src/resolvers/WebColorResolver.ts +0 -240
- package/src/resolvers/__tests__/AndroidColorResolver.test.ts +0 -507
- package/src/resolvers/__tests__/ModeThemeResolver.test.ts +0 -411
- package/src/resolvers/__tests__/SemanticOverrideResolver.test.ts +0 -186
- package/src/resolvers/__tests__/WebColorResolver.test.ts +0 -405
- package/src/resolvers/__tests__/iOSColorResolver.test.ts +0 -432
- package/src/resolvers/iOSColorResolver.ts +0 -224
- package/src/resolvers/index.ts +0 -11
- package/src/security/AIAgentRestrictions.ts +0 -298
- package/src/security/ContaminationAuditor.ts +0 -393
- package/src/security/ContaminationPrevention.ts +0 -275
- package/src/security/DocumentationGuard.ts +0 -258
- package/src/security/FlexibilityTokenGuard.ts +0 -256
- package/src/security/HumanApprovalWorkflow.ts +0 -319
- package/src/security/__tests__/AIAgentRestrictions.test.ts +0 -482
- package/src/security/__tests__/ContaminationPrevention.test.ts +0 -424
- package/src/security/__tests__/SecurityIntegration.test.ts +0 -505
- package/src/security/index.ts +0 -48
- package/src/testing/__tests__/utilities.test.ts +0 -175
- package/src/testing/index.ts +0 -154
- package/src/testing/jest-preset.ts +0 -62
- package/src/testing/style-mock.ts +0 -7
- package/src/testing/validators.ts +0 -10
- package/src/themes/ResolvedThemeSet.ts +0 -22
- package/src/themes/ThemeRegistry.ts +0 -97
- package/src/themes/__tests__/ThemeRegistry.test.ts +0 -162
- package/src/tools/ThemeFileGenerator.ts +0 -109
- package/src/tools/integrity/DiskFreshGenerator.ts +0 -36
- package/src/tools/integrity/GenerationIntegrityCheck.ts +0 -132
- package/src/tools/integrity/Invariants.ts +0 -228
- package/src/tools/integrity/Normalizer.ts +0 -94
- package/src/tools/integrity/SemanticComparator.ts +0 -127
- package/src/tools/integrity/__tests__/GenerationIntegrityCheck.test.ts +0 -132
- package/src/tools/integrity/__tests__/Invariants.test.ts +0 -142
- package/src/tools/integrity/__tests__/Normalizer.test.ts +0 -65
- package/src/tools/integrity/__tests__/SemanticComparator.test.ts +0 -62
- package/src/tools/integrity/__tests__/consumer-package-mode.test.ts +0 -205
- package/src/tools/integrity/cli/run-audit.ts +0 -150
- package/src/tools/integrity/inventory.ts +0 -51
- package/src/tools/integrity/manifest.ts +0 -56
- package/src/tools/integrity/types/index.ts +0 -183
- package/src/tools/release/__tests__/ChangeClassifier.test.ts +0 -133
- package/src/tools/release/__tests__/ChangeExtractor.test.ts +0 -222
- package/src/tools/release/__tests__/GitHubPublisher.test.ts +0 -240
- package/src/tools/release/__tests__/NotesRenderer.test.ts +0 -142
- package/src/tools/release/__tests__/NpmPublisher.test.ts +0 -289
- package/src/tools/release/__tests__/PipelineIntegration.test.ts +0 -188
- package/src/tools/release/__tests__/ReleasePipeline.test.ts +0 -192
- package/src/tools/release/__tests__/SemanticVersionValidator.test.ts +0 -49
- package/src/tools/release/__tests__/SummaryScanner.test.ts +0 -141
- package/src/tools/release/__tests__/TagResolver.test.ts +0 -91
- package/src/tools/release/__tests__/VersionCalculator.test.ts +0 -270
- package/src/tools/release/__tests__/helpers/NpmMockHelper.ts +0 -80
- package/src/tools/release/cli/ReleasePipeline.ts +0 -165
- package/src/tools/release/cli/release-tool.ts +0 -107
- package/src/tools/release/pipeline/ChangeClassifier.ts +0 -61
- package/src/tools/release/pipeline/ChangeExtractor.ts +0 -87
- package/src/tools/release/pipeline/NotesRenderer.ts +0 -66
- package/src/tools/release/pipeline/SummaryScanner.ts +0 -70
- package/src/tools/release/pipeline/TagResolver.ts +0 -40
- package/src/tools/release/pipeline/VersionCalculator.ts +0 -375
- package/src/tools/release/publishers/GitHubPublisher.ts +0 -228
- package/src/tools/release/publishers/NpmPublisher.ts +0 -196
- package/src/tools/release/release-config.json +0 -5
- package/src/tools/release/types/index.ts +0 -282
- package/src/tools/release/validators/SemanticVersionValidator.ts +0 -67
- package/src/types/ComponentTypes.ts +0 -76
- package/src/types/TranslationOutput.ts +0 -105
- package/src/types/ValidationResult.ts +0 -74
- package/src/types/__tests__/ComponentTypes.test.ts +0 -73
- package/src/types/css.d.ts +0 -35
- package/src/types/generated/TokenTypes.ts +0 -142
- package/src/types/index.ts +0 -42
- package/src/validators/BaselineGridValidator.ts +0 -119
- package/src/validators/CompositionPatternValidator.ts +0 -259
- package/src/validators/CrossPlatformConsistencyValidator.ts +0 -498
- package/src/validators/ErrorValidator.ts +0 -998
- package/src/validators/IValidator.ts +0 -273
- package/src/validators/MathematicalRelationshipParser.ts +0 -434
- package/src/validators/ModeParity.ts +0 -123
- package/src/validators/PassValidator.ts +0 -533
- package/src/validators/PlatformConstraintHandler.ts +0 -453
- package/src/validators/PrimitiveReferenceValidator.ts +0 -284
- package/src/validators/SemanticTokenValidator.ts +0 -496
- package/src/validators/StemmaComponentNamingValidator.ts +0 -524
- package/src/validators/StemmaErrorGuidanceSystem.ts +0 -1600
- package/src/validators/StemmaPropertyAccessibilityValidator.ts +0 -823
- package/src/validators/StemmaTokenUsageValidator.ts +0 -651
- package/src/validators/SyntaxValidator.ts +0 -537
- package/src/validators/ThreeTierValidator.ts +0 -822
- package/src/validators/ToleranceCalculator.ts +0 -324
- package/src/validators/ValidationReasoning.ts +0 -464
- package/src/validators/WCAGValidator.ts +0 -219
- package/src/validators/WarningValidator.ts +0 -626
- package/src/validators/__tests__/BaselineGridValidator.test.ts +0 -292
- package/src/validators/__tests__/BorderWidthValidation.test.ts +0 -595
- package/src/validators/__tests__/CompositionPatterns.test.ts +0 -463
- package/src/validators/__tests__/CrossPlatformConsistency.test.ts +0 -834
- package/src/validators/__tests__/IValidator.test.ts +0 -258
- package/src/validators/__tests__/MathematicalRelationshipParser.test.ts +0 -465
- package/src/validators/__tests__/PlatformConstraints.test.ts +0 -486
- package/src/validators/__tests__/SemanticTokenValidator.test.ts +0 -723
- package/src/validators/__tests__/StemmaComponentNamingValidator.test.ts +0 -597
- package/src/validators/__tests__/StemmaErrorGuidanceSystem.test.ts +0 -717
- package/src/validators/__tests__/StemmaPropertyAccessibilityValidator.test.ts +0 -349
- package/src/validators/__tests__/StemmaTokenUsageValidator.test.ts +0 -432
- package/src/validators/__tests__/SyntaxValidator.test.ts +0 -360
- package/src/validators/__tests__/ThreeTierValidator.test.ts +0 -906
- package/src/validators/__tests__/ValidationReasoning.test.ts +0 -636
- package/src/validators/__tests__/WCAGValidator.test.ts +0 -243
- package/src/validators/buildValidation.ts +0 -170
- package/src/validators/index.ts +0 -144
- package/src/workflows/ConsistencyValidator.ts +0 -339
- package/src/workflows/TokenGenerationWorkflow.ts +0 -460
- package/src/workflows/ValidationPipeline.ts +0 -284
- package/src/workflows/WorkflowErrorHandler.ts +0 -441
|
@@ -1,2070 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token File Generator
|
|
3
|
-
*
|
|
4
|
-
* Orchestrates the generation of platform-specific token constant files.
|
|
5
|
-
* Generates DesignTokens.web.css, DesignTokens.ios.swift, and DesignTokens.android.kt
|
|
6
|
-
* with mathematical consistency across all platforms.
|
|
7
|
-
*
|
|
8
|
-
* Also generates BlendUtilities for each platform via BlendUtilityGenerator integration.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { PrimitiveToken, TokenCategory } from '../types/PrimitiveToken';
|
|
12
|
-
import { SemanticToken, SemanticCategory } from '../types/SemanticToken';
|
|
13
|
-
import { WebFormatGenerator } from '../providers/WebFormatGenerator';
|
|
14
|
-
import { iOSFormatGenerator } from '../providers/iOSFormatGenerator';
|
|
15
|
-
import { AndroidFormatGenerator } from '../providers/AndroidFormatGenerator';
|
|
16
|
-
import { FileMetadata } from '../providers/FormatProvider';
|
|
17
|
-
import { getAllPrimitiveTokens, durationTokens, easingTokens, scaleTokens } from '../tokens';
|
|
18
|
-
import { getAllSemanticTokens, getAllZIndexTokens, getAllElevationTokens, motionTokens } from '../tokens/semantic';
|
|
19
|
-
import { BlendUtilityGenerator, BlendUtilityGenerationOptions } from './BlendUtilityGenerator';
|
|
20
|
-
import { ComponentTokenRegistry, RegisteredComponentToken } from '../registries/ComponentTokenRegistry';
|
|
21
|
-
import { allComposedColors } from '../tokens/color';
|
|
22
|
-
import { colorHues, neutralHue } from '../tokens/color/channels/hues';
|
|
23
|
-
import {
|
|
24
|
-
pinkLightness, orangeLightness, yellowLightness, greenLightness,
|
|
25
|
-
cyanLightness, tealLightness, purpleLightness,
|
|
26
|
-
} from '../tokens/color/channels/lightness/chromatic';
|
|
27
|
-
import {
|
|
28
|
-
pinkChroma, orangeChroma, yellowChroma, greenChroma,
|
|
29
|
-
cyanChroma, tealChroma, purpleChroma,
|
|
30
|
-
} from '../tokens/color/channels/chroma/chromatic';
|
|
31
|
-
import { whiteLightness, grayLightness, blackLightness } from '../tokens/color/channels/lightness/neutral';
|
|
32
|
-
import { whiteChroma, grayChroma, blackChroma } from '../tokens/color/channels/chroma/neutral';
|
|
33
|
-
|
|
34
|
-
export interface BaseGenerationOptions {
|
|
35
|
-
outputDir?: string;
|
|
36
|
-
version?: string;
|
|
37
|
-
includeComments?: boolean;
|
|
38
|
-
groupByCategory?: boolean;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export interface GenerationOptions extends BaseGenerationOptions {
|
|
42
|
-
/** Resolved primitive tokens from the configured source. When omitted, loads from package. */
|
|
43
|
-
primitiveTokens?: PrimitiveToken[];
|
|
44
|
-
/** Pre-resolved semantic tokens (light-base context). Generators require externally-resolved tokens (D9 Option B). */
|
|
45
|
-
semanticTokens: Array<Omit<SemanticToken, 'primitiveTokens'>>;
|
|
46
|
-
/** Pre-resolved semantic tokens (dark-base context). Used with semanticTokens to produce mode-aware output. */
|
|
47
|
-
darkSemanticTokens: Array<Omit<SemanticToken, 'primitiveTokens'>>;
|
|
48
|
-
/** Pre-resolved semantic tokens (light-wcag context). When provided, generates WCAG theme overrides. */
|
|
49
|
-
wcagSemanticTokens?: Array<Omit<SemanticToken, 'primitiveTokens'>>;
|
|
50
|
-
/** Pre-resolved semantic tokens (dark-wcag context). Used with wcagSemanticTokens for mode-aware WCAG output. */
|
|
51
|
-
darkWcagSemanticTokens?: Array<Omit<SemanticToken, 'primitiveTokens'>>;
|
|
52
|
-
/** Token names that have WCAG semantic overrides (Level 2). Only these appear in the WCAG override block. */
|
|
53
|
-
wcagOverrideKeys?: Set<string>;
|
|
54
|
-
/** Registered theme override sets for generalized theme block generation (Spec 094). */
|
|
55
|
-
themeOverrides?: ThemeOverrideSet[];
|
|
56
|
-
/** Token names that have moved to theme types — excluded from static iOS/Android output (Spec 094). */
|
|
57
|
-
themeVaryingTokens?: Set<string>;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* A resolved theme override set for generation.
|
|
62
|
-
* Generalizes the WCAG-specific fields to support any registered theme.
|
|
63
|
-
*
|
|
64
|
-
* @see Spec 094 design.md § "Platform Generators (Modified)"
|
|
65
|
-
*/
|
|
66
|
-
export interface ThemeOverrideSet {
|
|
67
|
-
/** Theme name used in CSS `data-theme` attribute and generated type names. */
|
|
68
|
-
name: string;
|
|
69
|
-
/** Theme mode: 'dark' = dark-only, 'light' = light-only, 'both' = light-dark(). */
|
|
70
|
-
mode: 'dark' | 'light' | 'both';
|
|
71
|
-
/** Resolved light tokens for this theme (or the only tokens if mode is 'light'). */
|
|
72
|
-
lightTokens: Array<Omit<SemanticToken, 'primitiveTokens'>>;
|
|
73
|
-
/** Resolved dark tokens for this theme (or the only tokens if mode is 'dark'). */
|
|
74
|
-
darkTokens: Array<Omit<SemanticToken, 'primitiveTokens'>>;
|
|
75
|
-
/** Token names that have overrides in this theme. Only these appear in the override block. */
|
|
76
|
-
overrideKeys: Set<string>;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export interface GenerationResult {
|
|
80
|
-
platform: 'web' | 'ios' | 'android';
|
|
81
|
-
filePath: string;
|
|
82
|
-
content: string;
|
|
83
|
-
tokenCount: number;
|
|
84
|
-
semanticTokenCount: number;
|
|
85
|
-
valid: boolean;
|
|
86
|
-
errors?: string[];
|
|
87
|
-
warnings?: string[];
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
export interface BlendUtilityResult {
|
|
91
|
-
platform: 'web' | 'ios' | 'android';
|
|
92
|
-
filePath: string;
|
|
93
|
-
content: string;
|
|
94
|
-
valid: boolean;
|
|
95
|
-
errors?: string[];
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export interface AllGenerationResults {
|
|
99
|
-
tokens: GenerationResult[];
|
|
100
|
-
blendUtilities: BlendUtilityResult[];
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Result of component token generation for a single platform
|
|
105
|
-
*/
|
|
106
|
-
export interface ComponentTokenGenerationResult {
|
|
107
|
-
platform: 'web' | 'ios' | 'android';
|
|
108
|
-
filePath: string;
|
|
109
|
-
content: string;
|
|
110
|
-
tokenCount: number;
|
|
111
|
-
componentCount: number;
|
|
112
|
-
valid: boolean;
|
|
113
|
-
errors?: string[];
|
|
114
|
-
warnings?: string[];
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
/**
|
|
118
|
-
* Token File Generator
|
|
119
|
-
* Generates platform-specific token constant files with mathematical consistency
|
|
120
|
-
*/
|
|
121
|
-
export class TokenFileGenerator {
|
|
122
|
-
private webGenerator: WebFormatGenerator;
|
|
123
|
-
private iosGenerator: iOSFormatGenerator;
|
|
124
|
-
private androidGenerator: AndroidFormatGenerator;
|
|
125
|
-
private blendUtilityGenerator: BlendUtilityGenerator;
|
|
126
|
-
|
|
127
|
-
constructor() {
|
|
128
|
-
this.webGenerator = new WebFormatGenerator();
|
|
129
|
-
this.iosGenerator = new iOSFormatGenerator();
|
|
130
|
-
this.androidGenerator = new AndroidFormatGenerator('kotlin');
|
|
131
|
-
this.blendUtilityGenerator = new BlendUtilityGenerator();
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Generate all platform-specific token files
|
|
136
|
-
*/
|
|
137
|
-
generateAll(options: GenerationOptions): GenerationResult[] {
|
|
138
|
-
const results: GenerationResult[] = [];
|
|
139
|
-
|
|
140
|
-
results.push(this.generateWebTokens(options));
|
|
141
|
-
results.push(this.generateiOSTokens(options));
|
|
142
|
-
results.push(this.generateAndroidTokens(options));
|
|
143
|
-
|
|
144
|
-
return results;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Generate all platform-specific token files AND blend utilities
|
|
149
|
-
* This is the comprehensive generation method that produces all artifacts
|
|
150
|
-
*/
|
|
151
|
-
generateAllWithBlendUtilities(options: GenerationOptions): AllGenerationResults {
|
|
152
|
-
const tokenResults = this.generateAll(options);
|
|
153
|
-
const blendResults = this.generateBlendUtilities(options);
|
|
154
|
-
|
|
155
|
-
return {
|
|
156
|
-
tokens: tokenResults,
|
|
157
|
-
blendUtilities: blendResults
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Generate blend utilities for all platforms
|
|
163
|
-
*
|
|
164
|
-
* @param options - Generation options
|
|
165
|
-
* @returns Array of blend utility generation results
|
|
166
|
-
*/
|
|
167
|
-
generateBlendUtilities(options: BaseGenerationOptions = {}): BlendUtilityResult[] {
|
|
168
|
-
const { outputDir = 'output', includeComments = true } = options;
|
|
169
|
-
const blendOptions: BlendUtilityGenerationOptions = { includeComments };
|
|
170
|
-
const results: BlendUtilityResult[] = [];
|
|
171
|
-
|
|
172
|
-
// Generate Web blend utilities
|
|
173
|
-
try {
|
|
174
|
-
const webContent = this.blendUtilityGenerator.generateWebBlendUtilities(blendOptions);
|
|
175
|
-
results.push({
|
|
176
|
-
platform: 'web',
|
|
177
|
-
filePath: `${outputDir}/BlendUtilities.web.ts`,
|
|
178
|
-
content: webContent,
|
|
179
|
-
valid: this.validateWebBlendUtilitySyntax(webContent)
|
|
180
|
-
});
|
|
181
|
-
} catch (error) {
|
|
182
|
-
results.push({
|
|
183
|
-
platform: 'web',
|
|
184
|
-
filePath: `${outputDir}/BlendUtilities.web.ts`,
|
|
185
|
-
content: '',
|
|
186
|
-
valid: false,
|
|
187
|
-
errors: [`Web blend utility generation failed: ${error instanceof Error ? error.message : String(error)}`]
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// Generate iOS blend utilities
|
|
192
|
-
try {
|
|
193
|
-
const iosContent = this.blendUtilityGenerator.generateiOSBlendUtilities(blendOptions);
|
|
194
|
-
results.push({
|
|
195
|
-
platform: 'ios',
|
|
196
|
-
filePath: `${outputDir}/BlendUtilities.ios.swift`,
|
|
197
|
-
content: iosContent,
|
|
198
|
-
valid: this.validateiOSBlendUtilitySyntax(iosContent)
|
|
199
|
-
});
|
|
200
|
-
} catch (error) {
|
|
201
|
-
results.push({
|
|
202
|
-
platform: 'ios',
|
|
203
|
-
filePath: `${outputDir}/BlendUtilities.ios.swift`,
|
|
204
|
-
content: '',
|
|
205
|
-
valid: false,
|
|
206
|
-
errors: [`iOS blend utility generation failed: ${error instanceof Error ? error.message : String(error)}`]
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Generate Android blend utilities
|
|
211
|
-
try {
|
|
212
|
-
const androidContent = this.blendUtilityGenerator.generateAndroidBlendUtilities(blendOptions);
|
|
213
|
-
results.push({
|
|
214
|
-
platform: 'android',
|
|
215
|
-
filePath: `${outputDir}/BlendUtilities.android.kt`,
|
|
216
|
-
content: androidContent,
|
|
217
|
-
valid: this.validateAndroidBlendUtilitySyntax(androidContent)
|
|
218
|
-
});
|
|
219
|
-
} catch (error) {
|
|
220
|
-
results.push({
|
|
221
|
-
platform: 'android',
|
|
222
|
-
filePath: `${outputDir}/BlendUtilities.android.kt`,
|
|
223
|
-
content: '',
|
|
224
|
-
valid: false,
|
|
225
|
-
errors: [`Android blend utility generation failed: ${error instanceof Error ? error.message : String(error)}`]
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
return results;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
/**
|
|
233
|
-
* Generate component tokens for all platforms
|
|
234
|
-
*
|
|
235
|
-
* Queries ComponentTokenRegistry.getAll() for tokens to generate.
|
|
236
|
-
* Generates output grouped by component.
|
|
237
|
-
* Maintains primitive token references in output (not inline values).
|
|
238
|
-
*
|
|
239
|
-
* @param options - Generation options
|
|
240
|
-
* @returns Array of component token generation results for each platform
|
|
241
|
-
*
|
|
242
|
-
* @see Requirements 5.1, 5.2, 5.3, 5.4 in .kiro/specs/037-component-token-generation-pipeline/requirements.md
|
|
243
|
-
*/
|
|
244
|
-
generateComponentTokens(options: BaseGenerationOptions = {}): ComponentTokenGenerationResult[] {
|
|
245
|
-
const { outputDir = 'dist', version = '1.0.0', includeComments = true } = options;
|
|
246
|
-
const results: ComponentTokenGenerationResult[] = [];
|
|
247
|
-
|
|
248
|
-
// Get all registered component tokens
|
|
249
|
-
const allTokens = ComponentTokenRegistry.getAll();
|
|
250
|
-
|
|
251
|
-
// Group tokens by component
|
|
252
|
-
const tokensByComponent = this.groupTokensByComponent(allTokens);
|
|
253
|
-
const componentCount = Object.keys(tokensByComponent).length;
|
|
254
|
-
|
|
255
|
-
// Generate for each platform
|
|
256
|
-
results.push(this.generateWebComponentTokens(tokensByComponent, outputDir, version, includeComments));
|
|
257
|
-
results.push(this.generateiOSComponentTokens(tokensByComponent, outputDir, version, includeComments));
|
|
258
|
-
results.push(this.generateAndroidComponentTokens(tokensByComponent, outputDir, version, includeComments));
|
|
259
|
-
|
|
260
|
-
return results;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Group component tokens by component name
|
|
265
|
-
*
|
|
266
|
-
* @param tokens - Array of registered component tokens
|
|
267
|
-
* @returns Map of component name to tokens
|
|
268
|
-
*/
|
|
269
|
-
private groupTokensByComponent(tokens: RegisteredComponentToken[]): Record<string, RegisteredComponentToken[]> {
|
|
270
|
-
const grouped: Record<string, RegisteredComponentToken[]> = {};
|
|
271
|
-
|
|
272
|
-
for (const token of tokens) {
|
|
273
|
-
if (!grouped[token.component]) {
|
|
274
|
-
grouped[token.component] = [];
|
|
275
|
-
}
|
|
276
|
-
grouped[token.component].push(token);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
return grouped;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
/**
|
|
283
|
-
* Generate Web CSS component tokens
|
|
284
|
-
*
|
|
285
|
-
* Generates CSS custom properties referencing primitive tokens.
|
|
286
|
-
* Format: --button-icon-inset-large: var(--space-150);
|
|
287
|
-
*
|
|
288
|
-
* @param tokensByComponent - Tokens grouped by component
|
|
289
|
-
* @param outputDir - Output directory
|
|
290
|
-
* @param version - Version string
|
|
291
|
-
* @param includeComments - Whether to include comments
|
|
292
|
-
* @returns Generation result for web platform
|
|
293
|
-
*/
|
|
294
|
-
private generateWebComponentTokens(
|
|
295
|
-
tokensByComponent: Record<string, RegisteredComponentToken[]>,
|
|
296
|
-
outputDir: string,
|
|
297
|
-
version: string,
|
|
298
|
-
includeComments: boolean
|
|
299
|
-
): ComponentTokenGenerationResult {
|
|
300
|
-
const lines: string[] = [];
|
|
301
|
-
const timestamp = new Date().toISOString();
|
|
302
|
-
let tokenCount = 0;
|
|
303
|
-
|
|
304
|
-
// Header
|
|
305
|
-
lines.push('/**');
|
|
306
|
-
lines.push(' * DesignerPunk Design System - Component Tokens');
|
|
307
|
-
lines.push(` * Generated: ${timestamp}`);
|
|
308
|
-
lines.push(` * Version: ${version}`);
|
|
309
|
-
lines.push(' * Platform: Web (CSS Custom Properties)');
|
|
310
|
-
lines.push(' *');
|
|
311
|
-
lines.push(' * Component-specific tokens that reference primitive tokens.');
|
|
312
|
-
lines.push(' * Use these for component-level styling consistency.');
|
|
313
|
-
lines.push(' */');
|
|
314
|
-
lines.push('');
|
|
315
|
-
lines.push(':root {');
|
|
316
|
-
|
|
317
|
-
// Generate tokens grouped by component
|
|
318
|
-
const components = Object.keys(tokensByComponent).sort();
|
|
319
|
-
|
|
320
|
-
for (const component of components) {
|
|
321
|
-
const tokens = tokensByComponent[component];
|
|
322
|
-
|
|
323
|
-
if (includeComments) {
|
|
324
|
-
lines.push('');
|
|
325
|
-
lines.push(` /* ${component} Component Tokens */`);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
for (const token of tokens) {
|
|
329
|
-
const cssTokenName = this.formatWebComponentTokenName(token);
|
|
330
|
-
const cssValue = this.formatWebComponentTokenValue(token);
|
|
331
|
-
|
|
332
|
-
if (includeComments && token.reasoning) {
|
|
333
|
-
lines.push(` /* ${token.reasoning} */`);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
lines.push(` ${cssTokenName}: ${cssValue};`);
|
|
337
|
-
tokenCount++;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
lines.push('}');
|
|
342
|
-
|
|
343
|
-
const content = lines.join('\n');
|
|
344
|
-
const validation = this.validateWebComponentTokenSyntax(content);
|
|
345
|
-
|
|
346
|
-
return {
|
|
347
|
-
platform: 'web',
|
|
348
|
-
filePath: `${outputDir}/ComponentTokens.web.css`,
|
|
349
|
-
content,
|
|
350
|
-
tokenCount,
|
|
351
|
-
componentCount: components.length,
|
|
352
|
-
valid: validation.valid,
|
|
353
|
-
errors: validation.errors
|
|
354
|
-
};
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* Generate iOS Swift component tokens
|
|
359
|
-
*
|
|
360
|
-
* Generates Swift constants referencing primitive tokens.
|
|
361
|
-
* Format: public static let insetLarge: CGFloat = SpacingTokens.space150
|
|
362
|
-
*
|
|
363
|
-
* @param tokensByComponent - Tokens grouped by component
|
|
364
|
-
* @param outputDir - Output directory
|
|
365
|
-
* @param version - Version string
|
|
366
|
-
* @param includeComments - Whether to include comments
|
|
367
|
-
* @returns Generation result for iOS platform
|
|
368
|
-
*/
|
|
369
|
-
private generateiOSComponentTokens(
|
|
370
|
-
tokensByComponent: Record<string, RegisteredComponentToken[]>,
|
|
371
|
-
outputDir: string,
|
|
372
|
-
version: string,
|
|
373
|
-
includeComments: boolean
|
|
374
|
-
): ComponentTokenGenerationResult {
|
|
375
|
-
const lines: string[] = [];
|
|
376
|
-
const timestamp = new Date().toISOString();
|
|
377
|
-
let tokenCount = 0;
|
|
378
|
-
|
|
379
|
-
// Header
|
|
380
|
-
lines.push('///');
|
|
381
|
-
lines.push('/// DesignerPunk Design System - Component Tokens');
|
|
382
|
-
lines.push(`/// Generated: ${timestamp}`);
|
|
383
|
-
lines.push(`/// Version: ${version}`);
|
|
384
|
-
lines.push('/// Platform: iOS (Swift Constants)');
|
|
385
|
-
lines.push('///');
|
|
386
|
-
lines.push('/// Component-specific tokens that reference primitive tokens.');
|
|
387
|
-
lines.push('/// Use these for component-level styling consistency.');
|
|
388
|
-
lines.push('///');
|
|
389
|
-
lines.push('');
|
|
390
|
-
lines.push('import UIKit');
|
|
391
|
-
lines.push('');
|
|
392
|
-
|
|
393
|
-
// Generate tokens grouped by component (each component as an enum)
|
|
394
|
-
const components = Object.keys(tokensByComponent).sort();
|
|
395
|
-
|
|
396
|
-
for (const component of components) {
|
|
397
|
-
const tokens = tokensByComponent[component];
|
|
398
|
-
const enumName = `${component}Tokens`;
|
|
399
|
-
|
|
400
|
-
if (includeComments) {
|
|
401
|
-
lines.push(`/// ${component} Component Tokens`);
|
|
402
|
-
}
|
|
403
|
-
lines.push(`public enum ${enumName} {`);
|
|
404
|
-
|
|
405
|
-
for (const token of tokens) {
|
|
406
|
-
const swiftConstName = this.formatiOSComponentTokenName(token);
|
|
407
|
-
const swiftType = this.getiOSComponentTokenType(token);
|
|
408
|
-
const swiftValue = this.formatiOSComponentTokenValue(token);
|
|
409
|
-
|
|
410
|
-
if (includeComments && token.reasoning) {
|
|
411
|
-
lines.push(` /// ${token.reasoning}`);
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
lines.push(` public static let ${swiftConstName}: ${swiftType} = ${swiftValue}`);
|
|
415
|
-
tokenCount++;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
lines.push('}');
|
|
419
|
-
lines.push('');
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
const content = lines.join('\n');
|
|
423
|
-
const validation = this.validateiOSComponentTokenSyntax(content);
|
|
424
|
-
|
|
425
|
-
return {
|
|
426
|
-
platform: 'ios',
|
|
427
|
-
filePath: `${outputDir}/ComponentTokens.ios.swift`,
|
|
428
|
-
content,
|
|
429
|
-
tokenCount,
|
|
430
|
-
componentCount: components.length,
|
|
431
|
-
valid: validation.valid,
|
|
432
|
-
errors: validation.errors
|
|
433
|
-
};
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
/**
|
|
437
|
-
* Generate Android Kotlin component tokens
|
|
438
|
-
*
|
|
439
|
-
* Generates Kotlin constants referencing primitive tokens.
|
|
440
|
-
* Format: val insetLarge = SpacingTokens.space150
|
|
441
|
-
*
|
|
442
|
-
* @param tokensByComponent - Tokens grouped by component
|
|
443
|
-
* @param outputDir - Output directory
|
|
444
|
-
* @param version - Version string
|
|
445
|
-
* @param includeComments - Whether to include comments
|
|
446
|
-
* @returns Generation result for Android platform
|
|
447
|
-
*/
|
|
448
|
-
private generateAndroidComponentTokens(
|
|
449
|
-
tokensByComponent: Record<string, RegisteredComponentToken[]>,
|
|
450
|
-
outputDir: string,
|
|
451
|
-
version: string,
|
|
452
|
-
includeComments: boolean
|
|
453
|
-
): ComponentTokenGenerationResult {
|
|
454
|
-
const lines: string[] = [];
|
|
455
|
-
const timestamp = new Date().toISOString();
|
|
456
|
-
let tokenCount = 0;
|
|
457
|
-
|
|
458
|
-
// Header
|
|
459
|
-
lines.push('/**');
|
|
460
|
-
lines.push(' * DesignerPunk Design System - Component Tokens');
|
|
461
|
-
lines.push(` * Generated: ${timestamp}`);
|
|
462
|
-
lines.push(` * Version: ${version}`);
|
|
463
|
-
lines.push(' * Platform: Android (Kotlin Constants)');
|
|
464
|
-
lines.push(' *');
|
|
465
|
-
lines.push(' * Component-specific tokens that reference primitive tokens.');
|
|
466
|
-
lines.push(' * Use these for component-level styling consistency.');
|
|
467
|
-
lines.push(' */');
|
|
468
|
-
lines.push('');
|
|
469
|
-
lines.push('package com.designerpunk.tokens');
|
|
470
|
-
lines.push('');
|
|
471
|
-
|
|
472
|
-
// Generate tokens grouped by component (each component as an object)
|
|
473
|
-
const components = Object.keys(tokensByComponent).sort();
|
|
474
|
-
|
|
475
|
-
for (const component of components) {
|
|
476
|
-
const tokens = tokensByComponent[component];
|
|
477
|
-
const objectName = `${component}Tokens`;
|
|
478
|
-
|
|
479
|
-
if (includeComments) {
|
|
480
|
-
lines.push(`/** ${component} Component Tokens */`);
|
|
481
|
-
}
|
|
482
|
-
lines.push(`object ${objectName} {`);
|
|
483
|
-
|
|
484
|
-
for (const token of tokens) {
|
|
485
|
-
const kotlinConstName = this.formatAndroidComponentTokenName(token);
|
|
486
|
-
const kotlinValue = this.formatAndroidComponentTokenValue(token);
|
|
487
|
-
|
|
488
|
-
if (includeComments && token.reasoning) {
|
|
489
|
-
lines.push(` // ${token.reasoning}`);
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
lines.push(` val ${kotlinConstName} = ${kotlinValue}`);
|
|
493
|
-
tokenCount++;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
lines.push('}');
|
|
497
|
-
lines.push('');
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
const content = lines.join('\n');
|
|
501
|
-
const validation = this.validateAndroidComponentTokenSyntax(content);
|
|
502
|
-
|
|
503
|
-
return {
|
|
504
|
-
platform: 'android',
|
|
505
|
-
filePath: `${outputDir}/ComponentTokens.android.kt`,
|
|
506
|
-
content,
|
|
507
|
-
tokenCount,
|
|
508
|
-
componentCount: components.length,
|
|
509
|
-
valid: validation.valid,
|
|
510
|
-
errors: validation.errors
|
|
511
|
-
};
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
/**
|
|
515
|
-
* Format component token name for Web CSS
|
|
516
|
-
* Converts 'buttonicon.inset.large' to '--button-icon-inset-large'
|
|
517
|
-
*/
|
|
518
|
-
private formatWebComponentTokenName(token: RegisteredComponentToken): string {
|
|
519
|
-
// Convert component.property.variant to kebab-case CSS custom property
|
|
520
|
-
const parts = token.name.split('.');
|
|
521
|
-
const kebabName = parts.map(part =>
|
|
522
|
-
part.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()
|
|
523
|
-
).join('-');
|
|
524
|
-
return `--${kebabName}`;
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
/**
|
|
528
|
-
* Format component token value for Web CSS
|
|
529
|
-
* Returns var(--space-150) for primitive references, or raw value
|
|
530
|
-
*/
|
|
531
|
-
private formatWebComponentTokenValue(token: RegisteredComponentToken): string {
|
|
532
|
-
if (token.primitiveReference) {
|
|
533
|
-
// Convert primitive reference to CSS custom property reference
|
|
534
|
-
// e.g., 'space150' -> 'var(--space-150)'
|
|
535
|
-
const cssRef = token.primitiveReference
|
|
536
|
-
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
537
|
-
.replace(/([a-zA-Z])(\d)/g, '$1-$2')
|
|
538
|
-
.toLowerCase();
|
|
539
|
-
return `var(--${cssRef})`;
|
|
540
|
-
}
|
|
541
|
-
// Return raw value for non-reference tokens
|
|
542
|
-
return String(token.value);
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
/**
|
|
546
|
-
* Format component token name for iOS Swift
|
|
547
|
-
* Converts 'buttonicon.inset.large' to 'insetLarge'
|
|
548
|
-
*/
|
|
549
|
-
private formatiOSComponentTokenName(token: RegisteredComponentToken): string {
|
|
550
|
-
// Extract property name from full token name (remove component prefix)
|
|
551
|
-
const parts = token.name.split('.');
|
|
552
|
-
// Skip the component name (first part), join remaining parts in camelCase
|
|
553
|
-
const propertyParts = parts.slice(1);
|
|
554
|
-
if (propertyParts.length === 0) {
|
|
555
|
-
return parts[0];
|
|
556
|
-
}
|
|
557
|
-
return propertyParts.map((part, index) =>
|
|
558
|
-
index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)
|
|
559
|
-
).join('');
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
/**
|
|
563
|
-
* Get Swift type for component token based on family
|
|
564
|
-
*/
|
|
565
|
-
private getiOSComponentTokenType(token: RegisteredComponentToken): string {
|
|
566
|
-
switch (token.family) {
|
|
567
|
-
case 'spacing':
|
|
568
|
-
case 'radius':
|
|
569
|
-
case 'fontSize':
|
|
570
|
-
case 'tapArea':
|
|
571
|
-
case 'borderWidth':
|
|
572
|
-
return 'CGFloat';
|
|
573
|
-
case 'color':
|
|
574
|
-
return 'UIColor';
|
|
575
|
-
default:
|
|
576
|
-
return 'CGFloat';
|
|
577
|
-
}
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
/**
|
|
581
|
-
* Format component token value for iOS Swift
|
|
582
|
-
* Returns SpacingTokens.space150 for primitive references, or raw value
|
|
583
|
-
*/
|
|
584
|
-
private formatiOSComponentTokenValue(token: RegisteredComponentToken): string {
|
|
585
|
-
if (token.primitiveReference) {
|
|
586
|
-
// Convert primitive reference to Swift constant reference
|
|
587
|
-
// e.g., 'space150' -> 'SpacingTokens.space150'
|
|
588
|
-
const familyClass = this.getFamilyClassName(token.family);
|
|
589
|
-
return `${familyClass}.${token.primitiveReference}`;
|
|
590
|
-
}
|
|
591
|
-
// Return raw value for non-reference tokens
|
|
592
|
-
return String(token.value);
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
/**
|
|
596
|
-
* Format component token name for Android Kotlin
|
|
597
|
-
* Converts 'buttonicon.inset.large' to 'insetLarge'
|
|
598
|
-
*/
|
|
599
|
-
private formatAndroidComponentTokenName(token: RegisteredComponentToken): string {
|
|
600
|
-
// Same as iOS - extract property name from full token name
|
|
601
|
-
const parts = token.name.split('.');
|
|
602
|
-
const propertyParts = parts.slice(1);
|
|
603
|
-
if (propertyParts.length === 0) {
|
|
604
|
-
return parts[0];
|
|
605
|
-
}
|
|
606
|
-
return propertyParts.map((part, index) =>
|
|
607
|
-
index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1)
|
|
608
|
-
).join('');
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
/**
|
|
612
|
-
* Format component token value for Android Kotlin
|
|
613
|
-
* Returns SpacingTokens.space150 for primitive references, or raw value
|
|
614
|
-
*/
|
|
615
|
-
private formatAndroidComponentTokenValue(token: RegisteredComponentToken): string {
|
|
616
|
-
if (token.primitiveReference) {
|
|
617
|
-
// Convert primitive reference to Kotlin constant reference
|
|
618
|
-
// e.g., 'space150' -> 'SpacingTokens.space150'
|
|
619
|
-
const familyClass = this.getFamilyClassName(token.family);
|
|
620
|
-
return `${familyClass}.${token.primitiveReference}`;
|
|
621
|
-
}
|
|
622
|
-
// Dimensional families need .dp suffix to match primitive token output (Task 1.4)
|
|
623
|
-
const dimensionalFamilies = ['spacing', 'radius', 'tapArea', 'fontSize', 'borderWidth'];
|
|
624
|
-
if (dimensionalFamilies.includes(token.family)) {
|
|
625
|
-
return `${token.value}.dp`;
|
|
626
|
-
}
|
|
627
|
-
return String(token.value);
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
/**
|
|
631
|
-
* Get the class name for a token family
|
|
632
|
-
* Used for generating primitive token references
|
|
633
|
-
*/
|
|
634
|
-
private getFamilyClassName(family: string): string {
|
|
635
|
-
const familyClassMap: Record<string, string> = {
|
|
636
|
-
'spacing': 'SpacingTokens',
|
|
637
|
-
'sizing': 'SizingTokens',
|
|
638
|
-
'radius': 'RadiusTokens',
|
|
639
|
-
'fontSize': 'FontSizeTokens',
|
|
640
|
-
'color': 'ColorTokens',
|
|
641
|
-
'tapArea': 'TapAreaTokens',
|
|
642
|
-
'borderWidth': 'BorderWidthTokens',
|
|
643
|
-
'lineHeight': 'LineHeightTokens',
|
|
644
|
-
'fontWeight': 'FontWeightTokens',
|
|
645
|
-
'fontFamily': 'FontFamilyTokens'
|
|
646
|
-
};
|
|
647
|
-
return familyClassMap[family] || `${family.charAt(0).toUpperCase() + family.slice(1)}Tokens`;
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
/**
|
|
651
|
-
* Validate Web component token CSS syntax
|
|
652
|
-
*/
|
|
653
|
-
private validateWebComponentTokenSyntax(content: string): { valid: boolean; errors?: string[] } {
|
|
654
|
-
const errors: string[] = [];
|
|
655
|
-
|
|
656
|
-
// Check for :root selector
|
|
657
|
-
if (!content.includes(':root {')) {
|
|
658
|
-
errors.push('Missing :root selector');
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
// Check for balanced braces
|
|
662
|
-
const openBraces = (content.match(/{/g) || []).length;
|
|
663
|
-
const closeBraces = (content.match(/}/g) || []).length;
|
|
664
|
-
if (openBraces !== closeBraces) {
|
|
665
|
-
errors.push('Unbalanced braces in CSS');
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
return {
|
|
669
|
-
valid: errors.length === 0,
|
|
670
|
-
errors: errors.length > 0 ? errors : undefined
|
|
671
|
-
};
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
/**
|
|
675
|
-
* Validate iOS component token Swift syntax
|
|
676
|
-
*/
|
|
677
|
-
private validateiOSComponentTokenSyntax(content: string): { valid: boolean; errors?: string[] } {
|
|
678
|
-
const errors: string[] = [];
|
|
679
|
-
|
|
680
|
-
// Check for UIKit import
|
|
681
|
-
if (!content.includes('import UIKit')) {
|
|
682
|
-
errors.push('Missing UIKit import');
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
// Check for balanced braces
|
|
686
|
-
const openBraces = (content.match(/{/g) || []).length;
|
|
687
|
-
const closeBraces = (content.match(/}/g) || []).length;
|
|
688
|
-
if (openBraces !== closeBraces) {
|
|
689
|
-
errors.push('Unbalanced braces in Swift');
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
return {
|
|
693
|
-
valid: errors.length === 0,
|
|
694
|
-
errors: errors.length > 0 ? errors : undefined
|
|
695
|
-
};
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
/**
|
|
699
|
-
* Validate Android component token Kotlin syntax
|
|
700
|
-
*/
|
|
701
|
-
private validateAndroidComponentTokenSyntax(content: string): { valid: boolean; errors?: string[] } {
|
|
702
|
-
const errors: string[] = [];
|
|
703
|
-
|
|
704
|
-
// Check for package declaration
|
|
705
|
-
if (!content.includes('package com.designerpunk.tokens')) {
|
|
706
|
-
errors.push('Missing package declaration');
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
// Check for balanced braces
|
|
710
|
-
const openBraces = (content.match(/{/g) || []).length;
|
|
711
|
-
const closeBraces = (content.match(/}/g) || []).length;
|
|
712
|
-
if (openBraces !== closeBraces) {
|
|
713
|
-
errors.push('Unbalanced braces in Kotlin');
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
return {
|
|
717
|
-
valid: errors.length === 0,
|
|
718
|
-
errors: errors.length > 0 ? errors : undefined
|
|
719
|
-
};
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
/**
|
|
723
|
-
* Validate Web blend utility TypeScript syntax
|
|
724
|
-
* Basic validation to ensure generated code has expected structure
|
|
725
|
-
*/
|
|
726
|
-
private validateWebBlendUtilitySyntax(content: string): boolean {
|
|
727
|
-
// Check for required function exports
|
|
728
|
-
const requiredFunctions = ['darkerBlend', 'lighterBlend', 'saturate', 'desaturate'];
|
|
729
|
-
const hasAllFunctions = requiredFunctions.every(fn =>
|
|
730
|
-
content.includes(`export function ${fn}`)
|
|
731
|
-
);
|
|
732
|
-
|
|
733
|
-
// Check for required type definitions
|
|
734
|
-
const hasRgbInterface = content.includes('interface RGB');
|
|
735
|
-
const hasHslInterface = content.includes('interface HSL');
|
|
736
|
-
|
|
737
|
-
// Check for required utility functions
|
|
738
|
-
const hasHexToRgb = content.includes('function hexToRgb');
|
|
739
|
-
const hasRgbToHex = content.includes('function rgbToHex');
|
|
740
|
-
|
|
741
|
-
return hasAllFunctions && hasRgbInterface && hasHslInterface && hasHexToRgb && hasRgbToHex;
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
/**
|
|
745
|
-
* Validate iOS blend utility Swift syntax
|
|
746
|
-
* Basic validation to ensure generated code has expected structure
|
|
747
|
-
*/
|
|
748
|
-
private validateiOSBlendUtilitySyntax(content: string): boolean {
|
|
749
|
-
// Check for required imports
|
|
750
|
-
const hasSwiftUIImport = content.includes('import SwiftUI');
|
|
751
|
-
|
|
752
|
-
// Check for Color extension
|
|
753
|
-
const hasColorExtension = content.includes('extension Color');
|
|
754
|
-
|
|
755
|
-
// Check for required methods
|
|
756
|
-
const requiredMethods = ['darkerBlend', 'lighterBlend', 'saturate', 'desaturate'];
|
|
757
|
-
const hasAllMethods = requiredMethods.every(method =>
|
|
758
|
-
content.includes(`func ${method}`)
|
|
759
|
-
);
|
|
760
|
-
|
|
761
|
-
// Check for required structs
|
|
762
|
-
const hasRgbStruct = content.includes('struct RGB');
|
|
763
|
-
const hasHslStruct = content.includes('struct HSL');
|
|
764
|
-
|
|
765
|
-
return hasSwiftUIImport && hasColorExtension && hasAllMethods && hasRgbStruct && hasHslStruct;
|
|
766
|
-
}
|
|
767
|
-
|
|
768
|
-
/**
|
|
769
|
-
* Validate Android blend utility Kotlin syntax
|
|
770
|
-
* Basic validation to ensure generated code has expected structure
|
|
771
|
-
*/
|
|
772
|
-
private validateAndroidBlendUtilitySyntax(content: string): boolean {
|
|
773
|
-
// Check for required package and imports
|
|
774
|
-
const hasPackage = content.includes('package com.designerpunk.tokens');
|
|
775
|
-
const hasColorImport = content.includes('import androidx.compose.ui.graphics.Color');
|
|
776
|
-
|
|
777
|
-
// Check for required extension functions
|
|
778
|
-
const requiredFunctions = ['darkerBlend', 'lighterBlend', 'saturate', 'desaturate'];
|
|
779
|
-
const hasAllFunctions = requiredFunctions.every(fn =>
|
|
780
|
-
content.includes(`fun Color.${fn}`)
|
|
781
|
-
);
|
|
782
|
-
|
|
783
|
-
// Check for required data classes
|
|
784
|
-
const hasRgbClass = content.includes('data class RGB');
|
|
785
|
-
const hasHslClass = content.includes('data class HSL');
|
|
786
|
-
|
|
787
|
-
return hasPackage && hasColorImport && hasAllFunctions && hasRgbClass && hasHslClass;
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
/**
|
|
791
|
-
* Generate semantic token section for specified platform
|
|
792
|
-
* Handles both single-reference and multi-reference tokens
|
|
793
|
-
*
|
|
794
|
-
* @param semantics - Array of semantic tokens to generate
|
|
795
|
-
* @param platform - Target platform ('web', 'ios', or 'android')
|
|
796
|
-
* @returns Array of formatted token strings
|
|
797
|
-
*/
|
|
798
|
-
private generateSemanticSection(
|
|
799
|
-
semantics: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
800
|
-
platform: 'web' | 'ios' | 'android',
|
|
801
|
-
darkSemantics?: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
802
|
-
excludeTokenNames?: Set<string>
|
|
803
|
-
): string[] {
|
|
804
|
-
const lines: string[] = [];
|
|
805
|
-
|
|
806
|
-
// Select appropriate generator based on platform
|
|
807
|
-
let generator: WebFormatGenerator | iOSFormatGenerator | AndroidFormatGenerator;
|
|
808
|
-
|
|
809
|
-
switch (platform) {
|
|
810
|
-
case 'web':
|
|
811
|
-
generator = this.webGenerator;
|
|
812
|
-
break;
|
|
813
|
-
case 'ios':
|
|
814
|
-
generator = this.iosGenerator;
|
|
815
|
-
break;
|
|
816
|
-
case 'android':
|
|
817
|
-
generator = this.androidGenerator;
|
|
818
|
-
break;
|
|
819
|
-
default:
|
|
820
|
-
return lines;
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
// Build dark token lookup for mode-aware output
|
|
824
|
-
const darkMap = new Map<string, Omit<SemanticToken, 'primitiveTokens'>>();
|
|
825
|
-
if (darkSemantics) {
|
|
826
|
-
for (const dt of darkSemantics) {
|
|
827
|
-
darkMap.set(dt.name, dt);
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
// Iterate over semantic tokens
|
|
832
|
-
for (const semantic of semantics) {
|
|
833
|
-
// Skip tokens without primitiveReferences (e.g., semantic-only layering tokens)
|
|
834
|
-
if (!semantic.primitiveReferences) {
|
|
835
|
-
continue;
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
// Skip tokens that have moved to theme types (Spec 094 — prevents dual-pattern consumption)
|
|
839
|
-
if (excludeTokenNames && excludeTokenNames.has(semantic.name)) {
|
|
840
|
-
continue;
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
// Special handling for ICON category tokens with fontSize/multiplier (icon sizes)
|
|
844
|
-
// Icon property tokens (like strokeWidth) are handled as single-reference tokens below
|
|
845
|
-
if (semantic.category === 'icon' && semantic.primitiveReferences.fontSize && semantic.primitiveReferences.multiplier) {
|
|
846
|
-
const iconLine = this.generateIconSizeToken(semantic, platform, generator);
|
|
847
|
-
if (iconLine) {
|
|
848
|
-
lines.push(iconLine);
|
|
849
|
-
}
|
|
850
|
-
continue;
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
// Detect single-reference vs multi-reference tokens
|
|
854
|
-
// Single-reference tokens have:
|
|
855
|
-
// - Only one key in primitiveReferences, OR
|
|
856
|
-
// - A 'value' or 'default' key (standard single-reference pattern), OR
|
|
857
|
-
// - 'color' and 'opacity' keys (opacity composition pattern)
|
|
858
|
-
const refs = Object.keys(semantic.primitiveReferences);
|
|
859
|
-
const isOpacityComposition = refs.includes('color') && refs.includes('opacity') && refs.length === 2;
|
|
860
|
-
const isSingleReference = refs.length === 1 ||
|
|
861
|
-
refs.includes('value') ||
|
|
862
|
-
refs.includes('default') ||
|
|
863
|
-
isOpacityComposition;
|
|
864
|
-
|
|
865
|
-
// Call appropriate formatter method for each token based on reference type
|
|
866
|
-
let lightLine: string;
|
|
867
|
-
if (isSingleReference) {
|
|
868
|
-
lightLine = generator.formatSingleReferenceToken(semantic as SemanticToken);
|
|
869
|
-
} else {
|
|
870
|
-
lightLine = generator.formatMultiReferenceToken(semantic as SemanticToken);
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
// Mode-aware output: wrap in light-dark() when dark value differs (web only)
|
|
874
|
-
const darkToken = darkMap.get(semantic.name);
|
|
875
|
-
if (darkToken) {
|
|
876
|
-
let darkLine: string;
|
|
877
|
-
if (isSingleReference) {
|
|
878
|
-
darkLine = generator.formatSingleReferenceToken(darkToken as SemanticToken);
|
|
879
|
-
} else {
|
|
880
|
-
darkLine = generator.formatMultiReferenceToken(darkToken as SemanticToken);
|
|
881
|
-
}
|
|
882
|
-
|
|
883
|
-
const lightParts = this.extractFormattedParts(lightLine);
|
|
884
|
-
const darkParts = this.extractFormattedParts(darkLine);
|
|
885
|
-
|
|
886
|
-
if (lightParts && darkParts && lightParts.value !== darkParts.value) {
|
|
887
|
-
if (platform === 'web') {
|
|
888
|
-
lines.push(` ${lightParts.name}: light-dark(${lightParts.value}, ${darkParts.value});`);
|
|
889
|
-
continue;
|
|
890
|
-
}
|
|
891
|
-
if (platform === 'ios') {
|
|
892
|
-
lines.push(
|
|
893
|
-
` public static let ${lightParts.name}: UIColor = UIColor { $0.userInterfaceStyle == .dark ? ${darkParts.value} : ${lightParts.value} }`
|
|
894
|
-
);
|
|
895
|
-
continue;
|
|
896
|
-
}
|
|
897
|
-
if (platform === 'android') {
|
|
898
|
-
lines.push(
|
|
899
|
-
` val ${lightParts.name}_light = ${lightParts.value}`
|
|
900
|
-
);
|
|
901
|
-
lines.push(
|
|
902
|
-
` val ${lightParts.name}_dark = ${darkParts.value}`
|
|
903
|
-
);
|
|
904
|
-
continue;
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
lines.push(lightLine);
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
return lines;
|
|
913
|
-
}
|
|
914
|
-
|
|
915
|
-
/**
|
|
916
|
-
* Generate WCAG theme override block from 4-context resolved token sets (Spec 080 Phase 2).
|
|
917
|
-
* Compares base vs wcag tokens — emits overrides only where values differ.
|
|
918
|
-
*/
|
|
919
|
-
private generateWcagOverrideBlock(
|
|
920
|
-
lightBase: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
921
|
-
darkBase: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
922
|
-
lightWcag: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
923
|
-
darkWcag: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
924
|
-
platform: 'web' | 'ios' | 'android',
|
|
925
|
-
wcagKeys?: Set<string>
|
|
926
|
-
): string[] {
|
|
927
|
-
const lines: string[] = [];
|
|
928
|
-
|
|
929
|
-
// Build lookup maps
|
|
930
|
-
const lbMap = new Map(lightBase.map(t => [t.name, t]));
|
|
931
|
-
const dbMap = new Map(darkBase.map(t => [t.name, t]));
|
|
932
|
-
const lwMap = new Map(lightWcag.map(t => [t.name, t]));
|
|
933
|
-
const dwMap = new Map(darkWcag.map(t => [t.name, t]));
|
|
934
|
-
|
|
935
|
-
// Find color tokens where wcag override changes the primitive reference (Level 2 only).
|
|
936
|
-
// Tokens where only the primitive's own wcag slot differs are handled by the primitive layer.
|
|
937
|
-
const overrides: Array<{ token: Omit<SemanticToken, 'primitiveTokens'>; lwVal: string; dwVal: string; lbVal: string; dbVal: string }> = [];
|
|
938
|
-
for (const [name, lbToken] of lbMap) {
|
|
939
|
-
if (lbToken.category !== SemanticCategory.COLOR) continue;
|
|
940
|
-
if (wcagKeys && !wcagKeys.has(name)) continue;
|
|
941
|
-
const lwToken = lwMap.get(name);
|
|
942
|
-
const dbToken = dbMap.get(name);
|
|
943
|
-
const dwToken = dwMap.get(name);
|
|
944
|
-
if (!lwToken || !dbToken || !dwToken) continue;
|
|
945
|
-
|
|
946
|
-
const getVal = (t: Omit<SemanticToken, 'primitiveTokens'>) =>
|
|
947
|
-
t.primitiveReferences?.value ?? t.primitiveReferences?.default ?? Object.values(t.primitiveReferences || {})[0] ?? '';
|
|
948
|
-
|
|
949
|
-
overrides.push({ token: lbToken, lwVal: getVal(lwToken), dwVal: getVal(dwToken), lbVal: getVal(lbToken), dbVal: getVal(dbToken) });
|
|
950
|
-
}
|
|
951
|
-
|
|
952
|
-
if (overrides.length === 0) return lines;
|
|
953
|
-
|
|
954
|
-
// Helper: rgba string → iOS UIColor
|
|
955
|
-
const toIOS = (rgba: string) => {
|
|
956
|
-
const m = rgba.match(/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\s*\)/);
|
|
957
|
-
if (!m) return rgba;
|
|
958
|
-
return `UIColor(red: ${(+m[1]/255).toFixed(2)}, green: ${(+m[2]/255).toFixed(2)}, blue: ${(+m[3]/255).toFixed(2)}, alpha: ${(+m[4]).toFixed(2)})`;
|
|
959
|
-
};
|
|
960
|
-
|
|
961
|
-
// Helper: rgba string → Android Color.argb
|
|
962
|
-
const toAndroid = (rgba: string) => {
|
|
963
|
-
const m = rgba.match(/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\s*\)/);
|
|
964
|
-
if (!m) return rgba;
|
|
965
|
-
return `Color.argb(${Math.round(+m[4] * 255)}, ${m[1]}, ${m[2]}, ${m[3]})`;
|
|
966
|
-
};
|
|
967
|
-
|
|
968
|
-
switch (platform) {
|
|
969
|
-
case 'web': {
|
|
970
|
-
lines.push('');
|
|
971
|
-
lines.push('/* WCAG Theme: Semantic token overrides from theme files (Spec 080 Phase 2) */');
|
|
972
|
-
lines.push(':root[data-theme="wcag"] {');
|
|
973
|
-
for (const o of overrides) {
|
|
974
|
-
const name = this.webGenerator.getTokenName(o.token.name, o.token.category);
|
|
975
|
-
const cssName = name.startsWith('--') ? name : `--${name}`;
|
|
976
|
-
const value = o.lwVal !== o.dwVal
|
|
977
|
-
? `light-dark(${o.lwVal}, ${o.dwVal})`
|
|
978
|
-
: o.lwVal;
|
|
979
|
-
lines.push(` ${cssName}: ${value};`);
|
|
980
|
-
}
|
|
981
|
-
lines.push('}');
|
|
982
|
-
break;
|
|
983
|
-
}
|
|
984
|
-
case 'ios': {
|
|
985
|
-
lines.push('');
|
|
986
|
-
lines.push(' // MARK: - WCAG Theme Semantic Overrides (Spec 080 Phase 2)');
|
|
987
|
-
for (const o of overrides) {
|
|
988
|
-
const name = this.iosGenerator.getTokenName(o.token.name, o.token.category);
|
|
989
|
-
if (o.lwVal !== o.dwVal) {
|
|
990
|
-
lines.push(` public static let ${name}_wcag: UIColor = UIColor { $0.userInterfaceStyle == .dark ? ${toIOS(o.dwVal)} : ${toIOS(o.lwVal)} }`);
|
|
991
|
-
} else {
|
|
992
|
-
lines.push(` public static let ${name}_wcag: UIColor = ${toIOS(o.lwVal)}`);
|
|
993
|
-
}
|
|
994
|
-
}
|
|
995
|
-
break;
|
|
996
|
-
}
|
|
997
|
-
case 'android': {
|
|
998
|
-
lines.push('');
|
|
999
|
-
lines.push(' // WCAG Theme Semantic Overrides (Spec 080 Phase 2)');
|
|
1000
|
-
for (const o of overrides) {
|
|
1001
|
-
const name = this.androidGenerator.getTokenName(o.token.name, o.token.category);
|
|
1002
|
-
if (o.lwVal !== o.dwVal) {
|
|
1003
|
-
lines.push(` val ${name}_wcag_light = ${toAndroid(o.lwVal)}`);
|
|
1004
|
-
lines.push(` val ${name}_wcag_dark = ${toAndroid(o.dwVal)}`);
|
|
1005
|
-
} else {
|
|
1006
|
-
lines.push(` val ${name}_wcag = ${toAndroid(o.lwVal)}`);
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
break;
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
|
|
1013
|
-
return lines;
|
|
1014
|
-
}
|
|
1015
|
-
|
|
1016
|
-
/**
|
|
1017
|
-
* Generate theme override blocks for any registered theme (Spec 094).
|
|
1018
|
-
* Generalizes the WCAG-specific block to work with any ThemeOverrideSet.
|
|
1019
|
-
*
|
|
1020
|
-
* Web: produces `[data-theme="name"] { ... }` blocks after `:root` footer.
|
|
1021
|
-
* iOS/Android: stub — full implementation in subtasks 2.3/2.4.
|
|
1022
|
-
*/
|
|
1023
|
-
generateThemeOverrideBlocks(
|
|
1024
|
-
platform: 'web' | 'ios' | 'android',
|
|
1025
|
-
baseLight: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
1026
|
-
baseDark: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
1027
|
-
themeOverrides: ThemeOverrideSet[],
|
|
1028
|
-
name: string = 'DesignerPunk',
|
|
1029
|
-
abbreviation: string = 'DP'
|
|
1030
|
-
): string[] {
|
|
1031
|
-
const lines: string[] = [];
|
|
1032
|
-
switch (platform) {
|
|
1033
|
-
case 'web':
|
|
1034
|
-
for (const theme of themeOverrides) {
|
|
1035
|
-
lines.push(...this.generateWebThemeBlock(baseLight, baseDark, theme));
|
|
1036
|
-
}
|
|
1037
|
-
break;
|
|
1038
|
-
case 'ios':
|
|
1039
|
-
lines.push(...this.generateSwiftThemeTypes(baseLight, baseDark, themeOverrides, name, abbreviation));
|
|
1040
|
-
break;
|
|
1041
|
-
case 'android':
|
|
1042
|
-
lines.push(...this.generateKotlinThemeTypes(baseLight, baseDark, themeOverrides, name, abbreviation));
|
|
1043
|
-
break;
|
|
1044
|
-
}
|
|
1045
|
-
return lines;
|
|
1046
|
-
}
|
|
1047
|
-
|
|
1048
|
-
/**
|
|
1049
|
-
* Generate a single web CSS theme override block.
|
|
1050
|
-
* Produces `:root[data-theme="name"] { ... }` with overridden tokens.
|
|
1051
|
-
* Dark-only themes include `color-scheme: dark` and use static values (no light-dark()).
|
|
1052
|
-
*/
|
|
1053
|
-
private generateWebThemeBlock(
|
|
1054
|
-
baseLight: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
1055
|
-
baseDark: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
1056
|
-
theme: ThemeOverrideSet
|
|
1057
|
-
): string[] {
|
|
1058
|
-
const lines: string[] = [];
|
|
1059
|
-
|
|
1060
|
-
const lbMap = new Map(baseLight.map(t => [t.name, t]));
|
|
1061
|
-
const dbMap = new Map(baseDark.map(t => [t.name, t]));
|
|
1062
|
-
const ltMap = new Map(theme.lightTokens.map(t => [t.name, t]));
|
|
1063
|
-
const dtMap = new Map(theme.darkTokens.map(t => [t.name, t]));
|
|
1064
|
-
|
|
1065
|
-
const overrides: Array<{ token: Omit<SemanticToken, 'primitiveTokens'>; lightVal: string; darkVal: string }> = [];
|
|
1066
|
-
|
|
1067
|
-
for (const [name] of lbMap) {
|
|
1068
|
-
const lbToken = lbMap.get(name)!;
|
|
1069
|
-
if (lbToken.category !== SemanticCategory.COLOR) continue;
|
|
1070
|
-
if (!theme.overrideKeys.has(name)) continue;
|
|
1071
|
-
|
|
1072
|
-
const ltToken = ltMap.get(name);
|
|
1073
|
-
const dtToken = dtMap.get(name);
|
|
1074
|
-
if (!ltToken || !dtToken) continue;
|
|
1075
|
-
|
|
1076
|
-
const getVal = (t: Omit<SemanticToken, 'primitiveTokens'>) =>
|
|
1077
|
-
t.primitiveReferences?.value ?? t.primitiveReferences?.default ?? Object.values(t.primitiveReferences || {})[0] ?? '';
|
|
1078
|
-
|
|
1079
|
-
overrides.push({ token: lbToken, lightVal: getVal(ltToken), darkVal: getVal(dtToken) });
|
|
1080
|
-
}
|
|
1081
|
-
|
|
1082
|
-
if (overrides.length === 0) return lines;
|
|
1083
|
-
|
|
1084
|
-
lines.push('');
|
|
1085
|
-
lines.push(`/* ${theme.name.charAt(0).toUpperCase() + theme.name.slice(1)} Theme: Semantic token overrides (Spec 094) */`);
|
|
1086
|
-
lines.push(`:root[data-theme="${theme.name}"] {`);
|
|
1087
|
-
|
|
1088
|
-
if (theme.mode === 'dark') {
|
|
1089
|
-
lines.push(' color-scheme: dark;');
|
|
1090
|
-
}
|
|
1091
|
-
|
|
1092
|
-
for (const o of overrides) {
|
|
1093
|
-
const name = this.webGenerator.getTokenName(o.token.name, o.token.category);
|
|
1094
|
-
const cssName = name.startsWith('--') ? name : `--${name}`;
|
|
1095
|
-
|
|
1096
|
-
if (theme.mode === 'dark') {
|
|
1097
|
-
// Dark-only: static value, no light-dark()
|
|
1098
|
-
lines.push(` ${cssName}: ${o.darkVal};`);
|
|
1099
|
-
} else if (theme.mode === 'light') {
|
|
1100
|
-
// Light-only: static value
|
|
1101
|
-
lines.push(` ${cssName}: ${o.lightVal};`);
|
|
1102
|
-
} else {
|
|
1103
|
-
// Both modes: light-dark() wrapping when values differ
|
|
1104
|
-
const value = o.lightVal !== o.darkVal
|
|
1105
|
-
? `light-dark(${o.lightVal}, ${o.darkVal})`
|
|
1106
|
-
: o.lightVal;
|
|
1107
|
-
lines.push(` ${cssName}: ${value};`);
|
|
1108
|
-
}
|
|
1109
|
-
}
|
|
1110
|
-
|
|
1111
|
-
lines.push('}');
|
|
1112
|
-
return lines;
|
|
1113
|
-
}
|
|
1114
|
-
|
|
1115
|
-
/**
|
|
1116
|
-
* Generate Swift theme types: protocol, concrete structs, and EnvironmentKey.
|
|
1117
|
-
* Uses SwiftUI Color type directly (not UIColor) for clean consumption.
|
|
1118
|
-
*
|
|
1119
|
-
* Output structure:
|
|
1120
|
-
* - `{Name}Theme` protocol with theme-varying color properties
|
|
1121
|
-
* - Concrete struct per theme context (light+dark for 'both', single for 'dark'/'light')
|
|
1122
|
-
* - `{Abbreviation}ThemeKey: EnvironmentKey` with base light default
|
|
1123
|
-
* - `EnvironmentValues` extension for `.{abbreviation}Theme` access
|
|
1124
|
-
*/
|
|
1125
|
-
private generateSwiftThemeTypes(
|
|
1126
|
-
baseLight: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
1127
|
-
baseDark: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
1128
|
-
themeOverrides: ThemeOverrideSet[],
|
|
1129
|
-
name: string,
|
|
1130
|
-
abbreviation: string
|
|
1131
|
-
): string[] {
|
|
1132
|
-
// Collect all theme-varying token names
|
|
1133
|
-
const varyingNames = new Set<string>();
|
|
1134
|
-
for (const theme of themeOverrides) {
|
|
1135
|
-
for (const key of theme.overrideKeys) {
|
|
1136
|
-
varyingNames.add(key);
|
|
1137
|
-
}
|
|
1138
|
-
}
|
|
1139
|
-
// Also include tokens that differ between base light and dark
|
|
1140
|
-
const baseDarkMap = new Map(baseDark.map(t => [t.name, t]));
|
|
1141
|
-
for (const lt of baseLight) {
|
|
1142
|
-
if (lt.category !== SemanticCategory.COLOR) continue;
|
|
1143
|
-
const dt = baseDarkMap.get(lt.name);
|
|
1144
|
-
if (!dt) continue;
|
|
1145
|
-
const lv = this.getResolvedValue(lt);
|
|
1146
|
-
const dv = this.getResolvedValue(dt);
|
|
1147
|
-
if (lv !== dv) varyingNames.add(lt.name);
|
|
1148
|
-
}
|
|
1149
|
-
|
|
1150
|
-
if (varyingNames.size === 0) return [];
|
|
1151
|
-
|
|
1152
|
-
const lines: string[] = [];
|
|
1153
|
-
const lowerAbbr = abbreviation.toLowerCase();
|
|
1154
|
-
|
|
1155
|
-
// Sort for deterministic output
|
|
1156
|
-
const sortedNames = Array.from(varyingNames).sort();
|
|
1157
|
-
|
|
1158
|
-
// --- Protocol ---
|
|
1159
|
-
lines.push('');
|
|
1160
|
-
lines.push(`// MARK: - ${name} Theme System (Spec 094)`);
|
|
1161
|
-
lines.push('');
|
|
1162
|
-
lines.push('import SwiftUI');
|
|
1163
|
-
lines.push('');
|
|
1164
|
-
lines.push(`public protocol ${name}Theme {`);
|
|
1165
|
-
for (const tokenName of sortedNames) {
|
|
1166
|
-
const propName = this.iosGenerator.getTokenName(tokenName, SemanticCategory.COLOR);
|
|
1167
|
-
lines.push(` var ${propName}: Color { get }`);
|
|
1168
|
-
}
|
|
1169
|
-
lines.push('}');
|
|
1170
|
-
|
|
1171
|
-
// --- Base light struct ---
|
|
1172
|
-
lines.push('');
|
|
1173
|
-
lines.push(`public struct ${name}BaseLight: ${name}Theme {`);
|
|
1174
|
-
for (const tokenName of sortedNames) {
|
|
1175
|
-
const propName = this.iosGenerator.getTokenName(tokenName, SemanticCategory.COLOR);
|
|
1176
|
-
const token = baseLight.find(t => t.name === tokenName);
|
|
1177
|
-
const value = token ? this.rgbaToSwiftUIColor(this.getResolvedValue(token)) : 'Color.clear';
|
|
1178
|
-
lines.push(` public let ${propName}: Color = ${value}`);
|
|
1179
|
-
}
|
|
1180
|
-
lines.push('}');
|
|
1181
|
-
|
|
1182
|
-
// --- Base dark struct ---
|
|
1183
|
-
lines.push('');
|
|
1184
|
-
lines.push(`public struct ${name}BaseDark: ${name}Theme {`);
|
|
1185
|
-
for (const tokenName of sortedNames) {
|
|
1186
|
-
const propName = this.iosGenerator.getTokenName(tokenName, SemanticCategory.COLOR);
|
|
1187
|
-
const dt = baseDark.find(t => t.name === tokenName);
|
|
1188
|
-
const value = dt ? this.rgbaToSwiftUIColor(this.getResolvedValue(dt)) : 'Color.clear';
|
|
1189
|
-
lines.push(` public let ${propName}: Color = ${value}`);
|
|
1190
|
-
}
|
|
1191
|
-
lines.push('}');
|
|
1192
|
-
|
|
1193
|
-
// --- Theme override structs ---
|
|
1194
|
-
for (const theme of themeOverrides) {
|
|
1195
|
-
const themeName = theme.name.charAt(0).toUpperCase() + theme.name.slice(1);
|
|
1196
|
-
if (theme.mode === 'both') {
|
|
1197
|
-
// Light variant
|
|
1198
|
-
lines.push('');
|
|
1199
|
-
lines.push(`public struct ${name}${themeName}Light: ${name}Theme {`);
|
|
1200
|
-
for (const tokenName of sortedNames) {
|
|
1201
|
-
const propName = this.iosGenerator.getTokenName(tokenName, SemanticCategory.COLOR);
|
|
1202
|
-
const token = theme.lightTokens.find(t => t.name === tokenName)
|
|
1203
|
-
|| baseLight.find(t => t.name === tokenName);
|
|
1204
|
-
const value = token ? this.rgbaToSwiftUIColor(this.getResolvedValue(token)) : 'Color.clear';
|
|
1205
|
-
lines.push(` public let ${propName}: Color = ${value}`);
|
|
1206
|
-
}
|
|
1207
|
-
lines.push('}');
|
|
1208
|
-
// Dark variant
|
|
1209
|
-
lines.push('');
|
|
1210
|
-
lines.push(`public struct ${name}${themeName}Dark: ${name}Theme {`);
|
|
1211
|
-
for (const tokenName of sortedNames) {
|
|
1212
|
-
const propName = this.iosGenerator.getTokenName(tokenName, SemanticCategory.COLOR);
|
|
1213
|
-
const token = theme.darkTokens.find(t => t.name === tokenName)
|
|
1214
|
-
|| baseDark.find(t => t.name === tokenName);
|
|
1215
|
-
const value = token ? this.rgbaToSwiftUIColor(this.getResolvedValue(token)) : 'Color.clear';
|
|
1216
|
-
lines.push(` public let ${propName}: Color = ${value}`);
|
|
1217
|
-
}
|
|
1218
|
-
lines.push('}');
|
|
1219
|
-
} else {
|
|
1220
|
-
// Single-mode (dark or light)
|
|
1221
|
-
const tokens = theme.mode === 'dark' ? theme.darkTokens : theme.lightTokens;
|
|
1222
|
-
const fallback = theme.mode === 'dark' ? baseDark : baseLight;
|
|
1223
|
-
lines.push('');
|
|
1224
|
-
lines.push(`public struct ${name}${themeName}: ${name}Theme {`);
|
|
1225
|
-
for (const tokenName of sortedNames) {
|
|
1226
|
-
const propName = this.iosGenerator.getTokenName(tokenName, SemanticCategory.COLOR);
|
|
1227
|
-
const token = tokens.find(t => t.name === tokenName)
|
|
1228
|
-
|| fallback.find(t => t.name === tokenName);
|
|
1229
|
-
const value = token ? this.rgbaToSwiftUIColor(this.getResolvedValue(token)) : 'Color.clear';
|
|
1230
|
-
lines.push(` public let ${propName}: Color = ${value}`);
|
|
1231
|
-
}
|
|
1232
|
-
lines.push('}');
|
|
1233
|
-
}
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
// --- EnvironmentKey ---
|
|
1237
|
-
lines.push('');
|
|
1238
|
-
lines.push(`public struct ${abbreviation}ThemeKey: EnvironmentKey {`);
|
|
1239
|
-
lines.push(` public static let defaultValue: any ${name}Theme = ${name}BaseLight()`);
|
|
1240
|
-
lines.push('}');
|
|
1241
|
-
lines.push('');
|
|
1242
|
-
lines.push('public extension EnvironmentValues {');
|
|
1243
|
-
lines.push(` var ${lowerAbbr}Theme: any ${name}Theme {`);
|
|
1244
|
-
lines.push(` get { self[${abbreviation}ThemeKey.self] }`);
|
|
1245
|
-
lines.push(` set { self[${abbreviation}ThemeKey.self] = newValue }`);
|
|
1246
|
-
lines.push(' }');
|
|
1247
|
-
lines.push('}');
|
|
1248
|
-
|
|
1249
|
-
return lines;
|
|
1250
|
-
}
|
|
1251
|
-
|
|
1252
|
-
/** Extract the resolved value string from a semantic token's primitiveReferences. */
|
|
1253
|
-
private getResolvedValue(token: Omit<SemanticToken, 'primitiveTokens'>): string {
|
|
1254
|
-
return token.primitiveReferences?.value
|
|
1255
|
-
?? token.primitiveReferences?.default
|
|
1256
|
-
?? Object.values(token.primitiveReferences || {})[0]
|
|
1257
|
-
?? '';
|
|
1258
|
-
}
|
|
1259
|
-
|
|
1260
|
-
/** Convert an rgba() string to SwiftUI Color initializer. */
|
|
1261
|
-
private rgbaToSwiftUIColor(rgba: string): string {
|
|
1262
|
-
const m = rgba.match(/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\s*\)/);
|
|
1263
|
-
if (!m) return `Color.clear /* unresolved: ${rgba} */`;
|
|
1264
|
-
const r = (+m[1] / 255).toFixed(2);
|
|
1265
|
-
const g = (+m[2] / 255).toFixed(2);
|
|
1266
|
-
const b = (+m[3] / 255).toFixed(2);
|
|
1267
|
-
const a = (+m[4]).toFixed(2);
|
|
1268
|
-
return `Color(red: ${r}, green: ${g}, blue: ${b}, opacity: ${a})`;
|
|
1269
|
-
}
|
|
1270
|
-
|
|
1271
|
-
/**
|
|
1272
|
-
* Generate Kotlin theme types: data class, named instances, and CompositionLocal.
|
|
1273
|
-
* Uses Compose `Color` directly for clean consumption.
|
|
1274
|
-
*
|
|
1275
|
-
* Output structure:
|
|
1276
|
-
* - `{Name}Theme` data class with theme-varying color properties
|
|
1277
|
-
* - `{Name}Themes` object with named instances per theme context
|
|
1278
|
-
* - `Local{Abbreviation}Theme` CompositionLocal with base light default
|
|
1279
|
-
*/
|
|
1280
|
-
private generateKotlinThemeTypes(
|
|
1281
|
-
baseLight: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
1282
|
-
baseDark: Array<Omit<SemanticToken, 'primitiveTokens'>>,
|
|
1283
|
-
themeOverrides: ThemeOverrideSet[],
|
|
1284
|
-
name: string,
|
|
1285
|
-
abbreviation: string
|
|
1286
|
-
): string[] {
|
|
1287
|
-
// Collect theme-varying token names (same logic as Swift)
|
|
1288
|
-
const varyingNames = new Set<string>();
|
|
1289
|
-
for (const theme of themeOverrides) {
|
|
1290
|
-
for (const key of theme.overrideKeys) {
|
|
1291
|
-
varyingNames.add(key);
|
|
1292
|
-
}
|
|
1293
|
-
}
|
|
1294
|
-
const baseDarkMap = new Map(baseDark.map(t => [t.name, t]));
|
|
1295
|
-
for (const lt of baseLight) {
|
|
1296
|
-
if (lt.category !== SemanticCategory.COLOR) continue;
|
|
1297
|
-
const dt = baseDarkMap.get(lt.name);
|
|
1298
|
-
if (!dt) continue;
|
|
1299
|
-
if (this.getResolvedValue(lt) !== this.getResolvedValue(dt)) varyingNames.add(lt.name);
|
|
1300
|
-
}
|
|
1301
|
-
|
|
1302
|
-
if (varyingNames.size === 0) return [];
|
|
1303
|
-
|
|
1304
|
-
const lines: string[] = [];
|
|
1305
|
-
const sortedNames = Array.from(varyingNames).sort();
|
|
1306
|
-
|
|
1307
|
-
// --- Imports ---
|
|
1308
|
-
lines.push('');
|
|
1309
|
-
lines.push(`// ${name} Theme System (Spec 094)`);
|
|
1310
|
-
lines.push('');
|
|
1311
|
-
lines.push('import androidx.compose.runtime.compositionLocalOf');
|
|
1312
|
-
lines.push('import androidx.compose.ui.graphics.Color');
|
|
1313
|
-
|
|
1314
|
-
// --- Data class ---
|
|
1315
|
-
lines.push('');
|
|
1316
|
-
lines.push(`data class ${name}Theme(`);
|
|
1317
|
-
for (let i = 0; i < sortedNames.length; i++) {
|
|
1318
|
-
const propName = this.androidGenerator.getTokenName(sortedNames[i], SemanticCategory.COLOR);
|
|
1319
|
-
const comma = i < sortedNames.length - 1 ? ',' : '';
|
|
1320
|
-
lines.push(` val ${propName}: Color${comma}`);
|
|
1321
|
-
}
|
|
1322
|
-
lines.push(')');
|
|
1323
|
-
|
|
1324
|
-
// --- Themes object with instances ---
|
|
1325
|
-
lines.push('');
|
|
1326
|
-
lines.push(`object ${name}Themes {`);
|
|
1327
|
-
|
|
1328
|
-
// Base light
|
|
1329
|
-
lines.push(` val BaseLight = ${name}Theme(`);
|
|
1330
|
-
for (let i = 0; i < sortedNames.length; i++) {
|
|
1331
|
-
const token = baseLight.find(t => t.name === sortedNames[i]);
|
|
1332
|
-
const value = token ? this.rgbaToComposeColor(this.getResolvedValue(token)) : 'Color.Unspecified';
|
|
1333
|
-
const comma = i < sortedNames.length - 1 ? ',' : '';
|
|
1334
|
-
lines.push(` ${this.androidGenerator.getTokenName(sortedNames[i], SemanticCategory.COLOR)} = ${value}${comma}`);
|
|
1335
|
-
}
|
|
1336
|
-
lines.push(' )');
|
|
1337
|
-
|
|
1338
|
-
// Base dark
|
|
1339
|
-
lines.push(` val BaseDark = ${name}Theme(`);
|
|
1340
|
-
for (let i = 0; i < sortedNames.length; i++) {
|
|
1341
|
-
const dt = baseDark.find(t => t.name === sortedNames[i]);
|
|
1342
|
-
const value = dt ? this.rgbaToComposeColor(this.getResolvedValue(dt)) : 'Color.Unspecified';
|
|
1343
|
-
const comma = i < sortedNames.length - 1 ? ',' : '';
|
|
1344
|
-
lines.push(` ${this.androidGenerator.getTokenName(sortedNames[i], SemanticCategory.COLOR)} = ${value}${comma}`);
|
|
1345
|
-
}
|
|
1346
|
-
lines.push(' )');
|
|
1347
|
-
|
|
1348
|
-
// Theme override instances
|
|
1349
|
-
for (const theme of themeOverrides) {
|
|
1350
|
-
const themeName = theme.name.charAt(0).toUpperCase() + theme.name.slice(1);
|
|
1351
|
-
if (theme.mode === 'both') {
|
|
1352
|
-
for (const variant of ['Light', 'Dark'] as const) {
|
|
1353
|
-
const tokens = variant === 'Light' ? theme.lightTokens : theme.darkTokens;
|
|
1354
|
-
const fallback = variant === 'Light' ? baseLight : baseDark;
|
|
1355
|
-
lines.push(` val ${themeName}${variant} = ${name}Theme(`);
|
|
1356
|
-
for (let i = 0; i < sortedNames.length; i++) {
|
|
1357
|
-
const token = tokens.find(t => t.name === sortedNames[i])
|
|
1358
|
-
|| fallback.find(t => t.name === sortedNames[i]);
|
|
1359
|
-
const value = token ? this.rgbaToComposeColor(this.getResolvedValue(token)) : 'Color.Unspecified';
|
|
1360
|
-
const comma = i < sortedNames.length - 1 ? ',' : '';
|
|
1361
|
-
lines.push(` ${this.androidGenerator.getTokenName(sortedNames[i], SemanticCategory.COLOR)} = ${value}${comma}`);
|
|
1362
|
-
}
|
|
1363
|
-
lines.push(' )');
|
|
1364
|
-
}
|
|
1365
|
-
} else {
|
|
1366
|
-
const tokens = theme.mode === 'dark' ? theme.darkTokens : theme.lightTokens;
|
|
1367
|
-
const fallback = theme.mode === 'dark' ? baseDark : baseLight;
|
|
1368
|
-
lines.push(` val ${themeName} = ${name}Theme(`);
|
|
1369
|
-
for (let i = 0; i < sortedNames.length; i++) {
|
|
1370
|
-
const token = tokens.find(t => t.name === sortedNames[i])
|
|
1371
|
-
|| fallback.find(t => t.name === sortedNames[i]);
|
|
1372
|
-
const value = token ? this.rgbaToComposeColor(this.getResolvedValue(token)) : 'Color.Unspecified';
|
|
1373
|
-
const comma = i < sortedNames.length - 1 ? ',' : '';
|
|
1374
|
-
lines.push(` ${this.androidGenerator.getTokenName(sortedNames[i], SemanticCategory.COLOR)} = ${value}${comma}`);
|
|
1375
|
-
}
|
|
1376
|
-
lines.push(' )');
|
|
1377
|
-
}
|
|
1378
|
-
}
|
|
1379
|
-
|
|
1380
|
-
lines.push('}');
|
|
1381
|
-
|
|
1382
|
-
// --- CompositionLocal ---
|
|
1383
|
-
lines.push('');
|
|
1384
|
-
lines.push(`val Local${abbreviation}Theme = compositionLocalOf { ${name}Themes.BaseLight }`);
|
|
1385
|
-
|
|
1386
|
-
return lines;
|
|
1387
|
-
}
|
|
1388
|
-
|
|
1389
|
-
/** Convert an rgba() string to Compose Color initializer. */
|
|
1390
|
-
private rgbaToComposeColor(rgba: string): string {
|
|
1391
|
-
const m = rgba.match(/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\s*\)/);
|
|
1392
|
-
if (!m) return `Color.Unspecified /* unresolved: ${rgba} */`;
|
|
1393
|
-
return `Color(${m[1]}, ${m[2]}, ${m[3]}, ${Math.round(+m[4] * 255)})`;
|
|
1394
|
-
}
|
|
1395
|
-
|
|
1396
|
-
/**
|
|
1397
|
-
* Generate icon size token with calculated value.
|
|
1398
|
-
* Resolves fontSize and lineHeight primitives and applies formula: fontSize × lineHeight
|
|
1399
|
-
*
|
|
1400
|
-
* @param semantic - Icon size semantic token
|
|
1401
|
-
* @param platform - Target platform
|
|
1402
|
-
* @param generator - Platform-specific generator
|
|
1403
|
-
* @returns Formatted token string with calculated value
|
|
1404
|
-
*/
|
|
1405
|
-
private generateIconSizeToken(
|
|
1406
|
-
semantic: Omit<SemanticToken, 'primitiveTokens'>,
|
|
1407
|
-
platform: 'web' | 'ios' | 'android',
|
|
1408
|
-
generator: WebFormatGenerator | iOSFormatGenerator | AndroidFormatGenerator
|
|
1409
|
-
): string | null {
|
|
1410
|
-
// Get fontSize and multiplier primitive references
|
|
1411
|
-
const fontSizeRef = semantic.primitiveReferences.fontSize;
|
|
1412
|
-
const multiplierRef = semantic.primitiveReferences.multiplier;
|
|
1413
|
-
|
|
1414
|
-
if (!fontSizeRef || !multiplierRef) {
|
|
1415
|
-
console.warn(`Icon token ${semantic.name} missing fontSize or multiplier reference`);
|
|
1416
|
-
return null;
|
|
1417
|
-
}
|
|
1418
|
-
|
|
1419
|
-
// Import primitive tokens and parsing utilities
|
|
1420
|
-
const { fontSizeTokens } = require('../tokens/FontSizeTokens');
|
|
1421
|
-
const { lineHeightTokens } = require('../tokens/LineHeightTokens');
|
|
1422
|
-
const { parseMultiplier, CUSTOM_MULTIPLIER_PREFIX } = require('../tokens/semantic/IconTokens');
|
|
1423
|
-
|
|
1424
|
-
// Resolve fontSize primitive token
|
|
1425
|
-
const fontSizeToken = fontSizeTokens[fontSizeRef];
|
|
1426
|
-
|
|
1427
|
-
if (!fontSizeToken) {
|
|
1428
|
-
console.warn(`Icon token ${semantic.name} references invalid fontSize: ${fontSizeRef}`);
|
|
1429
|
-
return null;
|
|
1430
|
-
}
|
|
1431
|
-
|
|
1432
|
-
// Resolve multiplier - can be a lineHeight token reference or 'custom:X.XXX'
|
|
1433
|
-
let multiplierValue: number;
|
|
1434
|
-
try {
|
|
1435
|
-
multiplierValue = parseMultiplier(multiplierRef);
|
|
1436
|
-
} catch (error) {
|
|
1437
|
-
console.warn(`Icon token ${semantic.name} has invalid multiplier: ${multiplierRef}`);
|
|
1438
|
-
return null;
|
|
1439
|
-
}
|
|
1440
|
-
|
|
1441
|
-
// Calculate icon size: fontSize × multiplier (rounded)
|
|
1442
|
-
const calculatedSize = Math.round(fontSizeToken.baseValue * multiplierValue);
|
|
1443
|
-
|
|
1444
|
-
// Generate platform-specific token with calculated value, description, and context
|
|
1445
|
-
return generator.formatIconSizeToken(
|
|
1446
|
-
semantic.name,
|
|
1447
|
-
calculatedSize,
|
|
1448
|
-
semantic.category,
|
|
1449
|
-
semantic.description,
|
|
1450
|
-
semantic.context
|
|
1451
|
-
);
|
|
1452
|
-
}
|
|
1453
|
-
|
|
1454
|
-
/**
|
|
1455
|
-
* Generate motion token section for specified platform
|
|
1456
|
-
* Handles primitive motion tokens (duration, easing, scale) and semantic motion tokens
|
|
1457
|
-
*
|
|
1458
|
-
* @param platform - Target platform ('web', 'ios', or 'android')
|
|
1459
|
-
* @returns Array of formatted token strings
|
|
1460
|
-
*/
|
|
1461
|
-
private generateMotionSection(platform: 'web' | 'ios' | 'android'): string[] {
|
|
1462
|
-
const lines: string[] = [];
|
|
1463
|
-
|
|
1464
|
-
// Import platform builders for motion token generation
|
|
1465
|
-
const { WebBuilder } = require('../build/platforms/WebBuilder');
|
|
1466
|
-
const { iOSBuilder } = require('../build/platforms/iOSBuilder');
|
|
1467
|
-
const { AndroidBuilder } = require('../build/platforms/AndroidBuilder');
|
|
1468
|
-
|
|
1469
|
-
// Select appropriate builder based on platform
|
|
1470
|
-
let builder: any;
|
|
1471
|
-
|
|
1472
|
-
switch (platform) {
|
|
1473
|
-
case 'web':
|
|
1474
|
-
builder = new WebBuilder();
|
|
1475
|
-
break;
|
|
1476
|
-
case 'ios':
|
|
1477
|
-
builder = new iOSBuilder();
|
|
1478
|
-
break;
|
|
1479
|
-
case 'android':
|
|
1480
|
-
builder = new AndroidBuilder();
|
|
1481
|
-
break;
|
|
1482
|
-
default:
|
|
1483
|
-
return lines;
|
|
1484
|
-
}
|
|
1485
|
-
|
|
1486
|
-
// Generate primitive motion tokens
|
|
1487
|
-
const durationLines = builder.generateDurationTokens(durationTokens);
|
|
1488
|
-
const easingLines = builder.generateEasingTokens(easingTokens);
|
|
1489
|
-
const scaleLines = builder.generateScaleTokens(scaleTokens);
|
|
1490
|
-
|
|
1491
|
-
lines.push(durationLines);
|
|
1492
|
-
lines.push(easingLines);
|
|
1493
|
-
lines.push(scaleLines);
|
|
1494
|
-
|
|
1495
|
-
// Generate semantic motion tokens
|
|
1496
|
-
const semanticMotionLines = builder.generateSemanticMotionTokens(motionTokens);
|
|
1497
|
-
lines.push(semanticMotionLines);
|
|
1498
|
-
|
|
1499
|
-
return lines;
|
|
1500
|
-
}
|
|
1501
|
-
|
|
1502
|
-
/**
|
|
1503
|
-
* Generate layering token section for specified platform
|
|
1504
|
-
* Handles semantic-only layering tokens (z-index and elevation)
|
|
1505
|
-
*
|
|
1506
|
-
* @param platform - Target platform ('web', 'ios', or 'android')
|
|
1507
|
-
* @returns Array of formatted token strings
|
|
1508
|
-
*/
|
|
1509
|
-
private generateLayeringSection(platform: 'web' | 'ios' | 'android'): string[] {
|
|
1510
|
-
const lines: string[] = [];
|
|
1511
|
-
|
|
1512
|
-
// Route z-index tokens to web/iOS, elevation tokens to Android
|
|
1513
|
-
if (platform === 'web' || platform === 'ios') {
|
|
1514
|
-
// Get z-index tokens for web and iOS
|
|
1515
|
-
const zIndexTokens = getAllZIndexTokens();
|
|
1516
|
-
|
|
1517
|
-
for (const token of zIndexTokens) {
|
|
1518
|
-
// Format z-index token based on platform
|
|
1519
|
-
if (platform === 'web') {
|
|
1520
|
-
// Web: CSS custom property format
|
|
1521
|
-
// --z-index-modal: 400;
|
|
1522
|
-
const kebabName = token.name.replace('zIndex.', 'z-index-');
|
|
1523
|
-
lines.push(` --${kebabName}: ${token.value};`);
|
|
1524
|
-
} else {
|
|
1525
|
-
// iOS: Swift constant format with scaled value
|
|
1526
|
-
// static let zIndexModal: CGFloat = 4
|
|
1527
|
-
const suffix = token.name.replace('zIndex.', '');
|
|
1528
|
-
const camelSuffix = suffix.charAt(0).toUpperCase() + suffix.slice(1);
|
|
1529
|
-
const camelName = 'zIndex' + camelSuffix;
|
|
1530
|
-
const scaledValue = token.value / 100; // Scale down from 100-600 to 1-6
|
|
1531
|
-
lines.push(` static let ${camelName}: CGFloat = ${scaledValue}`);
|
|
1532
|
-
}
|
|
1533
|
-
}
|
|
1534
|
-
} else if (platform === 'android') {
|
|
1535
|
-
// Get elevation tokens for Android
|
|
1536
|
-
const elevationTokens = getAllElevationTokens();
|
|
1537
|
-
|
|
1538
|
-
for (const token of elevationTokens) {
|
|
1539
|
-
// Use AndroidFormatGenerator to format elevation tokens
|
|
1540
|
-
lines.push(this.androidGenerator.formatElevationToken(token.name, token.value));
|
|
1541
|
-
}
|
|
1542
|
-
}
|
|
1543
|
-
|
|
1544
|
-
return lines;
|
|
1545
|
-
}
|
|
1546
|
-
|
|
1547
|
-
// ---------------------------------------------------------------------------
|
|
1548
|
-
// Platform token generation
|
|
1549
|
-
//
|
|
1550
|
-
// All three platforms follow the same generation flow. Platform-specific
|
|
1551
|
-
// formatting is handled by the generator instances (WebFormatGenerator,
|
|
1552
|
-
// iOSFormatGenerator, AndroidFormatGenerator). This consolidated method
|
|
1553
|
-
// ensures filtering logic, section ordering, and structural decisions
|
|
1554
|
-
// stay in sync across platforms.
|
|
1555
|
-
// ---------------------------------------------------------------------------
|
|
1556
|
-
|
|
1557
|
-
/** Platform-specific configuration for the consolidated generation flow. */
|
|
1558
|
-
private static readonly PLATFORM_CONFIG: Record<'web' | 'ios' | 'android', {
|
|
1559
|
-
fileName: string;
|
|
1560
|
-
motionComment: string;
|
|
1561
|
-
layeringComment: string;
|
|
1562
|
-
/** Web closes :root before WCAG overrides; iOS/Android put WCAG inside the struct. */
|
|
1563
|
-
wcagAfterFooter: boolean;
|
|
1564
|
-
}> = {
|
|
1565
|
-
web: {
|
|
1566
|
-
fileName: 'DesignTokens.web.css',
|
|
1567
|
-
motionComment: ' /* Motion Tokens */',
|
|
1568
|
-
layeringComment: ' /* Layering Tokens (Z-Index) */',
|
|
1569
|
-
wcagAfterFooter: true,
|
|
1570
|
-
},
|
|
1571
|
-
ios: {
|
|
1572
|
-
fileName: 'DesignTokens.ios.swift',
|
|
1573
|
-
motionComment: ' // MARK: - Motion Tokens',
|
|
1574
|
-
layeringComment: ' // MARK: - Layering Tokens (Z-Index)',
|
|
1575
|
-
wcagAfterFooter: false,
|
|
1576
|
-
},
|
|
1577
|
-
android: {
|
|
1578
|
-
fileName: 'DesignTokens.android.kt',
|
|
1579
|
-
motionComment: ' // Motion Tokens',
|
|
1580
|
-
layeringComment: ' // Layering Tokens (Elevation)',
|
|
1581
|
-
wcagAfterFooter: false,
|
|
1582
|
-
},
|
|
1583
|
-
};
|
|
1584
|
-
|
|
1585
|
-
/**
|
|
1586
|
-
* Categories handled by dedicated sections (generateMotionSection),
|
|
1587
|
-
* excluded from the generic primitive pass to prevent duplicates.
|
|
1588
|
-
*/
|
|
1589
|
-
private static readonly DEDICATED_PRIMITIVE_CATEGORIES = new Set([
|
|
1590
|
-
TokenCategory.EASING, TokenCategory.DURATION, TokenCategory.SCALE,
|
|
1591
|
-
]);
|
|
1592
|
-
|
|
1593
|
-
/**
|
|
1594
|
-
* Semantic name prefixes handled by dedicated sections
|
|
1595
|
-
* (generateMotionSection, generateLayeringSection),
|
|
1596
|
-
* excluded from the generic semantic pass.
|
|
1597
|
-
*/
|
|
1598
|
-
private static readonly DEDICATED_SEMANTIC_PREFIXES = ['zIndex.', 'elevation.', 'motion.'];
|
|
1599
|
-
|
|
1600
|
-
/** Get primitive tokens for the generic pass (excludes dedicated-section categories). */
|
|
1601
|
-
private getGenerationPrimitives(primitiveTokens: PrimitiveToken[]): PrimitiveToken[] {
|
|
1602
|
-
return primitiveTokens.filter(
|
|
1603
|
-
t => !TokenFileGenerator.DEDICATED_PRIMITIVE_CATEGORIES.has(t.category)
|
|
1604
|
-
);
|
|
1605
|
-
}
|
|
1606
|
-
|
|
1607
|
-
/** Filter semantics for the generic pass (excludes dedicated-section prefixes). */
|
|
1608
|
-
private filterGenerationSemantics(
|
|
1609
|
-
tokens: Array<Omit<SemanticToken, 'primitiveTokens'>>
|
|
1610
|
-
): Array<Omit<SemanticToken, 'primitiveTokens'>> {
|
|
1611
|
-
return tokens.filter(s =>
|
|
1612
|
-
TokenFileGenerator.DEDICATED_SEMANTIC_PREFIXES.every(p => !s.name.startsWith(p))
|
|
1613
|
-
);
|
|
1614
|
-
}
|
|
1615
|
-
|
|
1616
|
-
/** Get the format generator instance for a platform. */
|
|
1617
|
-
private getGenerator(platform: 'web' | 'ios' | 'android'): WebFormatGenerator | iOSFormatGenerator | AndroidFormatGenerator {
|
|
1618
|
-
switch (platform) {
|
|
1619
|
-
case 'web': return this.webGenerator;
|
|
1620
|
-
case 'ios': return this.iosGenerator;
|
|
1621
|
-
case 'android': return this.androidGenerator;
|
|
1622
|
-
}
|
|
1623
|
-
}
|
|
1624
|
-
|
|
1625
|
-
/**
|
|
1626
|
-
* Generate token file for a specific platform.
|
|
1627
|
-
*
|
|
1628
|
-
* Shared flow: header → primitives → semantics → motion → layering → WCAG → footer.
|
|
1629
|
-
* Web places footer before WCAG (overrides live outside :root);
|
|
1630
|
-
* iOS/Android place WCAG before footer (overrides live inside the struct).
|
|
1631
|
-
*/
|
|
1632
|
-
private generatePlatformTokens(
|
|
1633
|
-
platform: 'web' | 'ios' | 'android',
|
|
1634
|
-
options: GenerationOptions
|
|
1635
|
-
): GenerationResult {
|
|
1636
|
-
const {
|
|
1637
|
-
outputDir = 'output',
|
|
1638
|
-
version = '1.0.0',
|
|
1639
|
-
includeComments = true,
|
|
1640
|
-
groupByCategory = true,
|
|
1641
|
-
semanticTokens,
|
|
1642
|
-
darkSemanticTokens,
|
|
1643
|
-
} = options;
|
|
1644
|
-
|
|
1645
|
-
const config = TokenFileGenerator.PLATFORM_CONFIG[platform];
|
|
1646
|
-
const generator = this.getGenerator(platform);
|
|
1647
|
-
const metadata: FileMetadata = { version, generatedAt: new Date() };
|
|
1648
|
-
|
|
1649
|
-
const tokens = this.getGenerationPrimitives(options.primitiveTokens || getAllPrimitiveTokens());
|
|
1650
|
-
const semantics = this.filterGenerationSemantics(semanticTokens);
|
|
1651
|
-
const darkSemantics = this.filterGenerationSemantics(darkSemanticTokens);
|
|
1652
|
-
|
|
1653
|
-
const lines: string[] = [];
|
|
1654
|
-
let semanticTokenCount = 0;
|
|
1655
|
-
|
|
1656
|
-
// --- Header ---
|
|
1657
|
-
lines.push(generator.generateHeader(metadata));
|
|
1658
|
-
if (platform === 'web') {
|
|
1659
|
-
lines.push(' color-scheme: light dark;');
|
|
1660
|
-
}
|
|
1661
|
-
|
|
1662
|
-
// --- Primitive tokens ---
|
|
1663
|
-
if (includeComments) {
|
|
1664
|
-
lines.push(generator.generateSectionComment('primitive'));
|
|
1665
|
-
}
|
|
1666
|
-
|
|
1667
|
-
if (groupByCategory) {
|
|
1668
|
-
const categories = this.getUniqueCategories(tokens);
|
|
1669
|
-
for (const category of categories) {
|
|
1670
|
-
if (category === TokenCategory.COLOR) {
|
|
1671
|
-
// OKLCH color output — uses composed colors instead of old RGBA PrimitiveTokens
|
|
1672
|
-
if (includeComments) {
|
|
1673
|
-
lines.push((generator as any).generateCategoryComment(category));
|
|
1674
|
-
}
|
|
1675
|
-
if (platform === 'web') {
|
|
1676
|
-
lines.push(...this.generateOklchWebColors());
|
|
1677
|
-
} else if (platform === 'ios') {
|
|
1678
|
-
lines.push(...this.generateOklchNativeColors('ios'));
|
|
1679
|
-
} else {
|
|
1680
|
-
lines.push(...this.generateOklchNativeColors('android'));
|
|
1681
|
-
}
|
|
1682
|
-
continue;
|
|
1683
|
-
}
|
|
1684
|
-
const categoryTokens = tokens.filter(t => t.category === category);
|
|
1685
|
-
if (includeComments) {
|
|
1686
|
-
lines.push((generator as any).generateCategoryComment(category));
|
|
1687
|
-
}
|
|
1688
|
-
for (const token of categoryTokens) {
|
|
1689
|
-
if (includeComments && 'mathematicalRelationship' in token) {
|
|
1690
|
-
lines.push((generator as any).generateMathematicalComment(token as PrimitiveToken));
|
|
1691
|
-
}
|
|
1692
|
-
lines.push(generator.formatToken(token));
|
|
1693
|
-
}
|
|
1694
|
-
}
|
|
1695
|
-
} else {
|
|
1696
|
-
for (const token of tokens) {
|
|
1697
|
-
lines.push(generator.formatToken(token));
|
|
1698
|
-
}
|
|
1699
|
-
}
|
|
1700
|
-
|
|
1701
|
-
// --- Semantic tokens ---
|
|
1702
|
-
if (includeComments) {
|
|
1703
|
-
lines.push(generator.generateSectionComment('semantic'));
|
|
1704
|
-
}
|
|
1705
|
-
const semanticLines = this.generateSemanticSection(
|
|
1706
|
-
semantics, platform, darkSemantics,
|
|
1707
|
-
platform !== 'web' ? options.themeVaryingTokens : undefined
|
|
1708
|
-
);
|
|
1709
|
-
lines.push(...semanticLines);
|
|
1710
|
-
semanticTokenCount = semantics.length;
|
|
1711
|
-
|
|
1712
|
-
// --- Motion tokens (dedicated section) ---
|
|
1713
|
-
if (includeComments) {
|
|
1714
|
-
lines.push('');
|
|
1715
|
-
lines.push(config.motionComment);
|
|
1716
|
-
}
|
|
1717
|
-
const motionLines = this.generateMotionSection(platform);
|
|
1718
|
-
lines.push(...motionLines);
|
|
1719
|
-
semanticTokenCount += motionLines.length;
|
|
1720
|
-
|
|
1721
|
-
// --- Layering tokens (dedicated section) ---
|
|
1722
|
-
if (includeComments) {
|
|
1723
|
-
lines.push('');
|
|
1724
|
-
lines.push(config.layeringComment);
|
|
1725
|
-
}
|
|
1726
|
-
const layeringLines = this.generateLayeringSection(platform);
|
|
1727
|
-
lines.push(...layeringLines);
|
|
1728
|
-
semanticTokenCount += layeringLines.length;
|
|
1729
|
-
|
|
1730
|
-
// --- WCAG overrides + Footer ---
|
|
1731
|
-
// Web: footer first (closes :root), then WCAG outside it.
|
|
1732
|
-
// iOS/Android: WCAG inside the struct, then footer closes it.
|
|
1733
|
-
const wcagLines = this.maybeGenerateWcagBlock(platform, options);
|
|
1734
|
-
|
|
1735
|
-
if (config.wcagAfterFooter) {
|
|
1736
|
-
lines.push(generator.generateFooter());
|
|
1737
|
-
lines.push(...wcagLines);
|
|
1738
|
-
} else {
|
|
1739
|
-
lines.push(...wcagLines);
|
|
1740
|
-
lines.push(generator.generateFooter());
|
|
1741
|
-
}
|
|
1742
|
-
|
|
1743
|
-
const content = lines.join('\n');
|
|
1744
|
-
const validation = generator.validateSyntax(content);
|
|
1745
|
-
|
|
1746
|
-
return {
|
|
1747
|
-
platform,
|
|
1748
|
-
filePath: `${outputDir}/${config.fileName}`,
|
|
1749
|
-
content,
|
|
1750
|
-
tokenCount: (options.primitiveTokens || getAllPrimitiveTokens()).length,
|
|
1751
|
-
semanticTokenCount,
|
|
1752
|
-
valid: validation.valid,
|
|
1753
|
-
errors: validation.errors,
|
|
1754
|
-
};
|
|
1755
|
-
}
|
|
1756
|
-
|
|
1757
|
-
/** Generate WCAG override block if WCAG tokens are provided. */
|
|
1758
|
-
private maybeGenerateWcagBlock(
|
|
1759
|
-
platform: 'web' | 'ios' | 'android',
|
|
1760
|
-
options: GenerationOptions
|
|
1761
|
-
): string[] {
|
|
1762
|
-
if (options.wcagSemanticTokens && options.darkWcagSemanticTokens) {
|
|
1763
|
-
const wcagLines = this.generateWcagOverrideBlock(
|
|
1764
|
-
options.semanticTokens, options.darkSemanticTokens,
|
|
1765
|
-
options.wcagSemanticTokens, options.darkWcagSemanticTokens,
|
|
1766
|
-
platform, options.wcagOverrideKeys
|
|
1767
|
-
);
|
|
1768
|
-
if (wcagLines.length > 0) return wcagLines;
|
|
1769
|
-
}
|
|
1770
|
-
return [];
|
|
1771
|
-
}
|
|
1772
|
-
|
|
1773
|
-
/** Generate web token file (CSS). */
|
|
1774
|
-
generateWebTokens(options: GenerationOptions): GenerationResult {
|
|
1775
|
-
return this.generatePlatformTokens('web', options);
|
|
1776
|
-
}
|
|
1777
|
-
|
|
1778
|
-
/** Generate iOS token file (Swift). */
|
|
1779
|
-
generateiOSTokens(options: GenerationOptions): GenerationResult {
|
|
1780
|
-
return this.generatePlatformTokens('ios', options);
|
|
1781
|
-
}
|
|
1782
|
-
|
|
1783
|
-
/** Generate Android token file (Kotlin). */
|
|
1784
|
-
generateAndroidTokens(options: GenerationOptions): GenerationResult {
|
|
1785
|
-
return this.generatePlatformTokens('android', options);
|
|
1786
|
-
}
|
|
1787
|
-
|
|
1788
|
-
/**
|
|
1789
|
-
* Extract name and value from a formatted token line (any platform).
|
|
1790
|
-
* Web: ` --color-text-default: rgba(38, 50, 58, 1);` → { name: '--color-text-default', value: 'rgba(38, 50, 58, 1)' }
|
|
1791
|
-
* iOS: ` public static let colorTextDefault: UIColor = UIColor(...)` → { name: 'colorTextDefault', value: 'UIColor(...)' }
|
|
1792
|
-
* Android: ` val color_text_default = Color.argb(255, 38, 50, 58)` → { name: 'color_text_default', value: 'Color.argb(255, 38, 50, 58)' }
|
|
1793
|
-
*/
|
|
1794
|
-
private extractFormattedParts(line: string): { name: string; value: string } | null {
|
|
1795
|
-
const lastLine = line.includes('\n') ? line.split('\n').pop()! : line;
|
|
1796
|
-
// Web: --prop-name: value;
|
|
1797
|
-
const cssMatch = lastLine.match(/^\s*(--[\w-]+):\s*(.+);$/);
|
|
1798
|
-
if (cssMatch) return { name: cssMatch[1], value: cssMatch[2].trim() };
|
|
1799
|
-
// iOS: public static let name: Type = value
|
|
1800
|
-
const swiftMatch = lastLine.match(/public static let (\w+).*?=\s*(.+)$/);
|
|
1801
|
-
if (swiftMatch) return { name: swiftMatch[1], value: swiftMatch[2].trim() };
|
|
1802
|
-
// Android (Kotlin): val name = value
|
|
1803
|
-
const kotlinMatch = lastLine.match(/^\s*val\s+([\w_]+)\s*=\s*(.+)$/);
|
|
1804
|
-
if (kotlinMatch) return { name: kotlinMatch[1], value: kotlinMatch[2].trim() };
|
|
1805
|
-
return null;
|
|
1806
|
-
}
|
|
1807
|
-
|
|
1808
|
-
/**
|
|
1809
|
-
* Get unique categories from token list
|
|
1810
|
-
*/
|
|
1811
|
-
private getUniqueCategories(tokens: PrimitiveToken[]): TokenCategory[] {
|
|
1812
|
-
const categories = new Set<TokenCategory>();
|
|
1813
|
-
tokens.forEach(token => categories.add(token.category));
|
|
1814
|
-
return Array.from(categories).sort();
|
|
1815
|
-
}
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
/**
|
|
1820
|
-
* Validate mathematical consistency across platforms
|
|
1821
|
-
* Extended to include semantic token validation with nuanced platform-specific token handling
|
|
1822
|
-
*
|
|
1823
|
-
* Platform-specific tokens (documented in acknowledged-differences.json) are excluded from
|
|
1824
|
-
* count comparisons. For example, Android has elevation.none (0dp baseline) while web/iOS
|
|
1825
|
-
* don't need a "zero" z-index token.
|
|
1826
|
-
*/
|
|
1827
|
-
validateCrossPlatformConsistency(results: GenerationResult[]): {
|
|
1828
|
-
consistent: boolean;
|
|
1829
|
-
issues: string[];
|
|
1830
|
-
platformSpecificTokens?: { platform: string; tokens: string[] }[];
|
|
1831
|
-
} {
|
|
1832
|
-
const issues: string[] = [];
|
|
1833
|
-
const platformSpecificInfo: { platform: string; tokens: string[] }[] = [];
|
|
1834
|
-
|
|
1835
|
-
// Check that all platforms generated successfully FIRST (most critical)
|
|
1836
|
-
const invalidPlatforms = results.filter(r => !r.valid);
|
|
1837
|
-
if (invalidPlatforms.length > 0) {
|
|
1838
|
-
invalidPlatforms.forEach(r => {
|
|
1839
|
-
issues.push(`${r.platform} generation failed: ${r.errors?.join(', ')}`);
|
|
1840
|
-
});
|
|
1841
|
-
}
|
|
1842
|
-
|
|
1843
|
-
// Load acknowledged differences registry for platform-specific token handling
|
|
1844
|
-
let acknowledgedDifferences: any = null;
|
|
1845
|
-
try {
|
|
1846
|
-
// Try multiple paths since this file may be run from different locations
|
|
1847
|
-
try {
|
|
1848
|
-
acknowledgedDifferences = require('../__tests__/fixtures/acknowledged-differences.json');
|
|
1849
|
-
} catch {
|
|
1850
|
-
acknowledgedDifferences = require('../../__tests__/fixtures/acknowledged-differences.json');
|
|
1851
|
-
}
|
|
1852
|
-
} catch (e) {
|
|
1853
|
-
// Registry not available, proceed with strict validation
|
|
1854
|
-
}
|
|
1855
|
-
|
|
1856
|
-
// Get platform-specific token counts from registry
|
|
1857
|
-
const platformSpecificCounts: Record<string, number> = {};
|
|
1858
|
-
if (acknowledgedDifferences?.platformSpecificTokens?.tokens) {
|
|
1859
|
-
for (const token of acknowledgedDifferences.platformSpecificTokens.tokens) {
|
|
1860
|
-
platformSpecificCounts[token.platform] = (platformSpecificCounts[token.platform] || 0) + 1;
|
|
1861
|
-
|
|
1862
|
-
// Track for reporting
|
|
1863
|
-
const existing = platformSpecificInfo.find(p => p.platform === token.platform);
|
|
1864
|
-
if (existing) {
|
|
1865
|
-
existing.tokens.push(token.token);
|
|
1866
|
-
} else {
|
|
1867
|
-
platformSpecificInfo.push({ platform: token.platform, tokens: [token.token] });
|
|
1868
|
-
}
|
|
1869
|
-
}
|
|
1870
|
-
}
|
|
1871
|
-
|
|
1872
|
-
// Check that all platforms have the same primitive token count
|
|
1873
|
-
const tokenCounts = results.map(r => r.tokenCount);
|
|
1874
|
-
const uniqueCounts = new Set(tokenCounts);
|
|
1875
|
-
|
|
1876
|
-
if (uniqueCounts.size > 1) {
|
|
1877
|
-
issues.push(`Primitive token count mismatch across platforms: ${Array.from(uniqueCounts).join(', ')}`);
|
|
1878
|
-
}
|
|
1879
|
-
|
|
1880
|
-
// Check semantic token counts with platform-specific token adjustment
|
|
1881
|
-
// Only apply adjustment if the raw counts suggest platform-specific tokens are present
|
|
1882
|
-
// (i.e., the difference between platforms matches the expected platform-specific count)
|
|
1883
|
-
const semanticTokenCounts = results.map(r => r.semanticTokenCount);
|
|
1884
|
-
const uniqueRawCounts = new Set(semanticTokenCounts);
|
|
1885
|
-
|
|
1886
|
-
// First check if raw counts are already consistent
|
|
1887
|
-
if (uniqueRawCounts.size === 1) {
|
|
1888
|
-
// All platforms have same count - no adjustment needed
|
|
1889
|
-
// This handles mock data and cases where platform-specific tokens aren't present
|
|
1890
|
-
} else {
|
|
1891
|
-
// Raw counts differ - check if the difference matches platform-specific tokens
|
|
1892
|
-
const normalizedSemanticCounts = results.map(r => {
|
|
1893
|
-
const platformSpecificCount = platformSpecificCounts[r.platform] || 0;
|
|
1894
|
-
return {
|
|
1895
|
-
platform: r.platform,
|
|
1896
|
-
original: r.semanticTokenCount,
|
|
1897
|
-
normalized: r.semanticTokenCount - platformSpecificCount,
|
|
1898
|
-
platformSpecific: platformSpecificCount
|
|
1899
|
-
};
|
|
1900
|
-
});
|
|
1901
|
-
|
|
1902
|
-
const uniqueNormalizedCounts = new Set(normalizedSemanticCounts.map(c => c.normalized));
|
|
1903
|
-
|
|
1904
|
-
if (uniqueNormalizedCounts.size > 1) {
|
|
1905
|
-
// Still mismatched after adjustment - report the issue
|
|
1906
|
-
const countDetails = normalizedSemanticCounts
|
|
1907
|
-
.map(c => `${c.platform}=${c.original}${c.platformSpecific > 0 ? ` (${c.platformSpecific} platform-specific)` : ''}`)
|
|
1908
|
-
.join(', ');
|
|
1909
|
-
issues.push(`Semantic token count mismatch across platforms (after excluding platform-specific tokens): ${countDetails}`);
|
|
1910
|
-
}
|
|
1911
|
-
// If normalized counts are consistent, the difference was due to documented platform-specific tokens
|
|
1912
|
-
}
|
|
1913
|
-
|
|
1914
|
-
// Verify all platforms have same semantic token names (excluding platform-specific)
|
|
1915
|
-
const semanticTokenNames = this.extractSemanticTokenNames(results);
|
|
1916
|
-
|
|
1917
|
-
if (semanticTokenNames.length > 0) {
|
|
1918
|
-
const referenceNames = semanticTokenNames[0].names;
|
|
1919
|
-
const referencePlatform = semanticTokenNames[0].platform;
|
|
1920
|
-
|
|
1921
|
-
for (let i = 1; i < semanticTokenNames.length; i++) {
|
|
1922
|
-
const current = semanticTokenNames[i];
|
|
1923
|
-
|
|
1924
|
-
const missingInCurrent = referenceNames.filter(name => !current.names.includes(name));
|
|
1925
|
-
const extraInCurrent = current.names.filter(name => !referenceNames.includes(name));
|
|
1926
|
-
|
|
1927
|
-
if (missingInCurrent.length > 0) {
|
|
1928
|
-
issues.push(`${current.platform} missing semantic tokens present in ${referencePlatform}: ${missingInCurrent.join(', ')}`);
|
|
1929
|
-
}
|
|
1930
|
-
|
|
1931
|
-
if (extraInCurrent.length > 0) {
|
|
1932
|
-
issues.push(`${current.platform} has extra semantic tokens not in ${referencePlatform}: ${extraInCurrent.join(', ')}`);
|
|
1933
|
-
}
|
|
1934
|
-
}
|
|
1935
|
-
}
|
|
1936
|
-
|
|
1937
|
-
// Verify all platforms maintain same primitive→semantic relationships
|
|
1938
|
-
const relationships = this.extractPrimitiveSemanticRelationships(results);
|
|
1939
|
-
|
|
1940
|
-
if (relationships.length > 0) {
|
|
1941
|
-
const referenceRelationships = relationships[0].relationships;
|
|
1942
|
-
const referencePlatform = relationships[0].platform;
|
|
1943
|
-
|
|
1944
|
-
for (let i = 1; i < relationships.length; i++) {
|
|
1945
|
-
const current = relationships[i];
|
|
1946
|
-
|
|
1947
|
-
for (const [semanticName, primitiveRefs] of Object.entries(referenceRelationships)) {
|
|
1948
|
-
const currentRefs = current.relationships[semanticName];
|
|
1949
|
-
|
|
1950
|
-
if (!currentRefs) {
|
|
1951
|
-
issues.push(`${current.platform} missing semantic token '${semanticName}' present in ${referencePlatform}`);
|
|
1952
|
-
continue;
|
|
1953
|
-
}
|
|
1954
|
-
|
|
1955
|
-
const refKeys = Object.keys(primitiveRefs).sort();
|
|
1956
|
-
const currKeys = Object.keys(currentRefs).sort();
|
|
1957
|
-
|
|
1958
|
-
if (JSON.stringify(refKeys) !== JSON.stringify(currKeys)) {
|
|
1959
|
-
issues.push(`${current.platform} has different primitive references for '${semanticName}' compared to ${referencePlatform}`);
|
|
1960
|
-
} else {
|
|
1961
|
-
for (const key of refKeys) {
|
|
1962
|
-
if (primitiveRefs[key] !== currentRefs[key]) {
|
|
1963
|
-
issues.push(`${current.platform} semantic token '${semanticName}' references '${currentRefs[key]}' for ${key}, but ${referencePlatform} references '${primitiveRefs[key]}'`);
|
|
1964
|
-
}
|
|
1965
|
-
}
|
|
1966
|
-
}
|
|
1967
|
-
}
|
|
1968
|
-
}
|
|
1969
|
-
}
|
|
1970
|
-
|
|
1971
|
-
return {
|
|
1972
|
-
consistent: issues.length === 0,
|
|
1973
|
-
issues,
|
|
1974
|
-
platformSpecificTokens: platformSpecificInfo.length > 0 ? platformSpecificInfo : undefined
|
|
1975
|
-
};
|
|
1976
|
-
}
|
|
1977
|
-
|
|
1978
|
-
/**
|
|
1979
|
-
* Extract semantic token names from generated content
|
|
1980
|
-
* Parses the generated files to extract semantic token names
|
|
1981
|
-
*
|
|
1982
|
-
* @param results - Generation results for all platforms
|
|
1983
|
-
* @returns Array of platform token names
|
|
1984
|
-
*/
|
|
1985
|
-
private extractSemanticTokenNames(results: GenerationResult[]): Array<{
|
|
1986
|
-
platform: string;
|
|
1987
|
-
names: string[];
|
|
1988
|
-
}> {
|
|
1989
|
-
const semantics = getAllSemanticTokens();
|
|
1990
|
-
const semanticNames = semantics.map(s => s.name);
|
|
1991
|
-
|
|
1992
|
-
return results.map(result => ({
|
|
1993
|
-
platform: result.platform,
|
|
1994
|
-
names: semanticNames
|
|
1995
|
-
}));
|
|
1996
|
-
}
|
|
1997
|
-
|
|
1998
|
-
/**
|
|
1999
|
-
* Extract primitive→semantic relationships from generated content
|
|
2000
|
-
* Analyzes semantic tokens to extract their primitive references
|
|
2001
|
-
*
|
|
2002
|
-
* @param results - Generation results for all platforms
|
|
2003
|
-
* @returns Array of platform relationships
|
|
2004
|
-
*/
|
|
2005
|
-
private extractPrimitiveSemanticRelationships(results: GenerationResult[]): Array<{
|
|
2006
|
-
platform: string;
|
|
2007
|
-
relationships: Record<string, Record<string, string>>;
|
|
2008
|
-
}> {
|
|
2009
|
-
const semantics = getAllSemanticTokens();
|
|
2010
|
-
|
|
2011
|
-
// Build relationships map from semantic tokens
|
|
2012
|
-
const relationships: Record<string, Record<string, string>> = {};
|
|
2013
|
-
|
|
2014
|
-
for (const semantic of semantics) {
|
|
2015
|
-
relationships[semantic.name] = { ...semantic.primitiveReferences };
|
|
2016
|
-
}
|
|
2017
|
-
|
|
2018
|
-
// Return same relationships for all platforms (they should be identical)
|
|
2019
|
-
return results.map(result => ({
|
|
2020
|
-
platform: result.platform,
|
|
2021
|
-
relationships: { ...relationships }
|
|
2022
|
-
}));
|
|
2023
|
-
}
|
|
2024
|
-
|
|
2025
|
-
// --- OKLCH Color Generation Helpers (Spec 112) ---
|
|
2026
|
-
|
|
2027
|
-
private generateOklchWebColors(): string[] {
|
|
2028
|
-
const lines: string[] = [];
|
|
2029
|
-
|
|
2030
|
-
// Channel custom properties
|
|
2031
|
-
const families: Array<{ name: string; hue: number; lightness: Record<number, number>; chroma: Record<number, number> }> = [
|
|
2032
|
-
{ name: 'pink', hue: colorHues.pink, lightness: pinkLightness, chroma: pinkChroma },
|
|
2033
|
-
{ name: 'orange', hue: colorHues.orange, lightness: orangeLightness, chroma: orangeChroma },
|
|
2034
|
-
{ name: 'yellow', hue: colorHues.yellow, lightness: yellowLightness, chroma: yellowChroma },
|
|
2035
|
-
{ name: 'green', hue: colorHues.green, lightness: greenLightness, chroma: greenChroma },
|
|
2036
|
-
{ name: 'cyan', hue: colorHues.cyan, lightness: cyanLightness, chroma: cyanChroma },
|
|
2037
|
-
{ name: 'teal', hue: colorHues.teal, lightness: tealLightness, chroma: tealChroma },
|
|
2038
|
-
{ name: 'purple', hue: colorHues.purple, lightness: purpleLightness, chroma: purpleChroma },
|
|
2039
|
-
];
|
|
2040
|
-
|
|
2041
|
-
// Emit channel primitives
|
|
2042
|
-
for (const family of families) {
|
|
2043
|
-
lines.push(...this.webGenerator.formatOklchChannels(family.name, family.hue, family.lightness, family.chroma));
|
|
2044
|
-
}
|
|
2045
|
-
// Neutral hue
|
|
2046
|
-
lines.push(` --neutral-hue: ${neutralHue};`);
|
|
2047
|
-
// Neutral channels
|
|
2048
|
-
lines.push(...this.webGenerator.formatOklchChannels('white', neutralHue, whiteLightness as any, whiteChroma as any));
|
|
2049
|
-
lines.push(...this.webGenerator.formatOklchChannels('gray', neutralHue, grayLightness as any, grayChroma as any));
|
|
2050
|
-
lines.push(...this.webGenerator.formatOklchChannels('black', neutralHue, blackLightness as any, blackChroma as any));
|
|
2051
|
-
|
|
2052
|
-
// Emit composed colors
|
|
2053
|
-
for (const color of allComposedColors) {
|
|
2054
|
-
lines.push(this.webGenerator.formatOklchColor(color.name, color.resolved.l, color.resolved.c, color.resolved.h));
|
|
2055
|
-
}
|
|
2056
|
-
|
|
2057
|
-
return lines;
|
|
2058
|
-
}
|
|
2059
|
-
|
|
2060
|
-
private generateOklchNativeColors(platform: 'ios' | 'android'): string[] {
|
|
2061
|
-
const lines: string[] = [];
|
|
2062
|
-
const gen = platform === 'ios' ? this.iosGenerator : this.androidGenerator;
|
|
2063
|
-
|
|
2064
|
-
for (const color of allComposedColors) {
|
|
2065
|
-
lines.push(gen.formatOklchColor(color.name, color.resolved.l, color.resolved.c, color.resolved.h));
|
|
2066
|
-
}
|
|
2067
|
-
|
|
2068
|
-
return lines;
|
|
2069
|
-
}
|
|
2070
|
-
}
|