@ds-mo/ui 9.2.1 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/README.md +2 -2
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +15 -9
  4. package/dist/agent.json +473 -150
  5. package/dist/angular/boolean-value-accessor.js +3 -3
  6. package/dist/angular/ds-agent-activity.js +3 -3
  7. package/dist/angular/ds-agent-response.js +3 -3
  8. package/dist/angular/ds-agent-source-list.js +3 -3
  9. package/dist/angular/ds-agent-tool-call.js +3 -3
  10. package/dist/angular/ds-app-shell.js +3 -3
  11. package/dist/angular/ds-attachment-list.js +3 -3
  12. package/dist/angular/ds-avatar.js +3 -3
  13. package/dist/angular/ds-badge.js +3 -3
  14. package/dist/angular/ds-bar-nav.js +3 -3
  15. package/dist/angular/ds-button-filled.js +3 -3
  16. package/dist/angular/ds-button-unfilled.js +3 -3
  17. package/dist/angular/ds-card-data-viz-donut.js +3 -3
  18. package/dist/angular/ds-card-setting.d.ts +5 -4
  19. package/dist/angular/ds-card-setting.js +6 -6
  20. package/dist/angular/ds-card-shell-data-viz.js +3 -3
  21. package/dist/angular/ds-chart-bar.js +3 -3
  22. package/dist/angular/ds-chart-donut.js +3 -3
  23. package/dist/angular/ds-chart-legend.js +3 -3
  24. package/dist/angular/ds-chart-line.js +3 -3
  25. package/dist/angular/ds-checkbox.js +3 -3
  26. package/dist/angular/ds-chip.js +3 -3
  27. package/dist/angular/ds-code-block.js +3 -3
  28. package/dist/angular/ds-conversation-list-item.js +3 -3
  29. package/dist/angular/ds-conversation-list-section.js +3 -3
  30. package/dist/angular/ds-conversation-list.js +3 -3
  31. package/dist/angular/ds-divider.js +3 -3
  32. package/dist/angular/ds-empty-state.js +3 -3
  33. package/dist/angular/ds-field.js +3 -3
  34. package/dist/angular/ds-icon.js +3 -3
  35. package/dist/angular/ds-input.js +3 -3
  36. package/dist/angular/ds-loader.js +3 -3
  37. package/dist/angular/ds-markdown.js +3 -3
  38. package/dist/angular/ds-menu.js +3 -3
  39. package/dist/angular/ds-message-bubble.js +3 -3
  40. package/dist/angular/ds-message-composer.js +3 -3
  41. package/dist/angular/ds-message-scroller.js +3 -3
  42. package/dist/angular/ds-message.js +3 -3
  43. package/dist/angular/ds-modal.d.ts +12 -3
  44. package/dist/angular/ds-modal.js +9 -6
  45. package/dist/angular/ds-panel-nav.js +3 -3
  46. package/dist/angular/ds-panel-sub-nav.js +3 -3
  47. package/dist/angular/ds-panel-tool-header.js +3 -3
  48. package/dist/angular/ds-panel-tool-search.js +3 -3
  49. package/dist/angular/ds-panel-tools.js +3 -3
  50. package/dist/angular/ds-radio.js +3 -3
  51. package/dist/angular/ds-select-multi.js +3 -3
  52. package/dist/angular/ds-select.js +3 -3
  53. package/dist/angular/ds-shell-gradient-picker.js +3 -3
  54. package/dist/angular/ds-shell-gradient-swatch.js +3 -3
  55. package/dist/angular/ds-skeleton.js +3 -3
  56. package/dist/angular/ds-slider.js +3 -3
  57. package/dist/angular/ds-swatch-picker.js +3 -3
  58. package/dist/angular/ds-switch.js +3 -3
  59. package/dist/angular/ds-tab-group.js +3 -3
  60. package/dist/angular/ds-tag.js +3 -3
  61. package/dist/angular/ds-text.js +3 -3
  62. package/dist/angular/ds-toast.d.ts +22 -0
  63. package/dist/angular/{ds-banner.js → ds-toast.js} +21 -15
  64. package/dist/angular/ds-tooltip-data-viz.js +3 -3
  65. package/dist/angular/ds-tooltip.js +3 -3
  66. package/dist/angular/ds-typing-indicator.d.ts +12 -0
  67. package/dist/angular/{ds-card.js → ds-typing-indicator.js} +12 -12
  68. package/dist/angular/index.d.ts +1 -1
  69. package/dist/angular/index.js +3 -3
  70. package/dist/angular/proxies.d.ts +2 -2
  71. package/dist/angular/proxies.js +2 -2
  72. package/dist/angular/radio-value-accessor.js +3 -3
  73. package/dist/angular/select-value-accessor.js +3 -3
  74. package/dist/angular/text-value-accessor.js +3 -3
  75. package/dist/angular/value-accessor.js +3 -3
  76. package/dist/components/ds-agent-activity.js +1 -1
  77. package/dist/components/ds-agent-response.js +1 -1
  78. package/dist/components/ds-agent-response.js.map +1 -1
  79. package/dist/components/ds-agent-source-list.js +1 -1
  80. package/dist/components/ds-agent-tool-call.js +1 -1
  81. package/dist/components/ds-app-shell.js +1 -1
  82. package/dist/components/ds-attachment-list.js +1 -1
  83. package/dist/components/ds-avatar.js +1 -1
  84. package/dist/components/ds-avatar.js.map +1 -1
  85. package/dist/components/ds-badge.js +1 -1
  86. package/dist/components/ds-bar-nav.js +1 -1
  87. package/dist/components/ds-bar-nav.js.map +1 -1
  88. package/dist/components/ds-button-filled.js +1 -1
  89. package/dist/components/ds-button-unfilled.js +1 -1
  90. package/dist/components/ds-card-data-viz-donut.js +1 -1
  91. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  92. package/dist/components/ds-card-setting.js +1 -1
  93. package/dist/components/ds-card-setting.js.map +1 -1
  94. package/dist/components/ds-card-shell-data-viz.js +1 -1
  95. package/dist/components/ds-chart-bar.js +1 -1
  96. package/dist/components/ds-chart-donut.js +1 -1
  97. package/dist/components/ds-chart-legend.js +1 -1
  98. package/dist/components/ds-chart-legend.js.map +1 -1
  99. package/dist/components/ds-chart-line.js +1 -1
  100. package/dist/components/ds-checkbox.js +1 -1
  101. package/dist/components/ds-chip.js +1 -1
  102. package/dist/components/ds-chip.js.map +1 -1
  103. package/dist/components/ds-code-block.js +1 -1
  104. package/dist/components/ds-conversation-list-item.js +1 -1
  105. package/dist/components/ds-conversation-list-item.js.map +1 -1
  106. package/dist/components/ds-conversation-list-section.js +1 -1
  107. package/dist/components/ds-conversation-list.js +1 -1
  108. package/dist/components/ds-divider.js +1 -1
  109. package/dist/components/ds-empty-state.js +1 -1
  110. package/dist/components/ds-field.js +1 -1
  111. package/dist/components/ds-icon.js +1 -1
  112. package/dist/components/ds-input.js +1 -1
  113. package/dist/components/ds-input.js.map +1 -1
  114. package/dist/components/ds-markdown.js +1 -1
  115. package/dist/components/ds-menu.js +1 -1
  116. package/dist/components/ds-message-bubble.js +1 -1
  117. package/dist/components/ds-message-bubble.js.map +1 -1
  118. package/dist/components/ds-message-composer.js +1 -1
  119. package/dist/components/ds-message-composer.js.map +1 -1
  120. package/dist/components/ds-message-scroller.js +1 -1
  121. package/dist/components/ds-message-scroller.js.map +1 -1
  122. package/dist/components/ds-message.js +1 -1
  123. package/dist/components/ds-modal.js +1 -1
  124. package/dist/components/ds-modal.js.map +1 -1
  125. package/dist/components/ds-panel-nav.js +1 -1
  126. package/dist/components/ds-panel-nav.js.map +1 -1
  127. package/dist/components/ds-panel-sub-nav.js +1 -1
  128. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  129. package/dist/components/ds-panel-tool-header.js +1 -1
  130. package/dist/components/ds-panel-tool-search.js +1 -1
  131. package/dist/components/ds-panel-tool-search.js.map +1 -1
  132. package/dist/components/ds-panel-tools.js +1 -1
  133. package/dist/components/ds-panel-tools.js.map +1 -1
  134. package/dist/components/ds-radio.js +1 -1
  135. package/dist/components/ds-radio.js.map +1 -1
  136. package/dist/components/ds-select-multi.js +1 -1
  137. package/dist/components/ds-select-multi.js.map +1 -1
  138. package/dist/components/ds-select.js +1 -1
  139. package/dist/components/ds-select.js.map +1 -1
  140. package/dist/components/ds-shell-gradient-picker.js +1 -1
  141. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  142. package/dist/components/ds-skeleton.js +1 -1
  143. package/dist/components/ds-skeleton.js.map +1 -1
  144. package/dist/components/ds-slider.js +1 -1
  145. package/dist/components/ds-slider.js.map +1 -1
  146. package/dist/components/ds-swatch-picker.js +1 -1
  147. package/dist/components/ds-switch.js +1 -1
  148. package/dist/components/ds-tab-group.js +1 -1
  149. package/dist/components/ds-tab-group.js.map +1 -1
  150. package/dist/components/ds-tag.js +1 -1
  151. package/dist/components/ds-tag.js.map +1 -1
  152. package/dist/components/ds-text.js +1 -1
  153. package/dist/components/{ds-card.d.ts → ds-toast.d.ts} +4 -4
  154. package/dist/components/ds-toast.js +2 -0
  155. package/dist/components/ds-toast.js.map +1 -0
  156. package/dist/components/ds-tooltip-data-viz.js +1 -1
  157. package/dist/components/ds-tooltip-data-viz.js.map +1 -1
  158. package/dist/components/ds-tooltip.js +1 -1
  159. package/dist/components/{ds-banner.d.ts → ds-typing-indicator.d.ts} +4 -4
  160. package/dist/components/ds-typing-indicator.js +2 -0
  161. package/dist/components/ds-typing-indicator.js.map +1 -0
  162. package/dist/components/{p-DnMCRAwx.js → p-0kEg-Z4f.js} +2 -2
  163. package/dist/components/p-B8C_yfLQ.js +2 -0
  164. package/dist/components/p-B8C_yfLQ.js.map +1 -0
  165. package/dist/components/{p-DiooIO2B.js → p-BEWtqFX7.js} +2 -2
  166. package/dist/components/p-BMwnjAIq.js +2 -0
  167. package/dist/components/p-BMwnjAIq.js.map +1 -0
  168. package/dist/components/{p-Ci_nVk5P.js → p-BkwBtZs3.js} +2 -2
  169. package/dist/components/p-C3nDIMX5.js +2 -0
  170. package/dist/components/{p-Dj5MejHv.js.map → p-C3nDIMX5.js.map} +1 -1
  171. package/dist/components/{p-CJlgONwR.js → p-C8e2A66f.js} +2 -2
  172. package/dist/components/{p-BRfOCc_h.js → p-CLn7QnE0.js} +2 -2
  173. package/dist/components/{p-kezp2_Xu.js → p-CPPAndX2.js} +2 -2
  174. package/dist/components/p-CTFBf97-.js +2 -0
  175. package/dist/components/{p-CblAABEo.js.map → p-CTFBf97-.js.map} +1 -1
  176. package/dist/components/{p-BSOZXagj.js → p-CZZYGqKz.js} +2 -2
  177. package/dist/components/p-C_0Q8Cnp.js +2 -0
  178. package/dist/components/p-C_0Q8Cnp.js.map +1 -0
  179. package/dist/components/{p-T0Mzhv3-.js → p-CbckeueL.js} +2 -2
  180. package/dist/components/p-CjP8sYlo.js +2 -0
  181. package/dist/components/{p-xB0GPG3-.js.map → p-CjP8sYlo.js.map} +1 -1
  182. package/dist/components/{p-DaQ0ZE_V.js → p-DJ78wdNv.js} +2 -2
  183. package/dist/components/p-DTqCBjUj.js +2 -0
  184. package/dist/components/{p-Dst-OliP.js.map → p-DTqCBjUj.js.map} +1 -1
  185. package/dist/components/{p-CeFBA7Dx.js → p-Dh4q5TSS.js} +2 -2
  186. package/dist/components/p-DirD-b2y.js +2 -0
  187. package/dist/components/{p-BHpWYKtP.js.map → p-DirD-b2y.js.map} +1 -1
  188. package/dist/components/{p-CiwdnKKp.js → p-DrDHC7V6.js} +2 -2
  189. package/dist/components/p-DuNZGFkV.js +2 -0
  190. package/dist/components/p-DuNZGFkV.js.map +1 -0
  191. package/dist/components/{p-Cijzn3YQ.js → p-Hw-HMjCk.js} +2 -2
  192. package/dist/components/p-M5pt9I13.js +2 -0
  193. package/dist/components/p-M5pt9I13.js.map +1 -0
  194. package/dist/components/{p-B1pWGQn1.js → p-bDx_rlLm.js} +2 -2
  195. package/dist/docs/components.json +1509 -1530
  196. package/dist/framework/select-multi-value-accessor.js +3 -3
  197. package/dist/lib/toast/index.d.ts +2 -0
  198. package/dist/lib/toast/index.js +158 -0
  199. package/dist/lib/toast/index.js.map +7 -0
  200. package/dist/lib/toast/toast-manager.d.ts +3 -0
  201. package/dist/lib/toast/toast-types.d.ts +85 -0
  202. package/dist/mcp-data/registry/agent-activity.json +1 -1
  203. package/dist/mcp-data/registry/agent-response.json +6 -6
  204. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  205. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  206. package/dist/mcp-data/registry/app-shell.json +1 -1
  207. package/dist/mcp-data/registry/attachment-list.json +1 -1
  208. package/dist/mcp-data/registry/avatar.json +1 -1
  209. package/dist/mcp-data/registry/badge.json +1 -1
  210. package/dist/mcp-data/registry/bar-nav.json +1 -1
  211. package/dist/mcp-data/registry/button-filled.json +1 -1
  212. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  213. package/dist/mcp-data/registry/card-data-viz-donut.json +2 -2
  214. package/dist/mcp-data/registry/card-setting.json +99 -13
  215. package/dist/mcp-data/registry/card-shell-data-viz.json +8 -8
  216. package/dist/mcp-data/registry/chart-bar.json +1 -1
  217. package/dist/mcp-data/registry/chart-donut.json +1 -1
  218. package/dist/mcp-data/registry/chart-legend.json +1 -1
  219. package/dist/mcp-data/registry/chart-line.json +1 -1
  220. package/dist/mcp-data/registry/checkbox.json +1 -1
  221. package/dist/mcp-data/registry/chip.json +1 -1
  222. package/dist/mcp-data/registry/code-block.json +1 -1
  223. package/dist/mcp-data/registry/conversation-list-item.json +5 -5
  224. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  225. package/dist/mcp-data/registry/conversation-list.json +1 -1
  226. package/dist/mcp-data/registry/divider.json +5 -5
  227. package/dist/mcp-data/registry/empty-state.json +1 -1
  228. package/dist/mcp-data/registry/field.json +1 -1
  229. package/dist/mcp-data/registry/icon.json +2 -2
  230. package/dist/mcp-data/registry/input.json +1 -1
  231. package/dist/mcp-data/registry/loader.json +1 -1
  232. package/dist/mcp-data/registry/markdown.json +1 -1
  233. package/dist/mcp-data/registry/menu.json +1 -1
  234. package/dist/mcp-data/registry/message-bubble.json +21 -16
  235. package/dist/mcp-data/registry/message-composer.json +6 -4
  236. package/dist/mcp-data/registry/message-scroller.json +2 -2
  237. package/dist/mcp-data/registry/message.json +7 -6
  238. package/dist/mcp-data/registry/modal.json +154 -24
  239. package/dist/mcp-data/registry/panel-nav.json +4 -3
  240. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  241. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  242. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  243. package/dist/mcp-data/registry/panel-tools.json +1 -1
  244. package/dist/mcp-data/registry/radio.json +1 -1
  245. package/dist/mcp-data/registry/registry.json +479 -156
  246. package/dist/mcp-data/registry/select-multi.json +1 -1
  247. package/dist/mcp-data/registry/select.json +1 -1
  248. package/dist/mcp-data/registry/shell-gradient-picker.json +1 -1
  249. package/dist/mcp-data/registry/shell-gradient-swatch.json +1 -1
  250. package/dist/mcp-data/registry/skeleton.json +4 -4
  251. package/dist/mcp-data/registry/slider.json +1 -1
  252. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  253. package/dist/mcp-data/registry/switch.json +1 -1
  254. package/dist/mcp-data/registry/tab-group.json +1 -1
  255. package/dist/mcp-data/registry/tag.json +2 -2
  256. package/dist/mcp-data/registry/text.json +2 -2
  257. package/dist/mcp-data/registry/toast.json +318 -0
  258. package/dist/mcp-data/registry/tooltip-data-viz.json +1 -1
  259. package/dist/mcp-data/registry/tooltip.json +1 -1
  260. package/dist/mcp-data/registry/typing-indicator.json +127 -0
  261. package/dist/react/components.d.ts +2 -2
  262. package/dist/react/components.js +2 -2
  263. package/dist/react/ds-card-setting.d.ts +2 -2
  264. package/dist/react/ds-card-setting.js +1 -1
  265. package/dist/react/ds-modal.d.ts +3 -2
  266. package/dist/react/ds-modal.js +4 -1
  267. package/dist/react/ds-toast.d.ts +14 -0
  268. package/dist/react/ds-toast.js +16 -0
  269. package/dist/react/{ds-card.d.ts → ds-typing-indicator.d.ts} +3 -3
  270. package/dist/react/ds-typing-indicator.js +12 -0
  271. package/dist/types/components/CardSetting/CardSetting.d.ts +9 -6
  272. package/dist/types/components/CardSetting/index.d.ts +1 -1
  273. package/dist/types/components/MessageBubble/MessageBubble.d.ts +1 -1
  274. package/dist/types/components/Modal/Modal.d.ts +21 -18
  275. package/dist/types/components/Toast/Toast.d.ts +106 -0
  276. package/dist/types/components/Toast/index.d.ts +2 -0
  277. package/dist/types/components/TypingIndicator/TypingIndicator.d.ts +6 -0
  278. package/dist/types/components.d.ts +164 -182
  279. package/dist/types/toast/index.d.ts +3 -0
  280. package/dist/types/toast/toast-manager.d.ts +4 -0
  281. package/dist/types/toast/toast-types.d.ts +86 -0
  282. package/package.json +12 -8
  283. package/dist/angular/ds-banner.d.ts +0 -15
  284. package/dist/angular/ds-card.d.ts +0 -12
  285. package/dist/components/ds-banner.js +0 -2
  286. package/dist/components/ds-banner.js.map +0 -1
  287. package/dist/components/ds-card.js +0 -2
  288. package/dist/components/ds-card.js.map +0 -1
  289. package/dist/components/p-BHpWYKtP.js +0 -2
  290. package/dist/components/p-BO6C8abO.js +0 -2
  291. package/dist/components/p-BO6C8abO.js.map +0 -1
  292. package/dist/components/p-CBYuvZKM.js +0 -2
  293. package/dist/components/p-CBYuvZKM.js.map +0 -1
  294. package/dist/components/p-CWNdl52Y.js +0 -2
  295. package/dist/components/p-CWNdl52Y.js.map +0 -1
  296. package/dist/components/p-CblAABEo.js +0 -2
  297. package/dist/components/p-CiKGqsA2.js +0 -2
  298. package/dist/components/p-CiKGqsA2.js.map +0 -1
  299. package/dist/components/p-DFxqk71w.js +0 -2
  300. package/dist/components/p-DFxqk71w.js.map +0 -1
  301. package/dist/components/p-Dj5MejHv.js +0 -2
  302. package/dist/components/p-Dst-OliP.js +0 -2
  303. package/dist/components/p-drBA73M_.js +0 -2
  304. package/dist/components/p-drBA73M_.js.map +0 -1
  305. package/dist/components/p-xB0GPG3-.js +0 -2
  306. package/dist/mcp-data/registry/banner.json +0 -206
  307. package/dist/mcp-data/registry/card.json +0 -126
  308. package/dist/react/ds-banner.d.ts +0 -12
  309. package/dist/react/ds-banner.js +0 -12
  310. package/dist/react/ds-card.js +0 -12
  311. package/dist/types/components/Banner/Banner.d.ts +0 -31
  312. package/dist/types/components/Card/Card.d.ts +0 -21
  313. package/dist/types/components/Card/index.d.ts +0 -2
  314. /package/dist/components/{p-DnMCRAwx.js.map → p-0kEg-Z4f.js.map} +0 -0
  315. /package/dist/components/{p-DiooIO2B.js.map → p-BEWtqFX7.js.map} +0 -0
  316. /package/dist/components/{p-Ci_nVk5P.js.map → p-BkwBtZs3.js.map} +0 -0
  317. /package/dist/components/{p-CJlgONwR.js.map → p-C8e2A66f.js.map} +0 -0
  318. /package/dist/components/{p-BRfOCc_h.js.map → p-CLn7QnE0.js.map} +0 -0
  319. /package/dist/components/{p-kezp2_Xu.js.map → p-CPPAndX2.js.map} +0 -0
  320. /package/dist/components/{p-BSOZXagj.js.map → p-CZZYGqKz.js.map} +0 -0
  321. /package/dist/components/{p-T0Mzhv3-.js.map → p-CbckeueL.js.map} +0 -0
  322. /package/dist/components/{p-DaQ0ZE_V.js.map → p-DJ78wdNv.js.map} +0 -0
  323. /package/dist/components/{p-CeFBA7Dx.js.map → p-Dh4q5TSS.js.map} +0 -0
  324. /package/dist/components/{p-CiwdnKKp.js.map → p-DrDHC7V6.js.map} +0 -0
  325. /package/dist/components/{p-Cijzn3YQ.js.map → p-Hw-HMjCk.js.map} +0 -0
  326. /package/dist/components/{p-B1pWGQn1.js.map → p-bDx_rlLm.js.map} +0 -0
@@ -13,8 +13,8 @@ export class SelectMultiValueAccessor extends ValueAccessor {
13
13
  this.el.nativeElement.values = values;
14
14
  this.lastValue = values;
15
15
  }
16
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SelectMultiValueAccessor, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
17
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.6", type: SelectMultiValueAccessor, isStandalone: true, selector: "ds-select-multi", host: { listeners: { "dsChange": "handleChangeEvent($event.target?.[\"values\"])" } }, providers: [
16
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SelectMultiValueAccessor, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
17
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.7", type: SelectMultiValueAccessor, isStandalone: true, selector: "ds-select-multi", host: { listeners: { "dsChange": "handleChangeEvent($event.target?.[\"values\"])" } }, providers: [
18
18
  {
19
19
  provide: NG_VALUE_ACCESSOR,
20
20
  useExisting: forwardRef(() => SelectMultiValueAccessor),
@@ -22,7 +22,7 @@ export class SelectMultiValueAccessor extends ValueAccessor {
22
22
  },
23
23
  ], usesInheritance: true, ngImport: i0 }); }
24
24
  }
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: SelectMultiValueAccessor, decorators: [{
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SelectMultiValueAccessor, decorators: [{
26
26
  type: Directive,
27
27
  args: [{
28
28
  selector: 'ds-select-multi',
@@ -0,0 +1,2 @@
1
+ export { createToastManager, toastManager } from './toast-manager';
2
+ export type { ToastAction, ToastActionContext, ToastActionEventDetail, ToastCloseContext, ToastCloseEventDetail, ToastCloseReason, ToastEventDetail, ToastListener, ToastManager, ToastOptions, ToastPositionerOptions, ToastPriority, ToastPromiseOptions, ToastPromiseValue, ToastRecord, ToastSwipeDirection, ToastTransitionStatus, } from './toast-types';
@@ -0,0 +1,158 @@
1
+ // src/wc/toast/toast-manager.ts
2
+ function resolvePromiseValue(value, input) {
3
+ const resolved = typeof value === "function" ? value(input) : value;
4
+ return typeof resolved === "string" ? { description: resolved } : resolved;
5
+ }
6
+ var ToastManagerImpl = class {
7
+ constructor() {
8
+ this.records = [];
9
+ this.listeners = /* @__PURE__ */ new Set();
10
+ this.nextId = 0;
11
+ }
12
+ add(options) {
13
+ const id = options.id || `ds-toast-${++this.nextId}`;
14
+ const existingIndex = this.records.findIndex((record2) => record2.id === id);
15
+ if (!options.title?.trim() && !options.description?.trim()) {
16
+ console.warn(`[ds-toast] Toast "${id}" should provide a title or description.`);
17
+ }
18
+ if (existingIndex >= 0) {
19
+ const current = this.records[existingIndex];
20
+ const updated = {
21
+ ...current,
22
+ ...options,
23
+ id,
24
+ priority: options.priority ?? current.priority,
25
+ transitionStatus: "active",
26
+ closeReason: void 0,
27
+ updateKey: current.updateKey + 1,
28
+ timerKey: current.timerKey + 1
29
+ };
30
+ this.records = [
31
+ updated,
32
+ ...this.records.filter((_, index) => index !== existingIndex)
33
+ ];
34
+ this.emit();
35
+ return id;
36
+ }
37
+ const record = {
38
+ ...options,
39
+ id,
40
+ priority: options.priority ?? "low",
41
+ transitionStatus: "starting",
42
+ updateKey: 0,
43
+ timerKey: 0
44
+ };
45
+ this.records = [record, ...this.records];
46
+ this.emit();
47
+ return id;
48
+ }
49
+ update(id, updates) {
50
+ const index = this.records.findIndex((record) => record.id === id);
51
+ if (index < 0) return;
52
+ const current = this.records[index];
53
+ const restartsTimer = Object.prototype.hasOwnProperty.call(updates, "timeout") || current.type === "loading" && updates.type !== void 0 && updates.type !== "loading";
54
+ const updated = {
55
+ ...current,
56
+ ...updates,
57
+ id,
58
+ priority: updates.priority ?? current.priority,
59
+ updateKey: current.updateKey + 1,
60
+ timerKey: restartsTimer ? current.timerKey + 1 : current.timerKey
61
+ };
62
+ this.records = this.records.map(
63
+ (record, recordIndex) => recordIndex === index ? updated : record
64
+ );
65
+ this.emit();
66
+ }
67
+ close(id, reason = "programmatic") {
68
+ const index = this.records.findIndex((record) => record.id === id);
69
+ if (index < 0 || this.records[index].transitionStatus === "ending") return;
70
+ const closing = {
71
+ ...this.records[index],
72
+ transitionStatus: "ending",
73
+ closeReason: reason
74
+ };
75
+ this.records = this.records.map(
76
+ (record, recordIndex) => recordIndex === index ? closing : record
77
+ );
78
+ this.emit();
79
+ closing.onClose?.({ id, reason, toast: closing });
80
+ }
81
+ closeAll(reason = "programmatic") {
82
+ for (const record of [...this.records]) this.close(record.id, reason);
83
+ }
84
+ async promise(promiseValue, options) {
85
+ const loading = resolvePromiseValue(options.loading, void 0);
86
+ const id = this.add({
87
+ ...loading,
88
+ type: loading.type ?? "loading",
89
+ timeout: 0
90
+ });
91
+ try {
92
+ const value = await promiseValue;
93
+ const success = resolvePromiseValue(options.success, value);
94
+ this.update(id, {
95
+ ...success,
96
+ type: success.type ?? "success",
97
+ timeout: success.timeout
98
+ });
99
+ return value;
100
+ } catch (error) {
101
+ const failure = resolvePromiseValue(options.error, error);
102
+ this.update(id, {
103
+ ...failure,
104
+ type: failure.type ?? "error",
105
+ timeout: failure.timeout
106
+ });
107
+ throw error;
108
+ }
109
+ }
110
+ subscribe(listener) {
111
+ this.listeners.add(listener);
112
+ listener(this.getSnapshot());
113
+ return () => {
114
+ this.listeners.delete(listener);
115
+ };
116
+ }
117
+ getSnapshot() {
118
+ return this.records.map((record) => ({ ...record }));
119
+ }
120
+ activate(id) {
121
+ const record = this.records.find((candidate) => candidate.id === id);
122
+ if (!record || record.transitionStatus !== "starting") return;
123
+ this.records = this.records.map(
124
+ (candidate) => candidate.id === id ? { ...candidate, transitionStatus: "active" } : candidate
125
+ );
126
+ this.emit();
127
+ }
128
+ remove(id) {
129
+ const record = this.records.find((candidate) => candidate.id === id);
130
+ if (!record || record.transitionStatus !== "ending") return null;
131
+ const reason = record.closeReason ?? "programmatic";
132
+ this.records = this.records.filter((candidate) => candidate.id !== id);
133
+ this.emit();
134
+ const context = { id, reason, toast: record };
135
+ return context;
136
+ }
137
+ notifyRemove(context) {
138
+ const { toast } = context;
139
+ toast.onRemove?.(context);
140
+ }
141
+ emit() {
142
+ const snapshot = this.getSnapshot();
143
+ for (const listener of this.listeners) listener(snapshot);
144
+ }
145
+ };
146
+ function createToastManager() {
147
+ return new ToastManagerImpl();
148
+ }
149
+ var defaultManagerKey = /* @__PURE__ */ Symbol.for("@ds-mo/ui/default-toast-manager");
150
+ var globalScope = globalThis;
151
+ var existingManager = globalScope[defaultManagerKey];
152
+ var toastManager = existingManager ?? createToastManager();
153
+ if (!existingManager) globalScope[defaultManagerKey] = toastManager;
154
+ export {
155
+ createToastManager,
156
+ toastManager
157
+ };
158
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/wc/toast/toast-manager.ts"],
4
+ "sourcesContent": ["import type {\n ToastCloseContext,\n ToastCloseReason,\n ToastListener,\n ToastManager,\n ToastOptions,\n ToastPromiseOptions,\n ToastPromiseValue,\n ToastRecord,\n} from './toast-types';\n\nfunction resolvePromiseValue<Value, Data>(\n value:\n | ToastPromiseValue<Data>\n | ((input: Value) => ToastPromiseValue<Data>),\n input: Value,\n): ToastOptions<Data> {\n const resolved = typeof value === 'function' ? value(input) : value;\n return typeof resolved === 'string' ? { description: resolved } : resolved;\n}\n\nclass ToastManagerImpl<Data = unknown> implements ToastManager<Data> {\n private records: ToastRecord<Data>[] = [];\n private listeners = new Set<ToastListener<Data>>();\n private nextId = 0;\n\n add(options: ToastOptions<Data>): string {\n const id = options.id || `ds-toast-${++this.nextId}`;\n const existingIndex = this.records.findIndex(record => record.id === id);\n\n if (!options.title?.trim() && !options.description?.trim()) {\n console.warn(`[ds-toast] Toast \"${id}\" should provide a title or description.`);\n }\n\n if (existingIndex >= 0) {\n const current = this.records[existingIndex];\n const updated: ToastRecord<Data> = {\n ...current,\n ...options,\n id,\n priority: options.priority ?? current.priority,\n transitionStatus: 'active',\n closeReason: undefined,\n updateKey: current.updateKey + 1,\n timerKey: current.timerKey + 1,\n };\n this.records = [\n updated,\n ...this.records.filter((_, index) => index !== existingIndex),\n ];\n this.emit();\n return id;\n }\n\n const record: ToastRecord<Data> = {\n ...options,\n id,\n priority: options.priority ?? 'low',\n transitionStatus: 'starting',\n updateKey: 0,\n timerKey: 0,\n };\n this.records = [record, ...this.records];\n this.emit();\n return id;\n }\n\n update(id: string, updates: Partial<ToastOptions<Data>>): void {\n const index = this.records.findIndex(record => record.id === id);\n if (index < 0) return;\n const current = this.records[index];\n const restartsTimer =\n Object.prototype.hasOwnProperty.call(updates, 'timeout') ||\n (current.type === 'loading' && updates.type !== undefined && updates.type !== 'loading');\n const updated: ToastRecord<Data> = {\n ...current,\n ...updates,\n id,\n priority: updates.priority ?? current.priority,\n updateKey: current.updateKey + 1,\n timerKey: restartsTimer ? current.timerKey + 1 : current.timerKey,\n };\n this.records = this.records.map((record, recordIndex) =>\n recordIndex === index ? updated : record\n );\n this.emit();\n }\n\n close(id: string, reason: ToastCloseReason = 'programmatic'): void {\n const index = this.records.findIndex(record => record.id === id);\n if (index < 0 || this.records[index].transitionStatus === 'ending') return;\n\n const closing: ToastRecord<Data> = {\n ...this.records[index],\n transitionStatus: 'ending',\n closeReason: reason,\n };\n this.records = this.records.map((record, recordIndex) =>\n recordIndex === index ? closing : record\n );\n this.emit();\n closing.onClose?.({ id, reason, toast: closing });\n }\n\n closeAll(reason: ToastCloseReason = 'programmatic'): void {\n for (const record of [...this.records]) this.close(record.id, reason);\n }\n\n async promise<Value>(\n promiseValue: PromiseLike<Value>,\n options: ToastPromiseOptions<Value, Data>,\n ): Promise<Value> {\n const loading = resolvePromiseValue(options.loading, undefined as Value);\n const id = this.add({\n ...loading,\n type: loading.type ?? 'loading',\n timeout: 0,\n });\n\n try {\n const value = await promiseValue;\n const success = resolvePromiseValue(options.success, value);\n this.update(id, {\n ...success,\n type: success.type ?? 'success',\n timeout: success.timeout,\n });\n return value;\n } catch (error) {\n const failure = resolvePromiseValue(options.error, error);\n this.update(id, {\n ...failure,\n type: failure.type ?? 'error',\n timeout: failure.timeout,\n });\n throw error;\n }\n }\n\n subscribe(listener: ToastListener<Data>): () => void {\n this.listeners.add(listener);\n listener(this.getSnapshot());\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getSnapshot(): readonly ToastRecord<Data>[] {\n return this.records.map(record => ({ ...record }));\n }\n\n activate(id: string): void {\n const record = this.records.find(candidate => candidate.id === id);\n if (!record || record.transitionStatus !== 'starting') return;\n this.records = this.records.map(candidate =>\n candidate.id === id\n ? { ...candidate, transitionStatus: 'active' }\n : candidate\n );\n this.emit();\n }\n\n remove(id: string): ToastCloseContext<Data> | null {\n const record = this.records.find(candidate => candidate.id === id);\n if (!record || record.transitionStatus !== 'ending') return null;\n const reason = record.closeReason ?? 'programmatic';\n this.records = this.records.filter(candidate => candidate.id !== id);\n this.emit();\n const context: ToastCloseContext<Data> = { id, reason, toast: record };\n return context;\n }\n\n notifyRemove(context: ToastCloseContext<Data>): void {\n const { toast } = context;\n toast.onRemove?.(context);\n }\n\n private emit(): void {\n const snapshot = this.getSnapshot();\n for (const listener of this.listeners) listener(snapshot);\n }\n}\n\nexport function createToastManager<Data = unknown>(): ToastManager<Data> {\n return new ToastManagerImpl<Data>();\n}\n\nconst defaultManagerKey = Symbol.for('@ds-mo/ui/default-toast-manager');\nconst globalScope = globalThis as typeof globalThis & Record<PropertyKey, unknown>;\nconst existingManager = globalScope[defaultManagerKey] as ToastManager | undefined;\n\nexport const toastManager: ToastManager =\n existingManager ?? createToastManager();\n\nif (!existingManager) globalScope[defaultManagerKey] = toastManager;\n"],
5
+ "mappings": "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",
6
+ "names": ["record"]
7
+ }
@@ -0,0 +1,3 @@
1
+ import type { ToastManager } from './toast-types';
2
+ export declare function createToastManager<Data = unknown>(): ToastManager<Data>;
3
+ export declare const toastManager: ToastManager;
@@ -0,0 +1,85 @@
1
+ import type { AnchoredPopupAlign, AnchoredPopupSide } from '../utils/anchored-popup';
2
+ export type ToastPriority = 'low' | 'high';
3
+ export type ToastTransitionStatus = 'starting' | 'active' | 'ending';
4
+ export type ToastSwipeDirection = 'up' | 'down' | 'left' | 'right';
5
+ export type ToastCloseReason = 'timeout' | 'close-button' | 'swipe' | 'escape' | 'programmatic';
6
+ export interface ToastPositionerOptions {
7
+ /** Element or document id used to position this toast outside the global stack. */
8
+ anchor: HTMLElement | string;
9
+ side?: AnchoredPopupSide;
10
+ align?: AnchoredPopupAlign;
11
+ sideOffset?: number | string;
12
+ alignOffset?: number | string;
13
+ }
14
+ export interface ToastActionContext<Data = unknown> {
15
+ id: string;
16
+ data: Data | undefined;
17
+ manager: ToastManager<Data>;
18
+ originalEvent: MouseEvent;
19
+ }
20
+ export interface ToastAction<Data = unknown> {
21
+ label: string;
22
+ ariaLabel?: string;
23
+ onAction?: (context: ToastActionContext<Data>) => void;
24
+ }
25
+ export interface ToastCloseContext<Data = unknown> {
26
+ id: string;
27
+ reason: ToastCloseReason;
28
+ toast: ToastRecord<Data>;
29
+ }
30
+ export interface ToastOptions<Data = unknown> {
31
+ id?: string;
32
+ title?: string;
33
+ description?: string;
34
+ /** Styling/state hook, including `loading`, `success`, and `error`. */
35
+ type?: string;
36
+ /** Milliseconds, a CSS time/token value, or 0 to keep the toast open. */
37
+ timeout?: number | string;
38
+ priority?: ToastPriority;
39
+ action?: ToastAction<Data>;
40
+ positioner?: ToastPositionerOptions;
41
+ data?: Data;
42
+ onClose?: (context: ToastCloseContext<Data>) => void;
43
+ onRemove?: (context: ToastCloseContext<Data>) => void;
44
+ }
45
+ export interface ToastRecord<Data = unknown> extends Omit<ToastOptions<Data>, 'id' | 'priority'> {
46
+ id: string;
47
+ priority: ToastPriority;
48
+ transitionStatus: ToastTransitionStatus;
49
+ updateKey: number;
50
+ /** Internal timer generation; changes only when countdown timing must restart. */
51
+ timerKey: number;
52
+ closeReason?: ToastCloseReason;
53
+ }
54
+ export type ToastPromiseValue<Data = unknown> = string | ToastOptions<Data>;
55
+ export interface ToastPromiseOptions<Value, Data = unknown> {
56
+ loading: ToastPromiseValue<Data>;
57
+ success: ToastPromiseValue<Data> | ((value: Value) => ToastPromiseValue<Data>);
58
+ error: ToastPromiseValue<Data> | ((error: unknown) => ToastPromiseValue<Data>);
59
+ }
60
+ export type ToastListener<Data = unknown> = (records: readonly ToastRecord<Data>[]) => void;
61
+ export interface ToastManager<Data = unknown> {
62
+ add(options: ToastOptions<Data>): string;
63
+ update(id: string, updates: Partial<ToastOptions<Data>>): void;
64
+ close(id: string, reason?: ToastCloseReason): void;
65
+ closeAll(reason?: ToastCloseReason): void;
66
+ promise<Value>(promiseValue: PromiseLike<Value>, options: ToastPromiseOptions<Value, Data>): Promise<Value>;
67
+ subscribe(listener: ToastListener<Data>): () => void;
68
+ getSnapshot(): readonly ToastRecord<Data>[];
69
+ /** Component lifecycle hook; consumers should not need to call this. */
70
+ activate(id: string): void;
71
+ /** Component lifecycle hook; consumers should not need to call this. */
72
+ remove(id: string): ToastCloseContext<Data> | null;
73
+ /** Component lifecycle hook; invokes onRemove after rendered DOM removal. */
74
+ notifyRemove(context: ToastCloseContext<Data>): void;
75
+ }
76
+ export interface ToastEventDetail<Data = unknown> {
77
+ id: string;
78
+ toast: ToastRecord<Data>;
79
+ }
80
+ export interface ToastCloseEventDetail<Data = unknown> extends ToastEventDetail<Data> {
81
+ reason: ToastCloseReason;
82
+ }
83
+ export interface ToastActionEventDetail<Data = unknown> extends ToastEventDetail<Data> {
84
+ originalEvent: MouseEvent;
85
+ }
@@ -127,7 +127,7 @@
127
127
  "peerDependencies": {
128
128
  "required": [
129
129
  "@ds-mo/tokens ^3.1.1",
130
- "@ds-mo/icons ^6.2.0"
130
+ "@ds-mo/icons ^6.3.0"
131
131
  ],
132
132
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
133
133
  }
@@ -35,10 +35,11 @@
35
35
  "Streaming state supplements rather than replaces meaningful textual status."
36
36
  ],
37
37
  "states": [
38
- "The owner replaces immutable part arrays as scripted or live output changes."
38
+ "The owner replaces immutable part arrays as scripted or live output changes.",
39
+ "AgentResponse renders directly in Message without borrowing a plain MessageBubble surface."
39
40
  ],
40
41
  "responsiveBehavior": [
41
- "Rich content uses the wider ghost message treatment while respecting transcript constraints."
42
+ "Rich content uses the available transcript width while respecting readable measure and overflow constraints."
42
43
  ],
43
44
  "references": [
44
45
  {
@@ -177,7 +178,7 @@
177
178
  "peerDependencies": {
178
179
  "required": [
179
180
  "@ds-mo/tokens ^3.1.1",
180
- "@ds-mo/icons ^6.2.0"
181
+ "@ds-mo/icons ^6.3.0"
181
182
  ],
182
183
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
183
184
  }
@@ -193,8 +194,7 @@
193
194
  "agent-tool-call",
194
195
  "attachment-list",
195
196
  "markdown",
196
- "message",
197
- "message-bubble"
197
+ "message"
198
198
  ],
199
199
  "files": [
200
200
  {
@@ -204,7 +204,7 @@
204
204
  },
205
205
  {
206
206
  "path": "src/wc/components/AgentResponse/AgentResponse.tsx",
207
- "content": "import { Component, Prop, h, Host } from '@stencil/core';\nimport type { AgentResponsePart } from '../conversation-types';\n\n@Component({ tag: 'ds-agent-response', styleUrl: 'AgentResponse.css', scoped: true })\nexport class AgentResponse {\n @Prop() messageId: string = '';\n @Prop() author: string = '';\n @Prop() showAuthor: boolean = true;\n @Prop() timestamp: string = '';\n @Prop() parts: AgentResponsePart[] = [];\n @Prop() streaming: boolean = false;\n\n private renderPart(part: AgentResponsePart) {\n switch (part.type) {\n case 'markdown':\n return (\n <ds-markdown\n key={part.id}\n content={part.content}\n streaming={part.state === 'streaming'}\n />\n );\n case 'activity':\n return <ds-agent-activity key={part.id} items={part.items} />;\n case 'tool':\n return (\n <ds-agent-tool-call\n key={part.id}\n name={part.name}\n label={part.label}\n state={part.state}\n input={part.input}\n output={part.output}\n error={part.error}\n />\n );\n case 'attachments':\n return <ds-attachment-list key={part.id} items={part.items} />;\n case 'sources':\n return <ds-agent-source-list key={part.id} items={part.items} />;\n }\n }\n\n render() {\n return (\n <Host>\n <ds-message\n messageId={this.messageId}\n direction=\"incoming\"\n author={this.author}\n showAuthor={this.showAuthor}\n timestamp={this.timestamp}\n streaming={this.streaming}\n >\n <slot name=\"avatar\" slot=\"avatar\" />\n <ds-message-bubble variant=\"ghost\">\n <div class=\"agent-response\">{this.parts.map(part => this.renderPart(part))}</div>\n </ds-message-bubble>\n <slot name=\"footer\" slot=\"footer\" />\n <slot name=\"actions\" slot=\"actions\" />\n </ds-message>\n </Host>\n );\n }\n}\n",
207
+ "content": "import { Component, Prop, h, Host } from '@stencil/core';\nimport type { AgentResponsePart } from '../conversation-types';\n\n@Component({ tag: 'ds-agent-response', styleUrl: 'AgentResponse.css', scoped: true })\nexport class AgentResponse {\n @Prop() messageId: string = '';\n @Prop() author: string = '';\n @Prop() showAuthor: boolean = true;\n @Prop() timestamp: string = '';\n @Prop() parts: AgentResponsePart[] = [];\n @Prop() streaming: boolean = false;\n\n private renderPart(part: AgentResponsePart) {\n switch (part.type) {\n case 'markdown':\n return (\n <ds-markdown\n key={part.id}\n content={part.content}\n streaming={part.state === 'streaming'}\n />\n );\n case 'activity':\n return <ds-agent-activity key={part.id} items={part.items} />;\n case 'tool':\n return (\n <ds-agent-tool-call\n key={part.id}\n name={part.name}\n label={part.label}\n state={part.state}\n input={part.input}\n output={part.output}\n error={part.error}\n />\n );\n case 'attachments':\n return <ds-attachment-list key={part.id} items={part.items} />;\n case 'sources':\n return <ds-agent-source-list key={part.id} items={part.items} />;\n }\n }\n\n render() {\n return (\n <Host>\n <ds-message\n messageId={this.messageId}\n direction=\"incoming\"\n author={this.author}\n showAuthor={this.showAuthor}\n timestamp={this.timestamp}\n streaming={this.streaming}\n >\n <div class=\"agent-response\">{this.parts.map(part => this.renderPart(part))}</div>\n <slot name=\"footer\" slot=\"footer\" />\n <slot name=\"actions\" slot=\"actions\" />\n </ds-message>\n </Host>\n );\n }\n}\n",
208
208
  "type": "registry:ui"
209
209
  }
210
210
  ]
@@ -123,7 +123,7 @@
123
123
  "peerDependencies": {
124
124
  "required": [
125
125
  "@ds-mo/tokens ^3.1.1",
126
- "@ds-mo/icons ^6.2.0"
126
+ "@ds-mo/icons ^6.3.0"
127
127
  ],
128
128
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
129
129
  }
@@ -182,7 +182,7 @@
182
182
  "peerDependencies": {
183
183
  "required": [
184
184
  "@ds-mo/tokens ^3.1.1",
185
- "@ds-mo/icons ^6.2.0"
185
+ "@ds-mo/icons ^6.3.0"
186
186
  ],
187
187
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
188
188
  }
@@ -184,7 +184,7 @@
184
184
  "peerDependencies": {
185
185
  "required": [
186
186
  "@ds-mo/tokens ^3.1.1",
187
- "@ds-mo/icons ^6.2.0"
187
+ "@ds-mo/icons ^6.3.0"
188
188
  ],
189
189
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
190
190
  }
@@ -107,7 +107,7 @@
107
107
  "peerDependencies": {
108
108
  "required": [
109
109
  "@ds-mo/tokens ^3.1.1",
110
- "@ds-mo/icons ^6.2.0"
110
+ "@ds-mo/icons ^6.3.0"
111
111
  ],
112
112
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
113
113
  }
@@ -125,7 +125,7 @@
125
125
  "peerDependencies": {
126
126
  "required": [
127
127
  "@ds-mo/tokens ^3.1.1",
128
- "@ds-mo/icons ^6.2.0"
128
+ "@ds-mo/icons ^6.3.0"
129
129
  ],
130
130
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
131
131
  }
@@ -261,7 +261,7 @@
261
261
  "peerDependencies": {
262
262
  "required": [
263
263
  "@ds-mo/tokens ^3.1.1",
264
- "@ds-mo/icons ^6.2.0"
264
+ "@ds-mo/icons ^6.3.0"
265
265
  ],
266
266
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
267
267
  }
@@ -295,7 +295,7 @@
295
295
  "peerDependencies": {
296
296
  "required": [
297
297
  "@ds-mo/tokens ^3.1.1",
298
- "@ds-mo/icons ^6.2.0"
298
+ "@ds-mo/icons ^6.3.0"
299
299
  ],
300
300
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
301
301
  }
@@ -355,7 +355,7 @@
355
355
  "peerDependencies": {
356
356
  "required": [
357
357
  "@ds-mo/tokens ^3.1.1",
358
- "@ds-mo/icons ^6.2.0"
358
+ "@ds-mo/icons ^6.3.0"
359
359
  ],
360
360
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
361
361
  }
@@ -505,7 +505,7 @@
505
505
  "peerDependencies": {
506
506
  "required": [
507
507
  "@ds-mo/tokens ^3.1.1",
508
- "@ds-mo/icons ^6.2.0"
508
+ "@ds-mo/icons ^6.3.0"
509
509
  ],
510
510
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
511
511
  }
@@ -114,7 +114,7 @@
114
114
  "peerDependencies": {
115
115
  "required": [
116
116
  "@ds-mo/tokens ^3.1.1",
117
- "@ds-mo/icons ^6.2.0"
117
+ "@ds-mo/icons ^6.3.0"
118
118
  ],
119
119
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
120
120
  }
@@ -136,7 +136,7 @@
136
136
  },
137
137
  {
138
138
  "path": "src/wc/components/CardDataVizDonut/CardDataVizDonut.tsx",
139
- "content": "import { Component, Element, Event, EventEmitter, State, h, Host, Prop } from '@stencil/core';\nimport type { CardShellDataVizWidth } from '../CardShellDataViz/CardShellDataViz';\n\nexport type CardDataVizDonutWidth = CardShellDataVizWidth;\n\n/** Matches the `dsSliceHover`/`dsItemHover` detail shape emitted by `ds-chart-*` and `ds-chart-legend`. */\ntype HoveredDatum = { label: string } | null;\n\n/** A slotted chart/legend that opts into hover sync by exposing an `activeLabel` prop. */\ntype SyncableSlot = HTMLElement & { activeLabel?: string | null };\n\n/**\n * Donut data-viz card — dedicated `ds-card-shell-data-viz` chrome with a fill chart region and\n * content-sized legend. Hover sync between chart and legend stays here.\n */\n@Component({\n tag: 'ds-card-data-viz-donut',\n styleUrl: 'CardDataVizDonut.css',\n scoped: true,\n})\nexport class CardDataVizDonut {\n @Element() el!: HTMLElement;\n\n /** Widget heading shown in the card header. */\n @Prop() heading!: string;\n\n /** Card width token — also sets matching min-height. */\n @Prop() cardWidth: CardDataVizDonutWidth = 'md';\n @Prop() filterLabel: string = 'Filter';\n\n /** Emits when the header filter control is activated. */\n @Event() dsFilterClick!: EventEmitter<void>;\n\n // Scoped (light-DOM) components have no native slot projection to detect emptiness from CSS —\n // check the actual children so an unused region (e.g. no legend) doesn't render a dangling\n // padded box plus a body gap next to nothing.\n @State() private hasChartSlot = false;\n @State() private hasLegendSlot = false;\n\n componentWillRender() {\n // Not `:scope >` — Stencil's scoped slot polyfill relocates slotted children into\n // region wrappers (and here into nested `ds-card`), so they may not stay direct\n // host children across renders.\n this.hasChartSlot = !!this.el.querySelector('[slot=\"chart\"]');\n this.hasLegendSlot = !!this.el.querySelector('[slot=\"legend\"]');\n }\n\n componentDidLoad() {\n // Sync the chart's and legend's `activeLabel` from each other's hover events, so any\n // ds-chart-donut + ds-chart-legend pair cross-highlights without every consumer having to\n // wire it up by hand. Delegated on the host (rather than bound to the specific slotted\n // elements) since Stencil events bubble and the slot content can be swapped at runtime.\n this.el.addEventListener('dsSliceHover', this.handleChartHover);\n this.el.addEventListener('dsItemHover', this.handleLegendHover);\n }\n\n disconnectedCallback() {\n this.el.removeEventListener('dsSliceHover', this.handleChartHover);\n this.el.removeEventListener('dsItemHover', this.handleLegendHover);\n }\n\n private handleChartHover = (e: Event) => {\n // Not `:scope >` — Stencil's slot polyfill for scoped (non-shadow) components relocates\n // slotted children into an inner region wrapper on render, so they're no longer direct\n // children of the host by the time this fires.\n const legend = this.el.querySelector('[slot=\"legend\"]') as SyncableSlot | null;\n if (!legend || !('activeLabel' in legend)) return;\n legend.activeLabel = (e as CustomEvent<HoveredDatum>).detail?.label ?? null;\n };\n\n private handleLegendHover = (e: Event) => {\n const chart = this.el.querySelector('[slot=\"chart\"]') as SyncableSlot | null;\n if (!chart || !('activeLabel' in chart)) return;\n chart.activeLabel = (e as CustomEvent<HoveredDatum>).detail?.label ?? null;\n };\n\n private handleFilterClick = () => {\n this.dsFilterClick.emit();\n };\n\n render() {\n return (\n <Host class=\"card-data-viz-donut\">\n <ds-card-shell-data-viz heading={this.heading} cardWidth={this.cardWidth}>\n <ds-button-unfilled\n slot=\"actions\"\n variant=\"icon\"\n type=\"button\"\n icon=\"Filters\"\n aria-label={this.filterLabel}\n onDsClick={this.handleFilterClick}\n />\n <div class=\"card-data-viz-donut__layout\">\n {this.hasChartSlot && (\n <div class=\"card-data-viz-donut__chart-region\">\n <slot name=\"chart\" />\n </div>\n )}\n {this.hasLegendSlot && (\n <div class=\"card-data-viz-donut__legend-region\">\n <slot name=\"legend\" />\n </div>\n )}\n </div>\n </ds-card-shell-data-viz>\n </Host>\n );\n }\n}\n",
139
+ "content": "import { Component, Element, Event, EventEmitter, State, h, Host, Prop } from '@stencil/core';\nimport type { CardShellDataVizWidth } from '../CardShellDataViz/CardShellDataViz';\n\nexport type CardDataVizDonutWidth = CardShellDataVizWidth;\n\n/** Matches the `dsSliceHover`/`dsItemHover` detail shape emitted by `ds-chart-*` and `ds-chart-legend`. */\ntype HoveredDatum = { label: string } | null;\n\n/** A slotted chart/legend that opts into hover sync by exposing an `activeLabel` prop. */\ntype SyncableSlot = HTMLElement & { activeLabel?: string | null };\n\n/**\n * Donut data-viz card — dedicated `ds-card-shell-data-viz` chrome with a fill chart region and\n * content-sized legend. Hover sync between chart and legend stays here.\n */\n@Component({\n tag: 'ds-card-data-viz-donut',\n styleUrl: 'CardDataVizDonut.css',\n scoped: true,\n})\nexport class CardDataVizDonut {\n @Element() el!: HTMLElement;\n\n /** Widget heading shown in the card header. */\n @Prop() heading!: string;\n\n /** Card width token — also sets matching min-height. */\n @Prop() cardWidth: CardDataVizDonutWidth = 'md';\n @Prop() filterLabel: string = 'Filter';\n\n /** Emits when the header filter control is activated. */\n @Event() dsFilterClick!: EventEmitter<void>;\n\n // Scoped (light-DOM) components have no native slot projection to detect emptiness from CSS —\n // check the actual children so an unused region (e.g. no legend) doesn't render a dangling\n // padded box plus a body gap next to nothing.\n @State() private hasChartSlot = false;\n @State() private hasLegendSlot = false;\n\n componentWillRender() {\n // Not `:scope >` — Stencil's scoped slot polyfill relocates slotted children into\n // region wrappers (and here into nested `ds-card-shell-data-viz`), so they may not stay direct\n // host children across renders.\n this.hasChartSlot = !!this.el.querySelector('[slot=\"chart\"]');\n this.hasLegendSlot = !!this.el.querySelector('[slot=\"legend\"]');\n }\n\n componentDidLoad() {\n // Sync the chart's and legend's `activeLabel` from each other's hover events, so any\n // ds-chart-donut + ds-chart-legend pair cross-highlights without every consumer having to\n // wire it up by hand. Delegated on the host (rather than bound to the specific slotted\n // elements) since Stencil events bubble and the slot content can be swapped at runtime.\n this.el.addEventListener('dsSliceHover', this.handleChartHover);\n this.el.addEventListener('dsItemHover', this.handleLegendHover);\n }\n\n disconnectedCallback() {\n this.el.removeEventListener('dsSliceHover', this.handleChartHover);\n this.el.removeEventListener('dsItemHover', this.handleLegendHover);\n }\n\n private handleChartHover = (e: Event) => {\n // Not `:scope >` — Stencil's slot polyfill for scoped (non-shadow) components relocates\n // slotted children into an inner region wrapper on render, so they're no longer direct\n // children of the host by the time this fires.\n const legend = this.el.querySelector('[slot=\"legend\"]') as SyncableSlot | null;\n if (!legend || !('activeLabel' in legend)) return;\n legend.activeLabel = (e as CustomEvent<HoveredDatum>).detail?.label ?? null;\n };\n\n private handleLegendHover = (e: Event) => {\n const chart = this.el.querySelector('[slot=\"chart\"]') as SyncableSlot | null;\n if (!chart || !('activeLabel' in chart)) return;\n chart.activeLabel = (e as CustomEvent<HoveredDatum>).detail?.label ?? null;\n };\n\n private handleFilterClick = () => {\n this.dsFilterClick.emit();\n };\n\n render() {\n return (\n <Host class=\"card-data-viz-donut\">\n <ds-card-shell-data-viz heading={this.heading} cardWidth={this.cardWidth}>\n <ds-button-unfilled\n slot=\"actions\"\n variant=\"icon\"\n type=\"button\"\n icon=\"Filters\"\n aria-label={this.filterLabel}\n onDsClick={this.handleFilterClick}\n />\n <div class=\"card-data-viz-donut__layout\">\n {this.hasChartSlot && (\n <div class=\"card-data-viz-donut__chart-region\">\n <slot name=\"chart\" />\n </div>\n )}\n {this.hasLegendSlot && (\n <div class=\"card-data-viz-donut__legend-region\">\n <slot name=\"legend\" />\n </div>\n )}\n </div>\n </ds-card-shell-data-viz>\n </Host>\n );\n }\n}\n",
140
140
  "type": "registry:ui"
141
141
  }
142
142
  ]