@3fn/core 13.0.0 → 14.1.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/agents/ada-prompt.md +80 -132
- package/.kiro/agents/ada-prompt.md.attribution.json +45 -0
- package/.kiro/agents/ada.json +44 -59
- package/.kiro/agents/ada.json.attribution.json +13 -0
- package/.kiro/agents/data-prompt.md +83 -74
- package/.kiro/agents/data-prompt.md.attribution.json +53 -0
- package/.kiro/agents/data.json +31 -38
- package/.kiro/agents/data.json.attribution.json +13 -0
- package/.kiro/agents/kenya-prompt.md +83 -72
- package/.kiro/agents/kenya-prompt.md.attribution.json +53 -0
- package/.kiro/agents/kenya.json +27 -35
- package/.kiro/agents/kenya.json.attribution.json +13 -0
- package/.kiro/agents/leonardo-prompt.md +176 -234
- package/.kiro/agents/leonardo-prompt.md.attribution.json +45 -0
- package/.kiro/agents/leonardo.json +28 -36
- package/.kiro/agents/leonardo.json.attribution.json +13 -0
- package/.kiro/agents/lina-prompt.md +110 -151
- package/.kiro/agents/lina-prompt.md.attribution.json +53 -0
- package/.kiro/agents/lina.json +46 -59
- package/.kiro/agents/lina.json.attribution.json +13 -0
- package/.kiro/agents/sparky-prompt.md +89 -72
- package/.kiro/agents/sparky-prompt.md.attribution.json +53 -0
- package/.kiro/agents/sparky.json +37 -37
- package/.kiro/agents/sparky.json.attribution.json +13 -0
- package/.kiro/agents/stacy-prompt.md +74 -48
- package/.kiro/agents/stacy-prompt.md.attribution.json +45 -0
- package/.kiro/agents/stacy.json +28 -30
- package/.kiro/agents/stacy.json.attribution.json +13 -0
- package/.kiro/agents/thurgood-prompt.md +94 -138
- package/.kiro/agents/thurgood-prompt.md.attribution.json +45 -0
- package/.kiro/agents/thurgood.json +31 -35
- package/.kiro/agents/thurgood.json.attribution.json +13 -0
- package/.kiro/steering/AI-Collaboration-Principles.md +3 -3
- package/.kiro/steering/Civitas-System-Overview.md +7 -16
- package/.kiro/steering/DesignerPunk-Systems-Overview.md +6 -6
- package/.kiro/steering/Spec-Feedback-Protocol.md +2 -11
- package/.kiro/steering/Task-Completion-Protocol.md +98 -17
- package/.kiro/steering/core-goals.md +3 -3
- package/.kiro/steering/personal-note.md +1 -1
- package/.kiro/steering/start-up-tasks.md +17 -6
- package/application-mcp-server/src/index.ts +26 -0
- 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 -1
- package/dist/DesignTokens.dtcg.json +8 -5
- package/dist/DesignTokens.figma.json +2 -2
- package/dist/DesignTokens.ios.swift +1 -1
- package/dist/DesignTokens.web.css +1 -1
- package/dist/android/DesignTokens.android.kt +1 -1
- package/dist/blend/OklchBlendCalculator.js +1 -0
- package/dist/blend/ThemeAwareBlendUtilities.web.d.ts +13 -2
- package/dist/blend/ThemeAwareBlendUtilities.web.js +6 -1
- package/dist/browser/designerpunk.esm.js +36 -90
- package/dist/browser/designerpunk.esm.min.js +33 -36
- package/dist/browser/designerpunk.umd.js +36 -90
- package/dist/browser/designerpunk.umd.min.js +47 -50
- package/dist/browser/tokens.css +3 -3
- package/dist/build/tokens/defineComponentTokens.d.ts +10 -0
- package/dist/build/tokens/defineComponentTokens.js +26 -0
- 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/Avatar-Base/platforms/web/Avatar.web.js +24 -5
- package/dist/components/core/Button-CTA/examples/BasicUsage.d.ts +16 -28
- package/dist/components/core/Button-CTA/examples/BasicUsage.js +18 -43
- package/dist/components/core/Button-CTA/platforms/web/ButtonCTA.web.d.ts +3 -15
- package/dist/components/core/Button-CTA/platforms/web/ButtonCTA.web.js +9 -58
- package/dist/components/core/Button-CTA/types.d.ts +0 -24
- package/dist/components/core/Button-CTA/types.js +6 -0
- 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/Input-Text-Base/types.d.ts +13 -1
- package/dist/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.js +11 -2
- package/dist/generators/DTCGFormatGenerator.js +8 -0
- package/dist/generators/TokenFileGenerator.js +7 -2
- package/dist/integration/BuildErrorHandler.js +2 -2
- package/dist/ios/DesignTokens.ios.swift +1 -1
- package/dist/mcp/application-mcp.js +24 -0
- package/dist/mcp/docs-mcp.js +130 -15
- package/dist/mcp/product-mcp.js +25 -0
- package/dist/tokens/OpacityTokens.js +1 -1
- package/dist/tokens/component/progress.d.ts +65 -5
- package/dist/tokens/component/progress.js +79 -18
- package/dist/tokens/semantic/BlendTokens.d.ts +10 -3
- package/dist/tokens/semantic/BlendTokens.js +17 -5
- package/dist/tokens/semantic/OpacityTokens.d.ts +4 -4
- package/dist/tokens/semantic/OpacityTokens.js +4 -4
- package/dist/types/ComponentTypes.d.ts +1 -1
- package/dist/types/generated/TokenTypes.d.ts +1 -1
- package/dist/types/generated/TokenTypes.js +1 -1
- package/dist/validators/StemmaTokenUsageValidator.js +3 -2
- package/dist/web/DesignTokens.web.css +1 -1
- package/governance/BUILD-SYSTEM-SETUP.md +1 -2
- package/governance/Component-Development-Guide.md +23 -13
- package/governance/Component-Development-Standards.md +21 -20
- package/governance/Component-Family-Avatar.md +6 -7
- package/governance/Component-Family-Badge.md +19 -20
- package/governance/Component-Family-Button.md +30 -43
- package/governance/Component-Family-Chip.md +14 -15
- package/governance/Component-Family-Container.md +12 -13
- package/governance/Component-Family-Data-Display.md +1 -2
- package/governance/Component-Family-Divider.md +1 -2
- package/governance/Component-Family-Form-Inputs.md +65 -65
- package/governance/Component-Family-Icon.md +9 -10
- package/governance/Component-Family-Loading.md +1 -2
- package/governance/Component-Family-Modal.md +1 -2
- package/governance/Component-Family-Navigation.md +1 -2
- package/governance/Component-Family-Progress.md +0 -1
- package/governance/Component-Inheritance-Structures.md +219 -99
- package/governance/Component-MCP-Document-Template.md +6 -5
- package/governance/Component-Primitive-vs-Semantic-Philosophy.md +1 -1
- package/governance/Component-Quick-Reference.md +33 -33
- package/governance/Component-Readiness-Status.md +59 -44
- package/governance/Component-Templates.md +57 -61
- package/governance/Contract-System-Reference.md +7 -7
- package/governance/MCP-Integration-Guide.md +1 -1
- package/governance/Process-Cross-Reference-Standards.md +31 -13
- package/governance/Process-Development-Workflow.md +49 -59
- package/governance/Process-File-Organization.md +25 -28
- package/governance/Process-Hook-Operations.md +22 -11
- package/governance/Process-Orchestration-Model-Selection.md +92 -0
- package/governance/Process-Spec-Planning.md +98 -52
- package/governance/Process-Task-Type-Definitions.md +80 -4
- package/governance/Product-Handoff-Protocol.md +2 -0
- package/governance/Rosetta-System-Architecture.md +13 -11
- package/governance/Test-Behavioral-Contract-Validation.md +38 -31
- package/governance/Test-Failure-Audit-Methodology.md +1 -1
- package/governance/Token-Family-Accessibility.md +1 -2
- package/governance/Token-Family-Blend.md +18 -16
- package/governance/Token-Family-Blur.md +0 -1
- package/governance/Token-Family-Border.md +1 -2
- package/governance/Token-Family-Color.md +0 -1
- package/governance/Token-Family-Glow.md +1 -2
- package/governance/Token-Family-Layering.md +0 -1
- package/governance/Token-Family-Motion.md +1 -2
- package/governance/Token-Family-Opacity.md +0 -1
- package/governance/Token-Family-Radius.md +1 -2
- package/governance/Token-Family-Responsive.md +1 -2
- package/governance/Token-Family-Shadow.md +1 -2
- package/governance/Token-Family-Sizing.md +0 -1
- package/governance/Token-Family-Spacing.md +1 -2
- package/governance/Token-Family-Typography.md +1 -2
- package/governance/Token-Governance.md +8 -8
- package/governance/Token-Quick-Reference.md +47 -34
- package/governance/Token-Resolution-Patterns.md +1 -1
- package/governance/Token-Semantic-Structure.md +1 -1
- package/governance/Web-Authoring-Standards.md +5 -5
- package/governance/browser-distribution-guide.md +1 -4
- package/governance/classification-map.md +474 -0
- package/governance/completion-documentation-guide.md +23 -37
- package/governance/component-meta-authoring-guide.md +1 -1
- package/governance/cross-platform-vs-platform-specific-decision-framework.md +1 -1
- package/governance/platform-implementation-guidelines.md +2 -3
- package/governance/release-management-system.md +28 -63
- package/governance/rosetta-system-principles.md +8 -6
- package/governance/stemma-system-principles.md +18 -17
- package/mcp-server/src/index.ts +24 -6
- package/mcp-server/src/indexer/DocumentIndexer.ts +119 -9
- package/mcp-server/src/indexer/__tests__/bare-id-crossrefs.test.ts +250 -0
- package/mcp-server/src/indexer/cross-ref-parser.ts +29 -1
- package/mcp-server/src/indexer/index-health.ts +27 -2
- package/mcp-server/src/query/__tests__/find-docs-calibration.test.ts +11 -26
- package/mcp-server/src/relocation-integrity-gate/__tests__/relocation-integrity-gate.test.ts +72 -5
- package/mcp-server/src/relocation-integrity-gate/relocation-integrity-gate.ts +81 -24
- package/mcp-server/src/tools/list-cross-references.ts +2 -2
- package/package.json +24 -26
- package/src/__tests__/browser-distribution/css-bundling.test.ts +6 -4
- package/src/__tests__/console-allowlist.json +14 -0
- package/src/__tests__/console-fail-setup.ts +169 -0
- package/src/__tests__/integration/Spec107-DesignLanguageContext.test.ts +16 -0
- package/src/__tests__/stemma-system/behavioral-contract-validation.test.ts +70 -17
- package/src/__tests__/stemma-system/contract-catalog-name-validation.test.ts +28 -0
- package/src/__tests__/stemma-system/form-inputs-contracts.test.ts +223 -16
- package/src/__tests__/stemma-system/input-text-native-base-call-alignment.test.ts +298 -0
- package/src/blend/OklchBlendCalculator.ts +3 -0
- package/src/blend/ThemeAwareBlendUtilities.android.kt +3 -0
- package/src/blend/ThemeAwareBlendUtilities.ios.swift +3 -0
- package/src/blend/ThemeAwareBlendUtilities.web.ts +9 -1
- package/src/blend/__tests__/InteractionStateAudit.test.ts +12 -9
- package/src/build/errors/__tests__/ErrorHandler.integration.test.ts +8 -0
- package/src/build/errors/__tests__/ErrorHandler.test.ts +5 -0
- package/src/build/tokens/__tests__/defineComponentTokens.test.ts +113 -0
- package/src/build/tokens/defineComponentTokens.ts +43 -1
- package/src/build/workflow/__tests__/CICDIntegration.test.ts +12 -1
- package/src/cli/__tests__/init.test.ts +45 -11
- package/src/components/core/Avatar-Base/Avatar-Base.schema.yaml +1 -1
- package/src/components/core/Avatar-Base/__tests__/Avatar.accessibility.test.ts +121 -7
- package/src/components/core/Avatar-Base/__tests__/Avatar.image.test.ts +3 -0
- package/src/components/core/Avatar-Base/__tests__/Avatar.test.ts +15 -6
- package/src/components/core/Avatar-Base/avatar.tokens.ts +31 -34
- package/src/components/core/Avatar-Base/contracts.yaml +11 -1
- package/src/components/core/Avatar-Base/index.ts +1 -1
- package/src/components/core/Avatar-Base/platforms/web/Avatar.web.ts +24 -5
- package/src/components/core/Badge-Count-Base/contracts.yaml +1 -1
- package/src/components/core/Badge-Label-Base/contracts.yaml +1 -1
- package/src/components/core/Button-CTA/Button-CTA.schema.yaml +2 -12
- package/src/components/core/Button-CTA/README.md +3 -6
- package/src/components/core/Button-CTA/__tests__/ButtonCTA.test.ts +35 -89
- package/src/components/core/Button-CTA/__tests__/setup.test.ts +0 -2
- package/src/components/core/Button-CTA/__tests__/test-utils.ts +0 -2
- package/src/components/core/Button-CTA/contracts.yaml +6 -29
- package/src/components/core/Button-CTA/examples/BasicUsage.html +2 -14
- package/src/components/core/Button-CTA/examples/BasicUsage.tsx +17 -44
- package/src/components/core/Button-CTA/platforms/android/ButtonCTA.android.kt +12 -20
- package/src/components/core/Button-CTA/platforms/ios/ButtonCTA.ios.swift +12 -51
- package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.css +2 -26
- package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.ts +18 -71
- package/src/components/core/Button-CTA/types.ts +10 -28
- package/src/components/core/Button-Icon/buttonIcon.tokens.ts +43 -27
- package/src/components/core/Chip-Base/__tests__/ChipBase.test.ts +13 -0
- package/src/components/core/Chip-Filter/__tests__/ChipFilter.test.ts +13 -0
- package/src/components/core/Chip-Input/__tests__/ChipInput.test.ts +13 -0
- package/src/components/core/Input-Text-Base/Input-Text-Base.schema.yaml +30 -2
- package/src/components/core/Input-Text-Base/README.md +25 -2
- package/src/components/core/Input-Text-Base/__tests__/focusIndicators.test.ts +16 -15
- package/src/components/core/Input-Text-Base/contracts.yaml +90 -0
- package/src/components/core/Input-Text-Base/platforms/android/InputTextBase.android.kt +26 -12
- package/src/components/core/Input-Text-Base/platforms/ios/InputTextBase.ios.swift +195 -59
- package/src/components/core/Input-Text-Base/types.ts +13 -1
- package/src/components/core/Input-Text-Email/Input-Text-Email.schema.yaml +5 -1
- package/src/components/core/Input-Text-Email/README.md +8 -7
- package/src/components/core/Input-Text-Email/platforms/android/InputTextEmail.android.kt +1 -4
- package/src/components/core/Input-Text-Email/platforms/ios/InputTextEmail.ios.swift +2 -16
- package/src/components/core/Input-Text-Password/Input-Text-Password.schema.yaml +10 -3
- package/src/components/core/Input-Text-Password/README.md +9 -8
- package/src/components/core/Input-Text-Password/contracts.yaml +5 -0
- package/src/components/core/Input-Text-Password/platforms/android/InputTextPassword.android.kt +17 -7
- package/src/components/core/Input-Text-Password/platforms/ios/InputTextPassword.ios.swift +22 -20
- package/src/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.ts +11 -2
- package/src/components/core/Input-Text-PhoneNumber/Input-Text-PhoneNumber.schema.yaml +5 -1
- package/src/components/core/Input-Text-PhoneNumber/README.md +9 -8
- package/src/components/core/Input-Text-PhoneNumber/platforms/android/InputTextPhoneNumber.android.kt +2 -5
- package/src/components/core/Input-Text-PhoneNumber/platforms/ios/InputTextPhoneNumber.ios.swift +3 -17
- package/src/components/core/Nav-Header-App/contracts.yaml +1 -1
- package/src/components/core/Nav-SegmentedChoice-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Indicator-Connector-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Indicator-Label-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Indicator-Node-Base/contracts.yaml +1 -1
- package/src/components/core/Progress-Stepper-Base/__tests__/StepperBase.test.ts +5 -2
- package/src/components/core/Progress-Stepper-Detailed/__tests__/StepperDetailed.test.ts +5 -2
- package/src/generators/DTCGFormatGenerator.ts +6 -0
- package/src/generators/TokenFileGenerator.ts +7 -2
- package/src/generators/__tests__/DTCGConfigOptions.test.ts +14 -5
- package/src/integration/BuildErrorHandler.ts +2 -2
- package/src/tokens/OpacityTokens.ts +1 -1
- package/src/tokens/__tests__/OpacityTokens.test.ts +3 -1
- 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/component/progress.ts +83 -21
- package/src/tokens/semantic/BlendTokens.ts +26 -5
- package/src/tokens/semantic/OpacityTokens.ts +4 -4
- package/src/types/ComponentTypes.ts +1 -1
- package/src/types/generated/TokenTypes.ts +1 -1
- package/src/validators/StemmaTokenUsageValidator.ts +3 -2
- package/token-index/components.yaml +8 -8
- package/token-index/semantics.yaml +1 -2
- 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
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* composition pattern as iOS and Android platforms. This ensures cross-platform
|
|
14
14
|
* consistency and single source of truth for icon rendering.
|
|
15
15
|
*
|
|
16
|
-
* Uses theme-aware blend utilities for state colors (hover, pressed,
|
|
16
|
+
* Uses theme-aware blend utilities for state colors (hover, pressed, icon)
|
|
17
17
|
* instead of opacity or filter workarounds. This ensures cross-platform consistency
|
|
18
18
|
* with iOS and Android implementations.
|
|
19
19
|
*
|
|
@@ -83,13 +83,12 @@ function getIconSizeForButton(buttonSize) {
|
|
|
83
83
|
* - Semantic `<button>` element with proper accessibility
|
|
84
84
|
* - Token-based styling via CSS custom properties
|
|
85
85
|
* - Supports text wrapping by default (accessibility-first)
|
|
86
|
-
* - Uses blend utilities for state colors (hover, pressed,
|
|
86
|
+
* - Uses blend utilities for state colors (hover, pressed, icon)
|
|
87
87
|
* - WCAG 2.1 AA compliant:
|
|
88
88
|
* - Keyboard navigation (Tab, Enter, Space)
|
|
89
89
|
* - Focus indicators with 3:1 contrast ratio
|
|
90
90
|
* - Color contrast 4.5:1 for all styles
|
|
91
91
|
* - Screen reader support with ARIA attributes
|
|
92
|
-
* - Proper disabled state handling
|
|
93
92
|
*
|
|
94
93
|
* @example
|
|
95
94
|
* ```html
|
|
@@ -103,7 +102,6 @@ function getIconSizeForButton(buttonSize) {
|
|
|
103
102
|
* variant="primary"
|
|
104
103
|
* icon="arrow-right"
|
|
105
104
|
* no-wrap="false"
|
|
106
|
-
* disabled="false"
|
|
107
105
|
* test-id="submit-button"
|
|
108
106
|
* ></button-cta>
|
|
109
107
|
* ```
|
|
@@ -125,7 +123,7 @@ class ButtonCTA extends HTMLElement {
|
|
|
125
123
|
* When these attributes change, attributeChangedCallback is invoked.
|
|
126
124
|
*/
|
|
127
125
|
static get observedAttributes() {
|
|
128
|
-
return ['label', 'size', 'variant', 'icon', 'no-wrap', '
|
|
126
|
+
return ['label', 'size', 'variant', 'icon', 'no-wrap', 'test-id'];
|
|
129
127
|
}
|
|
130
128
|
constructor() {
|
|
131
129
|
super();
|
|
@@ -141,7 +139,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
141
139
|
// Cached blend colors for state styling
|
|
142
140
|
this._hoverColor = '';
|
|
143
141
|
this._pressedColor = '';
|
|
144
|
-
this._disabledColor = '';
|
|
145
142
|
this._iconColor = '';
|
|
146
143
|
this._iconOpticalBalanceColor = '';
|
|
147
144
|
/**
|
|
@@ -150,12 +147,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
150
147
|
* Dispatches a custom 'press' event that bubbles up to parent elements.
|
|
151
148
|
*/
|
|
152
149
|
this._handleClick = (event) => {
|
|
153
|
-
// Don't dispatch if disabled
|
|
154
|
-
if (this.disabled) {
|
|
155
|
-
event.preventDefault();
|
|
156
|
-
event.stopPropagation();
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
150
|
// Dispatch custom 'press' event
|
|
160
151
|
this.dispatchEvent(new CustomEvent('press', {
|
|
161
152
|
bubbles: true,
|
|
@@ -173,10 +164,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
173
164
|
* @param event - The keyboard event
|
|
174
165
|
*/
|
|
175
166
|
this._handleKeyDown = (event) => {
|
|
176
|
-
// Don't handle if disabled
|
|
177
|
-
if (this.disabled) {
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
167
|
// Handle Enter and Space keys (WCAG 2.1 AA keyboard navigation)
|
|
181
168
|
if (event.key === 'Enter' || event.key === ' ') {
|
|
182
169
|
event.preventDefault(); // Prevent default space scrolling
|
|
@@ -247,7 +234,7 @@ class ButtonCTA extends HTMLElement {
|
|
|
247
234
|
* Calculate blend colors from CSS custom properties.
|
|
248
235
|
*
|
|
249
236
|
* Reads base colors from CSS custom properties and applies theme-aware blend
|
|
250
|
-
* utilities to generate state colors (hover, pressed,
|
|
237
|
+
* utilities to generate state colors (hover, pressed, icon).
|
|
251
238
|
*
|
|
252
239
|
* Uses getBlendUtilities() factory functions instead of direct blend calculations
|
|
253
240
|
* for cross-platform consistency with iOS and Android implementations.
|
|
@@ -255,7 +242,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
255
242
|
* State color mappings:
|
|
256
243
|
* - Hover: darkerBlend(color.action.primary, blend.hoverDarker) - 8% darker
|
|
257
244
|
* - Pressed: darkerBlend(color.action.primary, blend.pressedDarker) - 12% darker
|
|
258
|
-
* - Disabled: desaturate(color.action.primary, blend.disabledDesaturate) - 12% less saturated
|
|
259
245
|
* - Icon: lighterBlend(color.contrast.onAction, blend.iconLighter) - 8% lighter
|
|
260
246
|
*
|
|
261
247
|
* @see Requirements: 7.1, 7.2, 7.3, 7.4 - Button-CTA state colors
|
|
@@ -282,8 +268,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
282
268
|
this._hoverColor = this._blendUtils.hoverColor(primaryColor);
|
|
283
269
|
// @see Requirements: 7.2 - Pressed uses darkerBlend(color.action.primary, blend.pressedDarker)
|
|
284
270
|
this._pressedColor = this._blendUtils.pressedColor(primaryColor);
|
|
285
|
-
// @see Requirements: 7.3 - Disabled uses desaturate(color.action.primary, blend.disabledDesaturate)
|
|
286
|
-
this._disabledColor = this._blendUtils.disabledColor(primaryColor);
|
|
287
271
|
// @see Requirements: 7.4 - Icon uses lighterBlend(color.contrast.onAction, blend.iconLighter)
|
|
288
272
|
// Icon for primary buttons: provides optical balance for icons on primary background
|
|
289
273
|
this._iconColor = this._blendUtils.iconColor(onActionColor);
|
|
@@ -380,23 +364,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
380
364
|
set noWrap(value) {
|
|
381
365
|
this.setAttribute('no-wrap', value.toString());
|
|
382
366
|
}
|
|
383
|
-
/**
|
|
384
|
-
* Get the disabled state.
|
|
385
|
-
*/
|
|
386
|
-
get disabled() {
|
|
387
|
-
return this.hasAttribute('disabled');
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* Set the disabled state.
|
|
391
|
-
*/
|
|
392
|
-
set disabled(value) {
|
|
393
|
-
if (value) {
|
|
394
|
-
this.setAttribute('disabled', '');
|
|
395
|
-
}
|
|
396
|
-
else {
|
|
397
|
-
this.removeAttribute('disabled');
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
367
|
/**
|
|
401
368
|
* Get the test ID.
|
|
402
369
|
*/
|
|
@@ -457,15 +424,13 @@ class ButtonCTA extends HTMLElement {
|
|
|
457
424
|
const variant = this.buttonVariant;
|
|
458
425
|
const icon = this.icon;
|
|
459
426
|
const noWrap = this.noWrap;
|
|
460
|
-
const disabled = this.disabled;
|
|
461
427
|
const testID = this.testID;
|
|
462
428
|
// Generate class names
|
|
463
429
|
const buttonClasses = [
|
|
464
430
|
'button-cta',
|
|
465
431
|
`button-cta--${size}`,
|
|
466
|
-
`button-cta--${variant}
|
|
467
|
-
|
|
468
|
-
].filter(Boolean).join(' ');
|
|
432
|
+
`button-cta--${variant}`
|
|
433
|
+
].join(' ');
|
|
469
434
|
// Get icon size for button size variant
|
|
470
435
|
// Icon sizes are type-safe mapped from button size:
|
|
471
436
|
// - Small/Medium: 24px (iconBaseSize100)
|
|
@@ -481,7 +446,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
481
446
|
const blendColorStyles = `
|
|
482
447
|
--_cta-hover-bg: ${this._hoverColor};
|
|
483
448
|
--_cta-pressed-bg: ${this._pressedColor};
|
|
484
|
-
--_cta-disabled-bg: ${this._disabledColor};
|
|
485
449
|
--_cta-icon-color: ${this._iconColor};
|
|
486
450
|
--_cta-icon-optical: ${this._iconOpticalBalanceColor};
|
|
487
451
|
`;
|
|
@@ -491,11 +455,10 @@ class ButtonCTA extends HTMLElement {
|
|
|
491
455
|
// @see Requirements: 8.2, 8.3 (components render correctly with interactivity)
|
|
492
456
|
this._shadowRoot.innerHTML = `
|
|
493
457
|
<style>${ButtonCTA_web_css_1.default}</style>
|
|
494
|
-
<button
|
|
458
|
+
<button
|
|
495
459
|
class="${buttonClasses}"
|
|
496
460
|
type="button"
|
|
497
461
|
role="button"
|
|
498
|
-
${disabled ? 'disabled aria-disabled="true"' : 'aria-disabled="false"'}
|
|
499
462
|
${testIDAttr}
|
|
500
463
|
aria-label="${label}"
|
|
501
464
|
style="${blendColorStyles}"
|
|
@@ -534,7 +497,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
534
497
|
const variant = this.buttonVariant;
|
|
535
498
|
const icon = this.icon;
|
|
536
499
|
const noWrap = this.noWrap;
|
|
537
|
-
const disabled = this.disabled;
|
|
538
500
|
const testID = this.testID;
|
|
539
501
|
// Get icon size for button size variant
|
|
540
502
|
const iconSize = getIconSizeForButton(size);
|
|
@@ -545,19 +507,9 @@ class ButtonCTA extends HTMLElement {
|
|
|
545
507
|
const buttonClasses = [
|
|
546
508
|
'button-cta',
|
|
547
509
|
`button-cta--${size}`,
|
|
548
|
-
`button-cta--${variant}
|
|
549
|
-
|
|
550
|
-
].filter(Boolean).join(' ');
|
|
510
|
+
`button-cta--${variant}`
|
|
511
|
+
].join(' ');
|
|
551
512
|
this._button.className = buttonClasses;
|
|
552
|
-
// Update disabled state
|
|
553
|
-
if (disabled) {
|
|
554
|
-
this._button.setAttribute('disabled', '');
|
|
555
|
-
this._button.setAttribute('aria-disabled', 'true');
|
|
556
|
-
}
|
|
557
|
-
else {
|
|
558
|
-
this._button.removeAttribute('disabled');
|
|
559
|
-
this._button.setAttribute('aria-disabled', 'false');
|
|
560
|
-
}
|
|
561
513
|
// Update aria-label
|
|
562
514
|
this._button.setAttribute('aria-label', label);
|
|
563
515
|
// Update test ID
|
|
@@ -570,7 +522,6 @@ class ButtonCTA extends HTMLElement {
|
|
|
570
522
|
// Update blend color CSS custom properties
|
|
571
523
|
this._button.style.setProperty('--_cta-hover-bg', this._hoverColor);
|
|
572
524
|
this._button.style.setProperty('--_cta-pressed-bg', this._pressedColor);
|
|
573
|
-
this._button.style.setProperty('--_cta-disabled-bg', this._disabledColor);
|
|
574
525
|
this._button.style.setProperty('--_cta-icon-color', this._iconColor);
|
|
575
526
|
this._button.style.setProperty('--_cta-icon-optical', this._iconOpticalBalanceColor);
|
|
576
527
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -78,7 +78,6 @@ export type ButtonStyle = 'primary' | 'secondary' | 'tertiary';
|
|
|
78
78
|
* variant="primary"
|
|
79
79
|
* icon="arrow-right"
|
|
80
80
|
* noWrap={false}
|
|
81
|
-
* disabled={false}
|
|
82
81
|
* testID="submit-button"
|
|
83
82
|
* onPress={handleSubmit}
|
|
84
83
|
* />
|
|
@@ -190,11 +189,9 @@ export interface ButtonProps {
|
|
|
190
189
|
* Click/tap handler (required)
|
|
191
190
|
*
|
|
192
191
|
* Callback function invoked when the button is clicked or tapped.
|
|
193
|
-
* Not called when button is disabled.
|
|
194
192
|
*
|
|
195
193
|
* @remarks
|
|
196
194
|
* - Function signature: `() => void`
|
|
197
|
-
* - Not invoked when `disabled` is true
|
|
198
195
|
* - Triggered by click, tap, Enter key, or Space key
|
|
199
196
|
*
|
|
200
197
|
* @example
|
|
@@ -222,26 +219,5 @@ export interface ButtonProps {
|
|
|
222
219
|
* ```
|
|
223
220
|
*/
|
|
224
221
|
testID?: string;
|
|
225
|
-
/**
|
|
226
|
-
* Optional disabled state (default: false)
|
|
227
|
-
*
|
|
228
|
-
* When true, the button is non-interactive and visually indicates
|
|
229
|
-
* disabled state. The onPress handler is not called when disabled.
|
|
230
|
-
*
|
|
231
|
-
* @defaultValue false
|
|
232
|
-
*
|
|
233
|
-
* @remarks
|
|
234
|
-
* - Disabled buttons are not keyboard focusable
|
|
235
|
-
* - Screen readers announce disabled state
|
|
236
|
-
* - Visual styling indicates non-interactive state
|
|
237
|
-
*
|
|
238
|
-
* @example
|
|
239
|
-
* ```typescript
|
|
240
|
-
* disabled={false} // Interactive (default)
|
|
241
|
-
* disabled={true} // Non-interactive
|
|
242
|
-
* disabled={isSubmitting} // Conditional disable
|
|
243
|
-
* ```
|
|
244
|
-
*/
|
|
245
|
-
disabled?: boolean;
|
|
246
222
|
}
|
|
247
223
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -11,4 +11,10 @@
|
|
|
11
11
|
* @module Button-CTA/types
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
// NO DISABLED STATES
|
|
15
|
+
// DesignerPunk does not support disabled states for usability and
|
|
16
|
+
// accessibility reasons. If an action is unavailable, the component
|
|
17
|
+
// should not be rendered. For in-flight async actions, use the loading
|
|
18
|
+
// state (state_loading) instead.
|
|
19
|
+
// Ruled by Peter 2026-07-15 (Button-CTA disabled-state adjudication).
|
|
14
20
|
//# sourceMappingURL=types.js.map
|
|
@@ -8,18 +8,27 @@
|
|
|
8
8
|
* Uses the defineComponentTokens() API to register tokens with the global
|
|
9
9
|
* ComponentTokenRegistry for pipeline integration.
|
|
10
10
|
*
|
|
11
|
+
* Two separate defineComponentTokens() calls are used — one per token family
|
|
12
|
+
* (spacing, sizing) — following the Avatar-Base pattern (avatar.tokens.ts). Every
|
|
13
|
+
* token registered by a single call is stamped with that call's `family`, so inset
|
|
14
|
+
* (spacing) and size (sizing) tokens must NOT share a call even though they live in
|
|
15
|
+
* the same file. The two branded results are exported separately and must NOT be
|
|
16
|
+
* spread/merged into one object — the rich metadata rides on a non-enumerable brand
|
|
17
|
+
* (see src/build/tokens/defineComponentTokens.ts, TOKEN_CONTRACT_BRAND) that a spread
|
|
18
|
+
* would silently drop.
|
|
19
|
+
*
|
|
11
20
|
* The build system generates platform-specific values from these definitions:
|
|
12
21
|
* - Web: CSS custom properties (var(--buttonicon-inset-large))
|
|
13
22
|
* - iOS: Swift constants (ButtonIconTokens.insetLarge)
|
|
14
23
|
* - Android: Kotlin constants (ButtonIconTokens.insetLarge)
|
|
15
24
|
*
|
|
16
25
|
* Token Relationships:
|
|
17
|
-
* - buttonIcon.inset.large (12px) references space150
|
|
18
|
-
* - buttonIcon.inset.medium (10px) references space125 (strategic flexibility token)
|
|
19
|
-
* - buttonIcon.inset.small (8px) references space100
|
|
20
|
-
* - buttonIcon.size.large (48px) references size600
|
|
21
|
-
* - buttonIcon.size.medium (40px) references size500
|
|
22
|
-
* - buttonIcon.size.small (32px) references size400
|
|
26
|
+
* - buttonIcon.inset.large (12px) references space150 — family: spacing
|
|
27
|
+
* - buttonIcon.inset.medium (10px) references space125 (strategic flexibility token) — family: spacing
|
|
28
|
+
* - buttonIcon.inset.small (8px) references space100 — family: spacing
|
|
29
|
+
* - buttonIcon.size.large (48px) references size600 — family: sizing
|
|
30
|
+
* - buttonIcon.size.medium (40px) references size500 — family: sizing
|
|
31
|
+
* - buttonIcon.size.small (32px) references size400 — family: sizing
|
|
23
32
|
*
|
|
24
33
|
* @see .kiro/specs/035-button-icon-component/design.md for token consumption strategy
|
|
25
34
|
* @see .kiro/specs/034-component-architecture-system for Stemma System details
|
|
@@ -27,24 +36,18 @@
|
|
|
27
36
|
* @see .kiro/specs/040-component-alignment/requirements.md Requirements 6.1, 6.2, 6.3
|
|
28
37
|
*/
|
|
29
38
|
/**
|
|
30
|
-
* Button-Icon
|
|
39
|
+
* Button-Icon inset (padding) tokens — reference spacing primitives.
|
|
31
40
|
*
|
|
32
41
|
* Each token references a primitive token and includes reasoning
|
|
33
42
|
* explaining why the token exists and its purpose in the component.
|
|
34
43
|
*
|
|
35
|
-
* Inset (padding) token values — reference spacing primitives:
|
|
36
44
|
* - inset.large: 12px (1.5 × base, references space150)
|
|
37
45
|
* - inset.medium: 10px (1.25 × base, references space125 strategic flexibility token)
|
|
38
46
|
* - inset.small: 8px (1 × base, references space100)
|
|
39
47
|
*
|
|
40
|
-
* Size (width/height) token values:
|
|
41
|
-
* - size.large: 48px (6 × base, references size600)
|
|
42
|
-
* - size.medium: 40px (5 × base, references size500)
|
|
43
|
-
* - size.small: 32px (4 × base, references size400)
|
|
44
|
-
*
|
|
45
48
|
* @see Requirements 6.1, 6.2, 6.3 in .kiro/specs/040-component-alignment/requirements.md
|
|
46
49
|
*/
|
|
47
|
-
export declare const
|
|
50
|
+
export declare const ButtonIconInsetTokens: import("../../../build/tokens").ComponentTokenValues<{
|
|
48
51
|
'inset.large': {
|
|
49
52
|
reference: import("../../../types").PrimitiveToken;
|
|
50
53
|
reasoning: string;
|
|
@@ -57,6 +60,17 @@ export declare const ButtonIconTokens: import("../../../build/tokens").Component
|
|
|
57
60
|
reference: import("../../../types").PrimitiveToken;
|
|
58
61
|
reasoning: string;
|
|
59
62
|
};
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Button-Icon size (width/height) tokens — reference sizing primitives, not spacing.
|
|
66
|
+
*
|
|
67
|
+
* - size.large: 48px (6 × base, references size600)
|
|
68
|
+
* - size.medium: 40px (5 × base, references size500)
|
|
69
|
+
* - size.small: 32px (4 × base, references size400)
|
|
70
|
+
*
|
|
71
|
+
* @see Requirements 6.1, 6.2, 6.3 in .kiro/specs/040-component-alignment/requirements.md
|
|
72
|
+
*/
|
|
73
|
+
export declare const ButtonIconSizeTokens: import("../../../build/tokens").ComponentTokenValues<{
|
|
60
74
|
'size.large': {
|
|
61
75
|
reference: import("../../../types").PrimitiveToken;
|
|
62
76
|
reasoning: string;
|
|
@@ -9,18 +9,27 @@
|
|
|
9
9
|
* Uses the defineComponentTokens() API to register tokens with the global
|
|
10
10
|
* ComponentTokenRegistry for pipeline integration.
|
|
11
11
|
*
|
|
12
|
+
* Two separate defineComponentTokens() calls are used — one per token family
|
|
13
|
+
* (spacing, sizing) — following the Avatar-Base pattern (avatar.tokens.ts). Every
|
|
14
|
+
* token registered by a single call is stamped with that call's `family`, so inset
|
|
15
|
+
* (spacing) and size (sizing) tokens must NOT share a call even though they live in
|
|
16
|
+
* the same file. The two branded results are exported separately and must NOT be
|
|
17
|
+
* spread/merged into one object — the rich metadata rides on a non-enumerable brand
|
|
18
|
+
* (see src/build/tokens/defineComponentTokens.ts, TOKEN_CONTRACT_BRAND) that a spread
|
|
19
|
+
* would silently drop.
|
|
20
|
+
*
|
|
12
21
|
* The build system generates platform-specific values from these definitions:
|
|
13
22
|
* - Web: CSS custom properties (var(--buttonicon-inset-large))
|
|
14
23
|
* - iOS: Swift constants (ButtonIconTokens.insetLarge)
|
|
15
24
|
* - Android: Kotlin constants (ButtonIconTokens.insetLarge)
|
|
16
25
|
*
|
|
17
26
|
* Token Relationships:
|
|
18
|
-
* - buttonIcon.inset.large (12px) references space150
|
|
19
|
-
* - buttonIcon.inset.medium (10px) references space125 (strategic flexibility token)
|
|
20
|
-
* - buttonIcon.inset.small (8px) references space100
|
|
21
|
-
* - buttonIcon.size.large (48px) references size600
|
|
22
|
-
* - buttonIcon.size.medium (40px) references size500
|
|
23
|
-
* - buttonIcon.size.small (32px) references size400
|
|
27
|
+
* - buttonIcon.inset.large (12px) references space150 — family: spacing
|
|
28
|
+
* - buttonIcon.inset.medium (10px) references space125 (strategic flexibility token) — family: spacing
|
|
29
|
+
* - buttonIcon.inset.small (8px) references space100 — family: spacing
|
|
30
|
+
* - buttonIcon.size.large (48px) references size600 — family: sizing
|
|
31
|
+
* - buttonIcon.size.medium (40px) references size500 — family: sizing
|
|
32
|
+
* - buttonIcon.size.small (32px) references size400 — family: sizing
|
|
24
33
|
*
|
|
25
34
|
* @see .kiro/specs/035-button-icon-component/design.md for token consumption strategy
|
|
26
35
|
* @see .kiro/specs/034-component-architecture-system for Stemma System details
|
|
@@ -28,7 +37,7 @@
|
|
|
28
37
|
* @see .kiro/specs/040-component-alignment/requirements.md Requirements 6.1, 6.2, 6.3
|
|
29
38
|
*/
|
|
30
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
-
exports.ButtonIconSizeTokenReferences = exports.ButtonIconInsetTokenReferences = exports.
|
|
40
|
+
exports.ButtonIconSizeTokenReferences = exports.ButtonIconInsetTokenReferences = exports.ButtonIconSizeTokens = exports.ButtonIconInsetTokens = void 0;
|
|
32
41
|
exports.getButtonIconInset = getButtonIconInset;
|
|
33
42
|
exports.getButtonIconSize = getButtonIconSize;
|
|
34
43
|
exports.getButtonIconInsetTokenReference = getButtonIconInsetTokenReference;
|
|
@@ -37,28 +46,21 @@ const tokens_1 = require("../../../build/tokens");
|
|
|
37
46
|
const SpacingTokens_1 = require("../../../tokens/SpacingTokens");
|
|
38
47
|
const SizingTokens_1 = require("../../../tokens/SizingTokens");
|
|
39
48
|
/**
|
|
40
|
-
* Button-Icon
|
|
49
|
+
* Button-Icon inset (padding) tokens — reference spacing primitives.
|
|
41
50
|
*
|
|
42
51
|
* Each token references a primitive token and includes reasoning
|
|
43
52
|
* explaining why the token exists and its purpose in the component.
|
|
44
53
|
*
|
|
45
|
-
* Inset (padding) token values — reference spacing primitives:
|
|
46
54
|
* - inset.large: 12px (1.5 × base, references space150)
|
|
47
55
|
* - inset.medium: 10px (1.25 × base, references space125 strategic flexibility token)
|
|
48
56
|
* - inset.small: 8px (1 × base, references space100)
|
|
49
57
|
*
|
|
50
|
-
* Size (width/height) token values:
|
|
51
|
-
* - size.large: 48px (6 × base, references size600)
|
|
52
|
-
* - size.medium: 40px (5 × base, references size500)
|
|
53
|
-
* - size.small: 32px (4 × base, references size400)
|
|
54
|
-
*
|
|
55
58
|
* @see Requirements 6.1, 6.2, 6.3 in .kiro/specs/040-component-alignment/requirements.md
|
|
56
59
|
*/
|
|
57
|
-
exports.
|
|
60
|
+
exports.ButtonIconInsetTokens = (0, tokens_1.defineComponentTokens)({
|
|
58
61
|
component: 'ButtonIcon',
|
|
59
62
|
family: 'spacing',
|
|
60
63
|
tokens: {
|
|
61
|
-
// Inset (padding) tokens
|
|
62
64
|
'inset.large': {
|
|
63
65
|
reference: SpacingTokens_1.spacingTokens.space150,
|
|
64
66
|
reasoning: 'Large button variant requires 12px padding (1.5× base) for comfortable touch target and visual balance with larger icon sizes',
|
|
@@ -71,8 +73,21 @@ exports.ButtonIconTokens = (0, tokens_1.defineComponentTokens)({
|
|
|
71
73
|
reference: SpacingTokens_1.spacingTokens.space100,
|
|
72
74
|
reasoning: 'Small button variant uses 8px padding (1× base) for minimal footprint in dense UI layouts while meeting minimum touch target requirements',
|
|
73
75
|
},
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* Button-Icon size (width/height) tokens — reference sizing primitives, not spacing.
|
|
80
|
+
*
|
|
81
|
+
* - size.large: 48px (6 × base, references size600)
|
|
82
|
+
* - size.medium: 40px (5 × base, references size500)
|
|
83
|
+
* - size.small: 32px (4 × base, references size400)
|
|
84
|
+
*
|
|
85
|
+
* @see Requirements 6.1, 6.2, 6.3 in .kiro/specs/040-component-alignment/requirements.md
|
|
86
|
+
*/
|
|
87
|
+
exports.ButtonIconSizeTokens = (0, tokens_1.defineComponentTokens)({
|
|
88
|
+
component: 'ButtonIcon',
|
|
89
|
+
family: 'sizing',
|
|
90
|
+
tokens: {
|
|
76
91
|
'size.large': {
|
|
77
92
|
reference: SizingTokens_1.sizingTokens.size600,
|
|
78
93
|
reasoning: 'Large button size (48px = 6× base) provides generous touch target exceeding tapAreaRecommended, calculated as icon (24px) + padding (12px × 2)',
|
|
@@ -101,7 +116,7 @@ exports.ButtonIconTokens = (0, tokens_1.defineComponentTokens)({
|
|
|
101
116
|
* ```
|
|
102
117
|
*/
|
|
103
118
|
function getButtonIconInset(variant) {
|
|
104
|
-
return exports.
|
|
119
|
+
return exports.ButtonIconInsetTokens[`inset.${variant}`];
|
|
105
120
|
}
|
|
106
121
|
/**
|
|
107
122
|
* Get Button-Icon size (width/height) value for a given size variant
|
|
@@ -119,7 +134,7 @@ function getButtonIconInset(variant) {
|
|
|
119
134
|
* @see Requirements 6.1, 6.2, 6.3 in .kiro/specs/040-component-alignment/requirements.md
|
|
120
135
|
*/
|
|
121
136
|
function getButtonIconSize(variant) {
|
|
122
|
-
return exports.
|
|
137
|
+
return exports.ButtonIconSizeTokens[`size.${variant}`];
|
|
123
138
|
}
|
|
124
139
|
/**
|
|
125
140
|
* Semantic token references for Button-Icon inset values
|
|
@@ -40,7 +40,19 @@ export interface InputTextBaseProps {
|
|
|
40
40
|
autocomplete?: string;
|
|
41
41
|
/** Placeholder text (only shown when label is floated and input is empty) */
|
|
42
42
|
placeholder?: string;
|
|
43
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* Read-only state (state_readonly contract): the value is displayed
|
|
45
|
+
* non-editably while remaining perceivable, selectable, and copyable —
|
|
46
|
+
* never rendered with disabled semantics on any platform.
|
|
47
|
+
*
|
|
48
|
+
* Platform note: web and Android readOnly fields participate in keyboard
|
|
49
|
+
* focus order; iOS renders readOnly as selectable static text in the
|
|
50
|
+
* field chrome and is not in focus order (declared carve-out — see
|
|
51
|
+
* contracts.yaml interaction_focusable).
|
|
52
|
+
*
|
|
53
|
+
* NOT supported by Input-Text-Password: readOnly is contracted out of the
|
|
54
|
+
* Password variant (see its contracts.yaml excludes) and is ignored there.
|
|
55
|
+
*/
|
|
44
56
|
readOnly?: boolean;
|
|
45
57
|
/** Required field indicator */
|
|
46
58
|
required?: boolean;
|
|
@@ -152,6 +152,9 @@ class InputTextPassword extends HTMLElement {
|
|
|
152
152
|
'error-message',
|
|
153
153
|
'is-success',
|
|
154
154
|
'show-info-icon',
|
|
155
|
+
// read-only is accepted for API stability but IGNORED — readOnly is
|
|
156
|
+
// contracted out of Input-Text-Password (see render(), and
|
|
157
|
+
// contracts.yaml excludes.state_readonly).
|
|
155
158
|
'read-only',
|
|
156
159
|
'required',
|
|
157
160
|
'max-length',
|
|
@@ -225,7 +228,14 @@ class InputTextPassword extends HTMLElement {
|
|
|
225
228
|
const propsErrorMessage = this.getAttribute('error-message') || '';
|
|
226
229
|
const isSuccess = this.getAttribute('is-success') === 'true';
|
|
227
230
|
const showInfoIcon = this.getAttribute('show-info-icon') === 'true';
|
|
228
|
-
|
|
231
|
+
// read-only is NOT read or forwarded: readOnly is contracted out of
|
|
232
|
+
// Input-Text-Password (adjudication condition 4:
|
|
233
|
+
// .kiro/issues/input-text-base-ios-readonly-adjudication.md — RULED
|
|
234
|
+
// B-prime, Peter 2026-07-15). On web this is contract conformance, not a
|
|
235
|
+
// security fix — a readonly password input stays masked and browsers
|
|
236
|
+
// block copy from type=password — but the exclusion holds uniformly on
|
|
237
|
+
// all three platforms. The attribute is accepted (observedAttributes)
|
|
238
|
+
// for API stability and ignored.
|
|
229
239
|
const required = this.hasAttribute('required');
|
|
230
240
|
const maxLength = this.getAttribute('max-length');
|
|
231
241
|
const showToggle = this.getAttribute('show-toggle') !== 'false'; // Default true
|
|
@@ -264,7 +274,6 @@ class InputTextPassword extends HTMLElement {
|
|
|
264
274
|
${errorMessage ? `error-message="${errorMessage}"` : ''}
|
|
265
275
|
${isSuccess ? 'is-success="true"' : ''}
|
|
266
276
|
${showInfoIcon ? 'show-info-icon="true"' : ''}
|
|
267
|
-
${readOnly ? 'read-only' : ''}
|
|
268
277
|
${required ? 'required' : ''}
|
|
269
278
|
${maxLength ? `max-length="${maxLength}"` : ''}
|
|
270
279
|
></input-text-base>
|
|
@@ -686,6 +686,14 @@ class DTCGFormatGenerator {
|
|
|
686
686
|
else if (token.direction === 'lighter') {
|
|
687
687
|
extensions.blendType = 'lighterBlend';
|
|
688
688
|
}
|
|
689
|
+
// Deprecation metadata (e.g. blend.disabledDesaturate) — lets includeDeprecated: false strip it
|
|
690
|
+
if (token.deprecated) {
|
|
691
|
+
extensions.deprecated = true;
|
|
692
|
+
if (token.deprecatedSince)
|
|
693
|
+
extensions.deprecatedSince = token.deprecatedSince;
|
|
694
|
+
if (token.deprecatedReason)
|
|
695
|
+
extensions.deprecatedReason = token.deprecatedReason;
|
|
696
|
+
}
|
|
689
697
|
group[key] = this.toDTCGToken(aliasValue, 'number', token.description, extensions);
|
|
690
698
|
}
|
|
691
699
|
return group;
|
|
@@ -400,6 +400,7 @@ class TokenFileGenerator {
|
|
|
400
400
|
getiOSComponentTokenType(token) {
|
|
401
401
|
switch (token.family) {
|
|
402
402
|
case 'spacing':
|
|
403
|
+
case 'sizing':
|
|
403
404
|
case 'radius':
|
|
404
405
|
case 'fontSize':
|
|
405
406
|
case 'tapArea':
|
|
@@ -449,8 +450,12 @@ class TokenFileGenerator {
|
|
|
449
450
|
const familyClass = this.getFamilyClassName(token.family);
|
|
450
451
|
return `${familyClass}.${token.primitiveReference}`;
|
|
451
452
|
}
|
|
452
|
-
// Dimensional families need .dp suffix to match primitive token output (Task 1.4)
|
|
453
|
-
|
|
453
|
+
// Dimensional families need .dp suffix to match primitive token output (Task 1.4).
|
|
454
|
+
// 'sizing' is dimensional (component width/height) and belongs here: without it, a
|
|
455
|
+
// value-path sizing token emits a bare Int, which fails to compile against consumers
|
|
456
|
+
// that type the member as Dp (e.g. Avatar.android.kt's
|
|
457
|
+
// `val iconSizeXs: Dp = GeneratedAvatarTokens.iconSizeXs`).
|
|
458
|
+
const dimensionalFamilies = ['spacing', 'sizing', 'radius', 'tapArea', 'fontSize', 'borderWidth'];
|
|
454
459
|
if (dimensionalFamilies.includes(token.family)) {
|
|
455
460
|
return `${token.value}.dp`;
|
|
456
461
|
}
|
|
@@ -149,7 +149,7 @@ class BuildErrorHandler {
|
|
|
149
149
|
'Validate configuration against schema'
|
|
150
150
|
],
|
|
151
151
|
documentation: [
|
|
152
|
-
'https://github.com/3fn/
|
|
152
|
+
'https://github.com/3fn/DesignerPunk/docs/build-integration.md'
|
|
153
153
|
]
|
|
154
154
|
};
|
|
155
155
|
}
|
|
@@ -169,7 +169,7 @@ class BuildErrorHandler {
|
|
|
169
169
|
'Ensure platform files are generated correctly'
|
|
170
170
|
],
|
|
171
171
|
documentation: [
|
|
172
|
-
`https://github.com/3fn/
|
|
172
|
+
`https://github.com/3fn/DesignerPunk/docs/platforms/${platform}.md`
|
|
173
173
|
]
|
|
174
174
|
};
|
|
175
175
|
}
|
|
@@ -19238,6 +19238,30 @@ var ComponentMCPServer = class {
|
|
|
19238
19238
|
this.stalenessGate.markIndexed();
|
|
19239
19239
|
await this.server.connect(transport);
|
|
19240
19240
|
console.error(`[${SERVER_NAME}] Server running on stdio`);
|
|
19241
|
+
this.setupShutdownHandlers();
|
|
19242
|
+
}
|
|
19243
|
+
/**
|
|
19244
|
+
* Self-exit on stdin EOF and fatal signals. A stdio MCP server whose parent client
|
|
19245
|
+
* died (or gracefully closed the pipe) has no one to serve, but the file watcher
|
|
19246
|
+
* keeps the event loop alive forever — found live at Spec 122 U3 (~230 orphaned
|
|
19247
|
+
* servers accumulated across harness runs). Exiting on EOF also makes graceful
|
|
19248
|
+
* client closes immediate: the MCP SDK's StdioClientTransport.close() ends stdin
|
|
19249
|
+
* and waits up to 2s for exactly this exit before escalating to SIGTERM.
|
|
19250
|
+
*/
|
|
19251
|
+
setupShutdownHandlers() {
|
|
19252
|
+
let shuttingDown = false;
|
|
19253
|
+
const shutdown = async () => {
|
|
19254
|
+
if (shuttingDown) return;
|
|
19255
|
+
shuttingDown = true;
|
|
19256
|
+
console.error(`[${SERVER_NAME}] Shutting down...`);
|
|
19257
|
+
this.fileWatcher.stop();
|
|
19258
|
+
await this.server.close();
|
|
19259
|
+
process.exit(0);
|
|
19260
|
+
};
|
|
19261
|
+
process.on("SIGINT", shutdown);
|
|
19262
|
+
process.on("SIGTERM", shutdown);
|
|
19263
|
+
process.stdin.on("end", shutdown);
|
|
19264
|
+
process.stdin.on("close", shutdown);
|
|
19241
19265
|
}
|
|
19242
19266
|
registerHandlers() {
|
|
19243
19267
|
this.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
|