@ds-mo/ui 12.0.0 → 12.2.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 (253) hide show
  1. package/README.md +18 -1
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +3 -2
  4. package/dist/agent.json +314 -41
  5. package/dist/angular/ds-avatar.d.ts +1 -1
  6. package/dist/angular/ds-avatar.js +3 -3
  7. package/dist/angular/ds-bar-workflow.d.ts +28 -0
  8. package/dist/angular/ds-bar-workflow.js +48 -0
  9. package/dist/angular/ds-conversation-list.d.ts +1 -1
  10. package/dist/angular/ds-conversation-list.js +4 -3
  11. package/dist/angular/ds-scroll-overlay.d.ts +19 -0
  12. package/dist/angular/ds-scroll-overlay.js +43 -0
  13. package/dist/angular/index.d.ts +1 -1
  14. package/dist/angular/index.js +2 -0
  15. package/dist/angular/proxies.d.ts +2 -0
  16. package/dist/angular/proxies.js +2 -0
  17. package/dist/components/ds-agent-activity.js +1 -1
  18. package/dist/components/ds-agent-response.js +1 -1
  19. package/dist/components/ds-agent-source-list.js +1 -1
  20. package/dist/components/ds-agent-tool-call.js +1 -1
  21. package/dist/components/ds-attachment-list.js +1 -1
  22. package/dist/components/ds-avatar.js +1 -1
  23. package/dist/components/ds-avatar.js.map +1 -1
  24. package/dist/components/ds-badge.js +1 -1
  25. package/dist/components/ds-bar-nav.js +1 -1
  26. package/dist/components/ds-bar-nav.js.map +1 -1
  27. package/dist/components/ds-bar-title.js +1 -1
  28. package/dist/components/ds-bar-title.js.map +1 -1
  29. package/dist/components/ds-bar-workflow.d.ts +11 -0
  30. package/dist/components/ds-bar-workflow.js +2 -0
  31. package/dist/components/ds-bar-workflow.js.map +1 -0
  32. package/dist/components/ds-button-filled.js +1 -1
  33. package/dist/components/ds-button-unfilled.js +1 -1
  34. package/dist/components/ds-card-data-viz-donut.js +1 -1
  35. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  36. package/dist/components/ds-card-setting.js +1 -1
  37. package/dist/components/ds-card-setting.js.map +1 -1
  38. package/dist/components/ds-card-shell-data-viz.js +1 -1
  39. package/dist/components/ds-chart-bar.js +1 -1
  40. package/dist/components/ds-chart-donut.js +1 -1
  41. package/dist/components/ds-chart-legend.js +1 -1
  42. package/dist/components/ds-chart-line.js +1 -1
  43. package/dist/components/ds-checkbox.js +1 -1
  44. package/dist/components/ds-chip.js +1 -1
  45. package/dist/components/ds-chip.js.map +1 -1
  46. package/dist/components/ds-code-block.js +1 -1
  47. package/dist/components/ds-conversation-list-item.js +1 -1
  48. package/dist/components/ds-conversation-list-item.js.map +1 -1
  49. package/dist/components/ds-conversation-list-section.js +1 -1
  50. package/dist/components/ds-conversation-list-section.js.map +1 -1
  51. package/dist/components/ds-conversation-list.js +1 -1
  52. package/dist/components/ds-conversation-list.js.map +1 -1
  53. package/dist/components/ds-divider.js +1 -1
  54. package/dist/components/ds-empty-state.js +1 -1
  55. package/dist/components/ds-field.js +1 -1
  56. package/dist/components/ds-icon.js +1 -1
  57. package/dist/components/ds-input.js +1 -1
  58. package/dist/components/ds-input.js.map +1 -1
  59. package/dist/components/ds-markdown.js +1 -1
  60. package/dist/components/ds-menu.js +1 -1
  61. package/dist/components/ds-message-bubble.js +1 -1
  62. package/dist/components/ds-message-bubble.js.map +1 -1
  63. package/dist/components/ds-message-composer.js +1 -1
  64. package/dist/components/ds-message-composer.js.map +1 -1
  65. package/dist/components/ds-message-scroller.js +1 -1
  66. package/dist/components/ds-message-scroller.js.map +1 -1
  67. package/dist/components/ds-message.js +1 -1
  68. package/dist/components/ds-modal.js +1 -1
  69. package/dist/components/ds-panel-nav.js +1 -1
  70. package/dist/components/ds-panel-sub-nav.js +1 -1
  71. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  72. package/dist/components/ds-panel-tool-header.js +1 -1
  73. package/dist/components/ds-panel-tool-search.js +1 -1
  74. package/dist/components/ds-panel-tools.js +1 -1
  75. package/dist/components/ds-radio.js +1 -1
  76. package/dist/components/ds-radio.js.map +1 -1
  77. package/dist/components/ds-scroll-overlay.d.ts +11 -0
  78. package/dist/components/ds-scroll-overlay.js +2 -0
  79. package/dist/components/ds-scroll-overlay.js.map +1 -0
  80. package/dist/components/ds-select-multi.js +1 -1
  81. package/dist/components/ds-select-multi.js.map +1 -1
  82. package/dist/components/ds-select.js +1 -1
  83. package/dist/components/ds-select.js.map +1 -1
  84. package/dist/components/ds-shell-app.js +1 -1
  85. package/dist/components/ds-shell-gradient-picker.js +1 -1
  86. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  87. package/dist/components/ds-shell-gradient-swatch.js.map +1 -1
  88. package/dist/components/ds-shell-page.js +1 -1
  89. package/dist/components/ds-shell-page.js.map +1 -1
  90. package/dist/components/ds-skeleton.js +1 -1
  91. package/dist/components/ds-slider.js +1 -1
  92. package/dist/components/ds-slider.js.map +1 -1
  93. package/dist/components/ds-swatch-picker.js +1 -1
  94. package/dist/components/ds-switch.js +1 -1
  95. package/dist/components/ds-tab-group.js +1 -1
  96. package/dist/components/ds-tab-group.js.map +1 -1
  97. package/dist/components/ds-tag.js +1 -1
  98. package/dist/components/ds-tag.js.map +1 -1
  99. package/dist/components/ds-text.js +1 -1
  100. package/dist/components/ds-toast.js +1 -1
  101. package/dist/components/ds-tooltip-data-viz.js +1 -1
  102. package/dist/components/ds-tooltip.js +1 -1
  103. package/dist/components/ds-typing-indicator.js +1 -1
  104. package/dist/components/p-2W-ZjZCR.js +2 -0
  105. package/dist/components/{p-CwTVEAl2.js.map → p-2W-ZjZCR.js.map} +1 -1
  106. package/dist/components/p-8OOCLGph.js +2 -0
  107. package/dist/components/p-8OOCLGph.js.map +1 -0
  108. package/dist/components/{p-BYHKdFzV.js → p-B8CubPgQ.js} +2 -2
  109. package/dist/components/{p-DuNZGFkV.js → p-BAfG3M8z.js} +2 -2
  110. package/dist/components/p-BAfG3M8z.js.map +1 -0
  111. package/dist/components/p-BE_CDJeL.js +2 -0
  112. package/dist/components/p-BE_CDJeL.js.map +1 -0
  113. package/dist/components/{p-BH3es4p7.js → p-BRLDJmkh.js} +2 -2
  114. package/dist/components/p-BpA9uYKX.js +2 -0
  115. package/dist/components/p-BpA9uYKX.js.map +1 -0
  116. package/dist/components/{p-Bs6SS34m.js → p-C0_8K4y7.js} +2 -2
  117. package/dist/components/{p-BhKhX1er.js → p-CA3kLO7K.js} +2 -2
  118. package/dist/components/{p-DfIch2Dk.js → p-CCHqsF_H.js} +2 -2
  119. package/dist/components/p-CG5EX4NW.js +2 -0
  120. package/dist/components/{p-DABj3qTX.js.map → p-CG5EX4NW.js.map} +1 -1
  121. package/dist/components/{p-DVk0wxxX.js → p-CHkI3oIS.js} +2 -2
  122. package/dist/components/{p-liMPkhUP.js → p-CNffejay.js} +2 -2
  123. package/dist/components/{p-B3YvoGjS.js → p-Cxpl-rzP.js} +2 -2
  124. package/dist/components/p-CydY-v7X.js +2 -0
  125. package/dist/components/p-CydY-v7X.js.map +1 -0
  126. package/dist/components/{p-BkwBtZs3.js → p-D6jK2Hyi.js} +2 -2
  127. package/dist/components/{p-Cy04lXlc.js → p-DBi1bmOL.js} +2 -2
  128. package/dist/components/{p-DxeHimqk.js → p-DOCKtrS4.js} +2 -2
  129. package/dist/components/p-DbpfpeQT.js +2 -0
  130. package/dist/components/p-DbpfpeQT.js.map +1 -0
  131. package/dist/components/{p-6vj4kh70.js → p-DcGpdIlT.js} +2 -2
  132. package/dist/components/p-DyGB97Oy.js +2 -0
  133. package/dist/components/{p-Dy_sZ-dI.js.map → p-DyGB97Oy.js.map} +1 -1
  134. package/dist/components/p-GMDGgtY8.js +2 -0
  135. package/dist/components/{p-BUmDHPr3.js.map → p-GMDGgtY8.js.map} +1 -1
  136. package/dist/components/{p-Cf2J9MEo.js → p-XgIQ3oI_.js} +2 -2
  137. package/dist/components/{p-Cf-i-6aE.js → p-ky1msbJ8.js} +2 -2
  138. package/dist/components/p-xY3TjBF5.js +2 -0
  139. package/dist/components/{p-DUHcJWTQ.js.map → p-xY3TjBF5.js.map} +1 -1
  140. package/dist/docs/components.json +685 -56
  141. package/dist/lib/utils/anchored-popup.d.ts +5 -1
  142. package/dist/mcp-data/registry/agent-activity.json +1 -1
  143. package/dist/mcp-data/registry/agent-response.json +10 -5
  144. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  145. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  146. package/dist/mcp-data/registry/attachment-list.json +1 -1
  147. package/dist/mcp-data/registry/avatar.json +27 -8
  148. package/dist/mcp-data/registry/badge.json +1 -1
  149. package/dist/mcp-data/registry/bar-nav.json +1 -1
  150. package/dist/mcp-data/registry/bar-title.json +13 -8
  151. package/dist/mcp-data/registry/bar-workflow.json +368 -0
  152. package/dist/mcp-data/registry/button-filled.json +2 -2
  153. package/dist/mcp-data/registry/button-unfilled.json +2 -2
  154. package/dist/mcp-data/registry/card-data-viz-donut.json +1 -1
  155. package/dist/mcp-data/registry/card-setting.json +1 -1
  156. package/dist/mcp-data/registry/card-shell-data-viz.json +1 -1
  157. package/dist/mcp-data/registry/chart-bar.json +1 -1
  158. package/dist/mcp-data/registry/chart-donut.json +1 -1
  159. package/dist/mcp-data/registry/chart-legend.json +1 -1
  160. package/dist/mcp-data/registry/chart-line.json +1 -1
  161. package/dist/mcp-data/registry/checkbox.json +2 -2
  162. package/dist/mcp-data/registry/chip.json +1 -1
  163. package/dist/mcp-data/registry/code-block.json +1 -1
  164. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  165. package/dist/mcp-data/registry/conversation-list-section.json +3 -3
  166. package/dist/mcp-data/registry/conversation-list.json +37 -10
  167. package/dist/mcp-data/registry/divider.json +1 -1
  168. package/dist/mcp-data/registry/empty-state.json +1 -1
  169. package/dist/mcp-data/registry/field.json +1 -1
  170. package/dist/mcp-data/registry/icon.json +2 -2
  171. package/dist/mcp-data/registry/input.json +1 -1
  172. package/dist/mcp-data/registry/loader.json +1 -1
  173. package/dist/mcp-data/registry/markdown.json +16 -11
  174. package/dist/mcp-data/registry/menu.json +10 -8
  175. package/dist/mcp-data/registry/message-bubble.json +1 -1
  176. package/dist/mcp-data/registry/message-composer.json +1 -1
  177. package/dist/mcp-data/registry/message-scroller.json +4 -4
  178. package/dist/mcp-data/registry/message.json +1 -1
  179. package/dist/mcp-data/registry/modal.json +1 -1
  180. package/dist/mcp-data/registry/panel-nav.json +1 -1
  181. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  182. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  183. package/dist/mcp-data/registry/panel-tool-search.json +2 -2
  184. package/dist/mcp-data/registry/panel-tools.json +1 -1
  185. package/dist/mcp-data/registry/radio.json +1 -1
  186. package/dist/mcp-data/registry/registry.json +320 -41
  187. package/dist/mcp-data/registry/scroll-overlay.json +183 -0
  188. package/dist/mcp-data/registry/select-multi.json +1 -1
  189. package/dist/mcp-data/registry/select.json +1 -1
  190. package/dist/mcp-data/registry/shell-app.json +1 -1
  191. package/dist/mcp-data/registry/shell-gradient-picker.json +1 -1
  192. package/dist/mcp-data/registry/shell-gradient-swatch.json +2 -2
  193. package/dist/mcp-data/registry/shell-page.json +15 -11
  194. package/dist/mcp-data/registry/skeleton.json +1 -1
  195. package/dist/mcp-data/registry/slider.json +2 -2
  196. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  197. package/dist/mcp-data/registry/switch.json +2 -2
  198. package/dist/mcp-data/registry/tab-group.json +2 -2
  199. package/dist/mcp-data/registry/tag.json +1 -1
  200. package/dist/mcp-data/registry/text.json +1 -1
  201. package/dist/mcp-data/registry/toast.json +1 -1
  202. package/dist/mcp-data/registry/tooltip-data-viz.json +1 -1
  203. package/dist/mcp-data/registry/tooltip.json +1 -1
  204. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  205. package/dist/react/components.d.ts +2 -0
  206. package/dist/react/components.js +2 -0
  207. package/dist/react/ds-bar-workflow.d.ts +14 -0
  208. package/dist/react/ds-bar-workflow.js +16 -0
  209. package/dist/react/ds-scroll-overlay.d.ts +12 -0
  210. package/dist/react/ds-scroll-overlay.js +12 -0
  211. package/dist/styles/prose.css +214 -0
  212. package/dist/types/components/Avatar/Avatar.d.ts +4 -1
  213. package/dist/types/components/BarTitle/BarTitle.d.ts +2 -0
  214. package/dist/types/components/BarWorkflow/BarWorkflow.d.ts +37 -0
  215. package/dist/types/components/BarWorkflow/bar-workflow-types.d.ts +12 -0
  216. package/dist/types/components/ConversationList/ConversationList.d.ts +12 -0
  217. package/dist/types/components/Menu/Menu.d.ts +1 -2
  218. package/dist/types/components/MessageScroller/MessageScroller.d.ts +1 -6
  219. package/dist/types/components/ScrollOverlay/ScrollOverlay.d.ts +28 -0
  220. package/dist/types/components/ShellPage/ShellPage.d.ts +5 -0
  221. package/dist/types/components.d.ts +231 -3
  222. package/dist/types/stories/isolated-overlay-docs.d.ts +13 -0
  223. package/dist/types/utils/anchored-popup.d.ts +5 -1
  224. package/dist/types/utils/scroll-overlay-controller.d.ts +35 -0
  225. package/package.json +6 -5
  226. package/dist/components/p-BUmDHPr3.js +0 -2
  227. package/dist/components/p-BZZwQfmN.js +0 -2
  228. package/dist/components/p-BZZwQfmN.js.map +0 -1
  229. package/dist/components/p-CUik7PCi.js +0 -2
  230. package/dist/components/p-CUik7PCi.js.map +0 -1
  231. package/dist/components/p-CwTVEAl2.js +0 -2
  232. package/dist/components/p-DABj3qTX.js +0 -2
  233. package/dist/components/p-DUHcJWTQ.js +0 -2
  234. package/dist/components/p-DuNZGFkV.js.map +0 -1
  235. package/dist/components/p-Dy_sZ-dI.js +0 -2
  236. package/dist/components/p-l6PmnW_P.js +0 -2
  237. package/dist/components/p-l6PmnW_P.js.map +0 -1
  238. package/dist/components/p-xFbUt9Tc.js +0 -2
  239. package/dist/components/p-xFbUt9Tc.js.map +0 -1
  240. /package/dist/components/{p-BYHKdFzV.js.map → p-B8CubPgQ.js.map} +0 -0
  241. /package/dist/components/{p-BH3es4p7.js.map → p-BRLDJmkh.js.map} +0 -0
  242. /package/dist/components/{p-Bs6SS34m.js.map → p-C0_8K4y7.js.map} +0 -0
  243. /package/dist/components/{p-BhKhX1er.js.map → p-CA3kLO7K.js.map} +0 -0
  244. /package/dist/components/{p-DfIch2Dk.js.map → p-CCHqsF_H.js.map} +0 -0
  245. /package/dist/components/{p-DVk0wxxX.js.map → p-CHkI3oIS.js.map} +0 -0
  246. /package/dist/components/{p-liMPkhUP.js.map → p-CNffejay.js.map} +0 -0
  247. /package/dist/components/{p-B3YvoGjS.js.map → p-Cxpl-rzP.js.map} +0 -0
  248. /package/dist/components/{p-BkwBtZs3.js.map → p-D6jK2Hyi.js.map} +0 -0
  249. /package/dist/components/{p-Cy04lXlc.js.map → p-DBi1bmOL.js.map} +0 -0
  250. /package/dist/components/{p-DxeHimqk.js.map → p-DOCKtrS4.js.map} +0 -0
  251. /package/dist/components/{p-6vj4kh70.js.map → p-DcGpdIlT.js.map} +0 -0
  252. /package/dist/components/{p-Cf2J9MEo.js.map → p-XgIQ3oI_.js.map} +0 -0
  253. /package/dist/components/{p-Cf-i-6aE.js.map → p-ky1msbJ8.js.map} +0 -0
@@ -0,0 +1,368 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "bar-workflow",
4
+ "title": "BarWorkflow",
5
+ "description": "Compact bold-brand create/edit workflow chrome with Exit, controlled previous and next step navigation, and a final Save or Submit action.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/bar-workflow",
11
+ "source": "src/wc/components/BarWorkflow/BarWorkflow.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "stable",
16
+ "summary": "Compact bold-brand create/edit workflow chrome with Exit, controlled previous and next step navigation, and a final Save or Submit action.",
17
+ "useWhen": [
18
+ "A create or edit flow needs persistent page-level Exit and step navigation.",
19
+ "A single-step form needs the same compact workflow chrome and final Save or Submit action.",
20
+ "Next or Submit must remain visible while the application owns validation and the current step."
21
+ ],
22
+ "avoidWhen": [
23
+ "The header identifies a routed page, list, or detail view; use BarTitle instead.",
24
+ "The steps must be visibly enumerated or expose progress; BarWorkflow uses steps only to resolve its navigation controls.",
25
+ "The header belongs to a PanelTools drawer or fullscreen pane; use PanelToolHeader through PanelTools instead.",
26
+ "The interaction is a local wizard inside page content rather than page-level workflow chrome."
27
+ ],
28
+ "alternatives": [
29
+ {
30
+ "when": "A routed page needs responsive title, section, Back, and page-action presentations.",
31
+ "component": "component:ds-bar-title",
32
+ "reason": "BarTitle owns page identity and capacity variants rather than workflow progression."
33
+ },
34
+ {
35
+ "when": "The workflow belongs to a tool drawer or fullscreen tool pane.",
36
+ "component": "component:ds-panel-tool-header",
37
+ "reason": "PanelToolHeader owns tool-pane navigation and actions within PanelTools."
38
+ }
39
+ ],
40
+ "commonlyComposedWith": [
41
+ "component:ds-shell-page",
42
+ "component:ds-button-filled",
43
+ "component:ds-button-unfilled",
44
+ "component:ds-text",
45
+ "component:ds-tooltip"
46
+ ],
47
+ "patterns": [],
48
+ "accessibility": [
49
+ "Provide one concise workflow heading; BarWorkflow renders exactly one h1 and appends the controlled current-step count as heading · X/N only for multi-step workflows.",
50
+ "Provide a workflow-specific Exit accessible name that describes the consequence or destination.",
51
+ "Give every step a stable id and concise label even though step labels are not rendered as visible progress.",
52
+ "Previous is omitted on the first step; it appears from step two onward. Next remains visible on intermediate steps and becomes the final labeled Check action on the last step.",
53
+ "Use submitAction.type=submit inside a form so the final action preserves native submission semantics."
54
+ ],
55
+ "states": [
56
+ "BarWorkflow always renders compact 48px bold-brand chrome and has no expanded, constrained, or responsive variant.",
57
+ "An unrecognized value resolves navigation from the first step without mutating the controlled value.",
58
+ "The first step omits Previous. Intermediate steps show Previous and Next. The last step replaces Next with the Check Save or Submit action.",
59
+ "The default empty steps array is a single-step flow with the plain heading, no Previous control, and the final action visible. An explicit one-step array behaves the same way.",
60
+ "isNextInactive blocks forward navigation while preserving the Next control; the target step's isInactive state also blocks entry.",
61
+ "submitAction owns the final label, native button type, inactive state, and loading state."
62
+ ],
63
+ "responsiveBehavior": [
64
+ "BarWorkflow does not expose a presentation variant and never collapses its navigation actions.",
65
+ "The heading truncates before Exit, Previous, and Next or Submit lose their complete hit targets.",
66
+ "When slotted into ShellPage, BarWorkflow remains compact while ShellPage continues to provide sticky placement."
67
+ ],
68
+ "frameworkCaveats": {
69
+ "customElements": [
70
+ "Assign steps and submitAction as JavaScript properties and replace their identities when controlled state changes.",
71
+ "Update value after dsStepChange, handle dsExit in the workflow owner, and use dsSubmit only when product behavior supplements native form submission."
72
+ ],
73
+ "react": [
74
+ "Pass steps and submitAction directly to DsBarWorkflow and keep value controlled in the workflow route.",
75
+ "Place DsBarWorkflow in DsShellPage with slot=header when sticky page placement is required."
76
+ ],
77
+ "angular": [
78
+ "Bind steps and submitAction on the standalone DsBarWorkflow adapter and update value from dsStepChange.",
79
+ "Place ds-bar-workflow in ds-shell-page with slot=header and keep the form or router outlet in ShellPage content."
80
+ ]
81
+ },
82
+ "references": [
83
+ {
84
+ "label": "Workflow states and controlled navigation",
85
+ "path": "src/wc/components/BarWorkflow/BarWorkflow.stories.ts"
86
+ },
87
+ {
88
+ "label": "Cross-browser workflow behavior",
89
+ "path": "tests/e2e/bar-workflow.spec.ts"
90
+ }
91
+ ]
92
+ },
93
+ "api": {
94
+ "props": {
95
+ "exitAriaLabel": {
96
+ "type": "string",
97
+ "resolvedType": "string",
98
+ "attribute": "exit-aria-label",
99
+ "default": "'Exit workflow'",
100
+ "required": false,
101
+ "mutable": false,
102
+ "description": "Workflow-specific accessible name for Exit."
103
+ },
104
+ "exitLabel": {
105
+ "type": "string",
106
+ "resolvedType": "string",
107
+ "attribute": "exit-label",
108
+ "default": "'Exit'",
109
+ "required": false,
110
+ "mutable": false,
111
+ "description": "Concise tooltip label for the Exit control."
112
+ },
113
+ "heading": {
114
+ "type": "string",
115
+ "resolvedType": "string",
116
+ "attribute": "heading",
117
+ "required": true,
118
+ "mutable": false,
119
+ "description": "The workflow's single visible h1."
120
+ },
121
+ "isNextInactive": {
122
+ "type": "boolean",
123
+ "resolvedType": "boolean",
124
+ "attribute": "is-next-inactive",
125
+ "default": "false",
126
+ "required": false,
127
+ "mutable": false,
128
+ "description": "Prevent advancing while the current step is incomplete or invalid."
129
+ },
130
+ "nextLabel": {
131
+ "type": "string",
132
+ "resolvedType": "string",
133
+ "attribute": "next-label",
134
+ "default": "'Next step'",
135
+ "required": false,
136
+ "mutable": false,
137
+ "description": "Tooltip and accessible name for the next-step control."
138
+ },
139
+ "previousLabel": {
140
+ "type": "string",
141
+ "resolvedType": "string",
142
+ "attribute": "previous-label",
143
+ "default": "'Previous step'",
144
+ "required": false,
145
+ "mutable": false,
146
+ "description": "Tooltip and accessible name for the previous-step control."
147
+ },
148
+ "steps": {
149
+ "type": "BarWorkflowStep[]",
150
+ "resolvedType": "BarWorkflowStep[]",
151
+ "default": "[]",
152
+ "required": false,
153
+ "mutable": false,
154
+ "description": "Ordered workflow steps. Step state is controlled by the application."
155
+ },
156
+ "submitAction": {
157
+ "type": "BarWorkflowSubmitAction",
158
+ "resolvedType": "BarWorkflowSubmitAction",
159
+ "default": "{\n label: 'Save',\n type: 'submit',\n }",
160
+ "required": false,
161
+ "mutable": false,
162
+ "description": "The final-step Save or Submit action."
163
+ },
164
+ "value": {
165
+ "type": "string",
166
+ "resolvedType": "string",
167
+ "attribute": "value",
168
+ "default": "''",
169
+ "required": false,
170
+ "mutable": false,
171
+ "description": "Id of the current workflow step. Falls back to the first step."
172
+ }
173
+ },
174
+ "events": [
175
+ {
176
+ "name": "dsExit",
177
+ "detail": "MouseEvent",
178
+ "bubbles": true,
179
+ "cancelable": true,
180
+ "composed": true,
181
+ "description": "Emitted when Exit is activated."
182
+ },
183
+ {
184
+ "name": "dsStepChange",
185
+ "detail": "string",
186
+ "bubbles": true,
187
+ "cancelable": true,
188
+ "composed": true,
189
+ "description": "Emitted with the target previous or next step id. The component never mutates value."
190
+ },
191
+ {
192
+ "name": "dsSubmit",
193
+ "detail": "MouseEvent",
194
+ "bubbles": true,
195
+ "cancelable": true,
196
+ "composed": true,
197
+ "description": "Emitted when the final Save or Submit control is activated."
198
+ }
199
+ ],
200
+ "methods": [],
201
+ "slots": []
202
+ },
203
+ "props": {
204
+ "exitAriaLabel": {
205
+ "type": "string",
206
+ "resolvedType": "string",
207
+ "attribute": "exit-aria-label",
208
+ "default": "'Exit workflow'",
209
+ "required": false,
210
+ "mutable": false,
211
+ "description": "Workflow-specific accessible name for Exit."
212
+ },
213
+ "exitLabel": {
214
+ "type": "string",
215
+ "resolvedType": "string",
216
+ "attribute": "exit-label",
217
+ "default": "'Exit'",
218
+ "required": false,
219
+ "mutable": false,
220
+ "description": "Concise tooltip label for the Exit control."
221
+ },
222
+ "heading": {
223
+ "type": "string",
224
+ "resolvedType": "string",
225
+ "attribute": "heading",
226
+ "required": true,
227
+ "mutable": false,
228
+ "description": "The workflow's single visible h1."
229
+ },
230
+ "isNextInactive": {
231
+ "type": "boolean",
232
+ "resolvedType": "boolean",
233
+ "attribute": "is-next-inactive",
234
+ "default": "false",
235
+ "required": false,
236
+ "mutable": false,
237
+ "description": "Prevent advancing while the current step is incomplete or invalid."
238
+ },
239
+ "nextLabel": {
240
+ "type": "string",
241
+ "resolvedType": "string",
242
+ "attribute": "next-label",
243
+ "default": "'Next step'",
244
+ "required": false,
245
+ "mutable": false,
246
+ "description": "Tooltip and accessible name for the next-step control."
247
+ },
248
+ "previousLabel": {
249
+ "type": "string",
250
+ "resolvedType": "string",
251
+ "attribute": "previous-label",
252
+ "default": "'Previous step'",
253
+ "required": false,
254
+ "mutable": false,
255
+ "description": "Tooltip and accessible name for the previous-step control."
256
+ },
257
+ "steps": {
258
+ "type": "BarWorkflowStep[]",
259
+ "resolvedType": "BarWorkflowStep[]",
260
+ "default": "[]",
261
+ "required": false,
262
+ "mutable": false,
263
+ "description": "Ordered workflow steps. Step state is controlled by the application."
264
+ },
265
+ "submitAction": {
266
+ "type": "BarWorkflowSubmitAction",
267
+ "resolvedType": "BarWorkflowSubmitAction",
268
+ "default": "{\n label: 'Save',\n type: 'submit',\n }",
269
+ "required": false,
270
+ "mutable": false,
271
+ "description": "The final-step Save or Submit action."
272
+ },
273
+ "value": {
274
+ "type": "string",
275
+ "resolvedType": "string",
276
+ "attribute": "value",
277
+ "default": "''",
278
+ "required": false,
279
+ "mutable": false,
280
+ "description": "Id of the current workflow step. Falls back to the first step."
281
+ }
282
+ },
283
+ "events": [
284
+ {
285
+ "name": "dsExit",
286
+ "detail": "MouseEvent",
287
+ "bubbles": true,
288
+ "cancelable": true,
289
+ "composed": true,
290
+ "description": "Emitted when Exit is activated."
291
+ },
292
+ {
293
+ "name": "dsStepChange",
294
+ "detail": "string",
295
+ "bubbles": true,
296
+ "cancelable": true,
297
+ "composed": true,
298
+ "description": "Emitted with the target previous or next step id. The component never mutates value."
299
+ },
300
+ {
301
+ "name": "dsSubmit",
302
+ "detail": "MouseEvent",
303
+ "bubbles": true,
304
+ "cancelable": true,
305
+ "composed": true,
306
+ "description": "Emitted when the final Save or Submit control is activated."
307
+ }
308
+ ],
309
+ "methods": [],
310
+ "slots": [],
311
+ "exports": {
312
+ "customElement": "ds-bar-workflow",
313
+ "react": "DsBarWorkflow",
314
+ "angular": "DsBarWorkflow"
315
+ },
316
+ "consumption": {
317
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
318
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
319
+ "customElements": {
320
+ "import": "import '@ds-mo/ui/dist/components/ds-bar-workflow.js';",
321
+ "example": "<ds-bar-workflow></ds-bar-workflow>"
322
+ },
323
+ "react": {
324
+ "import": "import { DsBarWorkflow } from '@ds-mo/ui/react';",
325
+ "example": "<DsBarWorkflow />"
326
+ },
327
+ "angular": {
328
+ "import": "import { DsBarWorkflow } from '@ds-mo/ui/angular/ds-bar-workflow';",
329
+ "example": "<ds-bar-workflow></ds-bar-workflow>"
330
+ },
331
+ "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: steps, submitAction.",
332
+ "peerDependencies": {
333
+ "required": [
334
+ "@ds-mo/tokens ^3.1.1",
335
+ "@ds-mo/icons ^6.4.0"
336
+ ],
337
+ "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
338
+ }
339
+ }
340
+ },
341
+ "dependencies": [
342
+ "@ds-mo/ui",
343
+ "@ds-mo/tokens"
344
+ ],
345
+ "registryDependencies": [
346
+ "button-filled",
347
+ "button-unfilled",
348
+ "text",
349
+ "tooltip"
350
+ ],
351
+ "files": [
352
+ {
353
+ "path": "src/wc/components/BarWorkflow/BarWorkflow.css",
354
+ "content": "@import '../../utils/control-density.css';\n\n:host {\n display: block;\n min-width: 0;\n box-sizing: border-box;\n background: var(--color-background-bold-brand);\n}\n\n.bar-workflow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--dimension-space-100);\n height: var(--dimension-size-600);\n min-width: 0;\n padding: var(--dimension-space-100);\n box-sizing: border-box;\n background: var(--color-background-bold-brand);\n}\n\n.bar-workflow__identity {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n gap: var(--dimension-space-050);\n height: var(--dimension-size-400);\n min-width: 0;\n}\n\n.bar-workflow__heading {\n display: inline-flex;\n flex: 1 1 auto;\n align-items: center;\n width: auto;\n min-width: 0;\n height: var(--dimension-size-400);\n padding-inline: calc(var(--ds-control-padding-inline) + var(--ds-control-label-inset));\n box-sizing: border-box;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: none;\n}\n\n.bar-workflow__actions {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n gap: var(--dimension-space-100);\n}\n",
355
+ "type": "registry:ui"
356
+ },
357
+ {
358
+ "path": "src/wc/components/BarWorkflow/BarWorkflow.tsx",
359
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport type { BarWorkflowStep, BarWorkflowSubmitAction } from './bar-workflow-types';\n\n@Component({\n tag: 'ds-bar-workflow',\n styleUrl: 'BarWorkflow.css',\n scoped: true,\n})\nexport class BarWorkflow {\n /** The workflow's single visible h1. */\n @Prop() heading!: string;\n\n /** Ordered workflow steps. Step state is controlled by the application. */\n @Prop() steps: BarWorkflowStep[] = [];\n\n /** Id of the current workflow step. Falls back to the first step. */\n @Prop() value: string = '';\n\n /** Concise tooltip label for the Exit control. */\n @Prop() exitLabel: string = 'Exit';\n\n /** Workflow-specific accessible name for Exit. */\n @Prop() exitAriaLabel: string = 'Exit workflow';\n\n /** Tooltip and accessible name for the previous-step control. */\n @Prop() previousLabel: string = 'Previous step';\n\n /** Tooltip and accessible name for the next-step control. */\n @Prop() nextLabel: string = 'Next step';\n\n /** The final-step Save or Submit action. */\n @Prop() submitAction: BarWorkflowSubmitAction = {\n label: 'Save',\n type: 'submit',\n };\n\n /** Prevent advancing while the current step is incomplete or invalid. */\n @Prop() isNextInactive: boolean = false;\n\n /** Emitted when Exit is activated. */\n @Event() dsExit!: EventEmitter<MouseEvent>;\n\n /** Emitted with the target previous or next step id. The component never mutates value. */\n @Event() dsStepChange!: EventEmitter<string>;\n\n /** Emitted when the final Save or Submit control is activated. */\n @Event() dsSubmit!: EventEmitter<MouseEvent>;\n\n private get currentIndex(): number {\n const index = this.steps.findIndex(step => step.id === this.value);\n return index >= 0 ? index : 0;\n }\n\n private get previousStep(): BarWorkflowStep | null {\n return this.steps[this.currentIndex - 1] ?? null;\n }\n\n private get nextStep(): BarWorkflowStep | null {\n return this.steps[this.currentIndex + 1] ?? null;\n }\n\n private get isLastStep(): boolean {\n return this.steps.length <= 1 || this.currentIndex === this.steps.length - 1;\n }\n\n private get resolvedHeading(): string {\n if (this.steps.length <= 1) return this.heading;\n return `${this.heading} · ${this.currentIndex + 1}/${this.steps.length}`;\n }\n\n private handlePrevious = () => {\n if (this.previousStep && !this.previousStep.isInactive) {\n this.dsStepChange.emit(this.previousStep.id);\n }\n };\n\n private handleNext = () => {\n if (this.nextStep && !this.isNextInactive && !this.nextStep.isInactive) {\n this.dsStepChange.emit(this.nextStep.id);\n }\n };\n\n render() {\n const submit = this.submitAction;\n return (\n <Host>\n <div class=\"bar-workflow\">\n <div class=\"bar-workflow__identity\">\n <ds-tooltip label={this.exitLabel} side=\"bottom\" size=\"sm\">\n <ds-button-unfilled\n class=\"bar-workflow__exit\"\n variant=\"icon\"\n icon=\"Cross\"\n aria-label={this.exitAriaLabel}\n size=\"md\"\n background=\"bold\"\n activeFill={false}\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) => this.dsExit.emit(event.detail)}\n />\n </ds-tooltip>\n <ds-text\n class=\"bar-workflow__heading ds-control--md\"\n variant=\"text-title-small\"\n emphasis\n color=\"on-bold\"\n as=\"h1\"\n lineTruncation={1}\n >\n {this.resolvedHeading}\n </ds-text>\n </div>\n\n <div class=\"bar-workflow__actions\">\n {this.previousStep ? (\n <ds-tooltip label={this.previousLabel} side=\"bottom\" size=\"sm\">\n <ds-button-unfilled\n class=\"bar-workflow__previous\"\n variant=\"icon\"\n icon=\"ChevronLeft\"\n aria-label={this.previousLabel}\n size=\"md\"\n background=\"bold\"\n activeFill={false}\n hasBorder={false}\n isInactive={this.previousStep.isInactive}\n onDsClick={this.handlePrevious}\n />\n </ds-tooltip>\n ) : null}\n\n {this.isLastStep ? (\n <ds-tooltip label={submit.label} side=\"bottom\" size=\"sm\">\n <ds-button-filled\n class=\"bar-workflow__submit\"\n variant=\"icon\"\n icon=\"Check\"\n label={submit.label}\n aria-label={submit.label}\n intent=\"brand\"\n contrast=\"faint\"\n background=\"bold\"\n size=\"md\"\n type={submit.type ?? 'submit'}\n isInactive={submit.isInactive}\n isLoading={submit.isLoading}\n onDsClick={(event: CustomEvent<MouseEvent>) => this.dsSubmit.emit(event.detail)}\n />\n </ds-tooltip>\n ) : (\n <ds-tooltip label={this.nextLabel} side=\"bottom\" size=\"sm\">\n <ds-button-filled\n class=\"bar-workflow__next\"\n variant=\"icon\"\n icon=\"ChevronRight\"\n label={this.nextLabel}\n aria-label={this.nextLabel}\n intent=\"brand\"\n contrast=\"faint\"\n background=\"bold\"\n size=\"md\"\n type=\"button\"\n isInactive={this.isNextInactive || this.nextStep?.isInactive}\n onDsClick={this.handleNext}\n />\n </ds-tooltip>\n )}\n </div>\n </div>\n </Host>\n );\n }\n}\n",
360
+ "type": "registry:ui"
361
+ },
362
+ {
363
+ "path": "src/wc/components/BarWorkflow/bar-workflow-types.ts",
364
+ "content": "export interface BarWorkflowStep {\n id: string;\n label: string;\n isInactive?: boolean;\n}\n\nexport interface BarWorkflowSubmitAction {\n label: string;\n type?: 'button' | 'submit' | 'reset';\n isInactive?: boolean;\n isLoading?: boolean;\n}\n",
365
+ "type": "registry:ui"
366
+ }
367
+ ]
368
+ }
@@ -391,7 +391,7 @@
391
391
  "peerDependencies": {
392
392
  "required": [
393
393
  "@ds-mo/tokens ^3.1.1",
394
- "@ds-mo/icons ^6.3.0"
394
+ "@ds-mo/icons ^6.4.0"
395
395
  ],
396
396
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
397
397
  }
@@ -410,7 +410,7 @@
410
410
  "files": [
411
411
  {
412
412
  "path": "src/wc/components/ButtonFilled/ButtonFilled.css",
413
- "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-width.css';\n\n:host {\n display: inline-flex;\n outline: none;\n --ds-button-filled-bg: var(--color-background-bold-brand);\n --ds-button-filled-fg: var(--color-foreground-faint-brand);\n --ds-button-filled-border: var(--color-border-secondary);\n}\n\n/* Icon-only: fixed square from density height (hug). Fill stretches the hit target. */\n:host(.button-filled-host--icon.ds-control-width--hug) {\n width: var(--ds-control-height, var(--dimension-size-400));\n height: var(--ds-control-height, var(--dimension-size-400));\n min-width: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.button-filled-host--icon.ds-control-width--fill) {\n height: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.ds-control-width--fill) .button-filled {\n width: 100%;\n}\n\n.button-filled {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n height: var(--ds-control-height, var(--dimension-size-400));\n padding: 0 var(--ds-control-padding-inline, var(--dimension-space-075));\n gap: var(--ds-control-gap, var(--dimension-space-050));\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n background-color: var(--ds-button-filled-bg);\n color: var(--ds-button-filled-fg);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n overflow: hidden;\n transition:\n background-color var(--effect-motion-short-2),\n color var(--effect-motion-short-2),\n transform var(--effect-motion-short-2);\n /* Hover/press: `.ds-interaction-fill` + contrast → `--on-*` (token overlay, not color-mix). */\n}\n\n.button-filled--icon {\n width: 100%;\n height: 100%;\n padding: 0;\n}\n\n.button-filled--rounded {\n --ds-control-radius: var(--dimension-radius-half);\n}\n\n/* Inset stroke via interaction-fill ::after (above hover and pressed washes). */\n.button-filled--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-button-filled-border);\n}\n\n/* Preserve the border while inactive, when interaction-fill is intentionally omitted. */\n.button-filled--bordered:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/*\n * Parent-surface context affects only the optional inset border.\n * Intent + contrast continue to own fill, foreground, and interaction overlays.\n */\n.button-filled--background-medium {\n --ds-button-filled-border: var(--color-border-on-medium-background-secondary);\n}\n\n.button-filled--background-bold {\n --ds-button-filled-border: var(--color-border-on-bold-background-secondary);\n}\n\n.button-filled--background-strong {\n --ds-button-filled-border: var(--color-border-on-strong-background-secondary);\n}\n\n.button-filled--background-translucent {\n --ds-button-filled-border: var(--color-translucent-border-secondary);\n}\n\n.button-filled--background-inverted {\n --ds-button-filled-border: var(--color-inverted-border-secondary);\n}\n\n.button-filled--background-media {\n --ds-button-filled-border: var(--color-media-border-secondary);\n}\n\n.button-filled--background-always-dark {\n --ds-button-filled-border: var(--color-always-dark-border-secondary);\n}\n\n.button-filled:active:not(:disabled):not(.ds-control-inactive) {\n transform: scale(var(--dimension-scale-subtle));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .button-filled {\n transition:\n background-color var(--effect-motion-short-2),\n color var(--effect-motion-short-2);\n }\n\n .button-filled:active:not(:disabled):not(.ds-control-inactive) {\n transform: none;\n }\n}\n\n/* Inactive: `.ds-control-inactive` (25% opacity). */\n\n.button-filled__icon-wrap {\n position: relative;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n z-index: 2;\n}\n\n.button-filled__label {\n position: relative;\n z-index: 2;\n padding: 0 var(--ds-control-label-inset, var(--dimension-space-025));\n white-space: nowrap;\n flex-shrink: 0;\n min-width: 0;\n}\n\n.button-filled__label--loading {\n visibility: hidden;\n}\n\n.button-filled > .button-filled__loader-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n/* ── Intent + contrast (bold default) ─────────────────────────────────────── */\n\n.button-filled--intent-neutral {\n --ds-button-filled-bg: var(--color-background-bold-neutral);\n --ds-button-filled-fg: var(--color-foreground-faint-neutral);\n}\n\n.button-filled--intent-brand {\n --ds-button-filled-bg: var(--color-background-bold-brand);\n --ds-button-filled-fg: var(--color-foreground-faint-brand);\n}\n\n.button-filled--intent-ai {\n --ds-button-filled-bg: var(--color-background-bold-ai);\n --ds-button-filled-fg: var(--color-foreground-faint-ai);\n}\n\n.button-filled--intent-negative {\n --ds-button-filled-bg: var(--color-background-bold-negative);\n --ds-button-filled-fg: var(--color-foreground-faint-negative);\n}\n\n.button-filled--intent-warning {\n --ds-button-filled-bg: var(--color-background-bold-warning);\n --ds-button-filled-fg: var(--color-foreground-faint-warning);\n}\n\n.button-filled--intent-caution {\n --ds-button-filled-bg: var(--color-background-bold-caution);\n --ds-button-filled-fg: var(--color-foreground-faint-caution);\n}\n\n.button-filled--intent-positive {\n --ds-button-filled-bg: var(--color-background-bold-positive);\n --ds-button-filled-fg: var(--color-foreground-faint-positive);\n}\n\n.button-filled--intent-guide {\n --ds-button-filled-bg: var(--color-background-bold-guide);\n --ds-button-filled-fg: var(--color-foreground-faint-guide);\n}\n\n.button-filled--intent-walkthrough {\n --ds-button-filled-bg: var(--color-background-bold-walkthrough);\n --ds-button-filled-fg: var(--color-foreground-faint-walkthrough);\n}\n\n/* strong → medium fg */\n.button-filled--contrast-strong.button-filled--intent-neutral {\n --ds-button-filled-bg: var(--color-background-strong-neutral);\n --ds-button-filled-fg: var(--color-foreground-medium-neutral);\n}\n\n.button-filled--contrast-strong.button-filled--intent-brand {\n --ds-button-filled-bg: var(--color-background-strong-brand);\n --ds-button-filled-fg: var(--color-foreground-medium-brand);\n}\n\n.button-filled--contrast-strong.button-filled--intent-ai {\n --ds-button-filled-bg: var(--color-background-strong-ai);\n --ds-button-filled-fg: var(--color-foreground-medium-ai);\n}\n\n.button-filled--contrast-strong.button-filled--intent-negative {\n --ds-button-filled-bg: var(--color-background-strong-negative);\n --ds-button-filled-fg: var(--color-foreground-medium-negative);\n}\n\n.button-filled--contrast-strong.button-filled--intent-warning {\n --ds-button-filled-bg: var(--color-background-strong-warning);\n --ds-button-filled-fg: var(--color-foreground-medium-warning);\n}\n\n.button-filled--contrast-strong.button-filled--intent-caution {\n --ds-button-filled-bg: var(--color-background-strong-caution);\n --ds-button-filled-fg: var(--color-foreground-medium-caution);\n}\n\n.button-filled--contrast-strong.button-filled--intent-positive {\n --ds-button-filled-bg: var(--color-background-strong-positive);\n --ds-button-filled-fg: var(--color-foreground-medium-positive);\n}\n\n.button-filled--contrast-strong.button-filled--intent-guide {\n --ds-button-filled-bg: var(--color-background-strong-guide);\n --ds-button-filled-fg: var(--color-foreground-medium-guide);\n}\n\n.button-filled--contrast-strong.button-filled--intent-walkthrough {\n --ds-button-filled-bg: var(--color-background-strong-walkthrough);\n --ds-button-filled-fg: var(--color-foreground-medium-walkthrough);\n}\n\n/* medium → strong fg */\n.button-filled--contrast-medium.button-filled--intent-neutral {\n --ds-button-filled-bg: var(--color-background-medium-neutral);\n --ds-button-filled-fg: var(--color-foreground-strong-neutral);\n}\n\n.button-filled--contrast-medium.button-filled--intent-brand {\n --ds-button-filled-bg: var(--color-background-medium-brand);\n --ds-button-filled-fg: var(--color-foreground-strong-brand);\n}\n\n.button-filled--contrast-medium.button-filled--intent-ai {\n --ds-button-filled-bg: var(--color-background-medium-ai);\n --ds-button-filled-fg: var(--color-foreground-strong-ai);\n}\n\n.button-filled--contrast-medium.button-filled--intent-negative {\n --ds-button-filled-bg: var(--color-background-medium-negative);\n --ds-button-filled-fg: var(--color-foreground-strong-negative);\n}\n\n.button-filled--contrast-medium.button-filled--intent-warning {\n --ds-button-filled-bg: var(--color-background-medium-warning);\n --ds-button-filled-fg: var(--color-foreground-strong-warning);\n}\n\n.button-filled--contrast-medium.button-filled--intent-caution {\n --ds-button-filled-bg: var(--color-background-medium-caution);\n --ds-button-filled-fg: var(--color-foreground-strong-caution);\n}\n\n.button-filled--contrast-medium.button-filled--intent-positive {\n --ds-button-filled-bg: var(--color-background-medium-positive);\n --ds-button-filled-fg: var(--color-foreground-strong-positive);\n}\n\n.button-filled--contrast-medium.button-filled--intent-guide {\n --ds-button-filled-bg: var(--color-background-medium-guide);\n --ds-button-filled-fg: var(--color-foreground-strong-guide);\n}\n\n.button-filled--contrast-medium.button-filled--intent-walkthrough {\n --ds-button-filled-bg: var(--color-background-medium-walkthrough);\n --ds-button-filled-fg: var(--color-foreground-strong-walkthrough);\n}\n\n/* faint → bold fg */\n.button-filled--contrast-faint.button-filled--intent-neutral {\n --ds-button-filled-bg: var(--color-background-faint-neutral);\n --ds-button-filled-fg: var(--color-foreground-bold-neutral);\n}\n\n.button-filled--contrast-faint.button-filled--intent-brand {\n --ds-button-filled-bg: var(--color-background-faint-brand);\n --ds-button-filled-fg: var(--color-foreground-bold-brand);\n}\n\n.button-filled--contrast-faint.button-filled--intent-ai {\n --ds-button-filled-bg: var(--color-background-faint-ai);\n --ds-button-filled-fg: var(--color-foreground-bold-ai);\n}\n\n.button-filled--contrast-faint.button-filled--intent-negative {\n --ds-button-filled-bg: var(--color-background-faint-negative);\n --ds-button-filled-fg: var(--color-foreground-bold-negative);\n}\n\n.button-filled--contrast-faint.button-filled--intent-warning {\n --ds-button-filled-bg: var(--color-background-faint-warning);\n --ds-button-filled-fg: var(--color-foreground-bold-warning);\n}\n\n.button-filled--contrast-faint.button-filled--intent-caution {\n --ds-button-filled-bg: var(--color-background-faint-caution);\n --ds-button-filled-fg: var(--color-foreground-bold-caution);\n}\n\n.button-filled--contrast-faint.button-filled--intent-positive {\n --ds-button-filled-bg: var(--color-background-faint-positive);\n --ds-button-filled-fg: var(--color-foreground-bold-positive);\n}\n\n.button-filled--contrast-faint.button-filled--intent-guide {\n --ds-button-filled-bg: var(--color-background-faint-guide);\n --ds-button-filled-fg: var(--color-foreground-bold-guide);\n}\n\n.button-filled--contrast-faint.button-filled--intent-walkthrough {\n --ds-button-filled-bg: var(--color-background-faint-walkthrough);\n --ds-button-filled-fg: var(--color-foreground-bold-walkthrough);\n}\n",
413
+ "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-width.css';\n\n:host {\n display: inline-flex;\n outline: none;\n --ds-button-filled-bg: var(--color-background-bold-brand);\n --ds-button-filled-fg: var(--color-foreground-faint-brand);\n --ds-button-filled-border: var(--color-border-secondary);\n}\n\n/* Icon-only: fixed square from density height (hug). Fill stretches the hit target. */\n:host(.button-filled-host--icon.ds-control-width--hug) {\n width: var(--ds-control-height, var(--dimension-size-400));\n height: var(--ds-control-height, var(--dimension-size-400));\n min-width: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.button-filled-host--icon.ds-control-width--fill) {\n height: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.ds-control-width--fill) .button-filled {\n width: 100%;\n}\n\n.button-filled {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n height: var(--ds-control-height, var(--dimension-size-400));\n padding: 0 var(--ds-control-padding-inline, var(--dimension-space-075));\n gap: var(--ds-control-gap, var(--dimension-space-050));\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n background-color: var(--ds-button-filled-bg);\n color: var(--ds-button-filled-fg);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n overflow: hidden;\n transition:\n background-color var(--effect-motion-short-2),\n color var(--effect-motion-short-2),\n transform var(--effect-motion-short-2);\n /* Hover/press: `.ds-interaction-fill` + contrast → `--on-*` (token overlay, not color-mix). */\n}\n\n.button-filled--icon {\n width: 100%;\n height: 100%;\n padding: 0;\n}\n\n.button-filled--rounded {\n --ds-control-radius: var(--dimension-radius-half);\n}\n\n/* Inset stroke via interaction-fill ::after (above hover and pressed washes). */\n.button-filled--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-button-filled-border);\n}\n\n/* Preserve the border while inactive, when interaction-fill is intentionally omitted. */\n.button-filled--bordered:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/*\n * Parent-surface context affects only the optional inset border.\n * Intent + contrast continue to own fill, foreground, and interaction overlays.\n */\n.button-filled--background-medium {\n --ds-button-filled-border: var(--color-border-on-medium-background-secondary);\n}\n\n.button-filled--background-bold {\n --ds-button-filled-border: var(--color-border-on-bold-background-secondary);\n}\n\n.button-filled--background-strong {\n --ds-button-filled-border: var(--color-border-on-strong-background-secondary);\n}\n\n.button-filled--background-translucent {\n --ds-button-filled-border: var(--color-translucent-border-secondary);\n}\n\n.button-filled--background-inverted {\n --ds-button-filled-border: var(--color-inverted-border-secondary);\n}\n\n.button-filled--background-media {\n --ds-button-filled-border: var(--color-media-border-secondary);\n}\n\n.button-filled--background-always-dark {\n --ds-button-filled-border: var(--color-always-dark-border-secondary);\n}\n\n.button-filled:active:not(:disabled):not(.ds-control-inactive) {\n transform: scale(var(--dimension-scale-subtle));\n}\n\n@media (prefers-reduced-motion: reduce) {\n .button-filled {\n transition:\n background-color var(--effect-motion-short-2),\n color var(--effect-motion-short-2);\n }\n\n .button-filled:active:not(:disabled):not(.ds-control-inactive) {\n transform: none;\n }\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity). */\n\n.button-filled__icon-wrap {\n position: relative;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n z-index: 2;\n}\n\n.button-filled__label {\n position: relative;\n z-index: 2;\n padding: 0 var(--ds-control-label-inset, var(--dimension-space-025));\n white-space: nowrap;\n flex-shrink: 0;\n min-width: 0;\n}\n\n.button-filled__label--loading {\n visibility: hidden;\n}\n\n.button-filled > .button-filled__loader-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n/* ── Intent + contrast (bold default) ─────────────────────────────────────── */\n\n.button-filled--intent-neutral {\n --ds-button-filled-bg: var(--color-background-bold-neutral);\n --ds-button-filled-fg: var(--color-foreground-faint-neutral);\n}\n\n.button-filled--intent-brand {\n --ds-button-filled-bg: var(--color-background-bold-brand);\n --ds-button-filled-fg: var(--color-foreground-faint-brand);\n}\n\n.button-filled--intent-ai {\n --ds-button-filled-bg: var(--color-background-bold-ai);\n --ds-button-filled-fg: var(--color-foreground-faint-ai);\n}\n\n.button-filled--intent-negative {\n --ds-button-filled-bg: var(--color-background-bold-negative);\n --ds-button-filled-fg: var(--color-foreground-faint-negative);\n}\n\n.button-filled--intent-warning {\n --ds-button-filled-bg: var(--color-background-bold-warning);\n --ds-button-filled-fg: var(--color-foreground-faint-warning);\n}\n\n.button-filled--intent-caution {\n --ds-button-filled-bg: var(--color-background-bold-caution);\n --ds-button-filled-fg: var(--color-foreground-faint-caution);\n}\n\n.button-filled--intent-positive {\n --ds-button-filled-bg: var(--color-background-bold-positive);\n --ds-button-filled-fg: var(--color-foreground-faint-positive);\n}\n\n.button-filled--intent-guide {\n --ds-button-filled-bg: var(--color-background-bold-guide);\n --ds-button-filled-fg: var(--color-foreground-faint-guide);\n}\n\n.button-filled--intent-walkthrough {\n --ds-button-filled-bg: var(--color-background-bold-walkthrough);\n --ds-button-filled-fg: var(--color-foreground-faint-walkthrough);\n}\n\n/* strong → medium fg */\n.button-filled--contrast-strong.button-filled--intent-neutral {\n --ds-button-filled-bg: var(--color-background-strong-neutral);\n --ds-button-filled-fg: var(--color-foreground-medium-neutral);\n}\n\n.button-filled--contrast-strong.button-filled--intent-brand {\n --ds-button-filled-bg: var(--color-background-strong-brand);\n --ds-button-filled-fg: var(--color-foreground-medium-brand);\n}\n\n.button-filled--contrast-strong.button-filled--intent-ai {\n --ds-button-filled-bg: var(--color-background-strong-ai);\n --ds-button-filled-fg: var(--color-foreground-medium-ai);\n}\n\n.button-filled--contrast-strong.button-filled--intent-negative {\n --ds-button-filled-bg: var(--color-background-strong-negative);\n --ds-button-filled-fg: var(--color-foreground-medium-negative);\n}\n\n.button-filled--contrast-strong.button-filled--intent-warning {\n --ds-button-filled-bg: var(--color-background-strong-warning);\n --ds-button-filled-fg: var(--color-foreground-medium-warning);\n}\n\n.button-filled--contrast-strong.button-filled--intent-caution {\n --ds-button-filled-bg: var(--color-background-strong-caution);\n --ds-button-filled-fg: var(--color-foreground-medium-caution);\n}\n\n.button-filled--contrast-strong.button-filled--intent-positive {\n --ds-button-filled-bg: var(--color-background-strong-positive);\n --ds-button-filled-fg: var(--color-foreground-medium-positive);\n}\n\n.button-filled--contrast-strong.button-filled--intent-guide {\n --ds-button-filled-bg: var(--color-background-strong-guide);\n --ds-button-filled-fg: var(--color-foreground-medium-guide);\n}\n\n.button-filled--contrast-strong.button-filled--intent-walkthrough {\n --ds-button-filled-bg: var(--color-background-strong-walkthrough);\n --ds-button-filled-fg: var(--color-foreground-medium-walkthrough);\n}\n\n/* medium → strong fg */\n.button-filled--contrast-medium.button-filled--intent-neutral {\n --ds-button-filled-bg: var(--color-background-medium-neutral);\n --ds-button-filled-fg: var(--color-foreground-strong-neutral);\n}\n\n.button-filled--contrast-medium.button-filled--intent-brand {\n --ds-button-filled-bg: var(--color-background-medium-brand);\n --ds-button-filled-fg: var(--color-foreground-strong-brand);\n}\n\n.button-filled--contrast-medium.button-filled--intent-ai {\n --ds-button-filled-bg: var(--color-background-medium-ai);\n --ds-button-filled-fg: var(--color-foreground-strong-ai);\n}\n\n.button-filled--contrast-medium.button-filled--intent-negative {\n --ds-button-filled-bg: var(--color-background-medium-negative);\n --ds-button-filled-fg: var(--color-foreground-strong-negative);\n}\n\n.button-filled--contrast-medium.button-filled--intent-warning {\n --ds-button-filled-bg: var(--color-background-medium-warning);\n --ds-button-filled-fg: var(--color-foreground-strong-warning);\n}\n\n.button-filled--contrast-medium.button-filled--intent-caution {\n --ds-button-filled-bg: var(--color-background-medium-caution);\n --ds-button-filled-fg: var(--color-foreground-strong-caution);\n}\n\n.button-filled--contrast-medium.button-filled--intent-positive {\n --ds-button-filled-bg: var(--color-background-medium-positive);\n --ds-button-filled-fg: var(--color-foreground-strong-positive);\n}\n\n.button-filled--contrast-medium.button-filled--intent-guide {\n --ds-button-filled-bg: var(--color-background-medium-guide);\n --ds-button-filled-fg: var(--color-foreground-strong-guide);\n}\n\n.button-filled--contrast-medium.button-filled--intent-walkthrough {\n --ds-button-filled-bg: var(--color-background-medium-walkthrough);\n --ds-button-filled-fg: var(--color-foreground-strong-walkthrough);\n}\n\n/* faint → bold fg */\n.button-filled--contrast-faint.button-filled--intent-neutral {\n --ds-button-filled-bg: var(--color-background-faint-neutral);\n --ds-button-filled-fg: var(--color-foreground-bold-neutral);\n}\n\n.button-filled--contrast-faint.button-filled--intent-brand {\n --ds-button-filled-bg: var(--color-background-faint-brand);\n --ds-button-filled-fg: var(--color-foreground-bold-brand);\n}\n\n.button-filled--contrast-faint.button-filled--intent-ai {\n --ds-button-filled-bg: var(--color-background-faint-ai);\n --ds-button-filled-fg: var(--color-foreground-bold-ai);\n}\n\n.button-filled--contrast-faint.button-filled--intent-negative {\n --ds-button-filled-bg: var(--color-background-faint-negative);\n --ds-button-filled-fg: var(--color-foreground-bold-negative);\n}\n\n.button-filled--contrast-faint.button-filled--intent-warning {\n --ds-button-filled-bg: var(--color-background-faint-warning);\n --ds-button-filled-fg: var(--color-foreground-bold-warning);\n}\n\n.button-filled--contrast-faint.button-filled--intent-caution {\n --ds-button-filled-bg: var(--color-background-faint-caution);\n --ds-button-filled-fg: var(--color-foreground-bold-caution);\n}\n\n.button-filled--contrast-faint.button-filled--intent-positive {\n --ds-button-filled-bg: var(--color-background-faint-positive);\n --ds-button-filled-fg: var(--color-foreground-bold-positive);\n}\n\n.button-filled--contrast-faint.button-filled--intent-guide {\n --ds-button-filled-bg: var(--color-background-faint-guide);\n --ds-button-filled-fg: var(--color-foreground-bold-guide);\n}\n\n.button-filled--contrast-faint.button-filled--intent-walkthrough {\n --ds-button-filled-bg: var(--color-background-faint-walkthrough);\n --ds-button-filled-fg: var(--color-foreground-bold-walkthrough);\n}\n",
414
414
  "type": "registry:ui"
415
415
  },
416
416
  {
@@ -505,7 +505,7 @@
505
505
  "peerDependencies": {
506
506
  "required": [
507
507
  "@ds-mo/tokens ^3.1.1",
508
- "@ds-mo/icons ^6.3.0"
508
+ "@ds-mo/icons ^6.4.0"
509
509
  ],
510
510
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
511
511
  }
@@ -525,7 +525,7 @@
525
525
  "files": [
526
526
  {
527
527
  "path": "src/wc/components/ButtonUnfilled/ButtonUnfilled.css",
528
- "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-width.css';\n\n:host {\n display: inline-flex;\n outline: none;\n --ds-button-unfilled-fg: var(--color-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-secondary);\n --ds-button-unfilled-border: var(--color-border-secondary);\n}\n\n/* Icon-only: fixed square from density height (hug). Fill stretches the hit target. */\n:host(.button-unfilled-host--icon.ds-control-width--hug) {\n width: var(--ds-control-height, var(--dimension-size-400));\n height: var(--ds-control-height, var(--dimension-size-400));\n min-width: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.button-unfilled-host--icon.ds-control-width--fill) {\n height: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.ds-control-width--fill) .button-unfilled {\n width: 100%;\n}\n\n.button-unfilled {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n height: var(--ds-control-height, var(--dimension-size-400));\n padding: 0 var(--ds-control-padding-inline, var(--dimension-space-075));\n gap: var(--ds-control-gap, var(--dimension-space-050));\n background: transparent;\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n color: var(--ds-button-unfilled-fg);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n overflow: hidden;\n transition: color var(--effect-motion-short-2);\n /* Hover/press/selected fill: `.ds-interaction-fill` (+ `--selected` / `--on-*`).\n Active always promotes foreground to primary (toggle mode). */\n}\n\n.button-unfilled--icon {\n width: 100%;\n height: 100%;\n padding: 0;\n}\n\n.button-unfilled--rounded {\n --ds-control-radius: var(--dimension-radius-half);\n}\n\n.button-unfilled--active {\n color: var(--ds-button-unfilled-fg-active);\n}\n\n/*\n * An open popup is a transient pressed state, not a selected state. Keep the\n * pressed wash visible for the popup's complete rendered lifecycle even when\n * shell chrome opts out of selected fills with `activeFill=false`.\n */\n.button-unfilled.button-unfilled--expanded::after,\n.button-unfilled.button-unfilled--expanded:hover:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* Inset stroke via interaction-fill ::after (above selected / hover washes). */\n.button-unfilled--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-button-unfilled-border);\n}\n\n/* Fallback if interaction-fill is omitted (should be rare — prefer keep the util class). */\n.button-unfilled--bordered:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Inactive: `.ds-control-inactive` (25% opacity). */\n\n/* Foreground / chrome tokens per surface — interaction tokens come from util `--on-*`. */\n.button-unfilled--background-medium {\n --ds-button-unfilled-fg: var(--color-foreground-on-medium-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-medium-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-medium-neutral);\n --ds-button-unfilled-border: var(--color-border-on-medium-background-secondary);\n}\n\n.button-unfilled--background-bold {\n --ds-button-unfilled-fg: var(--color-foreground-on-bold-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-bold-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-bold-neutral);\n --ds-button-unfilled-border: var(--color-border-on-bold-background-secondary);\n}\n\n.button-unfilled--background-strong {\n --ds-button-unfilled-fg: var(--color-foreground-on-strong-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-strong-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-strong-neutral);\n --ds-button-unfilled-border: var(--color-border-on-strong-background-secondary);\n}\n\n.button-unfilled--background-translucent {\n --ds-button-unfilled-fg: var(--color-translucent-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-translucent-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-translucent-translucent);\n --ds-button-unfilled-border: var(--color-translucent-border-secondary);\n}\n\n.button-unfilled--background-inverted {\n --ds-button-unfilled-fg: var(--color-inverted-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-inverted-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-inverted-background);\n --ds-button-unfilled-border: var(--color-inverted-border-secondary);\n}\n\n.button-unfilled--background-media {\n --ds-button-unfilled-fg: var(--color-media-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-media-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-media-background);\n --ds-button-unfilled-border: var(--color-media-border-secondary);\n}\n\n.button-unfilled--on-always-dark {\n --ds-button-unfilled-fg: var(--color-always-dark-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-always-dark-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-always-dark-background);\n --ds-button-unfilled-border: var(--color-always-dark-border-secondary);\n}\n\n/*\n * After surface ring defaults: selected fill remaps the knock-out to the active\n * wash so the badge halo matches the selected background.\n */\n.button-unfilled.ds-interaction-fill--selected {\n --ds-button-unfilled-dot-ring: var(--ds-interaction-active);\n}\n\n.button-unfilled__icon-wrap {\n position: relative;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n z-index: 2;\n}\n\n.button-unfilled__label {\n position: relative;\n z-index: 2;\n padding: 0 var(--ds-control-label-inset, var(--dimension-space-025));\n white-space: nowrap;\n flex-shrink: 0;\n min-width: 0;\n}\n\n.button-unfilled__label--loading {\n visibility: hidden;\n}\n\n.button-unfilled > .button-unfilled__loader-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.button-unfilled__dot {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n pointer-events: none;\n}\n",
528
+ "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/control-density.css';\n@import '../../utils/control-width.css';\n\n:host {\n display: inline-flex;\n outline: none;\n --ds-button-unfilled-fg: var(--color-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-secondary);\n --ds-button-unfilled-border: var(--color-border-secondary);\n}\n\n/* Icon-only: fixed square from density height (hug). Fill stretches the hit target. */\n:host(.button-unfilled-host--icon.ds-control-width--hug) {\n width: var(--ds-control-height, var(--dimension-size-400));\n height: var(--ds-control-height, var(--dimension-size-400));\n min-width: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.button-unfilled-host--icon.ds-control-width--fill) {\n height: var(--ds-control-height, var(--dimension-size-400));\n min-height: var(--ds-control-height, var(--dimension-size-400));\n}\n\n:host(.ds-control-width--fill) .button-unfilled {\n width: 100%;\n}\n\n.button-unfilled {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n height: var(--ds-control-height, var(--dimension-size-400));\n padding: 0 var(--ds-control-padding-inline, var(--dimension-space-075));\n gap: var(--ds-control-gap, var(--dimension-space-050));\n background: transparent;\n border: none;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n color: var(--ds-button-unfilled-fg);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n overflow: hidden;\n transition: color var(--effect-motion-short-2);\n /* Hover/press/selected fill: `.ds-interaction-fill` (+ `--selected` / `--on-*`).\n Active always promotes foreground to primary (toggle mode). */\n}\n\n.button-unfilled--icon {\n width: 100%;\n height: 100%;\n padding: 0;\n}\n\n.button-unfilled--rounded {\n --ds-control-radius: var(--dimension-radius-half);\n}\n\n.button-unfilled--active {\n color: var(--ds-button-unfilled-fg-active);\n}\n\n/*\n * An open popup is a transient pressed state, not a selected state. Keep the\n * pressed wash visible for the popup's complete rendered lifecycle even when\n * shell chrome opts out of selected fills with `activeFill=false`.\n */\n.button-unfilled.button-unfilled--expanded::after,\n.button-unfilled.button-unfilled--expanded:hover:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* Inset stroke via interaction-fill ::after (above selected / hover washes). */\n.button-unfilled--bordered {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--ds-button-unfilled-border);\n}\n\n/* Fallback if interaction-fill is omitted (should be rare — prefer keep the util class). */\n.button-unfilled--bordered:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity). */\n\n/* Foreground / chrome tokens per surface — interaction tokens come from util `--on-*`. */\n.button-unfilled--background-medium {\n --ds-button-unfilled-fg: var(--color-foreground-on-medium-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-medium-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-medium-neutral);\n --ds-button-unfilled-border: var(--color-border-on-medium-background-secondary);\n}\n\n.button-unfilled--background-bold {\n --ds-button-unfilled-fg: var(--color-foreground-on-bold-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-bold-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-bold-neutral);\n --ds-button-unfilled-border: var(--color-border-on-bold-background-secondary);\n}\n\n.button-unfilled--background-strong {\n --ds-button-unfilled-fg: var(--color-foreground-on-strong-background-secondary);\n --ds-button-unfilled-fg-active: var(--color-foreground-on-strong-background-primary);\n --ds-button-unfilled-dot-ring: var(--color-background-strong-neutral);\n --ds-button-unfilled-border: var(--color-border-on-strong-background-secondary);\n}\n\n.button-unfilled--background-translucent {\n --ds-button-unfilled-fg: var(--color-translucent-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-translucent-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-translucent-translucent);\n --ds-button-unfilled-border: var(--color-translucent-border-secondary);\n}\n\n.button-unfilled--background-inverted {\n --ds-button-unfilled-fg: var(--color-inverted-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-inverted-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-inverted-background);\n --ds-button-unfilled-border: var(--color-inverted-border-secondary);\n}\n\n.button-unfilled--background-media {\n --ds-button-unfilled-fg: var(--color-media-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-media-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-media-background);\n --ds-button-unfilled-border: var(--color-media-border-secondary);\n}\n\n.button-unfilled--on-always-dark {\n --ds-button-unfilled-fg: var(--color-always-dark-foreground-secondary);\n --ds-button-unfilled-fg-active: var(--color-always-dark-foreground-primary);\n --ds-button-unfilled-dot-ring: var(--color-always-dark-background);\n --ds-button-unfilled-border: var(--color-always-dark-border-secondary);\n}\n\n/*\n * After surface ring defaults: selected fill remaps the knock-out to the active\n * wash so the badge halo matches the selected background.\n */\n.button-unfilled.ds-interaction-fill--selected {\n --ds-button-unfilled-dot-ring: var(--ds-interaction-active);\n}\n\n.button-unfilled__icon-wrap {\n position: relative;\n width: var(--ds-control-icon, var(--dimension-iconography-md));\n height: var(--ds-control-icon, var(--dimension-iconography-md));\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n z-index: 2;\n}\n\n.button-unfilled__label {\n position: relative;\n z-index: 2;\n padding: 0 var(--ds-control-label-inset, var(--dimension-space-025));\n white-space: nowrap;\n flex-shrink: 0;\n min-width: 0;\n}\n\n.button-unfilled__label--loading {\n visibility: hidden;\n}\n\n.button-unfilled > .button-unfilled__loader-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.button-unfilled__dot {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n pointer-events: none;\n}\n",
529
529
  "type": "registry:ui"
530
530
  },
531
531
  {
@@ -183,7 +183,7 @@
183
183
  "peerDependencies": {
184
184
  "required": [
185
185
  "@ds-mo/tokens ^3.1.1",
186
- "@ds-mo/icons ^6.3.0"
186
+ "@ds-mo/icons ^6.4.0"
187
187
  ],
188
188
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
189
189
  }
@@ -250,7 +250,7 @@
250
250
  "peerDependencies": {
251
251
  "required": [
252
252
  "@ds-mo/tokens ^3.1.1",
253
- "@ds-mo/icons ^6.3.0"
253
+ "@ds-mo/icons ^6.4.0"
254
254
  ],
255
255
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
256
256
  }
@@ -145,7 +145,7 @@
145
145
  "peerDependencies": {
146
146
  "required": [
147
147
  "@ds-mo/tokens ^3.1.1",
148
- "@ds-mo/icons ^6.3.0"
148
+ "@ds-mo/icons ^6.4.0"
149
149
  ],
150
150
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
151
151
  }
@@ -159,7 +159,7 @@
159
159
  "peerDependencies": {
160
160
  "required": [
161
161
  "@ds-mo/tokens ^3.1.1",
162
- "@ds-mo/icons ^6.3.0"
162
+ "@ds-mo/icons ^6.4.0"
163
163
  ],
164
164
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
165
165
  }
@@ -315,7 +315,7 @@
315
315
  "peerDependencies": {
316
316
  "required": [
317
317
  "@ds-mo/tokens ^3.1.1",
318
- "@ds-mo/icons ^6.3.0"
318
+ "@ds-mo/icons ^6.4.0"
319
319
  ],
320
320
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
321
321
  }
@@ -251,7 +251,7 @@
251
251
  "peerDependencies": {
252
252
  "required": [
253
253
  "@ds-mo/tokens ^3.1.1",
254
- "@ds-mo/icons ^6.3.0"
254
+ "@ds-mo/icons ^6.4.0"
255
255
  ],
256
256
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
257
257
  }
@@ -191,7 +191,7 @@
191
191
  "peerDependencies": {
192
192
  "required": [
193
193
  "@ds-mo/tokens ^3.1.1",
194
- "@ds-mo/icons ^6.3.0"
194
+ "@ds-mo/icons ^6.4.0"
195
195
  ],
196
196
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
197
197
  }
@@ -333,7 +333,7 @@
333
333
  "peerDependencies": {
334
334
  "required": [
335
335
  "@ds-mo/tokens ^3.1.1",
336
- "@ds-mo/icons ^6.3.0"
336
+ "@ds-mo/icons ^6.4.0"
337
337
  ],
338
338
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
339
339
  }
@@ -349,7 +349,7 @@
349
349
  "files": [
350
350
  {
351
351
  "path": "src/wc/components/Checkbox/Checkbox.css",
352
- "content": "@import '../../utils/control-inactive.css';\n@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n\n:host {\n display: inline-flex;\n align-items: center;\n box-sizing: border-box;\n gap: var(--ds-control-gap);\n height: var(--ds-control-height);\n padding: 0 var(--ds-control-padding-inline);\n border-radius: var(--ds-control-radius);\n cursor: pointer;\n user-select: none;\n}\n\n:host(.checkbox--presentation) {\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n padding: 0;\n gap: 0;\n pointer-events: none;\n}\n\n/* Inactive: `.ds-control-inactive` (25% opacity). */\n\n:host(.checkbox--md) {\n --_checkbox-box: var(--dimension-iconography-sm);\n --_checkbox-stroke: var(--dimension-stroke-width-015);\n}\n\n:host(.checkbox--sm) {\n --_checkbox-box: var(--dimension-iconography-xs);\n --_checkbox-stroke: var(--dimension-stroke-width-012);\n}\n\n:host(.checkbox--xs) {\n --_checkbox-box: var(--dimension-size-100);\n --_checkbox-stroke: calc(var(--dimension-stroke-width-base) * 3 / 32);\n}\n\n.checkbox__placement {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n}\n\n.box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--_checkbox-box);\n height: var(--_checkbox-box);\n border: 0;\n border-radius: var(--dimension-radius-025);\n box-shadow: inset 0 0 0 var(--_checkbox-stroke) var(--color-foreground-tertiary);\n transition:\n background-color var(--effect-motion-short-2),\n box-shadow var(--effect-motion-short-2);\n}\n\n.box--marked {\n color: var(--color-foreground-on-bold-background-primary);\n background-color: var(--color-background-bold-brand);\n box-shadow: none;\n}\n\n.checkbox__mark {\n width: 100%;\n height: 100%;\n flex-shrink: 0;\n stroke: currentColor;\n stroke-width: var(--_checkbox-stroke);\n stroke-linecap: butt;\n stroke-linejoin: round;\n}\n\n.checkbox__mark--checked {\n transform: translateY(-0.5px);\n}\n\n.checkbox__label {\n flex: 1;\n min-width: 0;\n padding: 0 var(--ds-control-label-inset);\n}\n",
352
+ "content": "@import '../../utils/control-inactive.css';\n@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n\n:host {\n display: inline-flex;\n align-items: center;\n box-sizing: border-box;\n gap: var(--ds-control-gap);\n height: var(--ds-control-height);\n padding: 0 var(--ds-control-padding-inline);\n border-radius: var(--ds-control-radius);\n cursor: pointer;\n user-select: none;\n}\n\n:host(.checkbox--presentation) {\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n padding: 0;\n gap: 0;\n pointer-events: none;\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity). */\n\n:host(.checkbox--md) {\n --_checkbox-box: var(--dimension-iconography-sm);\n --_checkbox-stroke: var(--dimension-stroke-width-015);\n}\n\n:host(.checkbox--sm) {\n --_checkbox-box: var(--dimension-iconography-xs);\n --_checkbox-stroke: var(--dimension-stroke-width-012);\n}\n\n:host(.checkbox--xs) {\n --_checkbox-box: var(--dimension-size-100);\n --_checkbox-stroke: calc(var(--dimension-stroke-width-base) * 3 / 32);\n}\n\n.checkbox__placement {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n}\n\n.box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--_checkbox-box);\n height: var(--_checkbox-box);\n border: 0;\n border-radius: var(--dimension-radius-025);\n box-shadow: inset 0 0 0 var(--_checkbox-stroke) var(--color-foreground-tertiary);\n transition:\n background-color var(--effect-motion-short-2),\n box-shadow var(--effect-motion-short-2);\n}\n\n.box--marked {\n color: var(--color-foreground-on-bold-background-primary);\n background-color: var(--color-background-bold-brand);\n box-shadow: none;\n}\n\n.checkbox__mark {\n width: 100%;\n height: 100%;\n flex-shrink: 0;\n stroke: currentColor;\n stroke-width: var(--_checkbox-stroke);\n stroke-linecap: butt;\n stroke-linejoin: round;\n}\n\n.checkbox__mark--checked {\n transform: translateY(-0.5px);\n}\n\n.checkbox__label {\n flex: 1;\n min-width: 0;\n padding: 0 var(--ds-control-label-inset);\n}\n",
353
353
  "type": "registry:ui"
354
354
  },
355
355
  {
@@ -246,7 +246,7 @@
246
246
  "peerDependencies": {
247
247
  "required": [
248
248
  "@ds-mo/tokens ^3.1.1",
249
- "@ds-mo/icons ^6.3.0"
249
+ "@ds-mo/icons ^6.4.0"
250
250
  ],
251
251
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
252
252
  }
@@ -121,7 +121,7 @@
121
121
  "peerDependencies": {
122
122
  "required": [
123
123
  "@ds-mo/tokens ^3.1.1",
124
- "@ds-mo/icons ^6.3.0"
124
+ "@ds-mo/icons ^6.4.0"
125
125
  ],
126
126
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
127
127
  }