@ds-mo/ui 13.13.0 → 13.15.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 (339) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +71 -21
  3. package/dist/agent.json +291 -74
  4. package/dist/angular/ds-agent-questionnaire.d.ts +19 -0
  5. package/dist/angular/ds-agent-questionnaire.js +46 -0
  6. package/dist/angular/ds-agent-response.d.ts +1 -1
  7. package/dist/angular/ds-agent-response.js +3 -3
  8. package/dist/angular/ds-agent-source-list.d.ts +9 -2
  9. package/dist/angular/ds-agent-source-list.js +7 -3
  10. package/dist/angular/ds-agent-tool-call.d.ts +9 -2
  11. package/dist/angular/ds-agent-tool-call.js +9 -5
  12. package/dist/angular/ds-button-filled.d.ts +1 -1
  13. package/dist/angular/ds-button-filled.js +3 -3
  14. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  15. package/dist/angular/ds-button-unfilled.js +3 -3
  16. package/dist/angular/ds-checkbox.d.ts +1 -1
  17. package/dist/angular/ds-checkbox.js +3 -3
  18. package/dist/angular/ds-message-composer.d.ts +1 -1
  19. package/dist/angular/ds-message-composer.js +3 -3
  20. package/dist/angular/ds-radio.js +2 -1
  21. package/dist/angular/ds-table.d.ts +4 -1
  22. package/dist/angular/ds-table.js +7 -4
  23. package/dist/angular/ds-tag.d.ts +1 -1
  24. package/dist/angular/ds-tag.js +3 -3
  25. package/dist/angular/index.d.ts +1 -1
  26. package/dist/angular/index.js +1 -0
  27. package/dist/angular/proxies.d.ts +1 -0
  28. package/dist/angular/proxies.js +1 -0
  29. package/dist/components/ds-agent-activity.js +1 -1
  30. package/dist/components/ds-agent-questionnaire.d.ts +24 -0
  31. package/dist/components/ds-agent-questionnaire.js +2 -0
  32. package/dist/components/ds-agent-questionnaire.js.map +1 -0
  33. package/dist/components/ds-agent-response.js +1 -1
  34. package/dist/components/ds-agent-response.js.map +1 -1
  35. package/dist/components/ds-agent-source-list.js +1 -1
  36. package/dist/components/ds-agent-tool-call.js +1 -1
  37. package/dist/components/ds-attachment-list.js +1 -1
  38. package/dist/components/ds-avatar.js +1 -1
  39. package/dist/components/ds-badge.js +1 -1
  40. package/dist/components/ds-banner.js +1 -1
  41. package/dist/components/ds-bar-nav.js +1 -1
  42. package/dist/components/ds-bar-title.js +1 -1
  43. package/dist/components/ds-bar-workflow.js +1 -1
  44. package/dist/components/ds-breadcrumb.js +1 -1
  45. package/dist/components/ds-button-filled.js +1 -1
  46. package/dist/components/ds-button-unfilled.js +1 -1
  47. package/dist/components/ds-card-chart.js +1 -1
  48. package/dist/components/ds-card-overview.js +1 -1
  49. package/dist/components/ds-card-overview.js.map +1 -1
  50. package/dist/components/ds-card-setting.js +1 -1
  51. package/dist/components/ds-chart-legend.js +1 -1
  52. package/dist/components/ds-chart-legend.js.map +1 -1
  53. package/dist/components/ds-chart.js +1 -1
  54. package/dist/components/ds-chart.js.map +1 -1
  55. package/dist/components/ds-checkbox.js +1 -1
  56. package/dist/components/ds-chip.js +1 -1
  57. package/dist/components/ds-chip.js.map +1 -1
  58. package/dist/components/ds-code-block.js +1 -1
  59. package/dist/components/ds-conversation-list-item.js +1 -1
  60. package/dist/components/ds-conversation-list-item.js.map +1 -1
  61. package/dist/components/ds-conversation-list-section.js +1 -1
  62. package/dist/components/ds-conversation-list.js +1 -1
  63. package/dist/components/ds-divider.js +1 -1
  64. package/dist/components/ds-empty-state.js +1 -1
  65. package/dist/components/ds-field.js +1 -1
  66. package/dist/components/ds-icon.js +1 -1
  67. package/dist/components/ds-input.js +1 -1
  68. package/dist/components/ds-input.js.map +1 -1
  69. package/dist/components/ds-markdown.js +1 -1
  70. package/dist/components/ds-menu.js +1 -1
  71. package/dist/components/ds-message-actions.js +1 -1
  72. package/dist/components/ds-message-bubble.js +1 -1
  73. package/dist/components/ds-message-bubble.js.map +1 -1
  74. package/dist/components/ds-message-composer.js +1 -1
  75. package/dist/components/ds-message-composer.js.map +1 -1
  76. package/dist/components/ds-message-scroller.js +1 -1
  77. package/dist/components/ds-message-scroller.js.map +1 -1
  78. package/dist/components/ds-message.js +1 -1
  79. package/dist/components/ds-mobile-bar-nav.js +1 -1
  80. package/dist/components/ds-mobile-header.js +1 -1
  81. package/dist/components/ds-mobile-section-switcher.js +1 -1
  82. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  83. package/dist/components/ds-modal.js +1 -1
  84. package/dist/components/ds-panel-nav.js +1 -1
  85. package/dist/components/ds-panel-sub-nav.js +1 -1
  86. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  87. package/dist/components/ds-panel-tool-header.js +1 -1
  88. package/dist/components/ds-panel-tool-search.js +1 -1
  89. package/dist/components/ds-panel-tools.js +1 -1
  90. package/dist/components/ds-radio.js +1 -1
  91. package/dist/components/ds-radio.js.map +1 -1
  92. package/dist/components/ds-scroll-overlay.js +1 -1
  93. package/dist/components/ds-select.js +1 -1
  94. package/dist/components/ds-select.js.map +1 -1
  95. package/dist/components/ds-shell-app.js +1 -1
  96. package/dist/components/ds-shell-app.js.map +1 -1
  97. package/dist/components/ds-shell-page.js +1 -1
  98. package/dist/components/ds-shell-tools.js +1 -1
  99. package/dist/components/ds-skeleton.js +1 -1
  100. package/dist/components/ds-slider.js +1 -1
  101. package/dist/components/ds-slider.js.map +1 -1
  102. package/dist/components/ds-swatch-picker.js +1 -1
  103. package/dist/components/ds-switch.js +1 -1
  104. package/dist/components/ds-tab-group.js +1 -1
  105. package/dist/components/ds-table.js +1 -1
  106. package/dist/components/ds-table.js.map +1 -1
  107. package/dist/components/ds-tag.js +1 -1
  108. package/dist/components/ds-text.js +1 -1
  109. package/dist/components/ds-toast.js +1 -1
  110. package/dist/components/ds-tooltip-chart.js +1 -1
  111. package/dist/components/ds-tooltip.js +1 -1
  112. package/dist/components/ds-typing-indicator.js +1 -1
  113. package/dist/components/index.d.ts +10 -0
  114. package/dist/components/{p-PQgDzzn9.js → p-00or0yGw.js} +2 -2
  115. package/dist/components/p-B2SoinWf.js +2 -0
  116. package/dist/components/p-B2SoinWf.js.map +1 -0
  117. package/dist/components/{p-DGkWMhHO.js → p-B69Re7HW.js} +2 -2
  118. package/dist/components/p-BH_lVRgp.js +2 -0
  119. package/dist/components/{p-CCYgBUUS.js.map → p-BH_lVRgp.js.map} +1 -1
  120. package/dist/components/p-BLaqjUWu.js +2 -0
  121. package/dist/components/{p-Cw1bbiCG.js.map → p-BLaqjUWu.js.map} +1 -1
  122. package/dist/components/{p-B6z51yBf.js → p-BNkU9dcc.js} +2 -2
  123. package/dist/components/{p-DBchq8Zw.js → p-BRze4tRe.js} +2 -2
  124. package/dist/components/p-BtUgncSJ.js +2 -0
  125. package/dist/components/p-BtUgncSJ.js.map +1 -0
  126. package/dist/components/p-C891ueIx.js +2 -0
  127. package/dist/components/p-C891ueIx.js.map +1 -0
  128. package/dist/components/p-C8U5BsJf.js +2 -0
  129. package/dist/components/p-C8U5BsJf.js.map +1 -0
  130. package/dist/components/p-CCkptWPj.js +2 -0
  131. package/dist/components/p-CCkptWPj.js.map +1 -0
  132. package/dist/components/p-CKo3OFG1.js +2 -0
  133. package/dist/components/p-CKo3OFG1.js.map +1 -0
  134. package/dist/components/p-CXduurfd.js.map +1 -1
  135. package/dist/components/{p-DLwM1RNL.js → p-CdKz-QT2.js} +2 -2
  136. package/dist/components/p-CdKz-QT2.js.map +1 -0
  137. package/dist/components/p-CekGwihQ.js +2 -0
  138. package/dist/components/{p-CSlTJWFG.js.map → p-CekGwihQ.js.map} +1 -1
  139. package/dist/components/p-ClHpIZg0.js +2 -0
  140. package/dist/components/p-ClHpIZg0.js.map +1 -0
  141. package/dist/components/p-CnUq7E8S.js +2 -0
  142. package/dist/components/p-CnUq7E8S.js.map +1 -0
  143. package/dist/components/{p-C9StMCWg.js → p-Cohb8T7G.js} +2 -2
  144. package/dist/components/p-CqDJRVT8.js +2 -0
  145. package/dist/components/p-CqDJRVT8.js.map +1 -0
  146. package/dist/components/p-CsXC1cHI.js +2 -0
  147. package/dist/components/{p-DGvzGGcu.js.map → p-CsXC1cHI.js.map} +1 -1
  148. package/dist/components/p-CuwopElg.js.map +1 -1
  149. package/dist/components/p-D4j0deyd.js +2 -0
  150. package/dist/components/{p-CzV4gIxd.js.map → p-D4j0deyd.js.map} +1 -1
  151. package/dist/components/p-D5aUkdTw.js +2 -0
  152. package/dist/components/p-D5aUkdTw.js.map +1 -0
  153. package/dist/components/p-DQXzTV8N.js +2 -0
  154. package/dist/components/p-DQXzTV8N.js.map +1 -0
  155. package/dist/components/p-DStd98dM.js +2 -0
  156. package/dist/components/p-DStd98dM.js.map +1 -0
  157. package/dist/components/p-DWNhyLp2.js +2 -0
  158. package/dist/components/{p-B1JB0Zn-.js.map → p-DWNhyLp2.js.map} +1 -1
  159. package/dist/components/p-DWjE0VNn.js +2 -0
  160. package/dist/components/p-DWjE0VNn.js.map +1 -0
  161. package/dist/components/{p-BFMV9TJO.js → p-DgIRyJoc.js} +2 -2
  162. package/dist/components/{p-BNiIyZCn.js → p-Dhx_3_tf.js} +2 -2
  163. package/dist/components/p-Dhx_3_tf.js.map +1 -0
  164. package/dist/components/{p-CE82aQZr.js → p-DyVAWGL9.js} +2 -2
  165. package/dist/components/p-GSnB-sa7.js +2 -0
  166. package/dist/components/p-GSnB-sa7.js.map +1 -0
  167. package/dist/components/p-GWUTrIlk.js +2 -0
  168. package/dist/components/p-GWUTrIlk.js.map +1 -0
  169. package/dist/components/p-IhToA4m4.js +2 -0
  170. package/dist/components/{p-cPh32CFB.js.map → p-IhToA4m4.js.map} +1 -1
  171. package/dist/components/p-NQOI5gN1.js +2 -0
  172. package/dist/components/p-NQOI5gN1.js.map +1 -0
  173. package/dist/components/p-QDcUAz9m.js +2 -0
  174. package/dist/components/{p-BNHPCCw8.js.map → p-QDcUAz9m.js.map} +1 -1
  175. package/dist/components/p-Qf-os3lG.js +2 -0
  176. package/dist/components/p-Qf-os3lG.js.map +1 -0
  177. package/dist/components/{p-DBJJiSP0.js → p-chA2WA5x.js} +2 -2
  178. package/dist/components/{p-DwKC_9u2.js → p-dEouiXJ8.js} +2 -2
  179. package/dist/components/{p-BAGTb6cZ.js → p-fKwbYrhi.js} +2 -2
  180. package/dist/docs/components.json +942 -20
  181. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +4 -0
  182. package/dist/lib/utils/control-text.d.ts +2 -0
  183. package/dist/lib/utils/index.d.ts +1 -1
  184. package/dist/lib/utils/index.js.map +2 -2
  185. package/dist/mcp-data/registry/agent-activity.json +2 -2
  186. package/dist/mcp-data/registry/agent-questionnaire.json +273 -0
  187. package/dist/mcp-data/registry/agent-response.json +33 -12
  188. package/dist/mcp-data/registry/agent-source-list.json +34 -14
  189. package/dist/mcp-data/registry/agent-tool-call.json +60 -19
  190. package/dist/mcp-data/registry/attachment-list.json +2 -2
  191. package/dist/mcp-data/registry/avatar.json +2 -2
  192. package/dist/mcp-data/registry/badge.json +2 -2
  193. package/dist/mcp-data/registry/banner.json +2 -2
  194. package/dist/mcp-data/registry/bar-nav.json +3 -3
  195. package/dist/mcp-data/registry/bar-title.json +3 -3
  196. package/dist/mcp-data/registry/bar-workflow.json +2 -2
  197. package/dist/mcp-data/registry/breadcrumb.json +3 -3
  198. package/dist/mcp-data/registry/button-filled.json +22 -4
  199. package/dist/mcp-data/registry/button-unfilled.json +28 -8
  200. package/dist/mcp-data/registry/card-chart.json +2 -2
  201. package/dist/mcp-data/registry/card-overview.json +2 -2
  202. package/dist/mcp-data/registry/card-setting.json +2 -2
  203. package/dist/mcp-data/registry/chart-legend.json +3 -3
  204. package/dist/mcp-data/registry/chart.json +3 -3
  205. package/dist/mcp-data/registry/checkbox.json +27 -10
  206. package/dist/mcp-data/registry/chip.json +3 -3
  207. package/dist/mcp-data/registry/code-block.json +15 -7
  208. package/dist/mcp-data/registry/conversation-list-item.json +3 -3
  209. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  210. package/dist/mcp-data/registry/conversation-list.json +2 -2
  211. package/dist/mcp-data/registry/divider.json +2 -2
  212. package/dist/mcp-data/registry/empty-state.json +2 -2
  213. package/dist/mcp-data/registry/field.json +2 -2
  214. package/dist/mcp-data/registry/icon.json +3 -3
  215. package/dist/mcp-data/registry/input.json +2 -2
  216. package/dist/mcp-data/registry/loader.json +2 -2
  217. package/dist/mcp-data/registry/markdown.json +2 -2
  218. package/dist/mcp-data/registry/menu.json +3 -3
  219. package/dist/mcp-data/registry/message-actions.json +2 -2
  220. package/dist/mcp-data/registry/message-bubble.json +3 -3
  221. package/dist/mcp-data/registry/message-composer.json +31 -9
  222. package/dist/mcp-data/registry/message-scroller.json +18 -10
  223. package/dist/mcp-data/registry/message.json +2 -2
  224. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  225. package/dist/mcp-data/registry/mobile-header.json +2 -2
  226. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  227. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  228. package/dist/mcp-data/registry/modal.json +2 -2
  229. package/dist/mcp-data/registry/panel-nav.json +3 -3
  230. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  231. package/dist/mcp-data/registry/panel-tool-header.json +2 -2
  232. package/dist/mcp-data/registry/panel-tool-search.json +2 -2
  233. package/dist/mcp-data/registry/panel-tools.json +3 -3
  234. package/dist/mcp-data/registry/radio.json +25 -12
  235. package/dist/mcp-data/registry/registry.json +295 -75
  236. package/dist/mcp-data/registry/scroll-overlay.json +2 -2
  237. package/dist/mcp-data/registry/select.json +3 -3
  238. package/dist/mcp-data/registry/shell-app.json +3 -3
  239. package/dist/mcp-data/registry/shell-page.json +2 -2
  240. package/dist/mcp-data/registry/shell-tools.json +2 -2
  241. package/dist/mcp-data/registry/skeleton.json +2 -2
  242. package/dist/mcp-data/registry/slider.json +3 -3
  243. package/dist/mcp-data/registry/swatch-picker.json +3 -3
  244. package/dist/mcp-data/registry/switch.json +3 -3
  245. package/dist/mcp-data/registry/tab-group.json +2 -2
  246. package/dist/mcp-data/registry/table.json +122 -21
  247. package/dist/mcp-data/registry/tag.json +24 -6
  248. package/dist/mcp-data/registry/text.json +3 -3
  249. package/dist/mcp-data/registry/toast.json +2 -2
  250. package/dist/mcp-data/registry/tooltip-chart.json +6 -4
  251. package/dist/mcp-data/registry/tooltip.json +2 -2
  252. package/dist/mcp-data/registry/typing-indicator.json +2 -2
  253. package/dist/react/components.d.ts +1 -0
  254. package/dist/react/components.js +1 -0
  255. package/dist/react/ds-agent-questionnaire.d.ts +13 -0
  256. package/dist/react/ds-agent-questionnaire.js +15 -0
  257. package/dist/react/ds-agent-source-list.d.ts +7 -2
  258. package/dist/react/ds-agent-source-list.js +1 -1
  259. package/dist/react/ds-agent-tool-call.d.ts +7 -2
  260. package/dist/react/ds-agent-tool-call.js +1 -1
  261. package/dist/react/ds-table.d.ts +2 -1
  262. package/dist/react/ds-table.js +1 -0
  263. package/dist/styles/prose.css +21 -4
  264. package/dist/styles/table.css +244 -26
  265. package/dist/types/components/AgentQuestionnaire/AgentQuestionnaire.d.ts +49 -0
  266. package/dist/types/components/AgentQuestionnaire/agent-questionnaire-model.d.ts +13 -0
  267. package/dist/types/components/AgentResponse/AgentResponse.d.ts +3 -1
  268. package/dist/types/components/AgentSourceList/AgentSourceList.d.ts +5 -0
  269. package/dist/types/components/AgentToolCall/AgentToolCall.d.ts +21 -0
  270. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +4 -0
  271. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +11 -1
  272. package/dist/types/components/Checkbox/Checkbox.d.ts +3 -0
  273. package/dist/types/components/MessageComposer/MessageComposer.d.ts +3 -0
  274. package/dist/types/components/MessageScroller/MessageScroller.d.ts +21 -1
  275. package/dist/types/components/Radio/Radio.d.ts +4 -0
  276. package/dist/types/components/Table/Table.d.ts +31 -23
  277. package/dist/types/components/Table/index.d.ts +1 -1
  278. package/dist/types/components/Table/table-cell-model.d.ts +44 -0
  279. package/dist/types/components/Table/table-layout-controller.d.ts +65 -0
  280. package/dist/types/components/Table/table-load-controller.d.ts +49 -0
  281. package/dist/types/components/Table/table-model.d.ts +25 -0
  282. package/dist/types/components/Table/table-render-model.d.ts +41 -0
  283. package/dist/types/components/Table/table-types.d.ts +23 -2
  284. package/dist/types/components/Tag/Tag.d.ts +3 -0
  285. package/dist/types/components/conversation-types.d.ts +51 -2
  286. package/dist/types/components.d.ts +231 -10
  287. package/dist/types/utils/control-text.d.ts +2 -0
  288. package/dist/types/utils/index.d.ts +1 -1
  289. package/package.json +7 -5
  290. package/dist/components/p-B1JB0Zn-.js +0 -2
  291. package/dist/components/p-B2t8alvH.js +0 -2
  292. package/dist/components/p-B2t8alvH.js.map +0 -1
  293. package/dist/components/p-BEEYhbIb.js +0 -2
  294. package/dist/components/p-BEEYhbIb.js.map +0 -1
  295. package/dist/components/p-BNHPCCw8.js +0 -2
  296. package/dist/components/p-BNiIyZCn.js.map +0 -1
  297. package/dist/components/p-BUZLhvs1.js +0 -2
  298. package/dist/components/p-BUZLhvs1.js.map +0 -1
  299. package/dist/components/p-BgaF83uh.js +0 -2
  300. package/dist/components/p-BgaF83uh.js.map +0 -1
  301. package/dist/components/p-Br0fwWUG.js +0 -2
  302. package/dist/components/p-Br0fwWUG.js.map +0 -1
  303. package/dist/components/p-BydCwx7x.js +0 -2
  304. package/dist/components/p-BydCwx7x.js.map +0 -1
  305. package/dist/components/p-C3Z01Glr.js +0 -2
  306. package/dist/components/p-C3Z01Glr.js.map +0 -1
  307. package/dist/components/p-CCYgBUUS.js +0 -2
  308. package/dist/components/p-CSlTJWFG.js +0 -2
  309. package/dist/components/p-CdFnvBem.js +0 -2
  310. package/dist/components/p-CdFnvBem.js.map +0 -1
  311. package/dist/components/p-Ch5yT3UA.js +0 -2
  312. package/dist/components/p-Ch5yT3UA.js.map +0 -1
  313. package/dist/components/p-Cw1bbiCG.js +0 -2
  314. package/dist/components/p-CzV4gIxd.js +0 -2
  315. package/dist/components/p-D-F8eyXy.js +0 -2
  316. package/dist/components/p-D-F8eyXy.js.map +0 -1
  317. package/dist/components/p-D6g070eY.js +0 -2
  318. package/dist/components/p-D6g070eY.js.map +0 -1
  319. package/dist/components/p-DGvzGGcu.js +0 -2
  320. package/dist/components/p-DLwM1RNL.js.map +0 -1
  321. package/dist/components/p-DmblUQ4D.js +0 -2
  322. package/dist/components/p-DmblUQ4D.js.map +0 -1
  323. package/dist/components/p-Doz2uwRv.js +0 -2
  324. package/dist/components/p-Doz2uwRv.js.map +0 -1
  325. package/dist/components/p-DumWT7NN.js +0 -2
  326. package/dist/components/p-DumWT7NN.js.map +0 -1
  327. package/dist/components/p-bLCbOPYa.js +0 -2
  328. package/dist/components/p-bLCbOPYa.js.map +0 -1
  329. package/dist/components/p-cPh32CFB.js +0 -2
  330. /package/dist/components/{p-PQgDzzn9.js.map → p-00or0yGw.js.map} +0 -0
  331. /package/dist/components/{p-DGkWMhHO.js.map → p-B69Re7HW.js.map} +0 -0
  332. /package/dist/components/{p-B6z51yBf.js.map → p-BNkU9dcc.js.map} +0 -0
  333. /package/dist/components/{p-DBchq8Zw.js.map → p-BRze4tRe.js.map} +0 -0
  334. /package/dist/components/{p-C9StMCWg.js.map → p-Cohb8T7G.js.map} +0 -0
  335. /package/dist/components/{p-BFMV9TJO.js.map → p-DgIRyJoc.js.map} +0 -0
  336. /package/dist/components/{p-CE82aQZr.js.map → p-DyVAWGL9.js.map} +0 -0
  337. /package/dist/components/{p-DBJJiSP0.js.map → p-chA2WA5x.js.map} +0 -0
  338. /package/dist/components/{p-DwKC_9u2.js.map → p-dEouiXJ8.js.map} +0 -0
  339. /package/dist/components/{p-BAGTb6cZ.js.map → p-fKwbYrhi.js.map} +0 -0
@@ -62,8 +62,8 @@
62
62
  "Neutral is ordinary metadata; brand marks Motive or product affiliation; AI marks AI-generated or AI-assisted content; positive, caution, warning, and negative communicate increasingly specific status meaning.",
63
63
  "Warning signals higher urgency or risk than caution, which asks for attention before a possible issue.",
64
64
  "Contrast changes visual prominence without changing semantic intent or parent surface context.",
65
- "Rounded is an optional visual style with no semantic difference.",
66
- "isInset opts into reduced outer geometry only when Tag is nested inside a control of the same density; semantic styling, typography, icons, gaps, radius, and interaction remain unchanged.",
65
+ "Rounded is an optional visual style with no semantic difference. Every size and inset depth keeps a minimum inline size equal to its resolved height, so short labels such as a one-digit count render as circles instead of vertically elongated pills.",
66
+ "isInset opts into reduced outer geometry only when Tag is nested inside a control of the same density. The default single inset removes 4px overall; insetDepth double removes 8px overall and falls back to single at xs to protect minimum icon geometry. Semantic styling, typography, icons, gaps, radius, and interaction remain unchanged.",
67
67
  "Labels stay on one line and truncate only when the owner supplies a maximum width.",
68
68
  "Omitted interactive renders static metadata with no focus, event, or suffix. Interactive adds the fixed ChevronUpDown suffix and emits dsClick without toggling expanded internally.",
69
69
  "isInactive disables only the interactive button and applies the shared inactive treatment."
@@ -126,6 +126,15 @@
126
126
  "mutable": false,
127
127
  "description": "Canonical icon name rendered before the visible label."
128
128
  },
129
+ "insetDepth": {
130
+ "type": "ControlInsetDepth",
131
+ "resolvedType": "\"double\" | \"single\"",
132
+ "attribute": "inset-depth",
133
+ "default": "'single'",
134
+ "required": false,
135
+ "mutable": false,
136
+ "description": "Single removes 4px overall; double removes 8px overall (xs stays single)."
137
+ },
129
138
  "intent": {
130
139
  "type": "TagIntent",
131
140
  "resolvedType": "\"ai\" | \"brand\" | \"caution\" | \"negative\" | \"neutral\" | \"positive\" | \"warning\"",
@@ -240,6 +249,15 @@
240
249
  "mutable": false,
241
250
  "description": "Canonical icon name rendered before the visible label."
242
251
  },
252
+ "insetDepth": {
253
+ "type": "ControlInsetDepth",
254
+ "resolvedType": "\"double\" | \"single\"",
255
+ "attribute": "inset-depth",
256
+ "default": "'single'",
257
+ "required": false,
258
+ "mutable": false,
259
+ "description": "Single removes 4px overall; double removes 8px overall (xs stays single)."
260
+ },
243
261
  "intent": {
244
262
  "type": "TagIntent",
245
263
  "resolvedType": "\"ai\" | \"brand\" | \"caution\" | \"negative\" | \"neutral\" | \"positive\" | \"warning\"",
@@ -340,8 +358,8 @@
340
358
  },
341
359
  "peerDependencies": {
342
360
  "required": [
343
- "@ds-mo/tokens ^6.0.0",
344
- "@ds-mo/icons ^6.5.0"
361
+ "@ds-mo/tokens ^6.2.1",
362
+ "@ds-mo/icons ^6.6.0"
345
363
  ],
346
364
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
347
365
  }
@@ -359,12 +377,12 @@
359
377
  "files": [
360
378
  {
361
379
  "path": "src/wc/components/Tag/Tag.css",
362
- "content": "@import '../../utils/tag-chip.css';\n@import '../../utils/control-density-inset.css';\n\n/* ── Intent × Contrast — strong ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-strong) { background-color: var(--color-background-strong-neutral); color: var(--color-foreground-medium-neutral); }\n:host(.tag--intent-brand.tag--contrast-strong) { background-color: var(--color-background-strong-brand); color: var(--color-foreground-on-strong-background-primary); }\n:host(.tag--intent-ai.tag--contrast-strong) { background-color: var(--color-background-strong-ai); color: var(--color-foreground-medium-ai); }\n:host(.tag--intent-negative.tag--contrast-strong) { background-color: var(--color-background-strong-negative); color: var(--color-foreground-medium-negative); }\n:host(.tag--intent-warning.tag--contrast-strong) { background-color: var(--color-background-strong-warning); color: var(--color-foreground-medium-warning); }\n:host(.tag--intent-caution.tag--contrast-strong) { background-color: var(--color-background-strong-caution); color: var(--color-foreground-medium-caution); }\n:host(.tag--intent-positive.tag--contrast-strong) { background-color: var(--color-background-strong-positive); color: var(--color-foreground-medium-positive); }\n\n/* ── Intent × Contrast — bold ───────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-bold) { background-color: var(--color-background-bold-neutral); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-brand.tag--contrast-bold) { background-color: var(--color-background-bold-brand); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-ai.tag--contrast-bold) { background-color: var(--color-background-bold-ai); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-negative.tag--contrast-bold) { background-color: var(--color-background-bold-negative); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-warning.tag--contrast-bold) { background-color: var(--color-background-bold-warning); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-caution.tag--contrast-bold) { background-color: var(--color-background-bold-caution); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-positive.tag--contrast-bold) { background-color: var(--color-background-bold-positive); color: var(--color-foreground-on-bold-background-primary); }\n\n/* ── Intent × Contrast — medium ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-medium) { background-color: var(--color-background-medium-neutral); color: var(--color-foreground-strong-neutral); }\n:host(.tag--intent-brand.tag--contrast-medium) { background-color: var(--color-background-medium-brand); color: var(--color-foreground-on-medium-background-primary); }\n:host(.tag--intent-ai.tag--contrast-medium) { background-color: var(--color-background-medium-ai); color: var(--color-foreground-strong-ai); }\n:host(.tag--intent-negative.tag--contrast-medium) { background-color: var(--color-background-medium-negative); color: var(--color-foreground-strong-negative); }\n:host(.tag--intent-warning.tag--contrast-medium) { background-color: var(--color-background-medium-warning); color: var(--color-foreground-strong-warning); }\n:host(.tag--intent-caution.tag--contrast-medium) { background-color: var(--color-background-medium-caution); color: var(--color-foreground-strong-caution); }\n:host(.tag--intent-positive.tag--contrast-medium) { background-color: var(--color-background-medium-positive); color: var(--color-foreground-strong-positive); }\n\n/* ── Intent × Contrast — faint ──────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-faint) { background-color: var(--color-background-faint-neutral); color: var(--color-foreground-bold-neutral); }\n:host(.tag--intent-brand.tag--contrast-faint) { background-color: var(--color-background-faint-brand); color: var(--color-foreground-bold-brand); }\n:host(.tag--intent-ai.tag--contrast-faint) { background-color: var(--color-background-faint-ai); color: var(--color-foreground-bold-ai); }\n:host(.tag--intent-negative.tag--contrast-faint) { background-color: var(--color-background-faint-negative); color: var(--color-foreground-bold-negative); }\n:host(.tag--intent-warning.tag--contrast-faint) { background-color: var(--color-background-faint-warning); color: var(--color-foreground-bold-warning); }\n:host(.tag--intent-caution.tag--contrast-faint) { background-color: var(--color-background-faint-caution); color: var(--color-foreground-bold-caution); }\n:host(.tag--intent-positive.tag--contrast-faint) { background-color: var(--color-background-faint-positive); color: var(--color-foreground-bold-positive); }\n\n/* ── Interactive menu trigger ───────────────────────────────────────────── */\n\n:host(.tag--interactive) {\n padding: 0;\n gap: 0;\n}\n\n.tag__button {\n all: unset;\n position: relative;\n z-index: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n height: 100%;\n padding: 0 var(--ds-control-padding-inline);\n gap: var(--ds-control-gap);\n border-radius: inherit;\n color: inherit;\n cursor: default;\n}\n\n.tag__button:disabled {\n cursor: not-allowed;\n}\n\n.tag__button--expanded::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* Hover/press wash stays above the Tag's semantic background. */\n\n/* ── Icons ──────────────────────────────────────────────────────────────── */\n\n.tag__prefix-icon,\n.tag__suffix-icon {\n position: relative;\n z-index: 2;\n display: inline-flex;\n flex-shrink: 0;\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n}\n",
380
+ "content": "@import '../../utils/tag-chip.css';\n@import '../../utils/control-density-inset.css';\n\n/* A one-character rounded Tag resolves to a circle at every density. */\n:host {\n min-inline-size: var(--ds-control-height);\n}\n\n/* ── Intent × Contrast — strong ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-strong) { background-color: var(--color-background-strong-neutral); color: var(--color-foreground-medium-neutral); }\n:host(.tag--intent-brand.tag--contrast-strong) { background-color: var(--color-background-strong-brand); color: var(--color-foreground-on-strong-background-primary); }\n:host(.tag--intent-ai.tag--contrast-strong) { background-color: var(--color-background-strong-ai); color: var(--color-foreground-medium-ai); }\n:host(.tag--intent-negative.tag--contrast-strong) { background-color: var(--color-background-strong-negative); color: var(--color-foreground-medium-negative); }\n:host(.tag--intent-warning.tag--contrast-strong) { background-color: var(--color-background-strong-warning); color: var(--color-foreground-medium-warning); }\n:host(.tag--intent-caution.tag--contrast-strong) { background-color: var(--color-background-strong-caution); color: var(--color-foreground-medium-caution); }\n:host(.tag--intent-positive.tag--contrast-strong) { background-color: var(--color-background-strong-positive); color: var(--color-foreground-medium-positive); }\n\n/* ── Intent × Contrast — bold ───────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-bold) { background-color: var(--color-background-bold-neutral); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-brand.tag--contrast-bold) { background-color: var(--color-background-bold-brand); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-ai.tag--contrast-bold) { background-color: var(--color-background-bold-ai); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-negative.tag--contrast-bold) { background-color: var(--color-background-bold-negative); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-warning.tag--contrast-bold) { background-color: var(--color-background-bold-warning); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-caution.tag--contrast-bold) { background-color: var(--color-background-bold-caution); color: var(--color-foreground-on-bold-background-primary); }\n:host(.tag--intent-positive.tag--contrast-bold) { background-color: var(--color-background-bold-positive); color: var(--color-foreground-on-bold-background-primary); }\n\n/* ── Intent × Contrast — medium ─────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-medium) { background-color: var(--color-background-medium-neutral); color: var(--color-foreground-strong-neutral); }\n:host(.tag--intent-brand.tag--contrast-medium) { background-color: var(--color-background-medium-brand); color: var(--color-foreground-on-medium-background-primary); }\n:host(.tag--intent-ai.tag--contrast-medium) { background-color: var(--color-background-medium-ai); color: var(--color-foreground-strong-ai); }\n:host(.tag--intent-negative.tag--contrast-medium) { background-color: var(--color-background-medium-negative); color: var(--color-foreground-strong-negative); }\n:host(.tag--intent-warning.tag--contrast-medium) { background-color: var(--color-background-medium-warning); color: var(--color-foreground-strong-warning); }\n:host(.tag--intent-caution.tag--contrast-medium) { background-color: var(--color-background-medium-caution); color: var(--color-foreground-strong-caution); }\n:host(.tag--intent-positive.tag--contrast-medium) { background-color: var(--color-background-medium-positive); color: var(--color-foreground-strong-positive); }\n\n/* ── Intent × Contrast — faint ──────────────────────────────────────────── */\n\n:host(.tag--intent-neutral.tag--contrast-faint) { background-color: var(--color-background-faint-neutral); color: var(--color-foreground-bold-neutral); }\n:host(.tag--intent-brand.tag--contrast-faint) { background-color: var(--color-background-faint-brand); color: var(--color-foreground-bold-brand); }\n:host(.tag--intent-ai.tag--contrast-faint) { background-color: var(--color-background-faint-ai); color: var(--color-foreground-bold-ai); }\n:host(.tag--intent-negative.tag--contrast-faint) { background-color: var(--color-background-faint-negative); color: var(--color-foreground-bold-negative); }\n:host(.tag--intent-warning.tag--contrast-faint) { background-color: var(--color-background-faint-warning); color: var(--color-foreground-bold-warning); }\n:host(.tag--intent-caution.tag--contrast-faint) { background-color: var(--color-background-faint-caution); color: var(--color-foreground-bold-caution); }\n:host(.tag--intent-positive.tag--contrast-faint) { background-color: var(--color-background-faint-positive); color: var(--color-foreground-bold-positive); }\n\n/* ── Interactive menu trigger ───────────────────────────────────────────── */\n\n:host(.tag--interactive) {\n padding: 0;\n gap: 0;\n}\n\n.tag__button {\n all: unset;\n position: relative;\n z-index: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n min-width: 0;\n max-width: 100%;\n height: 100%;\n padding: 0 var(--ds-control-padding-inline);\n gap: var(--ds-control-gap);\n border-radius: inherit;\n color: inherit;\n cursor: default;\n}\n\n.tag__button:disabled {\n cursor: not-allowed;\n}\n\n.tag__button--expanded::after {\n background: var(--ds-interaction-pressed);\n}\n\n/* Hover/press wash stays above the Tag's semantic background. */\n\n/* ── Icons ──────────────────────────────────────────────────────────────── */\n\n.tag__prefix-icon,\n.tag__suffix-icon {\n position: relative;\n z-index: 2;\n display: inline-flex;\n flex-shrink: 0;\n width: var(--ds-control-icon);\n height: var(--ds-control-icon);\n}\n",
363
381
  "type": "registry:ui"
364
382
  },
365
383
  {
366
384
  "path": "src/wc/components/Tag/Tag.tsx",
367
- "content": "import { Component, Event, EventEmitter, Prop, h, Host } from '@stencil/core';\nimport { CONTROL_TEXT_VARIANT } from '../../utils';\n\nexport type TagIntent = 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type TagContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type TagSize = 'md' | 'sm' | 'xs';\n\n/**\n * `ds-icon` size prop matching control-density icon metrics\n * (md→20 / sm→16 / xs→12 via `--dimension-iconography-*`).\n */\nconst ICON_SIZE: Record<TagSize, 'md' | 'sm' | 'xs'> = {\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\n@Component({\n tag: 'ds-tag',\n styleUrl: 'Tag.css',\n scoped: true,\n})\nexport class Tag {\n @Prop() label!: string;\n /** Canonical icon name rendered before the visible label. */\n @Prop() icon: string = '';\n @Prop() intent: TagIntent = 'neutral';\n @Prop() contrast: TagContrast = 'faint';\n @Prop() size: TagSize = 'md';\n /** Use the reduced outer geometry when nested inside a control of the same size. */\n @Prop() isInset: boolean = false;\n @Prop() rounded: boolean = false;\n @Prop() maxWidth: string | number | undefined;\n /** Render a menu-trigger button with a fixed ChevronUpDown suffix. */\n @Prop() interactive: boolean = false;\n /** Controlled open state for the menu triggered by an interactive Tag. */\n @Prop() expanded: boolean = false;\n /** ID of the menu controlled by an interactive Tag. */\n @Prop() ariaControls: string | undefined;\n /** Disable an interactive Tag and apply the shared inactive treatment. */\n @Prop() isInactive: boolean = false;\n\n /** Fired when the interactive Tag button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private handleClick = (event: MouseEvent) => {\n if (!this.interactive || this.isInactive) return;\n this.dsClick.emit(event);\n };\n\n render() {\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n\n const maxWidthStyle = this.maxWidth != null\n ? { maxWidth: typeof this.maxWidth === 'number' ? `${this.maxWidth}px` : this.maxWidth }\n : undefined;\n const hostClass = {\n 'tag': true,\n [`tag--intent-${this.intent}`]: true,\n [`tag--contrast-${this.contrast}`]: true,\n [`tag--size-${this.size}`]: true,\n 'ds-control--md': this.size === 'md',\n 'ds-control--sm': this.size === 'sm',\n 'ds-control--xs': this.size === 'xs',\n 'ds-control--inset': this.isInset,\n 'tag--rounded': this.rounded,\n 'tag--interactive': this.interactive,\n 'ds-control-inactive': this.interactive && this.isInactive,\n };\n const content = [\n this.icon && (\n <ds-icon\n class=\"tag__prefix-icon\"\n name={this.icon}\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n ),\n <ds-text class=\"tag__label\" as=\"span\" variant={textVariant} color=\"inherit\">\n {this.label}\n </ds-text>,\n ];\n\n if (!this.interactive) {\n return <Host class={hostClass} style={maxWidthStyle}>{content}</Host>;\n }\n\n return (\n <Host class={hostClass} style={maxWidthStyle}>\n <button\n type=\"button\"\n class={{\n 'tag__button': true,\n 'tag__button--expanded': this.expanded,\n 'ds-interaction-fill': true,\n 'ds-focus-ring-inset': true,\n }}\n aria-haspopup=\"menu\"\n aria-expanded={this.expanded ? 'true' : 'false'}\n aria-controls={this.ariaControls}\n disabled={this.isInactive || undefined}\n onClick={this.handleClick}\n >\n {content}\n <ds-icon\n class=\"tag__suffix-icon\"\n name=\"ChevronUpDown\"\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n </button>\n </Host>\n );\n }\n}\n",
385
+ "content": "import { Component, Event, EventEmitter, Prop, h, Host } from '@stencil/core';\nimport { CONTROL_TEXT_VARIANT, type ControlInsetDepth } from '../../utils';\n\nexport type TagIntent = 'neutral' | 'brand' | 'ai' | 'negative' | 'warning' | 'caution' | 'positive';\nexport type TagContrast = 'strong' | 'bold' | 'medium' | 'faint';\nexport type TagSize = 'md' | 'sm' | 'xs';\n\n/**\n * `ds-icon` size prop matching control-density icon metrics\n * (md→20 / sm→16 / xs→12 via `--dimension-iconography-*`).\n */\nconst ICON_SIZE: Record<TagSize, 'md' | 'sm' | 'xs'> = {\n md: 'md',\n sm: 'sm',\n xs: 'xs',\n};\n\n@Component({\n tag: 'ds-tag',\n styleUrl: 'Tag.css',\n scoped: true,\n})\nexport class Tag {\n @Prop() label!: string;\n /** Canonical icon name rendered before the visible label. */\n @Prop() icon: string = '';\n @Prop() intent: TagIntent = 'neutral';\n @Prop() contrast: TagContrast = 'faint';\n @Prop() size: TagSize = 'md';\n /** Use the reduced outer geometry when nested inside a control of the same size. */\n @Prop() isInset: boolean = false;\n /** Single removes 4px overall; double removes 8px overall (xs stays single). */\n @Prop() insetDepth: ControlInsetDepth = 'single';\n @Prop() rounded: boolean = false;\n @Prop() maxWidth: string | number | undefined;\n /** Render a menu-trigger button with a fixed ChevronUpDown suffix. */\n @Prop() interactive: boolean = false;\n /** Controlled open state for the menu triggered by an interactive Tag. */\n @Prop() expanded: boolean = false;\n /** ID of the menu controlled by an interactive Tag. */\n @Prop() ariaControls: string | undefined;\n /** Disable an interactive Tag and apply the shared inactive treatment. */\n @Prop() isInactive: boolean = false;\n\n /** Fired when the interactive Tag button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private handleClick = (event: MouseEvent) => {\n if (!this.interactive || this.isInactive) return;\n this.dsClick.emit(event);\n };\n\n render() {\n const textVariant = CONTROL_TEXT_VARIANT[this.size];\n const iconSize = ICON_SIZE[this.size];\n const doubleInset = this.isInset && this.insetDepth === 'double' && this.size !== 'xs';\n\n const maxWidthStyle = this.maxWidth != null\n ? { maxWidth: typeof this.maxWidth === 'number' ? `${this.maxWidth}px` : this.maxWidth }\n : undefined;\n const hostClass = {\n 'tag': true,\n [`tag--intent-${this.intent}`]: true,\n [`tag--contrast-${this.contrast}`]: true,\n [`tag--size-${this.size}`]: true,\n 'ds-control--md': this.size === 'md',\n 'ds-control--sm': this.size === 'sm',\n 'ds-control--xs': this.size === 'xs',\n 'ds-control--inset': this.isInset && !doubleInset,\n 'ds-control--inset-double': doubleInset,\n 'tag--rounded': this.rounded,\n 'tag--interactive': this.interactive,\n 'ds-control-inactive': this.interactive && this.isInactive,\n };\n const content = [\n this.icon && (\n <ds-icon\n class=\"tag__prefix-icon\"\n name={this.icon}\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n ),\n <ds-text class=\"tag__label\" as=\"span\" variant={textVariant} color=\"inherit\">\n {this.label}\n </ds-text>,\n ];\n\n if (!this.interactive) {\n return <Host class={hostClass} style={maxWidthStyle}>{content}</Host>;\n }\n\n return (\n <Host class={hostClass} style={maxWidthStyle}>\n <button\n type=\"button\"\n class={{\n 'tag__button': true,\n 'tag__button--expanded': this.expanded,\n 'ds-interaction-fill': true,\n 'ds-focus-ring-inset': true,\n }}\n aria-haspopup=\"menu\"\n aria-expanded={this.expanded ? 'true' : 'false'}\n aria-controls={this.ariaControls}\n disabled={this.isInactive || undefined}\n onClick={this.handleClick}\n >\n {content}\n <ds-icon\n class=\"tag__suffix-icon\"\n name=\"ChevronUpDown\"\n size={iconSize}\n color=\"inherit\"\n ></ds-icon>\n </button>\n </Host>\n );\n }\n}\n",
368
386
  "type": "registry:ui"
369
387
  }
370
388
  ]
@@ -334,8 +334,8 @@
334
334
  },
335
335
  "peerDependencies": {
336
336
  "required": [
337
- "@ds-mo/tokens ^6.0.0",
338
- "@ds-mo/icons ^6.5.0"
337
+ "@ds-mo/tokens ^6.2.1",
338
+ "@ds-mo/icons ^6.6.0"
339
339
  ],
340
340
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
341
341
  }
@@ -349,7 +349,7 @@
349
349
  "files": [
350
350
  {
351
351
  "path": "src/wc/components/Text/Text.css",
352
- "content": "@import '../../utils/typography.css';\n@import '../../utils/shimmer.css';\n\n:host {\n box-sizing: border-box;\n max-width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font-family: var(--typography-font-family);\n}\n\n:host(:where(.ds-text--inline-box)) {\n display: inline-block;\n}\n\n:host(:where(.ds-text--block-box)) {\n display: block;\n width: 100%;\n}\n\n/*\n * The host is the measurable typography box. The semantic inner element fills\n * it and inherits every text metric without adding margins, padding, or its own\n * line-height strut. One rendered line therefore measures exactly one token\n * line-height; N lines measure N × that token.\n */\n.ds-text__element {\n display: block;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n text-transform: inherit;\n text-align: inherit;\n text-decoration: inherit;\n font-style: inherit;\n font-variant-numeric: inherit;\n font-feature-settings: inherit;\n -webkit-user-select: inherit;\n user-select: inherit;\n white-space: inherit;\n text-wrap: inherit;\n overflow-wrap: inherit;\n word-break: inherit;\n /* Consumer truncation on the host (PanelNav, ChartLegend, …) must reach the\n text node — overflow/text-overflow are not inherited by default. */\n overflow: inherit;\n text-overflow: inherit;\n}\n\n/* ── Truncation ─────────────────────────────────────────────────────────── */\n\n:host(.ds-text--truncate-1) {\n overflow: hidden;\n}\n\n:host(.ds-text--truncate-1) .ds-text__element {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:host(.ds-text--truncate-2),\n:host(.ds-text--truncate-3),\n:host(.ds-text--truncate-4),\n:host(.ds-text--truncate-5) {\n overflow: hidden;\n}\n\n:host(.ds-text--truncate-2) .ds-text__element,\n:host(.ds-text--truncate-3) .ds-text__element,\n:host(.ds-text--truncate-4) .ds-text__element,\n:host(.ds-text--truncate-5) .ds-text__element {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n:host(.ds-text--truncate-2) .ds-text__element { -webkit-line-clamp: 2; }\n:host(.ds-text--truncate-3) .ds-text__element { -webkit-line-clamp: 3; }\n:host(.ds-text--truncate-4) .ds-text__element { -webkit-line-clamp: 4; }\n:host(.ds-text--truncate-5) .ds-text__element { -webkit-line-clamp: 5; }\n\n/* ── Wrap ───────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--nowrap),\n:host(.ds-text--nowrap) .ds-text__element {\n white-space: nowrap;\n word-break: normal;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n:host(.ds-text--balance),\n:host(.ds-text--balance) .ds-text__element { text-wrap: balance; }\n\n:host(.ds-text--pretty),\n:host(.ds-text--pretty) .ds-text__element { text-wrap: pretty; }\n\n/* ── Color ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--color-primary) { color: var(--color-foreground-primary); }\n:host(.ds-text--color-secondary) { color: var(--color-foreground-secondary); }\n:host(.ds-text--color-tertiary) { color: var(--color-foreground-tertiary); }\n:host(.ds-text--color-quaternary) { color: var(--color-foreground-quaternary); }\n:host(.ds-text--color-brand) { color: var(--color-foreground-bold-brand); }\n:host(.ds-text--color-negative) { color: var(--color-foreground-bold-negative); }\n:host(.ds-text--color-positive) { color: var(--color-foreground-bold-positive); }\n:host(.ds-text--color-warning) { color: var(--color-foreground-bold-warning); }\n:host(.ds-text--color-caution) { color: var(--color-foreground-bold-caution); }\n:host(.ds-text--color-ai) { color: var(--color-foreground-bold-ai); }\n:host(.ds-text--color-on-strong) { color: var(--color-foreground-on-strong-background-primary); }\n:host(.ds-text--color-on-bold) { color: var(--color-foreground-on-bold-background-primary); }\n/*\n * The inherit state intentionally has no declaration. `color` inherits\n * naturally, while omitting a host rule lets an owning component apply a\n * semantic token directly to ds-text without depending on stylesheet order.\n */\n\n/* ── Decorations ─────────────────────────────────────────────────────────── */\n\n:host(.ds-text--decoration-underline) {\n text-decoration: underline;\n text-decoration-color: var(--color-foreground-tertiary);\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n:host(.ds-text--decoration-dotted-underline) {\n text-decoration: underline dotted;\n text-decoration-color: var(--color-foreground-tertiary);\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n/* ── Style ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--italic) { font-style: italic; }\n\n:host(.ds-text--font-feature-tabular-nums) {\n font-variant-numeric: tabular-nums;\n font-feature-settings: 'tnum';\n}\n\n/* ── Align ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--align-left) { text-align: left; }\n:host(.ds-text--align-center) { text-align: center; }\n:host(.ds-text--align-right) { text-align: right; }\n",
352
+ "content": "@import '../../utils/typography.css';\n@import '../../utils/shimmer.css';\n\n:host {\n box-sizing: border-box;\n max-width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font-family: var(--typography-font-family-ui);\n}\n\n:host(:where(.ds-text--inline-box)) {\n display: inline-block;\n}\n\n:host(:where(.ds-text--block-box)) {\n display: block;\n width: 100%;\n}\n\n/*\n * The host is the measurable typography box. The semantic inner element fills\n * it and inherits every text metric without adding margins, padding, or its own\n * line-height strut. One rendered line therefore measures exactly one token\n * line-height; N lines measure N × that token.\n */\n.ds-text__element {\n display: block;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n text-transform: inherit;\n text-align: inherit;\n text-decoration: inherit;\n font-style: inherit;\n font-variant-numeric: inherit;\n font-feature-settings: inherit;\n -webkit-user-select: inherit;\n user-select: inherit;\n white-space: inherit;\n text-wrap: inherit;\n overflow-wrap: inherit;\n word-break: inherit;\n /* Consumer truncation on the host (PanelNav, ChartLegend, …) must reach the\n text node — overflow/text-overflow are not inherited by default. */\n overflow: inherit;\n text-overflow: inherit;\n}\n\n/* ── Truncation ─────────────────────────────────────────────────────────── */\n\n:host(.ds-text--truncate-1) {\n overflow: hidden;\n}\n\n:host(.ds-text--truncate-1) .ds-text__element {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:host(.ds-text--truncate-2),\n:host(.ds-text--truncate-3),\n:host(.ds-text--truncate-4),\n:host(.ds-text--truncate-5) {\n overflow: hidden;\n}\n\n:host(.ds-text--truncate-2) .ds-text__element,\n:host(.ds-text--truncate-3) .ds-text__element,\n:host(.ds-text--truncate-4) .ds-text__element,\n:host(.ds-text--truncate-5) .ds-text__element {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n:host(.ds-text--truncate-2) .ds-text__element { -webkit-line-clamp: 2; }\n:host(.ds-text--truncate-3) .ds-text__element { -webkit-line-clamp: 3; }\n:host(.ds-text--truncate-4) .ds-text__element { -webkit-line-clamp: 4; }\n:host(.ds-text--truncate-5) .ds-text__element { -webkit-line-clamp: 5; }\n\n/* ── Wrap ───────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--nowrap),\n:host(.ds-text--nowrap) .ds-text__element {\n white-space: nowrap;\n word-break: normal;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n:host(.ds-text--balance),\n:host(.ds-text--balance) .ds-text__element { text-wrap: balance; }\n\n:host(.ds-text--pretty),\n:host(.ds-text--pretty) .ds-text__element { text-wrap: pretty; }\n\n/* ── Color ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--color-primary) { color: var(--color-foreground-primary); }\n:host(.ds-text--color-secondary) { color: var(--color-foreground-secondary); }\n:host(.ds-text--color-tertiary) { color: var(--color-foreground-tertiary); }\n:host(.ds-text--color-quaternary) { color: var(--color-foreground-quaternary); }\n:host(.ds-text--color-brand) { color: var(--color-foreground-bold-brand); }\n:host(.ds-text--color-negative) { color: var(--color-foreground-bold-negative); }\n:host(.ds-text--color-positive) { color: var(--color-foreground-bold-positive); }\n:host(.ds-text--color-warning) { color: var(--color-foreground-bold-warning); }\n:host(.ds-text--color-caution) { color: var(--color-foreground-bold-caution); }\n:host(.ds-text--color-ai) { color: var(--color-foreground-bold-ai); }\n:host(.ds-text--color-on-strong) { color: var(--color-foreground-on-strong-background-primary); }\n:host(.ds-text--color-on-bold) { color: var(--color-foreground-on-bold-background-primary); }\n/*\n * The inherit state intentionally has no declaration. `color` inherits\n * naturally, while omitting a host rule lets an owning component apply a\n * semantic token directly to ds-text without depending on stylesheet order.\n */\n\n/* ── Decorations ─────────────────────────────────────────────────────────── */\n\n:host(.ds-text--decoration-underline) {\n text-decoration: underline;\n text-decoration-color: var(--color-foreground-tertiary);\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n:host(.ds-text--decoration-dotted-underline) {\n text-decoration: underline dotted;\n text-decoration-color: var(--color-foreground-tertiary);\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n/* ── Style ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--italic) { font-style: italic; }\n\n:host(.ds-text--font-feature-tabular-nums) {\n font-variant-numeric: tabular-nums;\n font-feature-settings: 'tnum';\n}\n\n/* ── Align ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--align-left) { text-align: left; }\n:host(.ds-text--align-center) { text-align: center; }\n:host(.ds-text--align-right) { text-align: right; }\n",
353
353
  "type": "registry:ui"
354
354
  },
355
355
  {
@@ -307,8 +307,8 @@
307
307
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: manager, swipeDirections.",
308
308
  "peerDependencies": {
309
309
  "required": [
310
- "@ds-mo/tokens ^6.0.0",
311
- "@ds-mo/icons ^6.5.0"
310
+ "@ds-mo/tokens ^6.2.1",
311
+ "@ds-mo/icons ^6.6.0"
312
312
  ],
313
313
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
314
314
  }
@@ -49,6 +49,8 @@
49
49
  "The owning chart mounts the callout when a local interaction starts and unmounts it when that interaction ends.",
50
50
  "Coordinate updates track within one mounted interaction session without restarting the show delay.",
51
51
  "Placement flips horizontally or vertically when the rendered callout approaches a viewport edge.",
52
+ "The heading and rows use the same medium-density section-heading and control-frame anatomy as menu-style choice content.",
53
+ "When any grouped row supplies a swatch, every row reserves the shared leading icon zone so mixed-swatch labels and trailing values stay aligned.",
52
54
  "Placement is chosen as a quadrant rather than computed as coordinates: the component measures its own rendered rect and flips its side and align props, which CSS consumes. It therefore does not use the shared anchored-position utilities, which resolve an anchor element into x and y.",
53
55
  "This separation is deliberate. The callout follows the pointer instead of an element, so it has no anchor rect to resolve; adopting the shared geometry would mean rewriting its CSS to consume coordinates for no behavioral gain.",
54
56
  "Reduced motion preserves the final visible state without an opacity transition."
@@ -224,8 +226,8 @@
224
226
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
225
227
  "peerDependencies": {
226
228
  "required": [
227
- "@ds-mo/tokens ^6.0.0",
228
- "@ds-mo/icons ^6.5.0"
229
+ "@ds-mo/tokens ^6.2.1",
230
+ "@ds-mo/icons ^6.6.0"
229
231
  ],
230
232
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
231
233
  }
@@ -241,12 +243,12 @@
241
243
  "files": [
242
244
  {
243
245
  "path": "src/wc/components/TooltipChart/TooltipChart.css",
244
- "content": "@import '../../utils/control-density.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n position: absolute;\n z-index: var(--dimension-z-index-tooltip);\n display: block;\n box-sizing: border-box;\n background-color: var(--color-translucent-translucent);\n backdrop-filter: blur(var(--effect-blur-md));\n -webkit-backdrop-filter: blur(var(--effect-blur-md));\n border-radius: var(--dimension-radius-075);\n box-shadow: var(--effect-elevation-elevated-floating);\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n padding: var(--dimension-space-050);\n}\n\n:host(.tooltip-chart--visible) {\n animation: tooltip-chart-fade-in var(--effect-motion-short-2) forwards;\n}\n\n.tooltip-chart__item {\n width: 100%;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n}\n\n.tooltip-chart__heading {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n height: var(--ds-control-height, var(--dimension-size-400));\n padding-inline: calc(\n var(--ds-control-padding-inline, var(--dimension-space-075)) +\n var(--ds-control-label-inset, var(--dimension-space-025))\n );\n}\n\n.tooltip-chart__items {\n display: grid;\n}\n\n.tooltip-chart__swatch-box {\n pointer-events: none;\n}\n\n.tooltip-chart__swatch {\n width: var(--dimension-size-100);\n height: var(--dimension-size-100);\n flex: none;\n border-radius: var(--dimension-radius-half);\n background: var(--ds-tooltip-chart-swatch);\n}\n\n.tooltip-chart__value {\n margin-inline-start: auto;\n text-align: end;\n}\n\n.tooltip-chart__label {\n margin-inline-end: var(--dimension-space-050);\n}\n\n.tooltip-chart__label,\n.tooltip-chart__value {\n flex: none;\n}\n\n@keyframes tooltip-chart-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host(.tooltip-chart--visible) {\n animation: none;\n opacity: 1;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n box-shadow: none;\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n}\n",
246
+ "content": "@import '../../utils/control-density.css';\n@import '../../utils/control-parts.css';\n@import '../../utils/chrome-layout.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n position: absolute;\n z-index: var(--dimension-z-index-tooltip);\n background-color: var(--color-translucent-translucent);\n backdrop-filter: blur(var(--effect-blur-md));\n -webkit-backdrop-filter: blur(var(--effect-blur-md));\n border-radius: var(--dimension-radius-075);\n box-shadow: var(--effect-elevation-elevated-floating);\n white-space: nowrap;\n pointer-events: none;\n opacity: 0;\n}\n\n:host(.tooltip-chart--visible) {\n animation: tooltip-chart-fade-in var(--effect-motion-short-2) forwards;\n}\n\n.tooltip-chart__item {\n width: 100%;\n border-radius: var(--ds-control-radius, var(--dimension-radius-025));\n}\n\n.tooltip-chart__items {\n display: contents;\n}\n\n.tooltip-chart__swatch-box {\n pointer-events: none;\n}\n\n.tooltip-chart__swatch {\n width: var(--dimension-size-100);\n height: var(--dimension-size-100);\n flex: none;\n border-radius: var(--dimension-radius-half);\n background: var(--ds-tooltip-chart-swatch);\n}\n\n.tooltip-chart__value {\n margin-inline-start: auto;\n text-align: end;\n}\n\n.tooltip-chart__label,\n.tooltip-chart__value {\n flex: none;\n}\n\n@keyframes tooltip-chart-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host(.tooltip-chart--visible) {\n animation: none;\n opacity: 1;\n }\n}\n\n@media (forced-colors: active) {\n :host {\n box-shadow: none;\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n}\n",
245
247
  "type": "registry:ui"
246
248
  },
247
249
  {
248
250
  "path": "src/wc/components/TooltipChart/TooltipChart.tsx",
249
- "content": "import { Component, Prop, State, Element, Watch, h, Host } from '@stencil/core';\nimport {\n CONTROL_SUPPORTING_TEXT_VARIANT,\n CONTROL_TEXT_VARIANT,\n resolveCssTimeMs,\n TOKEN_DEFAULTS,\n} from '../../utils';\n\nconst CURSOR_OFFSET_PX = 12;\nconst VIEWPORT_PAD_PX = 8;\n\nexport type TooltipChartSide = 'left' | 'right';\nexport type TooltipChartAlign = 'top' | 'bottom';\n\nexport interface TooltipChartItem {\n label: string;\n value: string | number;\n color?: string;\n}\n\n/**\n * Positioned value/label callout for chart hover interactions (bar, line point,\n * polar arc, …). A composition may suppress it when a visible legend already\n * surfaces the same value.\n * Unlike `ds-tooltip`, this doesn't bind to a slotted anchor element —\n * charts hover-highlight data that lives inside an SVG, so the chart itself computes\n * the anchor point (e.g. the cursor position while hovering) and passes it in as `x`/`y`.\n *\n * Renders `position: absolute` — place inside a `position: relative` chart wrapper,\n * with `x`/`y` as pixel coordinates within that wrapper. Defaults to sitting below-right\n * of the anchor (matching cursor-following tooltips), flipping to whichever side/edge\n * keeps it on-screen.\n *\n * Mount (or remount) when a hover session starts so `delay` applies once per hover;\n * keep the instance mounted while the cursor moves so tracking stays instant.\n */\n@Component({\n tag: 'ds-tooltip-chart',\n styleUrl: 'TooltipChart.css',\n scoped: true,\n})\nexport class TooltipChart {\n @Element() el!: HTMLElement;\n\n @Prop() value: string | number = '';\n @Prop() label: string = '';\n /** Optional heading for grouped chart focus. */\n @Prop() heading?: string;\n /** Multi-row content. When supplied, this replaces the legacy label/value row. */\n @Prop() items?: TooltipChartItem[];\n /** Anchor point in px, relative to the nearest `position: relative` ancestor — e.g. the cursor. */\n @Prop() x: number = 0;\n @Prop() y: number = 0;\n\n /**\n * Show delay after mount before the callout appears.\n * Default: `--effect-animation-delay-instant` (0ms). Accepts a number (ms)\n * or a TokoMo time token / `var(--effect-animation-delay-*)`. Charts need\n * immediate feedback while scrubbing; prefer the default. Mount once per\n * hover session so any non-zero delay runs once, then track `x`/`y` instantly.\n */\n @Prop() delay: number | string = TOKEN_DEFAULTS.animationDelayInstant;\n\n @State() private side: TooltipChartSide = 'right';\n @State() private align: TooltipChartAlign = 'bottom';\n @State() private visible: boolean = false;\n\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\n\n componentDidLoad() {\n this.scheduleShow();\n this.calculatePlacement();\n }\n\n disconnectedCallback() {\n this.clearDelayTimer();\n }\n\n @Watch('x')\n @Watch('y')\n onAnchorChange() {\n requestAnimationFrame(() => this.calculatePlacement());\n }\n\n @Watch('delay')\n onDelayChange() {\n if (!this.visible) this.scheduleShow();\n }\n\n private get showDelayMs(): number {\n return resolveCssTimeMs(this.delay, TOKEN_DEFAULTS.animationDelayInstant);\n }\n\n private clearDelayTimer() {\n if (this.delayTimer) {\n clearTimeout(this.delayTimer);\n this.delayTimer = null;\n }\n }\n\n private scheduleShow() {\n this.clearDelayTimer();\n this.visible = false;\n const ms = this.showDelayMs;\n if (ms <= 0) {\n this.visible = true;\n return;\n }\n this.delayTimer = setTimeout(() => {\n this.delayTimer = null;\n this.visible = true;\n requestAnimationFrame(() => this.calculatePlacement());\n }, ms);\n }\n\n private calculatePlacement() {\n const rect = this.el.getBoundingClientRect();\n if (!rect.width || !rect.height) return;\n\n const nextSide: TooltipChartSide = rect.right > window.innerWidth - VIEWPORT_PAD_PX ? 'left' : 'right';\n const nextAlign: TooltipChartAlign = rect.bottom > window.innerHeight - VIEWPORT_PAD_PX ? 'top' : 'bottom';\n\n if (nextSide !== this.side) this.side = nextSide;\n if (nextAlign !== this.align) this.align = nextAlign;\n }\n\n render() {\n const translateX = this.side === 'right' ? `${CURSOR_OFFSET_PX}px` : `calc(-100% - ${CURSOR_OFFSET_PX}px)`;\n const translateY = this.align === 'bottom' ? `${CURSOR_OFFSET_PX}px` : `calc(-100% - ${CURSOR_OFFSET_PX}px)`;\n\n return (\n <Host\n class={{\n 'tooltip-chart': true,\n 'tooltip-chart--visible': this.visible,\n }}\n style={{ left: `${this.x}px`, top: `${this.y}px`, transform: `translate(${translateX}, ${translateY})` }}\n >\n {this.heading && (\n <ds-text\n class=\"tooltip-chart__heading\"\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT.md}\n emphasis\n color=\"var(--color-foreground-primary)\"\n >\n {this.heading}\n </ds-text>\n )}\n <div class=\"tooltip-chart__items\">\n {(this.items ?? [{ label: this.label, value: this.value }]).map((item, index) => (\n <div class=\"tooltip-chart__item ds-control-frame ds-control--md\" key={`${item.label}-${index}`}>\n {item.color && (\n <span class=\"tooltip-chart__swatch-box ds-control-icon-box\" aria-hidden=\"true\">\n <span\n class=\"tooltip-chart__swatch\"\n style={{ '--ds-tooltip-chart-swatch': item.color }}\n />\n </span>\n )}\n <ds-text\n class=\"tooltip-chart__label ds-control-label-box\"\n as=\"span\"\n variant={CONTROL_TEXT_VARIANT.md}\n color=\"var(--color-foreground-secondary)\"\n >\n {item.label}\n </ds-text>\n <ds-text\n class=\"tooltip-chart__value ds-control-label-box\"\n as=\"span\"\n variant={CONTROL_TEXT_VARIANT.md}\n emphasis\n color=\"var(--color-foreground-primary)\"\n >\n {item.value}\n </ds-text>\n </div>\n ))}\n </div>\n </Host>\n );\n }\n}\n",
251
+ "content": "import { Component, Prop, State, Element, Watch, h, Host } from '@stencil/core';\nimport {\n CONTROL_SUPPORTING_TEXT_VARIANT,\n CONTROL_TEXT_VARIANT,\n resolveCssTimeMs,\n TOKEN_DEFAULTS,\n} from '../../utils';\n\nconst CURSOR_OFFSET_PX = 12;\nconst VIEWPORT_PAD_PX = 8;\n\nexport type TooltipChartSide = 'left' | 'right';\nexport type TooltipChartAlign = 'top' | 'bottom';\n\nexport interface TooltipChartItem {\n label: string;\n value: string | number;\n color?: string;\n}\n\n/**\n * Positioned value/label callout for chart hover interactions (bar, line point,\n * polar arc, …). A composition may suppress it when a visible legend already\n * surfaces the same value.\n * Unlike `ds-tooltip`, this doesn't bind to a slotted anchor element —\n * charts hover-highlight data that lives inside an SVG, so the chart itself computes\n * the anchor point (e.g. the cursor position while hovering) and passes it in as `x`/`y`.\n *\n * Renders `position: absolute` — place inside a `position: relative` chart wrapper,\n * with `x`/`y` as pixel coordinates within that wrapper. Defaults to sitting below-right\n * of the anchor (matching cursor-following tooltips), flipping to whichever side/edge\n * keeps it on-screen.\n *\n * Mount (or remount) when a hover session starts so `delay` applies once per hover;\n * keep the instance mounted while the cursor moves so tracking stays instant.\n */\n@Component({\n tag: 'ds-tooltip-chart',\n styleUrl: 'TooltipChart.css',\n scoped: true,\n})\nexport class TooltipChart {\n @Element() el!: HTMLElement;\n\n @Prop() value: string | number = '';\n @Prop() label: string = '';\n /** Optional heading for grouped chart focus. */\n @Prop() heading?: string;\n /** Multi-row content. When supplied, this replaces the legacy label/value row. */\n @Prop() items?: TooltipChartItem[];\n /** Anchor point in px, relative to the nearest `position: relative` ancestor — e.g. the cursor. */\n @Prop() x: number = 0;\n @Prop() y: number = 0;\n\n /**\n * Show delay after mount before the callout appears.\n * Default: `--effect-animation-delay-instant` (0ms). Accepts a number (ms)\n * or a TokoMo time token / `var(--effect-animation-delay-*)`. Charts need\n * immediate feedback while scrubbing; prefer the default. Mount once per\n * hover session so any non-zero delay runs once, then track `x`/`y` instantly.\n */\n @Prop() delay: number | string = TOKEN_DEFAULTS.animationDelayInstant;\n\n @State() private side: TooltipChartSide = 'right';\n @State() private align: TooltipChartAlign = 'bottom';\n @State() private visible: boolean = false;\n\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\n\n componentDidLoad() {\n this.scheduleShow();\n this.calculatePlacement();\n }\n\n disconnectedCallback() {\n this.clearDelayTimer();\n }\n\n @Watch('x')\n @Watch('y')\n onAnchorChange() {\n requestAnimationFrame(() => this.calculatePlacement());\n }\n\n @Watch('delay')\n onDelayChange() {\n if (!this.visible) this.scheduleShow();\n }\n\n private get showDelayMs(): number {\n return resolveCssTimeMs(this.delay, TOKEN_DEFAULTS.animationDelayInstant);\n }\n\n private clearDelayTimer() {\n if (this.delayTimer) {\n clearTimeout(this.delayTimer);\n this.delayTimer = null;\n }\n }\n\n private scheduleShow() {\n this.clearDelayTimer();\n this.visible = false;\n const ms = this.showDelayMs;\n if (ms <= 0) {\n this.visible = true;\n return;\n }\n this.delayTimer = setTimeout(() => {\n this.delayTimer = null;\n this.visible = true;\n requestAnimationFrame(() => this.calculatePlacement());\n }, ms);\n }\n\n private calculatePlacement() {\n const rect = this.el.getBoundingClientRect();\n if (!rect.width || !rect.height) return;\n\n const nextSide: TooltipChartSide = rect.right > window.innerWidth - VIEWPORT_PAD_PX ? 'left' : 'right';\n const nextAlign: TooltipChartAlign = rect.bottom > window.innerHeight - VIEWPORT_PAD_PX ? 'top' : 'bottom';\n\n if (nextSide !== this.side) this.side = nextSide;\n if (nextAlign !== this.align) this.align = nextAlign;\n }\n\n render() {\n const translateX = this.side === 'right' ? `${CURSOR_OFFSET_PX}px` : `calc(-100% - ${CURSOR_OFFSET_PX}px)`;\n const translateY = this.align === 'bottom' ? `${CURSOR_OFFSET_PX}px` : `calc(-100% - ${CURSOR_OFFSET_PX}px)`;\n const rows = this.items ?? [{ label: this.label, value: this.value }];\n const usesSwatches = rows.some(item => Boolean(item.color));\n\n return (\n <Host\n class={{\n 'tooltip-chart': true,\n 'tooltip-chart--visible': this.visible,\n 'ds-chrome-column': true,\n 'ds-chrome-space--sm': true,\n }}\n style={{ left: `${this.x}px`, top: `${this.y}px`, transform: `translate(${translateX}, ${translateY})` }}\n >\n {this.heading && (\n <ds-text\n class=\"tooltip-chart__heading ds-control-section-heading ds-control--md\"\n as=\"span\"\n variant={CONTROL_SUPPORTING_TEXT_VARIANT.md}\n emphasis\n color=\"var(--color-foreground-primary)\"\n >\n {this.heading}\n </ds-text>\n )}\n <div class=\"tooltip-chart__items\">\n {rows.map((item, index) => (\n <div class=\"tooltip-chart__item ds-control-frame ds-control--md\" key={`${item.label}-${index}`}>\n {usesSwatches && (\n <span class=\"tooltip-chart__swatch-box ds-control-icon-box\" aria-hidden=\"true\">\n {item.color && (\n <span\n class=\"tooltip-chart__swatch\"\n style={{ '--ds-tooltip-chart-swatch': item.color }}\n />\n )}\n </span>\n )}\n <ds-text\n class=\"tooltip-chart__label ds-control-label-box\"\n as=\"span\"\n variant={CONTROL_TEXT_VARIANT.md}\n color=\"var(--color-foreground-secondary)\"\n >\n {item.label}\n </ds-text>\n <ds-text\n class=\"tooltip-chart__value ds-control-label-box\"\n as=\"span\"\n variant={CONTROL_TEXT_VARIANT.md}\n emphasis\n color=\"var(--color-foreground-primary)\"\n >\n {item.value}\n </ds-text>\n </div>\n ))}\n </div>\n </Host>\n );\n }\n}\n",
250
252
  "type": "registry:ui"
251
253
  }
252
254
  ]
@@ -277,8 +277,8 @@
277
277
  },
278
278
  "peerDependencies": {
279
279
  "required": [
280
- "@ds-mo/tokens ^6.0.0",
281
- "@ds-mo/icons ^6.5.0"
280
+ "@ds-mo/tokens ^6.2.1",
281
+ "@ds-mo/icons ^6.6.0"
282
282
  ],
283
283
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
284
284
  }
@@ -98,8 +98,8 @@
98
98
  },
99
99
  "peerDependencies": {
100
100
  "required": [
101
- "@ds-mo/tokens ^6.0.0",
102
- "@ds-mo/icons ^6.5.0"
101
+ "@ds-mo/tokens ^6.2.1",
102
+ "@ds-mo/icons ^6.6.0"
103
103
  ],
104
104
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
105
105
  }
@@ -3,6 +3,7 @@
3
3
  * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
4
  */
5
5
  export { DsAgentActivity } from "./ds-agent-activity.js";
6
+ export { DsAgentQuestionnaire } from "./ds-agent-questionnaire.js";
6
7
  export { DsAgentResponse } from "./ds-agent-response.js";
7
8
  export { DsAgentSourceList } from "./ds-agent-source-list.js";
8
9
  export { DsAgentToolCall } from "./ds-agent-tool-call.js";
@@ -4,6 +4,7 @@
4
4
  */
5
5
  /* eslint-disable */
6
6
  export { DsAgentActivity } from "./ds-agent-activity.js";
7
+ export { DsAgentQuestionnaire } from "./ds-agent-questionnaire.js";
7
8
  export { DsAgentResponse } from "./ds-agent-response.js";
8
9
  export { DsAgentSourceList } from "./ds-agent-source-list.js";
9
10
  export { DsAgentToolCall } from "./ds-agent-tool-call.js";
@@ -0,0 +1,13 @@
1
+ /**
2
+ * This file was automatically generated by the Stencil React Output Target.
3
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
+ */
5
+ import type { EventName, StencilReactComponent } from './react-runtime.js';
6
+ import { type AgentQuestionnaireAnswerEventDetail, type AgentQuestionnaireCancelEventDetail, type DsAgentQuestionnaireCustomEvent } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsAgentQuestionnaire as DsAgentQuestionnaireElement } from "@ds-mo/ui/dist/components/ds-agent-questionnaire.js";
9
+ export type DsAgentQuestionnaireEvents = {
10
+ onDsAnswer: EventName<DsAgentQuestionnaireCustomEvent<AgentQuestionnaireAnswerEventDetail>>;
11
+ onDsCancel: EventName<DsAgentQuestionnaireCustomEvent<AgentQuestionnaireCancelEventDetail>>;
12
+ };
13
+ export declare const DsAgentQuestionnaire: StencilReactComponent<DsAgentQuestionnaireElement, DsAgentQuestionnaireEvents, Components.DsAgentQuestionnaire, 'requestId' | 'questions'>;
@@ -0,0 +1,15 @@
1
+ 'use client';
2
+ import { createComponent } from './react-runtime.js';
3
+ import React from 'react';
4
+ import { DsAgentQuestionnaire as DsAgentQuestionnaireElement, defineCustomElement as defineDsAgentQuestionnaire } from "@ds-mo/ui/dist/components/ds-agent-questionnaire.js";
5
+ export const DsAgentQuestionnaire = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-agent-questionnaire',
7
+ elementClass: DsAgentQuestionnaireElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: {
11
+ onDsAnswer: 'dsAnswer',
12
+ onDsCancel: 'dsCancel'
13
+ },
14
+ defineCustomElement: defineDsAgentQuestionnaire
15
+ });
@@ -2,8 +2,13 @@
2
2
  * This file was automatically generated by the Stencil React Output Target.
3
3
  * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
4
  */
5
- import type { StencilReactComponent } from './react-runtime.js';
5
+ import type { EventName, StencilReactComponent } from './react-runtime.js';
6
+ import { type DsAgentSourceListCustomEvent } from "@ds-mo/ui";
6
7
  import type { Components } from "@ds-mo/ui/dist/components";
7
8
  import { DsAgentSourceList as DsAgentSourceListElement } from "@ds-mo/ui/dist/components/ds-agent-source-list.js";
8
- export type DsAgentSourceListEvents = NonNullable<unknown>;
9
+ export type DsAgentSourceListEvents = {
10
+ onDsOpenChange: EventName<DsAgentSourceListCustomEvent<{
11
+ open: boolean;
12
+ }>>;
13
+ };
9
14
  export declare const DsAgentSourceList: StencilReactComponent<DsAgentSourceListElement, DsAgentSourceListEvents, Components.DsAgentSourceList>;
@@ -7,6 +7,6 @@ export const DsAgentSourceList = /*@__PURE__*/ createComponent({
7
7
  elementClass: DsAgentSourceListElement,
8
8
  // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
9
  react: React,
10
- events: {},
10
+ events: { onDsOpenChange: 'dsOpenChange' },
11
11
  defineCustomElement: defineDsAgentSourceList
12
12
  });
@@ -2,8 +2,13 @@
2
2
  * This file was automatically generated by the Stencil React Output Target.
3
3
  * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
4
  */
5
- import type { StencilReactComponent } from './react-runtime.js';
5
+ import type { EventName, StencilReactComponent } from './react-runtime.js';
6
+ import { type DsAgentToolCallCustomEvent } from "@ds-mo/ui";
6
7
  import type { Components } from "@ds-mo/ui/dist/components";
7
8
  import { DsAgentToolCall as DsAgentToolCallElement } from "@ds-mo/ui/dist/components/ds-agent-tool-call.js";
8
- export type DsAgentToolCallEvents = NonNullable<unknown>;
9
+ export type DsAgentToolCallEvents = {
10
+ onDsOpenChange: EventName<DsAgentToolCallCustomEvent<{
11
+ open: boolean;
12
+ }>>;
13
+ };
9
14
  export declare const DsAgentToolCall: StencilReactComponent<DsAgentToolCallElement, DsAgentToolCallEvents, Components.DsAgentToolCall>;
@@ -7,6 +7,6 @@ export const DsAgentToolCall = /*@__PURE__*/ createComponent({
7
7
  elementClass: DsAgentToolCallElement,
8
8
  // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
9
  react: React,
10
- events: {},
10
+ events: { onDsOpenChange: 'dsOpenChange' },
11
11
  defineCustomElement: defineDsAgentToolCall
12
12
  });
@@ -3,12 +3,13 @@
3
3
  * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
4
  */
5
5
  import type { EventName, StencilReactComponent } from './react-runtime.js';
6
- import { type DsTableCustomEvent, type TableCellActionDetail, type TableGroupingChangeDetail, type TableLoadMoreDetail, type TableRowActivateDetail, type TableSelectionChangeDetail, type TableSortChangeDetail } from "@ds-mo/ui";
6
+ import { type DsTableCustomEvent, type TableCellActionDetail, type TableGroupCollapseChangeDetail, type TableGroupingChangeDetail, type TableLoadMoreDetail, type TableRowActivateDetail, type TableSelectionChangeDetail, type TableSortChangeDetail } from "@ds-mo/ui";
7
7
  import type { Components } from "@ds-mo/ui/dist/components";
8
8
  import { DsTable as DsTableElement } from "@ds-mo/ui/dist/components/ds-table.js";
9
9
  export type DsTableEvents = {
10
10
  onDsSortChange: EventName<DsTableCustomEvent<TableSortChangeDetail>>;
11
11
  onDsGroupingChange: EventName<DsTableCustomEvent<TableGroupingChangeDetail>>;
12
+ onDsGroupCollapseChange: EventName<DsTableCustomEvent<TableGroupCollapseChangeDetail>>;
12
13
  onDsSelectionChange: EventName<DsTableCustomEvent<TableSelectionChangeDetail>>;
13
14
  onDsLoadMore: EventName<DsTableCustomEvent<TableLoadMoreDetail>>;
14
15
  onDsCellAction: EventName<DsTableCustomEvent<TableCellActionDetail>>;
@@ -10,6 +10,7 @@ export const DsTable = /*@__PURE__*/ createComponent({
10
10
  events: {
11
11
  onDsSortChange: 'dsSortChange',
12
12
  onDsGroupingChange: 'dsGroupingChange',
13
+ onDsGroupCollapseChange: 'dsGroupCollapseChange',
13
14
  onDsSelectionChange: 'dsSelectionChange',
14
15
  onDsLoadMore: 'dsLoadMore',
15
16
  onDsCellAction: 'dsCellAction',
@@ -16,11 +16,16 @@
16
16
  overflow-wrap: anywhere;
17
17
  }
18
18
 
19
+ :where(.ds-prose)
20
+ > :where(h1, h2, h3, h4, h5, h6, p, ul, ol, dl, blockquote):not(:where([data-ds-prose='off'], [data-ds-prose='off'] *)) {
21
+ max-inline-size: var(--ds-prose-text-max-inline-size, 100%);
22
+ }
23
+
19
24
  :where(.ds-prose)
20
25
  :where(p, ul, ol, dl, blockquote, figure, figcaption, table):not(:where([data-ds-prose='off'], [data-ds-prose='off'] *)) {
21
26
  margin: 0;
22
27
  color: inherit;
23
- font-family: var(--typography-font-family);
28
+ font-family: var(--typography-font-family-ui);
24
29
  font-size: var(--typography-fontsize-md);
25
30
  font-weight: var(--typography-weight-regular);
26
31
  line-height: var(--typography-lineheight-md);
@@ -31,7 +36,7 @@
31
36
  :where(h1, h2, h3, h4, h5, h6):not(:where([data-ds-prose='off'], [data-ds-prose='off'] *)) {
32
37
  margin: 0;
33
38
  color: var(--color-foreground-primary);
34
- font-family: var(--typography-font-family);
39
+ font-family: var(--typography-font-family-ui);
35
40
  font-weight: var(--typography-weight-semibold);
36
41
  }
37
42
 
@@ -130,8 +135,14 @@
130
135
  padding: var(--dimension-space-012) var(--dimension-space-025);
131
136
  border-radius: var(--dimension-radius-025);
132
137
  background: var(--color-background-secondary);
133
- font-family: var(--typography-fontfamily-mono);
138
+ font-family: var(
139
+ --typography-font-family-code,
140
+ 'Fira Code', ui-monospace, 'SFMono-Regular', 'Cascadia Code', 'Roboto Mono',
141
+ Menlo, Monaco, Consolas, 'Liberation Mono', monospace
142
+ );
134
143
  font-size: var(--typography-fontsize-sm);
144
+ font-variant-ligatures: var(--ds-code-font-variant-ligatures, normal);
145
+ font-weight: var(--typography-weight-regular);
135
146
  line-height: var(--typography-lineheight-sm);
136
147
  letter-spacing: var(--typography-letterspacing-none);
137
148
  }
@@ -147,8 +158,14 @@
147
158
  border-radius: var(--dimension-radius-050);
148
159
  background: var(--color-background-strong-neutral);
149
160
  color: var(--color-foreground-faint-neutral);
150
- font-family: var(--typography-fontfamily-mono);
161
+ font-family: var(
162
+ --typography-font-family-code,
163
+ 'Fira Code', ui-monospace, 'SFMono-Regular', 'Cascadia Code', 'Roboto Mono',
164
+ Menlo, Monaco, Consolas, 'Liberation Mono', monospace
165
+ );
151
166
  font-size: var(--typography-fontsize-sm);
167
+ font-variant-ligatures: var(--ds-code-font-variant-ligatures, normal);
168
+ font-weight: var(--typography-weight-regular);
152
169
  line-height: var(--typography-lineheight-sm);
153
170
  letter-spacing: var(--typography-letterspacing-none);
154
171
  tab-size: 2;