@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.
Files changed (284) hide show
  1. package/.kiro/agents/ada-prompt.md +80 -132
  2. package/.kiro/agents/ada-prompt.md.attribution.json +45 -0
  3. package/.kiro/agents/ada.json +44 -59
  4. package/.kiro/agents/ada.json.attribution.json +13 -0
  5. package/.kiro/agents/data-prompt.md +83 -74
  6. package/.kiro/agents/data-prompt.md.attribution.json +53 -0
  7. package/.kiro/agents/data.json +31 -38
  8. package/.kiro/agents/data.json.attribution.json +13 -0
  9. package/.kiro/agents/kenya-prompt.md +83 -72
  10. package/.kiro/agents/kenya-prompt.md.attribution.json +53 -0
  11. package/.kiro/agents/kenya.json +27 -35
  12. package/.kiro/agents/kenya.json.attribution.json +13 -0
  13. package/.kiro/agents/leonardo-prompt.md +176 -234
  14. package/.kiro/agents/leonardo-prompt.md.attribution.json +45 -0
  15. package/.kiro/agents/leonardo.json +28 -36
  16. package/.kiro/agents/leonardo.json.attribution.json +13 -0
  17. package/.kiro/agents/lina-prompt.md +110 -151
  18. package/.kiro/agents/lina-prompt.md.attribution.json +53 -0
  19. package/.kiro/agents/lina.json +46 -59
  20. package/.kiro/agents/lina.json.attribution.json +13 -0
  21. package/.kiro/agents/sparky-prompt.md +89 -72
  22. package/.kiro/agents/sparky-prompt.md.attribution.json +53 -0
  23. package/.kiro/agents/sparky.json +37 -37
  24. package/.kiro/agents/sparky.json.attribution.json +13 -0
  25. package/.kiro/agents/stacy-prompt.md +74 -48
  26. package/.kiro/agents/stacy-prompt.md.attribution.json +45 -0
  27. package/.kiro/agents/stacy.json +28 -30
  28. package/.kiro/agents/stacy.json.attribution.json +13 -0
  29. package/.kiro/agents/thurgood-prompt.md +94 -138
  30. package/.kiro/agents/thurgood-prompt.md.attribution.json +45 -0
  31. package/.kiro/agents/thurgood.json +31 -35
  32. package/.kiro/agents/thurgood.json.attribution.json +13 -0
  33. package/.kiro/steering/AI-Collaboration-Principles.md +3 -3
  34. package/.kiro/steering/Civitas-System-Overview.md +7 -16
  35. package/.kiro/steering/DesignerPunk-Systems-Overview.md +6 -6
  36. package/.kiro/steering/Spec-Feedback-Protocol.md +2 -11
  37. package/.kiro/steering/Task-Completion-Protocol.md +98 -17
  38. package/.kiro/steering/core-goals.md +3 -3
  39. package/.kiro/steering/personal-note.md +1 -1
  40. package/.kiro/steering/start-up-tasks.md +17 -6
  41. package/application-mcp-server/src/index.ts +26 -0
  42. package/dist/ComponentTokens.android.kt +12 -12
  43. package/dist/ComponentTokens.ios.swift +12 -12
  44. package/dist/ComponentTokens.web.css +3 -3
  45. package/dist/DesignTokens.android.kt +1 -1
  46. package/dist/DesignTokens.dtcg.json +8 -5
  47. package/dist/DesignTokens.figma.json +2 -2
  48. package/dist/DesignTokens.ios.swift +1 -1
  49. package/dist/DesignTokens.web.css +1 -1
  50. package/dist/android/DesignTokens.android.kt +1 -1
  51. package/dist/blend/OklchBlendCalculator.js +1 -0
  52. package/dist/blend/ThemeAwareBlendUtilities.web.d.ts +13 -2
  53. package/dist/blend/ThemeAwareBlendUtilities.web.js +6 -1
  54. package/dist/browser/designerpunk.esm.js +36 -90
  55. package/dist/browser/designerpunk.esm.min.js +33 -36
  56. package/dist/browser/designerpunk.umd.js +36 -90
  57. package/dist/browser/designerpunk.umd.min.js +47 -50
  58. package/dist/browser/tokens.css +3 -3
  59. package/dist/build/tokens/defineComponentTokens.d.ts +10 -0
  60. package/dist/build/tokens/defineComponentTokens.js +26 -0
  61. package/dist/components/core/Avatar-Base/avatar.tokens.d.ts +21 -26
  62. package/dist/components/core/Avatar-Base/avatar.tokens.js +31 -34
  63. package/dist/components/core/Avatar-Base/index.d.ts +1 -1
  64. package/dist/components/core/Avatar-Base/index.js +2 -2
  65. package/dist/components/core/Avatar-Base/platforms/web/Avatar.web.js +24 -5
  66. package/dist/components/core/Button-CTA/examples/BasicUsage.d.ts +16 -28
  67. package/dist/components/core/Button-CTA/examples/BasicUsage.js +18 -43
  68. package/dist/components/core/Button-CTA/platforms/web/ButtonCTA.web.d.ts +3 -15
  69. package/dist/components/core/Button-CTA/platforms/web/ButtonCTA.web.js +9 -58
  70. package/dist/components/core/Button-CTA/types.d.ts +0 -24
  71. package/dist/components/core/Button-CTA/types.js +6 -0
  72. package/dist/components/core/Button-Icon/buttonIcon.tokens.d.ts +28 -14
  73. package/dist/components/core/Button-Icon/buttonIcon.tokens.js +35 -20
  74. package/dist/components/core/Input-Text-Base/types.d.ts +13 -1
  75. package/dist/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.js +11 -2
  76. package/dist/generators/DTCGFormatGenerator.js +8 -0
  77. package/dist/generators/TokenFileGenerator.js +7 -2
  78. package/dist/integration/BuildErrorHandler.js +2 -2
  79. package/dist/ios/DesignTokens.ios.swift +1 -1
  80. package/dist/mcp/application-mcp.js +24 -0
  81. package/dist/mcp/docs-mcp.js +130 -15
  82. package/dist/mcp/product-mcp.js +25 -0
  83. package/dist/tokens/OpacityTokens.js +1 -1
  84. package/dist/tokens/component/progress.d.ts +65 -5
  85. package/dist/tokens/component/progress.js +79 -18
  86. package/dist/tokens/semantic/BlendTokens.d.ts +10 -3
  87. package/dist/tokens/semantic/BlendTokens.js +17 -5
  88. package/dist/tokens/semantic/OpacityTokens.d.ts +4 -4
  89. package/dist/tokens/semantic/OpacityTokens.js +4 -4
  90. package/dist/types/ComponentTypes.d.ts +1 -1
  91. package/dist/types/generated/TokenTypes.d.ts +1 -1
  92. package/dist/types/generated/TokenTypes.js +1 -1
  93. package/dist/validators/StemmaTokenUsageValidator.js +3 -2
  94. package/dist/web/DesignTokens.web.css +1 -1
  95. package/governance/BUILD-SYSTEM-SETUP.md +1 -2
  96. package/governance/Component-Development-Guide.md +23 -13
  97. package/governance/Component-Development-Standards.md +21 -20
  98. package/governance/Component-Family-Avatar.md +6 -7
  99. package/governance/Component-Family-Badge.md +19 -20
  100. package/governance/Component-Family-Button.md +30 -43
  101. package/governance/Component-Family-Chip.md +14 -15
  102. package/governance/Component-Family-Container.md +12 -13
  103. package/governance/Component-Family-Data-Display.md +1 -2
  104. package/governance/Component-Family-Divider.md +1 -2
  105. package/governance/Component-Family-Form-Inputs.md +65 -65
  106. package/governance/Component-Family-Icon.md +9 -10
  107. package/governance/Component-Family-Loading.md +1 -2
  108. package/governance/Component-Family-Modal.md +1 -2
  109. package/governance/Component-Family-Navigation.md +1 -2
  110. package/governance/Component-Family-Progress.md +0 -1
  111. package/governance/Component-Inheritance-Structures.md +219 -99
  112. package/governance/Component-MCP-Document-Template.md +6 -5
  113. package/governance/Component-Primitive-vs-Semantic-Philosophy.md +1 -1
  114. package/governance/Component-Quick-Reference.md +33 -33
  115. package/governance/Component-Readiness-Status.md +59 -44
  116. package/governance/Component-Templates.md +57 -61
  117. package/governance/Contract-System-Reference.md +7 -7
  118. package/governance/MCP-Integration-Guide.md +1 -1
  119. package/governance/Process-Cross-Reference-Standards.md +31 -13
  120. package/governance/Process-Development-Workflow.md +49 -59
  121. package/governance/Process-File-Organization.md +25 -28
  122. package/governance/Process-Hook-Operations.md +22 -11
  123. package/governance/Process-Orchestration-Model-Selection.md +92 -0
  124. package/governance/Process-Spec-Planning.md +98 -52
  125. package/governance/Process-Task-Type-Definitions.md +80 -4
  126. package/governance/Product-Handoff-Protocol.md +2 -0
  127. package/governance/Rosetta-System-Architecture.md +13 -11
  128. package/governance/Test-Behavioral-Contract-Validation.md +38 -31
  129. package/governance/Test-Failure-Audit-Methodology.md +1 -1
  130. package/governance/Token-Family-Accessibility.md +1 -2
  131. package/governance/Token-Family-Blend.md +18 -16
  132. package/governance/Token-Family-Blur.md +0 -1
  133. package/governance/Token-Family-Border.md +1 -2
  134. package/governance/Token-Family-Color.md +0 -1
  135. package/governance/Token-Family-Glow.md +1 -2
  136. package/governance/Token-Family-Layering.md +0 -1
  137. package/governance/Token-Family-Motion.md +1 -2
  138. package/governance/Token-Family-Opacity.md +0 -1
  139. package/governance/Token-Family-Radius.md +1 -2
  140. package/governance/Token-Family-Responsive.md +1 -2
  141. package/governance/Token-Family-Shadow.md +1 -2
  142. package/governance/Token-Family-Sizing.md +0 -1
  143. package/governance/Token-Family-Spacing.md +1 -2
  144. package/governance/Token-Family-Typography.md +1 -2
  145. package/governance/Token-Governance.md +8 -8
  146. package/governance/Token-Quick-Reference.md +47 -34
  147. package/governance/Token-Resolution-Patterns.md +1 -1
  148. package/governance/Token-Semantic-Structure.md +1 -1
  149. package/governance/Web-Authoring-Standards.md +5 -5
  150. package/governance/browser-distribution-guide.md +1 -4
  151. package/governance/classification-map.md +474 -0
  152. package/governance/completion-documentation-guide.md +23 -37
  153. package/governance/component-meta-authoring-guide.md +1 -1
  154. package/governance/cross-platform-vs-platform-specific-decision-framework.md +1 -1
  155. package/governance/platform-implementation-guidelines.md +2 -3
  156. package/governance/release-management-system.md +28 -63
  157. package/governance/rosetta-system-principles.md +8 -6
  158. package/governance/stemma-system-principles.md +18 -17
  159. package/mcp-server/src/index.ts +24 -6
  160. package/mcp-server/src/indexer/DocumentIndexer.ts +119 -9
  161. package/mcp-server/src/indexer/__tests__/bare-id-crossrefs.test.ts +250 -0
  162. package/mcp-server/src/indexer/cross-ref-parser.ts +29 -1
  163. package/mcp-server/src/indexer/index-health.ts +27 -2
  164. package/mcp-server/src/query/__tests__/find-docs-calibration.test.ts +11 -26
  165. package/mcp-server/src/relocation-integrity-gate/__tests__/relocation-integrity-gate.test.ts +72 -5
  166. package/mcp-server/src/relocation-integrity-gate/relocation-integrity-gate.ts +81 -24
  167. package/mcp-server/src/tools/list-cross-references.ts +2 -2
  168. package/package.json +24 -26
  169. package/src/__tests__/browser-distribution/css-bundling.test.ts +6 -4
  170. package/src/__tests__/console-allowlist.json +14 -0
  171. package/src/__tests__/console-fail-setup.ts +169 -0
  172. package/src/__tests__/integration/Spec107-DesignLanguageContext.test.ts +16 -0
  173. package/src/__tests__/stemma-system/behavioral-contract-validation.test.ts +70 -17
  174. package/src/__tests__/stemma-system/contract-catalog-name-validation.test.ts +28 -0
  175. package/src/__tests__/stemma-system/form-inputs-contracts.test.ts +223 -16
  176. package/src/__tests__/stemma-system/input-text-native-base-call-alignment.test.ts +298 -0
  177. package/src/blend/OklchBlendCalculator.ts +3 -0
  178. package/src/blend/ThemeAwareBlendUtilities.android.kt +3 -0
  179. package/src/blend/ThemeAwareBlendUtilities.ios.swift +3 -0
  180. package/src/blend/ThemeAwareBlendUtilities.web.ts +9 -1
  181. package/src/blend/__tests__/InteractionStateAudit.test.ts +12 -9
  182. package/src/build/errors/__tests__/ErrorHandler.integration.test.ts +8 -0
  183. package/src/build/errors/__tests__/ErrorHandler.test.ts +5 -0
  184. package/src/build/tokens/__tests__/defineComponentTokens.test.ts +113 -0
  185. package/src/build/tokens/defineComponentTokens.ts +43 -1
  186. package/src/build/workflow/__tests__/CICDIntegration.test.ts +12 -1
  187. package/src/cli/__tests__/init.test.ts +45 -11
  188. package/src/components/core/Avatar-Base/Avatar-Base.schema.yaml +1 -1
  189. package/src/components/core/Avatar-Base/__tests__/Avatar.accessibility.test.ts +121 -7
  190. package/src/components/core/Avatar-Base/__tests__/Avatar.image.test.ts +3 -0
  191. package/src/components/core/Avatar-Base/__tests__/Avatar.test.ts +15 -6
  192. package/src/components/core/Avatar-Base/avatar.tokens.ts +31 -34
  193. package/src/components/core/Avatar-Base/contracts.yaml +11 -1
  194. package/src/components/core/Avatar-Base/index.ts +1 -1
  195. package/src/components/core/Avatar-Base/platforms/web/Avatar.web.ts +24 -5
  196. package/src/components/core/Badge-Count-Base/contracts.yaml +1 -1
  197. package/src/components/core/Badge-Label-Base/contracts.yaml +1 -1
  198. package/src/components/core/Button-CTA/Button-CTA.schema.yaml +2 -12
  199. package/src/components/core/Button-CTA/README.md +3 -6
  200. package/src/components/core/Button-CTA/__tests__/ButtonCTA.test.ts +35 -89
  201. package/src/components/core/Button-CTA/__tests__/setup.test.ts +0 -2
  202. package/src/components/core/Button-CTA/__tests__/test-utils.ts +0 -2
  203. package/src/components/core/Button-CTA/contracts.yaml +6 -29
  204. package/src/components/core/Button-CTA/examples/BasicUsage.html +2 -14
  205. package/src/components/core/Button-CTA/examples/BasicUsage.tsx +17 -44
  206. package/src/components/core/Button-CTA/platforms/android/ButtonCTA.android.kt +12 -20
  207. package/src/components/core/Button-CTA/platforms/ios/ButtonCTA.ios.swift +12 -51
  208. package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.css +2 -26
  209. package/src/components/core/Button-CTA/platforms/web/ButtonCTA.web.ts +18 -71
  210. package/src/components/core/Button-CTA/types.ts +10 -28
  211. package/src/components/core/Button-Icon/buttonIcon.tokens.ts +43 -27
  212. package/src/components/core/Chip-Base/__tests__/ChipBase.test.ts +13 -0
  213. package/src/components/core/Chip-Filter/__tests__/ChipFilter.test.ts +13 -0
  214. package/src/components/core/Chip-Input/__tests__/ChipInput.test.ts +13 -0
  215. package/src/components/core/Input-Text-Base/Input-Text-Base.schema.yaml +30 -2
  216. package/src/components/core/Input-Text-Base/README.md +25 -2
  217. package/src/components/core/Input-Text-Base/__tests__/focusIndicators.test.ts +16 -15
  218. package/src/components/core/Input-Text-Base/contracts.yaml +90 -0
  219. package/src/components/core/Input-Text-Base/platforms/android/InputTextBase.android.kt +26 -12
  220. package/src/components/core/Input-Text-Base/platforms/ios/InputTextBase.ios.swift +195 -59
  221. package/src/components/core/Input-Text-Base/types.ts +13 -1
  222. package/src/components/core/Input-Text-Email/Input-Text-Email.schema.yaml +5 -1
  223. package/src/components/core/Input-Text-Email/README.md +8 -7
  224. package/src/components/core/Input-Text-Email/platforms/android/InputTextEmail.android.kt +1 -4
  225. package/src/components/core/Input-Text-Email/platforms/ios/InputTextEmail.ios.swift +2 -16
  226. package/src/components/core/Input-Text-Password/Input-Text-Password.schema.yaml +10 -3
  227. package/src/components/core/Input-Text-Password/README.md +9 -8
  228. package/src/components/core/Input-Text-Password/contracts.yaml +5 -0
  229. package/src/components/core/Input-Text-Password/platforms/android/InputTextPassword.android.kt +17 -7
  230. package/src/components/core/Input-Text-Password/platforms/ios/InputTextPassword.ios.swift +22 -20
  231. package/src/components/core/Input-Text-Password/platforms/web/InputTextPassword.web.ts +11 -2
  232. package/src/components/core/Input-Text-PhoneNumber/Input-Text-PhoneNumber.schema.yaml +5 -1
  233. package/src/components/core/Input-Text-PhoneNumber/README.md +9 -8
  234. package/src/components/core/Input-Text-PhoneNumber/platforms/android/InputTextPhoneNumber.android.kt +2 -5
  235. package/src/components/core/Input-Text-PhoneNumber/platforms/ios/InputTextPhoneNumber.ios.swift +3 -17
  236. package/src/components/core/Nav-Header-App/contracts.yaml +1 -1
  237. package/src/components/core/Nav-SegmentedChoice-Base/contracts.yaml +1 -1
  238. package/src/components/core/Progress-Indicator-Connector-Base/contracts.yaml +1 -1
  239. package/src/components/core/Progress-Indicator-Label-Base/contracts.yaml +1 -1
  240. package/src/components/core/Progress-Indicator-Node-Base/contracts.yaml +1 -1
  241. package/src/components/core/Progress-Stepper-Base/__tests__/StepperBase.test.ts +5 -2
  242. package/src/components/core/Progress-Stepper-Detailed/__tests__/StepperDetailed.test.ts +5 -2
  243. package/src/generators/DTCGFormatGenerator.ts +6 -0
  244. package/src/generators/TokenFileGenerator.ts +7 -2
  245. package/src/generators/__tests__/DTCGConfigOptions.test.ts +14 -5
  246. package/src/integration/BuildErrorHandler.ts +2 -2
  247. package/src/tokens/OpacityTokens.ts +1 -1
  248. package/src/tokens/__tests__/OpacityTokens.test.ts +3 -1
  249. package/src/tokens/__tests__/ProgressTokenCompliance.test.ts +5 -3
  250. package/src/tokens/__tests__/ProgressTokenFormulas.test.ts +11 -11
  251. package/src/tokens/__tests__/ProgressTokenTranslation.test.ts +22 -20
  252. package/src/tokens/component/progress.ts +83 -21
  253. package/src/tokens/semantic/BlendTokens.ts +26 -5
  254. package/src/tokens/semantic/OpacityTokens.ts +4 -4
  255. package/src/types/ComponentTypes.ts +1 -1
  256. package/src/types/generated/TokenTypes.ts +1 -1
  257. package/src/validators/StemmaTokenUsageValidator.ts +3 -2
  258. package/token-index/components.yaml +8 -8
  259. package/token-index/semantics.yaml +1 -2
  260. package/src/tools/release/__tests__/ChangeClassifier.test.ts +0 -133
  261. package/src/tools/release/__tests__/ChangeExtractor.test.ts +0 -222
  262. package/src/tools/release/__tests__/GitHubPublisher.test.ts +0 -240
  263. package/src/tools/release/__tests__/NotesRenderer.test.ts +0 -142
  264. package/src/tools/release/__tests__/NpmPublisher.test.ts +0 -289
  265. package/src/tools/release/__tests__/PipelineIntegration.test.ts +0 -188
  266. package/src/tools/release/__tests__/ReleasePipeline.test.ts +0 -192
  267. package/src/tools/release/__tests__/SemanticVersionValidator.test.ts +0 -49
  268. package/src/tools/release/__tests__/SummaryScanner.test.ts +0 -141
  269. package/src/tools/release/__tests__/TagResolver.test.ts +0 -91
  270. package/src/tools/release/__tests__/VersionCalculator.test.ts +0 -270
  271. package/src/tools/release/__tests__/helpers/NpmMockHelper.ts +0 -80
  272. package/src/tools/release/cli/ReleasePipeline.ts +0 -165
  273. package/src/tools/release/cli/release-tool.ts +0 -107
  274. package/src/tools/release/pipeline/ChangeClassifier.ts +0 -61
  275. package/src/tools/release/pipeline/ChangeExtractor.ts +0 -87
  276. package/src/tools/release/pipeline/NotesRenderer.ts +0 -66
  277. package/src/tools/release/pipeline/SummaryScanner.ts +0 -70
  278. package/src/tools/release/pipeline/TagResolver.ts +0 -40
  279. package/src/tools/release/pipeline/VersionCalculator.ts +0 -375
  280. package/src/tools/release/publishers/GitHubPublisher.ts +0 -228
  281. package/src/tools/release/publishers/NpmPublisher.ts +0 -196
  282. package/src/tools/release/release-config.json +0 -5
  283. package/src/tools/release/types/index.ts +0 -282
  284. 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, disabled, icon)
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, disabled, icon)
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', 'disabled', 'test-id'];
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, disabled, icon).
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
- disabled ? 'button-cta--disabled' : ''
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
- disabled ? 'button-cta--disabled' : ''
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 component tokens defined using the hybrid authoring API.
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 ButtonIconTokens: import("../../../build/tokens").ComponentTokenValues<{
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.ButtonIconTokens = void 0;
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 component tokens defined using the hybrid authoring API.
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.ButtonIconTokens = (0, tokens_1.defineComponentTokens)({
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
- // Size (width/height) tokens — reference sizing primitives, not spacing
75
- // @see Requirements 6.1, 6.2, 6.3
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.ButtonIconTokens[`inset.${variant}`];
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.ButtonIconTokens[`size.${variant}`];
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
- /** Read-only state (alternative to disabled) */
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
- const readOnly = this.hasAttribute('read-only');
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
- const dimensionalFamilies = ['spacing', 'radius', 'tapArea', 'fontSize', 'borderWidth'];
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/DesignerPunkv2/docs/build-integration.md'
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/DesignerPunkv2/docs/platforms/${platform}.md`
172
+ `https://github.com/3fn/DesignerPunk/docs/platforms/${platform}.md`
173
173
  ]
174
174
  };
175
175
  }
@@ -1,6 +1,6 @@
1
1
  ///
2
2
  /// DesignerPunk Design System - iOS Tokens
3
- /// Generated: 2026-07-05T13:53:05.401Z
3
+ /// Generated: 2026-08-26T02:25:48.234Z
4
4
  /// Version: 1.0.0
5
5
  /// Platform: iOS (Swift Constants)
6
6
  ///
@@ -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 }));