@ds-mo/ui 15.2.0 → 15.4.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 (504) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +3 -3
  3. package/dist/agent.json +936 -80
  4. package/dist/angular/ds-card-setting.d.ts +1 -1
  5. package/dist/angular/ds-card-setting.js +3 -3
  6. package/dist/angular/ds-checkbox-group.d.ts +12 -0
  7. package/dist/angular/ds-checkbox-group.js +38 -0
  8. package/dist/angular/ds-checkbox.d.ts +1 -1
  9. package/dist/angular/ds-checkbox.js +3 -3
  10. package/dist/angular/ds-inline-banner-settings.d.ts +12 -0
  11. package/dist/angular/ds-inline-banner-settings.js +38 -0
  12. package/dist/angular/ds-input-time.d.ts +1 -1
  13. package/dist/angular/ds-input-time.js +3 -3
  14. package/dist/angular/ds-input.d.ts +5 -1
  15. package/dist/angular/ds-input.js +10 -4
  16. package/dist/angular/ds-map-entity-marker.d.ts +1 -1
  17. package/dist/angular/ds-map-entity-marker.js +3 -3
  18. package/dist/angular/ds-radio-tile.d.ts +15 -0
  19. package/dist/angular/ds-radio-tile.js +43 -0
  20. package/dist/angular/ds-radio.d.ts +1 -1
  21. package/dist/angular/ds-radio.js +3 -3
  22. package/dist/angular/ds-setting-row-checkbox.d.ts +12 -0
  23. package/dist/angular/ds-setting-row-checkbox.js +38 -0
  24. package/dist/angular/ds-setting-row-radio.d.ts +12 -0
  25. package/dist/angular/ds-setting-row-radio.js +38 -0
  26. package/dist/angular/ds-setting-row-toggle.d.ts +18 -0
  27. package/dist/angular/ds-setting-row-toggle.js +42 -0
  28. package/dist/angular/ds-slider.d.ts +1 -1
  29. package/dist/angular/ds-slider.js +3 -3
  30. package/dist/angular/ds-textarea.d.ts +1 -1
  31. package/dist/angular/ds-textarea.js +3 -3
  32. package/dist/angular/ds-time-picker.d.ts +1 -1
  33. package/dist/angular/ds-time-picker.js +3 -3
  34. package/dist/angular/index.d.ts +1 -1
  35. package/dist/angular/index.js +6 -0
  36. package/dist/angular/number-value-accessor.d.ts +9 -0
  37. package/dist/angular/number-value-accessor.js +39 -0
  38. package/dist/angular/proxies.d.ts +6 -0
  39. package/dist/angular/proxies.js +6 -0
  40. package/dist/angular/radio-value-accessor.d.ts +1 -1
  41. package/dist/angular/radio-value-accessor.js +2 -2
  42. package/dist/angular/select-value-accessor.d.ts +1 -1
  43. package/dist/angular/select-value-accessor.js +2 -2
  44. package/dist/angular/text-value-accessor.d.ts +1 -1
  45. package/dist/angular/text-value-accessor.js +2 -2
  46. package/dist/components/ds-agent-activity.js +1 -1
  47. package/dist/components/ds-agent-questionnaire.js +1 -1
  48. package/dist/components/ds-agent-response.js +1 -1
  49. package/dist/components/ds-agent-response.js.map +1 -1
  50. package/dist/components/ds-agent-source-list.js +1 -1
  51. package/dist/components/ds-agent-tool-call.js +1 -1
  52. package/dist/components/ds-attachment-list.js +1 -1
  53. package/dist/components/ds-badge.js +1 -1
  54. package/dist/components/ds-banner.js +1 -1
  55. package/dist/components/ds-bar-action.js +1 -1
  56. package/dist/components/ds-bar-nav.js +1 -1
  57. package/dist/components/ds-bar-page-title.js +1 -1
  58. package/dist/components/ds-bar-title.js +1 -1
  59. package/dist/components/ds-bar-workflow.js +1 -1
  60. package/dist/components/ds-breadcrumb.js +1 -1
  61. package/dist/components/ds-button-filled.js +1 -1
  62. package/dist/components/ds-button-inverted.js +1 -1
  63. package/dist/components/ds-button-inverted.js.map +1 -1
  64. package/dist/components/ds-button-unfilled.js +1 -1
  65. package/dist/components/ds-calendar.js +1 -1
  66. package/dist/components/ds-card-action-center.js +1 -1
  67. package/dist/components/ds-card-action-center.js.map +1 -1
  68. package/dist/components/ds-card-chart.js +1 -1
  69. package/dist/components/ds-card-navigation.js +1 -1
  70. package/dist/components/ds-card-navigation.js.map +1 -1
  71. package/dist/components/ds-card-overview.js +1 -1
  72. package/dist/components/ds-card-overview.js.map +1 -1
  73. package/dist/components/ds-card-setting.js +1 -1
  74. package/dist/components/ds-card-setting.js.map +1 -1
  75. package/dist/components/ds-card-settings-scope.js +1 -1
  76. package/dist/components/ds-card-settings-scope.js.map +1 -1
  77. package/dist/components/ds-chart-legend.js +1 -1
  78. package/dist/components/ds-chart-legend.js.map +1 -1
  79. package/dist/components/ds-chart.js +1 -1
  80. package/dist/components/ds-checkbox-group.d.ts +11 -0
  81. package/dist/components/ds-checkbox-group.js +2 -0
  82. package/dist/components/ds-checkbox-group.js.map +1 -0
  83. package/dist/components/ds-checkbox.js +1 -1
  84. package/dist/components/ds-chip.js +1 -1
  85. package/dist/components/ds-code-block.js +1 -1
  86. package/dist/components/ds-conversation-list-item.js +1 -1
  87. package/dist/components/ds-conversation-list-item.js.map +1 -1
  88. package/dist/components/ds-conversation-list-section.js +1 -1
  89. package/dist/components/ds-conversation-list.js +1 -1
  90. package/dist/components/ds-data-customize.js +1 -1
  91. package/dist/components/ds-data-customize.js.map +1 -1
  92. package/dist/components/ds-data-filter.js +1 -1
  93. package/dist/components/ds-data-filter.js.map +1 -1
  94. package/dist/components/ds-data-group.js +1 -1
  95. package/dist/components/ds-data-preferences.js +1 -1
  96. package/dist/components/ds-data-preferences.js.map +1 -1
  97. package/dist/components/ds-data-saved-views.js +1 -1
  98. package/dist/components/ds-data-saved-views.js.map +1 -1
  99. package/dist/components/ds-data-search.js +1 -1
  100. package/dist/components/ds-data-search.js.map +1 -1
  101. package/dist/components/ds-data-sort.js +1 -1
  102. package/dist/components/ds-data-toolbar.js +1 -1
  103. package/dist/components/ds-divider.js +1 -1
  104. package/dist/components/ds-empty-state.js +1 -1
  105. package/dist/components/ds-field.js +1 -1
  106. package/dist/components/ds-filter-menu.js +1 -1
  107. package/dist/components/ds-inline-banner-settings.d.ts +11 -0
  108. package/dist/components/ds-inline-banner-settings.js +2 -0
  109. package/dist/components/ds-inline-banner-settings.js.map +1 -0
  110. package/dist/components/ds-input-date.js +1 -1
  111. package/dist/components/ds-input-date.js.map +1 -1
  112. package/dist/components/ds-input-time.js +1 -1
  113. package/dist/components/ds-input-time.js.map +1 -1
  114. package/dist/components/ds-input.js +1 -1
  115. package/dist/components/ds-map-cluster-marker.js +1 -1
  116. package/dist/components/ds-map-entity-marker.js +1 -1
  117. package/dist/components/ds-map-entity-marker.js.map +1 -1
  118. package/dist/components/ds-markdown.js +1 -1
  119. package/dist/components/ds-menu.js +1 -1
  120. package/dist/components/ds-message-actions.js +1 -1
  121. package/dist/components/ds-message-bubble.js +1 -1
  122. package/dist/components/ds-message-bubble.js.map +1 -1
  123. package/dist/components/ds-message-composer.js +1 -1
  124. package/dist/components/ds-message-composer.js.map +1 -1
  125. package/dist/components/ds-message-scroller.js +1 -1
  126. package/dist/components/ds-message.js +1 -1
  127. package/dist/components/ds-mobile-bar-nav.js +1 -1
  128. package/dist/components/ds-mobile-header.js +1 -1
  129. package/dist/components/ds-mobile-section-switcher.js +1 -1
  130. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  131. package/dist/components/ds-modal.js +1 -1
  132. package/dist/components/ds-pagination.js +1 -1
  133. package/dist/components/ds-panel-nav.js +1 -1
  134. package/dist/components/ds-panel-sub-nav.js +1 -1
  135. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  136. package/dist/components/ds-panel-tool-header.js +1 -1
  137. package/dist/components/ds-panel-tool-search.js +1 -1
  138. package/dist/components/ds-panel-tool-search.js.map +1 -1
  139. package/dist/components/ds-panel-tools.js +1 -1
  140. package/dist/components/ds-paper-texture.js +1 -1
  141. package/dist/components/ds-radio-tile.d.ts +11 -0
  142. package/dist/components/ds-radio-tile.js +2 -0
  143. package/dist/components/ds-radio-tile.js.map +1 -0
  144. package/dist/components/ds-radio.js +1 -1
  145. package/dist/components/ds-score.js +1 -1
  146. package/dist/components/ds-scroll-overlay.js +1 -1
  147. package/dist/components/ds-select.js +1 -1
  148. package/dist/components/ds-setting-row-checkbox.d.ts +11 -0
  149. package/dist/components/ds-setting-row-checkbox.js +2 -0
  150. package/dist/components/ds-setting-row-checkbox.js.map +1 -0
  151. package/dist/components/ds-setting-row-radio.d.ts +11 -0
  152. package/dist/components/ds-setting-row-radio.js +2 -0
  153. package/dist/components/ds-setting-row-radio.js.map +1 -0
  154. package/dist/components/ds-setting-row-toggle.d.ts +11 -0
  155. package/dist/components/ds-setting-row-toggle.js +2 -0
  156. package/dist/components/ds-setting-row-toggle.js.map +1 -0
  157. package/dist/components/ds-shell-app.js +1 -1
  158. package/dist/components/ds-shell-app.js.map +1 -1
  159. package/dist/components/ds-shell-page.js +1 -1
  160. package/dist/components/ds-shell-tools.js +1 -1
  161. package/dist/components/ds-skeleton.js +1 -1
  162. package/dist/components/ds-slider.js +1 -1
  163. package/dist/components/ds-slider.js.map +1 -1
  164. package/dist/components/ds-swatch-picker.js +1 -1
  165. package/dist/components/ds-switch.js +1 -1
  166. package/dist/components/ds-tab-group.js +1 -1
  167. package/dist/components/ds-table.js +1 -1
  168. package/dist/components/ds-table.js.map +1 -1
  169. package/dist/components/ds-tag.js +1 -1
  170. package/dist/components/ds-text.js +1 -1
  171. package/dist/components/ds-textarea.js +1 -1
  172. package/dist/components/ds-textarea.js.map +1 -1
  173. package/dist/components/ds-time-picker.js +1 -1
  174. package/dist/components/ds-toast.js +1 -1
  175. package/dist/components/ds-tooltip-chart.js +1 -1
  176. package/dist/components/ds-tooltip.js +1 -1
  177. package/dist/components/ds-typing-indicator.js +1 -1
  178. package/dist/components/p-7TVdPhGR.js +2 -0
  179. package/dist/components/{p-YrnU2fM7.js.map → p-7TVdPhGR.js.map} +1 -1
  180. package/dist/components/{p-7V1AhetH.js → p-B0BQCVkq.js} +2 -2
  181. package/dist/components/p-B0EpvBDs.js +2 -0
  182. package/dist/components/{p-lamoJZE4.js.map → p-B0EpvBDs.js.map} +1 -1
  183. package/dist/components/{p-Cu8o2rOz.js → p-B39iJO8F.js} +2 -2
  184. package/dist/components/p-B9TM6FqC.js +2 -0
  185. package/dist/components/{p-BJJh-Bf7.js.map → p-B9TM6FqC.js.map} +1 -1
  186. package/dist/components/{p-B6qQaYkB.js → p-B9y6azEw.js} +2 -2
  187. package/dist/components/p-BDdlJZyL.js +2 -0
  188. package/dist/components/{p-CZ7hxDy_.js.map → p-BDdlJZyL.js.map} +1 -1
  189. package/dist/components/{p-5SVmAjXY.js → p-BERXvOCf.js} +2 -2
  190. package/dist/components/{p-xhn1cZgU.js → p-BFHpU-uU.js} +2 -2
  191. package/dist/components/{p-CuWPWC3t.js → p-BQspV5U7.js} +2 -2
  192. package/dist/components/p-BWSIw8AQ.js +2 -0
  193. package/dist/components/p-BWSIw8AQ.js.map +1 -0
  194. package/dist/components/p-BhjqYTiY.js +2 -0
  195. package/dist/components/p-BhjqYTiY.js.map +1 -0
  196. package/dist/components/{p-BOhefRMt.js → p-Bk3poU91.js} +2 -2
  197. package/dist/components/{p-QWukusRL.js → p-BnuNaXR2.js} +2 -2
  198. package/dist/components/p-BwdnVqAY.js +2 -0
  199. package/dist/components/p-BwdnVqAY.js.map +1 -0
  200. package/dist/components/p-C4huuwed.js +2 -0
  201. package/dist/components/{p-CRk0TjQv.js.map → p-C4huuwed.js.map} +1 -1
  202. package/dist/components/{p-BtnTQp4K.js → p-C8V4lkVy.js} +2 -2
  203. package/dist/components/p-CJ1NnOEW.js +2 -0
  204. package/dist/components/p-CJ1NnOEW.js.map +1 -0
  205. package/dist/components/p-CPamUzaj.js +2 -0
  206. package/dist/components/{p-CNZ6-kWd.js.map → p-CPamUzaj.js.map} +1 -1
  207. package/dist/components/{p-Dqfc6Nvd.js → p-CUDocY23.js} +2 -2
  208. package/dist/components/{p-Dqfc6Nvd.js.map → p-CUDocY23.js.map} +1 -1
  209. package/dist/components/p-CX6ZxUQT.js +2 -0
  210. package/dist/components/p-CX6ZxUQT.js.map +1 -0
  211. package/dist/components/p-CZNZTcYS.js +2 -0
  212. package/dist/components/p-CZNZTcYS.js.map +1 -0
  213. package/dist/components/p-CbCN9ew9.js +2 -0
  214. package/dist/components/p-CbCN9ew9.js.map +1 -0
  215. package/dist/components/p-CeXf9-X3.js.map +1 -1
  216. package/dist/components/p-Cgn-BORA.js +2 -0
  217. package/dist/components/p-Cgn-BORA.js.map +1 -0
  218. package/dist/components/{p-mux14tWZ.js → p-Co1rUdOR.js} +2 -2
  219. package/dist/components/p-Co1rUdOR.js.map +1 -0
  220. package/dist/components/{p-CGidq1iC.js → p-CuwopElg.js} +2 -2
  221. package/dist/components/p-CwUXroLs.js +2 -0
  222. package/dist/components/{p-etg-Uk1u.js.map → p-CwUXroLs.js.map} +1 -1
  223. package/dist/components/{p-Cn6AfzeF.js → p-CwdRaJER.js} +2 -2
  224. package/dist/components/p-D6FRqNhN.js +2 -0
  225. package/dist/components/p-D6FRqNhN.js.map +1 -0
  226. package/dist/components/{p-ZwRLjD5M.js → p-D8OWhnID.js} +2 -2
  227. package/dist/components/p-DCyJ3_PL.js +2 -0
  228. package/dist/components/{p-BZ_e69zx.js.map → p-DCyJ3_PL.js.map} +1 -1
  229. package/dist/components/{p-C_Ma6Xa-.js → p-DIQiHX0q.js} +2 -2
  230. package/dist/components/{p-B3CZvMXs.js → p-DJDbskZf.js} +2 -2
  231. package/dist/components/p-DRdoGSGX.js +2 -0
  232. package/dist/components/{p-CTGgXIXM.js.map → p-DRdoGSGX.js.map} +1 -1
  233. package/dist/components/{p-C1gaWjOm.js → p-DSZPO06T.js} +2 -2
  234. package/dist/components/{p-uADksYMl.js → p-DSmDyI2o.js} +2 -2
  235. package/dist/components/{p-UY63jmrO.js → p-DVEx-Xg9.js} +2 -2
  236. package/dist/components/p-DXk1eml1.js +2 -0
  237. package/dist/components/{p-Dlp1HqgS.js.map → p-DXk1eml1.js.map} +1 -1
  238. package/dist/components/{p-p0FVyEFa.js → p-DYQa1DVF.js} +2 -2
  239. package/dist/components/p-DYQa1DVF.js.map +1 -0
  240. package/dist/components/p-DYsE6HLk.js +2 -0
  241. package/dist/components/p-DYsE6HLk.js.map +1 -0
  242. package/dist/components/{p-vfCu7XSc.js → p-DZ58Sg5a.js} +2 -2
  243. package/dist/components/p-DebLYW7A.js +2 -0
  244. package/dist/components/p-DebLYW7A.js.map +1 -0
  245. package/dist/components/p-DhKvqh5G.js +2 -0
  246. package/dist/components/p-DhKvqh5G.js.map +1 -0
  247. package/dist/components/{p-DFO5lV_A.js → p-DmSnHVW6.js} +2 -2
  248. package/dist/components/p-Dnt5xUBD.js +2 -0
  249. package/dist/components/{p-BR5OC2PX.js.map → p-Dnt5xUBD.js.map} +1 -1
  250. package/dist/components/p-Doa2blZT.js +2 -0
  251. package/dist/components/{p-BLuqpHvp.js.map → p-Doa2blZT.js.map} +1 -1
  252. package/dist/components/{p-DsLXlxt3.js → p-Dyqd-cub.js} +2 -2
  253. package/dist/components/p-Dyqd-cub.js.map +1 -0
  254. package/dist/components/p-DzvTC27M.js +2 -0
  255. package/dist/components/p-DzvTC27M.js.map +1 -0
  256. package/dist/components/p-JBki_jyY.js +2 -0
  257. package/dist/components/{p-C0JkLR83.js.map → p-JBki_jyY.js.map} +1 -1
  258. package/dist/components/p-MOJmB6vX.js +2 -0
  259. package/dist/components/{p-BzYW1IqO.js.map → p-MOJmB6vX.js.map} +1 -1
  260. package/dist/components/p-TVkFIMXz.js +2 -0
  261. package/dist/components/p-TVkFIMXz.js.map +1 -0
  262. package/dist/components/{p-ER5M085B.js → p-UJMEz8_O.js} +2 -2
  263. package/dist/components/{p-CR-Jjdcn.js → p-_IqSPt5V.js} +2 -2
  264. package/dist/components/p-g0jsfEXz.js +2 -0
  265. package/dist/components/{p-BfF4RZdp.js.map → p-g0jsfEXz.js.map} +1 -1
  266. package/dist/components/{p-BLSSaVWm.js → p-pp1IQN4Z.js} +2 -2
  267. package/dist/docs/components.json +2901 -835
  268. package/dist/framework/angular.d.ts +1 -0
  269. package/dist/framework/angular.js +1 -0
  270. package/dist/lib/shell/index.js +1 -1
  271. package/dist/lib/shell/index.js.map +1 -1
  272. package/dist/lint/index.js +1 -1
  273. package/dist/mcp-data/registry/agent-activity.json +2 -2
  274. package/dist/mcp-data/registry/agent-questionnaire.json +2 -2
  275. package/dist/mcp-data/registry/agent-response.json +3 -3
  276. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  277. package/dist/mcp-data/registry/agent-tool-call.json +2 -2
  278. package/dist/mcp-data/registry/attachment-list.json +2 -2
  279. package/dist/mcp-data/registry/avatar.json +2 -2
  280. package/dist/mcp-data/registry/badge.json +2 -2
  281. package/dist/mcp-data/registry/banner.json +2 -2
  282. package/dist/mcp-data/registry/bar-action.json +2 -2
  283. package/dist/mcp-data/registry/bar-nav.json +5 -5
  284. package/dist/mcp-data/registry/bar-page-title.json +4 -4
  285. package/dist/mcp-data/registry/bar-title.json +4 -4
  286. package/dist/mcp-data/registry/bar-workflow.json +2 -2
  287. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  288. package/dist/mcp-data/registry/button-filled.json +2 -2
  289. package/dist/mcp-data/registry/button-inverted.json +2 -2
  290. package/dist/mcp-data/registry/button-unfilled.json +9 -9
  291. package/dist/mcp-data/registry/calendar.json +2 -2
  292. package/dist/mcp-data/registry/card-action-center.json +2 -2
  293. package/dist/mcp-data/registry/card-chart.json +2 -2
  294. package/dist/mcp-data/registry/card-navigation.json +2 -2
  295. package/dist/mcp-data/registry/card-overview.json +2 -2
  296. package/dist/mcp-data/registry/card-setting.json +50 -15
  297. package/dist/mcp-data/registry/card-settings-scope.json +2 -2
  298. package/dist/mcp-data/registry/chart-legend.json +2 -2
  299. package/dist/mcp-data/registry/chart.json +2 -2
  300. package/dist/mcp-data/registry/checkbox-group.json +246 -0
  301. package/dist/mcp-data/registry/checkbox.json +26 -6
  302. package/dist/mcp-data/registry/chip.json +2 -2
  303. package/dist/mcp-data/registry/code-block.json +2 -2
  304. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  305. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  306. package/dist/mcp-data/registry/conversation-list.json +2 -2
  307. package/dist/mcp-data/registry/data-customize.json +3 -3
  308. package/dist/mcp-data/registry/data-filter.json +2 -2
  309. package/dist/mcp-data/registry/data-group.json +2 -2
  310. package/dist/mcp-data/registry/data-preferences.json +2 -2
  311. package/dist/mcp-data/registry/data-saved-views.json +2 -2
  312. package/dist/mcp-data/registry/data-search.json +2 -2
  313. package/dist/mcp-data/registry/data-sort.json +2 -2
  314. package/dist/mcp-data/registry/data-toolbar.json +2 -2
  315. package/dist/mcp-data/registry/divider.json +2 -2
  316. package/dist/mcp-data/registry/empty-state.json +27 -14
  317. package/dist/mcp-data/registry/field.json +6 -5
  318. package/dist/mcp-data/registry/filter-menu.json +2 -2
  319. package/dist/mcp-data/registry/icon.json +2 -2
  320. package/dist/mcp-data/registry/inline-banner-settings.json +175 -0
  321. package/dist/mcp-data/registry/input-date.json +2 -2
  322. package/dist/mcp-data/registry/input-time.json +26 -7
  323. package/dist/mcp-data/registry/input.json +265 -15
  324. package/dist/mcp-data/registry/loader.json +2 -2
  325. package/dist/mcp-data/registry/map-cluster-marker.json +3 -3
  326. package/dist/mcp-data/registry/map-entity-marker.json +56 -56
  327. package/dist/mcp-data/registry/markdown.json +2 -2
  328. package/dist/mcp-data/registry/menu.json +2 -2
  329. package/dist/mcp-data/registry/message-actions.json +2 -2
  330. package/dist/mcp-data/registry/message-bubble.json +5 -5
  331. package/dist/mcp-data/registry/message-composer.json +7 -7
  332. package/dist/mcp-data/registry/message-scroller.json +2 -2
  333. package/dist/mcp-data/registry/message.json +3 -3
  334. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  335. package/dist/mcp-data/registry/mobile-header.json +2 -2
  336. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  337. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  338. package/dist/mcp-data/registry/modal.json +2 -2
  339. package/dist/mcp-data/registry/pagination.json +2 -2
  340. package/dist/mcp-data/registry/panel-nav.json +4 -4
  341. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  342. package/dist/mcp-data/registry/panel-tool-header.json +4 -4
  343. package/dist/mcp-data/registry/panel-tool-search.json +3 -3
  344. package/dist/mcp-data/registry/panel-tools.json +4 -4
  345. package/dist/mcp-data/registry/paper-texture.json +2 -2
  346. package/dist/mcp-data/registry/radio-tile.json +399 -0
  347. package/dist/mcp-data/registry/radio.json +51 -9
  348. package/dist/mcp-data/registry/registry.json +954 -80
  349. package/dist/mcp-data/registry/score.json +2 -2
  350. package/dist/mcp-data/registry/scroll-overlay.json +2 -2
  351. package/dist/mcp-data/registry/select.json +2 -2
  352. package/dist/mcp-data/registry/setting-row-checkbox.json +197 -0
  353. package/dist/mcp-data/registry/setting-row-radio.json +196 -0
  354. package/dist/mcp-data/registry/setting-row-toggle.json +233 -0
  355. package/dist/mcp-data/registry/shell-app.json +4 -4
  356. package/dist/mcp-data/registry/shell-page.json +2 -2
  357. package/dist/mcp-data/registry/shell-tools.json +2 -2
  358. package/dist/mcp-data/registry/skeleton.json +2 -2
  359. package/dist/mcp-data/registry/slider.json +32 -12
  360. package/dist/mcp-data/registry/swatch-picker.json +2 -2
  361. package/dist/mcp-data/registry/switch.json +4 -4
  362. package/dist/mcp-data/registry/tab-group.json +2 -2
  363. package/dist/mcp-data/registry/table.json +5 -5
  364. package/dist/mcp-data/registry/tag.json +2 -2
  365. package/dist/mcp-data/registry/text.json +2 -2
  366. package/dist/mcp-data/registry/textarea.json +72 -5
  367. package/dist/mcp-data/registry/time-picker.json +28 -9
  368. package/dist/mcp-data/registry/toast.json +2 -2
  369. package/dist/mcp-data/registry/tooltip-chart.json +2 -2
  370. package/dist/mcp-data/registry/tooltip.json +2 -2
  371. package/dist/mcp-data/registry/typing-indicator.json +2 -2
  372. package/dist/react/components.d.ts +6 -0
  373. package/dist/react/components.js +6 -0
  374. package/dist/react/ds-checkbox-group.d.ts +9 -0
  375. package/dist/react/ds-checkbox-group.js +12 -0
  376. package/dist/react/ds-inline-banner-settings.d.ts +9 -0
  377. package/dist/react/ds-inline-banner-settings.js +12 -0
  378. package/dist/react/ds-input.d.ts +2 -0
  379. package/dist/react/ds-input.js +2 -0
  380. package/dist/react/ds-radio-tile.d.ts +12 -0
  381. package/dist/react/ds-radio-tile.js +12 -0
  382. package/dist/react/ds-setting-row-checkbox.d.ts +9 -0
  383. package/dist/react/ds-setting-row-checkbox.js +12 -0
  384. package/dist/react/ds-setting-row-radio.d.ts +9 -0
  385. package/dist/react/ds-setting-row-radio.js +12 -0
  386. package/dist/react/ds-setting-row-toggle.d.ts +12 -0
  387. package/dist/react/ds-setting-row-toggle.js +12 -0
  388. package/dist/types/components/BarPageTitle/BarPageTitle.d.ts +2 -0
  389. package/dist/types/components/BarTitle/bar-title-action-chrome.d.ts +4 -0
  390. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +5 -2
  391. package/dist/types/components/CardSetting/CardSetting.d.ts +15 -3
  392. package/dist/types/components/CardSetting/index.d.ts +1 -1
  393. package/dist/types/components/Checkbox/Checkbox.d.ts +2 -0
  394. package/dist/types/components/CheckboxGroup/CheckboxGroup.d.ts +20 -0
  395. package/dist/types/components/EmptyState/EmptyState.d.ts +3 -0
  396. package/dist/types/components/Field/Field.d.ts +4 -0
  397. package/dist/types/components/InlineBannerSettings/InlineBannerSettings.d.ts +6 -0
  398. package/dist/types/components/Input/Input.d.ts +50 -1
  399. package/dist/types/components/InputTime/InputTime.d.ts +3 -0
  400. package/dist/types/components/MapEntityMarker/MapEntityMarker.d.ts +5 -5
  401. package/dist/types/components/Radio/Radio.d.ts +8 -0
  402. package/dist/types/components/RadioTile/RadioTile.d.ts +40 -0
  403. package/dist/types/components/RadioTile/index.d.ts +2 -0
  404. package/dist/types/components/SettingRowCheckbox/SettingRowCheckbox.d.ts +19 -0
  405. package/dist/types/components/SettingRowRadio/SettingRowRadio.d.ts +19 -0
  406. package/dist/types/components/SettingRowToggle/SettingRowToggle.d.ts +21 -0
  407. package/dist/types/components/Slider/Slider.d.ts +8 -1
  408. package/dist/types/components/Slider/index.d.ts +1 -1
  409. package/dist/types/components/Switch/Switch.d.ts +7 -0
  410. package/dist/types/components/Textarea/Textarea.d.ts +12 -0
  411. package/dist/types/components/TimePicker/TimePicker.d.ts +4 -0
  412. package/dist/types/components.d.ts +728 -37
  413. package/dist/types/utils/text-constraints.d.ts +20 -0
  414. package/dist/vue/components.d.ts +6 -0
  415. package/dist/vue/components.js +6 -0
  416. package/dist/vue/ds-card-setting.js +1 -0
  417. package/dist/vue/ds-checkbox-group.d.ts +3 -0
  418. package/dist/vue/ds-checkbox-group.js +12 -0
  419. package/dist/vue/ds-checkbox.js +1 -0
  420. package/dist/vue/ds-inline-banner-settings.d.ts +3 -0
  421. package/dist/vue/ds-inline-banner-settings.js +8 -0
  422. package/dist/vue/ds-input-time.js +1 -0
  423. package/dist/vue/ds-input.js +17 -0
  424. package/dist/vue/ds-map-entity-marker.js +2 -2
  425. package/dist/vue/ds-radio-tile.d.ts +3 -0
  426. package/dist/vue/ds-radio-tile.js +24 -0
  427. package/dist/vue/ds-radio.js +2 -0
  428. package/dist/vue/ds-setting-row-checkbox.d.ts +3 -0
  429. package/dist/vue/ds-setting-row-checkbox.js +11 -0
  430. package/dist/vue/ds-setting-row-radio.d.ts +3 -0
  431. package/dist/vue/ds-setting-row-radio.js +11 -0
  432. package/dist/vue/ds-setting-row-toggle.d.ts +3 -0
  433. package/dist/vue/ds-setting-row-toggle.js +15 -0
  434. package/dist/vue/ds-slider.d.ts +1 -1
  435. package/dist/vue/ds-slider.js +2 -1
  436. package/dist/vue/ds-textarea.js +4 -0
  437. package/dist/vue/ds-time-picker.js +1 -0
  438. package/package.json +5 -5
  439. package/dist/components/p-BCnzbfma.js +0 -2
  440. package/dist/components/p-BCnzbfma.js.map +0 -1
  441. package/dist/components/p-BJJh-Bf7.js +0 -2
  442. package/dist/components/p-BLuqpHvp.js +0 -2
  443. package/dist/components/p-BR5OC2PX.js +0 -2
  444. package/dist/components/p-BX506yEW.js +0 -2
  445. package/dist/components/p-BX506yEW.js.map +0 -1
  446. package/dist/components/p-BZ_e69zx.js +0 -2
  447. package/dist/components/p-BfF4RZdp.js +0 -2
  448. package/dist/components/p-Br5e83Fr.js +0 -2
  449. package/dist/components/p-Br5e83Fr.js.map +0 -1
  450. package/dist/components/p-Bv9rSkp0.js +0 -2
  451. package/dist/components/p-Bv9rSkp0.js.map +0 -1
  452. package/dist/components/p-BzYW1IqO.js +0 -2
  453. package/dist/components/p-C0JkLR83.js +0 -2
  454. package/dist/components/p-C6Aavz9h.js +0 -2
  455. package/dist/components/p-C6Aavz9h.js.map +0 -1
  456. package/dist/components/p-C6zycbhC.js +0 -2
  457. package/dist/components/p-C6zycbhC.js.map +0 -1
  458. package/dist/components/p-CNZ6-kWd.js +0 -2
  459. package/dist/components/p-CRk0TjQv.js +0 -2
  460. package/dist/components/p-CTGgXIXM.js +0 -2
  461. package/dist/components/p-CZ7hxDy_.js +0 -2
  462. package/dist/components/p-Cc3ZUQlJ.js +0 -2
  463. package/dist/components/p-Cc3ZUQlJ.js.map +0 -1
  464. package/dist/components/p-D5HxZrMA.js +0 -2
  465. package/dist/components/p-D5HxZrMA.js.map +0 -1
  466. package/dist/components/p-D7K1ZHML.js +0 -2
  467. package/dist/components/p-D7K1ZHML.js.map +0 -1
  468. package/dist/components/p-Dlp1HqgS.js +0 -2
  469. package/dist/components/p-DsLXlxt3.js.map +0 -1
  470. package/dist/components/p-YrnU2fM7.js +0 -2
  471. package/dist/components/p-ZYWnJaye.js +0 -2
  472. package/dist/components/p-ZYWnJaye.js.map +0 -1
  473. package/dist/components/p-etg-Uk1u.js +0 -2
  474. package/dist/components/p-lamoJZE4.js +0 -2
  475. package/dist/components/p-mV4vSjSK.js +0 -2
  476. package/dist/components/p-mV4vSjSK.js.map +0 -1
  477. package/dist/components/p-mux14tWZ.js.map +0 -1
  478. package/dist/components/p-mxZoWfnS.js +0 -2
  479. package/dist/components/p-mxZoWfnS.js.map +0 -1
  480. package/dist/components/p-p0FVyEFa.js.map +0 -1
  481. package/dist/components/p-xtGGIZmU.js +0 -2
  482. package/dist/components/p-xtGGIZmU.js.map +0 -1
  483. /package/dist/components/{p-7V1AhetH.js.map → p-B0BQCVkq.js.map} +0 -0
  484. /package/dist/components/{p-Cu8o2rOz.js.map → p-B39iJO8F.js.map} +0 -0
  485. /package/dist/components/{p-B6qQaYkB.js.map → p-B9y6azEw.js.map} +0 -0
  486. /package/dist/components/{p-5SVmAjXY.js.map → p-BERXvOCf.js.map} +0 -0
  487. /package/dist/components/{p-xhn1cZgU.js.map → p-BFHpU-uU.js.map} +0 -0
  488. /package/dist/components/{p-CuWPWC3t.js.map → p-BQspV5U7.js.map} +0 -0
  489. /package/dist/components/{p-BOhefRMt.js.map → p-Bk3poU91.js.map} +0 -0
  490. /package/dist/components/{p-QWukusRL.js.map → p-BnuNaXR2.js.map} +0 -0
  491. /package/dist/components/{p-BtnTQp4K.js.map → p-C8V4lkVy.js.map} +0 -0
  492. /package/dist/components/{p-CGidq1iC.js.map → p-CuwopElg.js.map} +0 -0
  493. /package/dist/components/{p-Cn6AfzeF.js.map → p-CwdRaJER.js.map} +0 -0
  494. /package/dist/components/{p-ZwRLjD5M.js.map → p-D8OWhnID.js.map} +0 -0
  495. /package/dist/components/{p-C_Ma6Xa-.js.map → p-DIQiHX0q.js.map} +0 -0
  496. /package/dist/components/{p-B3CZvMXs.js.map → p-DJDbskZf.js.map} +0 -0
  497. /package/dist/components/{p-C1gaWjOm.js.map → p-DSZPO06T.js.map} +0 -0
  498. /package/dist/components/{p-uADksYMl.js.map → p-DSmDyI2o.js.map} +0 -0
  499. /package/dist/components/{p-UY63jmrO.js.map → p-DVEx-Xg9.js.map} +0 -0
  500. /package/dist/components/{p-vfCu7XSc.js.map → p-DZ58Sg5a.js.map} +0 -0
  501. /package/dist/components/{p-DFO5lV_A.js.map → p-DmSnHVW6.js.map} +0 -0
  502. /package/dist/components/{p-ER5M085B.js.map → p-UJMEz8_O.js.map} +0 -0
  503. /package/dist/components/{p-CR-Jjdcn.js.map → p-_IqSPt5V.js.map} +0 -0
  504. /package/dist/components/{p-BLSSaVWm.js.map → p-pp1IQN4Z.js.map} +0 -0
@@ -191,8 +191,8 @@
191
191
  },
192
192
  "peerDependencies": {
193
193
  "required": [
194
- "@ds-mo/tokens ^6.5.1",
195
- "@ds-mo/icons ^8.1.0"
194
+ "@ds-mo/tokens ^6.6.1",
195
+ "@ds-mo/icons ^8.1.1"
196
196
  ],
197
197
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
198
198
  }
@@ -25,7 +25,7 @@
25
25
  ],
26
26
  "alternatives": [
27
27
  {
28
- "when": "One map entity needs operating state, heading, and stale treatment.",
28
+ "when": "One map entity needs operating state, bearing, and an optional dashed outline.",
29
29
  "component": "component:ds-map-entity-marker",
30
30
  "reason": "MapEntityMarker owns single-entity marker semantics and geometry."
31
31
  },
@@ -234,8 +234,8 @@
234
234
  },
235
235
  "peerDependencies": {
236
236
  "required": [
237
- "@ds-mo/tokens ^6.5.1",
238
- "@ds-mo/icons ^8.1.0"
237
+ "@ds-mo/tokens ^6.6.1",
238
+ "@ds-mo/icons ^8.1.1"
239
239
  ],
240
240
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
241
241
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "map-entity-marker",
4
4
  "title": "MapEntityMarker",
5
- "description": "Engine-independent map marker button for a vehicle, asset, person, or travel group with operating-state color, heading, stale treatment, and a hover or focus caption.",
5
+ "description": "Engine-independent map marker button for a vehicle, asset, person, or travel group with operating-state color, bearing, an optional dashed outline, and a hover or focus caption.",
6
6
  "type": "registry:ui",
7
7
  "meta": {
8
8
  "library": "@ds-mo/ui",
@@ -13,7 +13,7 @@
13
13
  "intent": {
14
14
  "audience": "general",
15
15
  "status": "experimental",
16
- "summary": "Engine-independent map marker button for a vehicle, asset, person, or travel group with operating-state color, heading, stale treatment, and a hover or focus caption.",
16
+ "summary": "Engine-independent map marker button for a vehicle, asset, person, or travel group with operating-state color, bearing, an optional dashed outline, and a hover or focus caption.",
17
17
  "useWhen": [
18
18
  "An application map needs a consistent interactive marker for one entity.",
19
19
  "The map engine can mount a custom element and retain ownership of coordinates, anchoring, and camera behavior."
@@ -38,14 +38,14 @@
38
38
  "The component renders a native button and label is its accessible action name. Prefer an action-oriented label such as ‘Open vehicle 412’.",
39
39
  "Caption is a supplemental visual identifier and is hidden from assistive technology to avoid duplicating label.",
40
40
  "Keyboard focus reveals the same caption as hover and uses the shared visible focus ring.",
41
- "State and stale meaning must be present in nearby map legend or application detail content; do not rely on marker color alone.",
42
- "The stale outline remains differentiated by a dashed border in forced-colors mode."
41
+ "Operating-state and outline meaning must be present in nearby map legend or application detail content; do not rely on marker color alone.",
42
+ "The optional dashed outline remains differentiated by a dashed border in forced-colors mode."
43
43
  ],
44
44
  "states": [
45
- "state selects the semantic operating-state color. Use stale as a standalone state only when no last-known operating state is available.",
46
- "stale adds a dashed outline while preserving state, matching last-known map data.",
47
- "immobilized always renders the upright MapKey glyph instead of the entity icon so the state is identifiable without interpreting heading.",
48
- "heading rotates only MapEntityTravelGroup and MapEntityVehicle glyphs and is normalized to a clockwise value from 0 through 359 degrees. Immobilized, asset, person, and other glyphs remain upright.",
45
+ "Unknown represents unavailable current motion and uses the existing stale-background token. The application resolves stale telemetry to Unknown regardless of previous motion; a known Immobilized state takes precedence.",
46
+ "The dashed outline is an independent visual option. Unknown is solid unless the owner explicitly requests dashes.",
47
+ "immobilized always renders the upright MapKey glyph instead of the entity icon so the state is identifiable without interpreting bearing.",
48
+ "bearing rotates only MapEntityTravelGroup and MapEntityVehicle glyphs and is normalized to a clockwise value from 0 through 359 degrees. Immobilized, asset, person, and other glyphs remain upright.",
49
49
  "dimmed is visual de-emphasis only. The map owner decides when selection context should dim peer markers and keeps every marker operable. A dimmed marker returns to full opacity while hovered or keyboard-focused so its revealed caption remains legible.",
50
50
  "Activation emits dsClick without changing application selection internally."
51
51
  ],
@@ -59,10 +59,10 @@
59
59
  "Listen for dsClick and keep selected entity, z-index, coordinates, and camera movement in application state."
60
60
  ],
61
61
  "react": [
62
- "Pass numeric heading as a property and handle dsClick through the generated event binding."
62
+ "Pass numeric bearing as a property and handle dsClick through the generated event binding."
63
63
  ],
64
64
  "angular": [
65
- "Bind heading as a number and keep map-engine marker lifecycle in the owning map adapter."
65
+ "Bind bearing as a number and keep map-engine marker lifecycle in the owning map adapter."
66
66
  ]
67
67
  },
68
68
  "references": [
@@ -86,10 +86,10 @@
86
86
  "color",
87
87
  "opacity"
88
88
  ],
89
- "reason": "Marker geometry, operating-state colors, stale distinction, and de-emphasis are one accessible visual recipe.",
89
+ "reason": "Marker geometry, operating-state colors, outline distinction, and de-emphasis are one accessible visual recipe.",
90
90
  "props": [
91
91
  "state",
92
- "stale",
92
+ "dashed",
93
93
  "dimmed"
94
94
  ]
95
95
  }
@@ -99,6 +99,15 @@
99
99
  },
100
100
  "api": {
101
101
  "props": {
102
+ "bearing": {
103
+ "type": "number",
104
+ "resolvedType": "number",
105
+ "attribute": "bearing",
106
+ "default": "0",
107
+ "required": false,
108
+ "mutable": false,
109
+ "description": "Clockwise map bearing for travel-group and vehicle icons. Values are normalized to 0–359."
110
+ },
102
111
  "caption": {
103
112
  "type": "string",
104
113
  "resolvedType": "string",
@@ -108,23 +117,23 @@
108
117
  "mutable": false,
109
118
  "description": "Short visible identifier revealed on hover or keyboard focus."
110
119
  },
111
- "dimmed": {
120
+ "dashed": {
112
121
  "type": "boolean",
113
122
  "resolvedType": "boolean",
114
- "attribute": "dimmed",
123
+ "attribute": "dashed",
115
124
  "default": "false",
116
125
  "required": false,
117
126
  "mutable": false,
118
- "description": "De-emphasizes this marker when an owner-managed selection is active elsewhere."
127
+ "description": "Adds an optional dashed outline without changing the operating state."
119
128
  },
120
- "heading": {
121
- "type": "number",
122
- "resolvedType": "number",
123
- "attribute": "heading",
124
- "default": "0",
129
+ "dimmed": {
130
+ "type": "boolean",
131
+ "resolvedType": "boolean",
132
+ "attribute": "dimmed",
133
+ "default": "false",
125
134
  "required": false,
126
135
  "mutable": false,
127
- "description": "Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359."
136
+ "description": "De-emphasizes this marker when an owner-managed selection is active elsewhere."
128
137
  },
129
138
  "icon": {
130
139
  "type": "string",
@@ -143,20 +152,11 @@
143
152
  "mutable": false,
144
153
  "description": "Accessible action label. Describe what activating the marker opens."
145
154
  },
146
- "stale": {
147
- "type": "boolean",
148
- "resolvedType": "boolean",
149
- "attribute": "stale",
150
- "default": "false",
151
- "required": false,
152
- "mutable": false,
153
- "description": "Adds the stale-data outline while preserving the last known operating state."
154
- },
155
155
  "state": {
156
156
  "type": "MapEntityMarkerState",
157
- "resolvedType": "\"idling\" | \"immobilized\" | \"in-motion\" | \"stale\" | \"stationary\"",
157
+ "resolvedType": "\"idling\" | \"immobilized\" | \"moving\" | \"stationary\" | \"unknown\"",
158
158
  "attribute": "state",
159
- "default": "'in-motion'",
159
+ "default": "'moving'",
160
160
  "required": false,
161
161
  "mutable": false,
162
162
  "description": "Semantic operating state that selects the marker background."
@@ -182,6 +182,15 @@
182
182
  "slots": []
183
183
  },
184
184
  "props": {
185
+ "bearing": {
186
+ "type": "number",
187
+ "resolvedType": "number",
188
+ "attribute": "bearing",
189
+ "default": "0",
190
+ "required": false,
191
+ "mutable": false,
192
+ "description": "Clockwise map bearing for travel-group and vehicle icons. Values are normalized to 0–359."
193
+ },
185
194
  "caption": {
186
195
  "type": "string",
187
196
  "resolvedType": "string",
@@ -191,23 +200,23 @@
191
200
  "mutable": false,
192
201
  "description": "Short visible identifier revealed on hover or keyboard focus."
193
202
  },
194
- "dimmed": {
203
+ "dashed": {
195
204
  "type": "boolean",
196
205
  "resolvedType": "boolean",
197
- "attribute": "dimmed",
206
+ "attribute": "dashed",
198
207
  "default": "false",
199
208
  "required": false,
200
209
  "mutable": false,
201
- "description": "De-emphasizes this marker when an owner-managed selection is active elsewhere."
210
+ "description": "Adds an optional dashed outline without changing the operating state."
202
211
  },
203
- "heading": {
204
- "type": "number",
205
- "resolvedType": "number",
206
- "attribute": "heading",
207
- "default": "0",
212
+ "dimmed": {
213
+ "type": "boolean",
214
+ "resolvedType": "boolean",
215
+ "attribute": "dimmed",
216
+ "default": "false",
208
217
  "required": false,
209
218
  "mutable": false,
210
- "description": "Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359."
219
+ "description": "De-emphasizes this marker when an owner-managed selection is active elsewhere."
211
220
  },
212
221
  "icon": {
213
222
  "type": "string",
@@ -226,20 +235,11 @@
226
235
  "mutable": false,
227
236
  "description": "Accessible action label. Describe what activating the marker opens."
228
237
  },
229
- "stale": {
230
- "type": "boolean",
231
- "resolvedType": "boolean",
232
- "attribute": "stale",
233
- "default": "false",
234
- "required": false,
235
- "mutable": false,
236
- "description": "Adds the stale-data outline while preserving the last known operating state."
237
- },
238
238
  "state": {
239
239
  "type": "MapEntityMarkerState",
240
- "resolvedType": "\"idling\" | \"immobilized\" | \"in-motion\" | \"stale\" | \"stationary\"",
240
+ "resolvedType": "\"idling\" | \"immobilized\" | \"moving\" | \"stationary\" | \"unknown\"",
241
241
  "attribute": "state",
242
- "default": "'in-motion'",
242
+ "default": "'moving'",
243
243
  "required": false,
244
244
  "mutable": false,
245
245
  "description": "Semantic operating state that selects the marker background."
@@ -290,8 +290,8 @@
290
290
  },
291
291
  "peerDependencies": {
292
292
  "required": [
293
- "@ds-mo/tokens ^6.5.1",
294
- "@ds-mo/icons ^8.1.0"
293
+ "@ds-mo/tokens ^6.6.1",
294
+ "@ds-mo/icons ^8.1.1"
295
295
  ],
296
296
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
297
297
  }
@@ -309,12 +309,12 @@
309
309
  "files": [
310
310
  {
311
311
  "path": "src/wc/components/MapEntityMarker/MapEntityMarker.css",
312
- "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/map-marker.css';\n\n:host([state='in-motion']) {\n --_map-marker-background: var(--color-entity-marker-background-in-motion);\n}\n\n:host([state='idling']) {\n --_map-marker-background: var(--color-entity-marker-background-idling);\n}\n\n:host([state='stationary']) {\n --_map-marker-background: var(--color-entity-marker-background-stationary);\n}\n\n:host([state='immobilized']) {\n --_map-marker-background: var(--color-entity-marker-background-immobilized);\n}\n\n:host([state='stale']) {\n --_map-marker-background: var(--color-entity-marker-background-stale);\n}\n\n.map-marker__button {\n width: var(--dimension-size-300);\n border-radius: var(--dimension-radius-half);\n}\n\n:host(.map-entity-marker--stale) .map-marker__button::after {\n display: none;\n}\n\n.map-entity-marker__stale-outline {\n position: absolute;\n z-index: 3;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n pointer-events: none;\n transform: rotate(-90deg);\n fill: none;\n stroke: currentcolor;\n stroke-width: 1;\n stroke-linecap: butt;\n}\n\n.map-entity-marker__glyph {\n position: relative;\n z-index: 2;\n display: inline-flex;\n transform: rotate(var(--ds-map-entity-marker-heading));\n}\n\n@media (forced-colors: active) {\n :host(.map-entity-marker--stale) .map-marker__button::after {\n display: block;\n outline-style: dashed;\n }\n\n .map-entity-marker__stale-outline {\n display: none;\n }\n}\n",
312
+ "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/map-marker.css';\n\n:host([state='moving']) {\n --_map-marker-background: var(--color-entity-marker-background-in-motion);\n}\n\n:host([state='idling']) {\n --_map-marker-background: var(--color-entity-marker-background-idling);\n}\n\n:host([state='stationary']) {\n --_map-marker-background: var(--color-entity-marker-background-stationary);\n}\n\n:host([state='immobilized']) {\n --_map-marker-background: var(--color-entity-marker-background-immobilized);\n}\n\n:host([state='unknown']) {\n --_map-marker-background: var(--color-entity-marker-background-stale);\n}\n\n.map-marker__button {\n width: var(--dimension-size-300);\n border-radius: var(--dimension-radius-half);\n}\n\n:host(.map-entity-marker--dashed) .map-marker__button::after {\n display: none;\n}\n\n.map-entity-marker__dashed-outline {\n position: absolute;\n z-index: 3;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n pointer-events: none;\n transform: rotate(-90deg);\n fill: none;\n stroke: currentcolor;\n stroke-width: 1;\n stroke-linecap: butt;\n}\n\n.map-entity-marker__glyph {\n position: relative;\n z-index: 2;\n display: inline-flex;\n transform: rotate(var(--ds-map-entity-marker-bearing));\n}\n\n@media (forced-colors: active) {\n :host(.map-entity-marker--dashed) .map-marker__button::after {\n display: block;\n outline-style: dashed;\n }\n\n .map-entity-marker__dashed-outline {\n display: none;\n }\n}\n",
313
313
  "type": "registry:ui"
314
314
  },
315
315
  {
316
316
  "path": "src/wc/components/MapEntityMarker/MapEntityMarker.tsx",
317
- "content": "import { Component, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';\n\nexport type MapEntityMarkerState = 'in-motion' | 'idling' | 'stationary' | 'immobilized' | 'stale';\n\nconst normalizeHeading = (heading: number): number => {\n if (!Number.isFinite(heading)) return 0;\n return ((heading % 360) + 360) % 360;\n};\n\nconst HEADING_ICONS = new Set(['MapEntityTravelGroup', 'MapEntityVehicle']);\n\nconst STALE_OUTLINE_CENTER = 8;\nconst STALE_OUTLINE_RADIUS = 6.5;\nconst STALE_OUTLINE_SEGMENT_ANGLE = 45;\nconst STALE_OUTLINE_HALF_GAP_ANGLE = 6;\n\nconst staleOutlinePoint = (angle: number): [number, number] => {\n const radians = (angle * Math.PI) / 180;\n return [\n STALE_OUTLINE_CENTER + STALE_OUTLINE_RADIUS * Math.cos(radians),\n STALE_OUTLINE_CENTER + STALE_OUTLINE_RADIUS * Math.sin(radians),\n ];\n};\n\nconst STALE_OUTLINE_PATH = Array.from({ length: 8 }, (_, index) => {\n const segmentStart = index * STALE_OUTLINE_SEGMENT_ANGLE + STALE_OUTLINE_HALF_GAP_ANGLE;\n const segmentEnd = (index + 1) * STALE_OUTLINE_SEGMENT_ANGLE - STALE_OUTLINE_HALF_GAP_ANGLE;\n const [startX, startY] = staleOutlinePoint(segmentStart);\n const [endX, endY] = staleOutlinePoint(segmentEnd);\n return `M ${startX.toFixed(3)} ${startY.toFixed(3)} A ${STALE_OUTLINE_RADIUS} ${STALE_OUTLINE_RADIUS} 0 0 1 ${endX.toFixed(3)} ${endY.toFixed(3)}`;\n}).join(' ');\n\n@Component({\n tag: 'ds-map-entity-marker',\n styleUrl: 'MapEntityMarker.css',\n scoped: true,\n})\nexport class MapEntityMarker {\n /** Accessible action label. Describe what activating the marker opens. */\n @Prop() label!: string;\n\n /** Short visible identifier revealed on hover or keyboard focus. */\n @Prop() caption: string = '';\n\n /** Canonical IcoMo icon name for the represented map entity. Immobilized state uses MapKey. */\n @Prop() icon: string = 'MapEntityTravelGroup';\n\n /** Semantic operating state that selects the marker background. */\n @Prop({ reflect: true }) state: MapEntityMarkerState = 'in-motion';\n\n /** Adds the stale-data outline while preserving the last known operating state. */\n @Prop({ reflect: true }) stale: boolean = false;\n\n /** Clockwise map heading for travel-group and vehicle icons. Values are normalized to 0–359. */\n @Prop() heading: number = 0;\n\n /** De-emphasizes this marker when an owner-managed selection is active elsewhere. */\n @Prop({ reflect: true }) dimmed: boolean = false;\n\n /** Fired when the marker's native button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private buttonEl?: HTMLButtonElement;\n\n /** Moves keyboard focus to the marker button. */\n @Method()\n async setFocus(): Promise<void> {\n this.buttonEl?.focus();\n }\n\n private handleClick = (event: MouseEvent) => {\n this.dsClick.emit(event);\n };\n\n render() {\n const caption = this.caption.trim();\n const markerIsStale = this.stale || this.state === 'stale';\n const markerIcon = this.state === 'immobilized' ? 'MapKey' : this.icon;\n const heading = HEADING_ICONS.has(markerIcon) ? normalizeHeading(this.heading) : 0;\n\n return (\n <Host\n class={{\n 'map-entity-marker': true,\n 'map-marker--dimmed': this.dimmed,\n 'map-entity-marker--stale': markerIsStale,\n }}\n >\n <button\n ref={element => (this.buttonEl = element)}\n type=\"button\"\n class=\"map-marker__button ds-focus-ring\"\n aria-label={this.label}\n onClick={this.handleClick}\n >\n <span\n class=\"map-entity-marker__glyph\"\n style={{ '--ds-map-entity-marker-heading': `${heading}deg` }}\n aria-hidden=\"true\"\n >\n <ds-icon name={markerIcon} size=\"sm\" color=\"inherit\"></ds-icon>\n </span>\n {markerIsStale && (\n // eslint-disable-next-line compomo/prefer-ds-icon -- The stale ring is a component-owned geometric primitive with eight exact equal arcs.\n <svg class=\"map-entity-marker__stale-outline\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d={STALE_OUTLINE_PATH}></path>\n </svg>\n )}\n </button>\n {caption && (\n <ds-text\n class=\"map-marker__caption\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n aria-hidden=\"true\"\n >\n {caption}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n",
317
+ "content": "import { Component, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';\n\nexport type MapEntityMarkerState = 'moving' | 'idling' | 'stationary' | 'immobilized' | 'unknown';\n\nconst normalizeBearing = (bearing: number): number => {\n if (!Number.isFinite(bearing)) return 0;\n return ((bearing % 360) + 360) % 360;\n};\n\nconst BEARING_ICONS = new Set(['MapEntityTravelGroup', 'MapEntityVehicle']);\n\nconst DASHED_OUTLINE_CENTER = 8;\nconst DASHED_OUTLINE_RADIUS = 6.5;\nconst DASHED_OUTLINE_SEGMENT_ANGLE = 45;\nconst DASHED_OUTLINE_HALF_GAP_ANGLE = 6;\n\nconst dashedOutlinePoint = (angle: number): [number, number] => {\n const radians = (angle * Math.PI) / 180;\n return [\n DASHED_OUTLINE_CENTER + DASHED_OUTLINE_RADIUS * Math.cos(radians),\n DASHED_OUTLINE_CENTER + DASHED_OUTLINE_RADIUS * Math.sin(radians),\n ];\n};\n\nconst DASHED_OUTLINE_PATH = Array.from({ length: 8 }, (_, index) => {\n const segmentStart = index * DASHED_OUTLINE_SEGMENT_ANGLE + DASHED_OUTLINE_HALF_GAP_ANGLE;\n const segmentEnd = (index + 1) * DASHED_OUTLINE_SEGMENT_ANGLE - DASHED_OUTLINE_HALF_GAP_ANGLE;\n const [startX, startY] = dashedOutlinePoint(segmentStart);\n const [endX, endY] = dashedOutlinePoint(segmentEnd);\n return `M ${startX.toFixed(3)} ${startY.toFixed(3)} A ${DASHED_OUTLINE_RADIUS} ${DASHED_OUTLINE_RADIUS} 0 0 1 ${endX.toFixed(3)} ${endY.toFixed(3)}`;\n}).join(' ');\n\n@Component({\n tag: 'ds-map-entity-marker',\n styleUrl: 'MapEntityMarker.css',\n scoped: true,\n})\nexport class MapEntityMarker {\n /** Accessible action label. Describe what activating the marker opens. */\n @Prop() label!: string;\n\n /** Short visible identifier revealed on hover or keyboard focus. */\n @Prop() caption: string = '';\n\n /** Canonical IcoMo icon name for the represented map entity. Immobilized state uses MapKey. */\n @Prop() icon: string = 'MapEntityTravelGroup';\n\n /** Semantic operating state that selects the marker background. */\n @Prop({ reflect: true }) state: MapEntityMarkerState = 'moving';\n\n /** Adds an optional dashed outline without changing the operating state. */\n @Prop({ reflect: true }) dashed: boolean = false;\n\n /** Clockwise map bearing for travel-group and vehicle icons. Values are normalized to 0–359. */\n @Prop() bearing: number = 0;\n\n /** De-emphasizes this marker when an owner-managed selection is active elsewhere. */\n @Prop({ reflect: true }) dimmed: boolean = false;\n\n /** Fired when the marker's native button is activated. */\n @Event() dsClick!: EventEmitter<MouseEvent>;\n\n private buttonEl?: HTMLButtonElement;\n\n /** Moves keyboard focus to the marker button. */\n @Method()\n async setFocus(): Promise<void> {\n this.buttonEl?.focus();\n }\n\n private handleClick = (event: MouseEvent) => {\n this.dsClick.emit(event);\n };\n\n render() {\n const caption = this.caption.trim();\n const markerIcon = this.state === 'immobilized' ? 'MapKey' : this.icon;\n const bearing = BEARING_ICONS.has(markerIcon) ? normalizeBearing(this.bearing) : 0;\n\n return (\n <Host\n class={{\n 'map-entity-marker': true,\n 'map-marker--dimmed': this.dimmed,\n 'map-entity-marker--dashed': this.dashed,\n }}\n >\n <button\n ref={element => (this.buttonEl = element)}\n type=\"button\"\n class=\"map-marker__button ds-focus-ring\"\n aria-label={this.label}\n onClick={this.handleClick}\n >\n <span\n class=\"map-entity-marker__glyph\"\n style={{ '--ds-map-entity-marker-bearing': `${bearing}deg` }}\n aria-hidden=\"true\"\n >\n <ds-icon name={markerIcon} size=\"sm\" color=\"inherit\"></ds-icon>\n </span>\n {this.dashed && (\n // eslint-disable-next-line compomo/prefer-ds-icon -- The dashed ring is a component-owned geometric primitive with eight exact equal arcs.\n <svg class=\"map-entity-marker__dashed-outline\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n <path d={DASHED_OUTLINE_PATH}></path>\n </svg>\n )}\n </button>\n {caption && (\n <ds-text\n class=\"map-marker__caption\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n aria-hidden=\"true\"\n >\n {caption}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n",
318
318
  "type": "registry:ui"
319
319
  }
320
320
  ]
@@ -138,8 +138,8 @@
138
138
  },
139
139
  "peerDependencies": {
140
140
  "required": [
141
- "@ds-mo/tokens ^6.5.1",
142
- "@ds-mo/icons ^8.1.0"
141
+ "@ds-mo/tokens ^6.6.1",
142
+ "@ds-mo/icons ^8.1.1"
143
143
  ],
144
144
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
145
145
  }
@@ -563,8 +563,8 @@
563
563
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: anchor, boundary, items, sections.",
564
564
  "peerDependencies": {
565
565
  "required": [
566
- "@ds-mo/tokens ^6.5.1",
567
- "@ds-mo/icons ^8.1.0"
566
+ "@ds-mo/tokens ^6.6.1",
567
+ "@ds-mo/icons ^8.1.1"
568
568
  ],
569
569
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
570
570
  }
@@ -167,8 +167,8 @@
167
167
  },
168
168
  "peerDependencies": {
169
169
  "required": [
170
- "@ds-mo/tokens ^6.5.1",
171
- "@ds-mo/icons ^8.1.0"
170
+ "@ds-mo/tokens ^6.6.1",
171
+ "@ds-mo/icons ^8.1.1"
172
172
  ],
173
173
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
174
174
  }
@@ -33,8 +33,8 @@
33
33
  "Surface styling does not add semantics; failed delivery belongs in Message metadata below the unchanged bubble rather than in an error bubble treatment."
34
34
  ],
35
35
  "states": [
36
- "The user variant represents user-sent copy in agent and person-to-person channels and uses secondary foreground.",
37
- "The received variant represents ordinary incoming person-to-person copy.",
36
+ "The user variant represents user-sent copy in agent and person-to-person channels, uses primary foreground, and uses the Chrome primary background so body-medium copy meets contrast on that surface.",
37
+ "The received variant represents ordinary incoming person-to-person copy, uses secondary foreground, and uses the Chrome secondary background.",
38
38
  "Typing and rich agent output are not MessageBubble variants."
39
39
  ],
40
40
  "responsiveBehavior": [
@@ -127,8 +127,8 @@
127
127
  },
128
128
  "peerDependencies": {
129
129
  "required": [
130
- "@ds-mo/tokens ^6.5.1",
131
- "@ds-mo/icons ^8.1.0"
130
+ "@ds-mo/tokens ^6.6.1",
131
+ "@ds-mo/icons ^8.1.1"
132
132
  ],
133
133
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
134
134
  }
@@ -142,7 +142,7 @@
142
142
  "files": [
143
143
  {
144
144
  "path": "src/wc/components/MessageBubble/MessageBubble.css",
145
- "content": ":host {\n display: inline-flex;\n max-width: 80%;\n box-sizing: border-box;\n -webkit-user-select: text;\n user-select: text;\n}\n\n.message-bubble {\n min-width: 0;\n padding-block: var(--dimension-space-100);\n padding-inline: calc(var(--dimension-space-100) + var(--dimension-space-025));\n border-radius: var(--dimension-radius-050);\n background: transparent;\n color: var(--color-foreground-primary);\n font-family: var(--typography-font-family-ui);\n font-size: var(--typography-fontsize-md);\n line-height: var(--typography-lineheight-md);\n font-weight: var(--typography-weight-regular);\n letter-spacing: var(--typography-letterspacing-negative-half);\n box-sizing: border-box;\n overflow-wrap: anywhere;\n}\n\n:host(.message-bubble--user) .message-bubble {\n background: var(--color-translucent-translucent);\n color: var(--color-foreground-secondary);\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--color-border-tertiary);\n}\n\n:host(.message-bubble--received) .message-bubble {\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--color-border-tertiary);\n}\n",
145
+ "content": ":host {\n display: inline-flex;\n max-width: 80%;\n box-sizing: border-box;\n -webkit-user-select: text;\n user-select: text;\n}\n\n.message-bubble {\n min-width: 0;\n padding-block: var(--dimension-space-100);\n padding-inline: calc(var(--dimension-space-100) + var(--dimension-space-025));\n border-radius: var(--dimension-radius-100);\n background: var(--color-chrome-background-secondary);\n color: var(--color-foreground-secondary);\n font-family: var(--typography-font-family-ui);\n font-size: var(--typography-fontsize-md);\n line-height: var(--typography-lineheight-md);\n font-weight: var(--typography-weight-regular);\n letter-spacing: var(--typography-letterspacing-negative-half);\n box-sizing: border-box;\n overflow-wrap: anywhere;\n}\n\n:host(.message-bubble--user) .message-bubble {\n background: var(--color-chrome-background-primary);\n color: var(--color-foreground-primary);\n}\n\n@media (max-width: 767px) {\n .message-bubble {\n background: var(--color-background-secondary);\n }\n\n :host(.message-bubble--user) .message-bubble {\n background: var(--color-background-faint-neutral);\n }\n}\n",
146
146
  "type": "registry:ui"
147
147
  },
148
148
  {
@@ -37,10 +37,10 @@
37
37
  "states": [
38
38
  "The owner controls draft value and transport state; the composer emits intent without performing transport.",
39
39
  "Error status never clears or disables the draft; the application supplies recovery actions through error-actions and owns retry semantics. The negative support surface appears above and attached to the composer box, within the component's measured ownership.",
40
- "Use the tools slot for leading actions such as add and the actions slot for trailing actions such as dictation; the built-in submit or stop action remains last with an 8px gap from the preceding action. These icon buttons use the standard non-rounded control radius, and the application supplies tooltips for slotted icon actions.",
41
- "The composer surface uses the 10px --dimension-radius-125 token.",
40
+ "Use the tools slot for leading actions such as add and the actions slot for trailing actions such as dictation; the built-in submit or stop action remains last with an 8px gap from the preceding action. The built-in and application-provided composer buttons use the standard rounded control treatment, and the application supplies tooltips for slotted icon actions.",
41
+ "The composer surface uses the 4px --dimension-radius-050 token.",
42
42
  "Mouse or keyboard focus on the textarea gives the complete composer surface the same bold-brand inset stroke width and color as an active Input; the native textarea never draws a separate outline.",
43
- "The empty or otherwise inactive submit action is a disabled bordered ButtonUnfilled. Ready submit actions use submitIntent, while the streaming stop action remains a bold-brand ButtonFilled.",
43
+ "The empty or otherwise inactive submit action is a disabled bordered, rounded ButtonUnfilled. Ready submit actions use submitIntent and the rounded control treatment, while the streaming stop action remains a rounded bold-brand ButtonFilled.",
44
44
  "The attached error unit keeps a real boundary in forced colors and lets message text and application-owned recovery actions wrap at narrow widths."
45
45
  ],
46
46
  "responsiveBehavior": [
@@ -285,8 +285,8 @@
285
285
  },
286
286
  "peerDependencies": {
287
287
  "required": [
288
- "@ds-mo/tokens ^6.5.1",
289
- "@ds-mo/icons ^8.1.0"
288
+ "@ds-mo/tokens ^6.6.1",
289
+ "@ds-mo/icons ^8.1.1"
290
290
  ],
291
291
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
292
292
  }
@@ -307,12 +307,12 @@
307
307
  "files": [
308
308
  {
309
309
  "path": "src/wc/components/MessageComposer/MessageComposer.css",
310
- "content": "@import '../../utils/forced-colors.css';\n\n:host {\n display: block;\n width: 100%;\n box-sizing: border-box;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.message-composer {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n width: 100%;\n margin: 0;\n}\n\n.message-composer__attachments:empty,\n.message-composer__tools:empty,\n.message-composer__error-actions:empty {\n display: none;\n}\n\n.message-composer__error-support,\n.message-composer__error-message,\n.message-composer__error-actions {\n display: flex;\n align-items: center;\n}\n\n.message-composer__error-support {\n justify-content: space-between;\n flex-wrap: wrap;\n gap: var(--dimension-space-075) var(--dimension-space-100);\n min-width: 0;\n padding: var(--dimension-space-075) var(--dimension-space-100);\n background: var(--color-background-faint-negative);\n}\n\n.message-composer__error-message {\n flex: 1 1 var(--dimension-panel-width-xs);\n gap: var(--dimension-space-050);\n min-width: 0;\n color: var(--color-foreground-bold-negative);\n}\n\n.message-composer__error-actions {\n flex: 0 1 auto;\n flex-wrap: wrap;\n gap: var(--dimension-space-050);\n}\n\n.message-composer__stack {\n min-width: 0;\n}\n\n.message-composer--error .message-composer__stack {\n overflow: hidden;\n border: var(--dimension-stroke-width-012) solid var(--color-border-bold-negative);\n border-radius: var(--dimension-radius-125);\n background: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-md);\n}\n\n.message-composer__field {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n padding: var(--dimension-space-100);\n border-radius: var(--dimension-radius-125);\n background: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-md);\n overflow: hidden;\n}\n\n.message-composer:not(.message-composer--error) .message-composer__field:focus-within {\n box-shadow:\n var(--effect-elevation-elevated-md),\n inset 0 0 0 var(--dimension-stroke-width-018) var(--color-border-bold-brand);\n}\n\n.message-composer--error .message-composer__field {\n border-radius: 0;\n box-shadow: none;\n}\n\ntextarea {\n field-sizing: content;\n width: 100%;\n min-height: calc(var(--typography-lineheight-md) * 2 + var(--dimension-space-150));\n max-height: calc(var(--typography-lineheight-md) * 6 + var(--dimension-space-150));\n padding: var(--dimension-space-075);\n border: none;\n outline: none;\n resize: none;\n overflow-y: auto;\n box-sizing: border-box;\n background: transparent;\n color: var(--color-foreground-primary);\n font-family: var(--typography-font-family-ui);\n font-size: var(--typography-fontsize-md);\n line-height: var(--typography-lineheight-md);\n font-weight: var(--typography-weight-regular);\n letter-spacing: var(--typography-letterspacing-negative-half);\n -webkit-user-select: text;\n user-select: text;\n}\n\ntextarea::placeholder {\n color: var(--color-foreground-secondary);\n}\n\ntextarea:focus::placeholder {\n color: var(--color-foreground-quaternary);\n}\n\ntextarea:focus,\ntextarea:focus-visible {\n outline: none;\n}\n\n.message-composer__tools {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n min-height: var(--dimension-size-400);\n}\n\n.message-composer__controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--dimension-space-050);\n width: 100%;\n min-width: 0;\n}\n\n.message-composer__actions {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n flex: 0 0 auto;\n margin-inline-start: auto;\n}\n\n@media (forced-colors: active) {\n .message-composer__field {\n border: var(--dimension-stroke-width-012) solid var(--ds-forced-color-control-boundary);\n box-shadow: none;\n }\n\n .message-composer--error .message-composer__field {\n border: 0;\n }\n\n .message-composer--error .message-composer__stack {\n border: var(--dimension-stroke-width-025) dashed var(--ds-forced-color-content);\n box-shadow: none;\n }\n\n .message-composer__error-support {\n border-block-end: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n background: var(--ds-forced-color-surface);\n }\n}\n",
310
+ "content": "@import '../../utils/forced-colors.css';\n\n:host {\n display: block;\n width: 100%;\n box-sizing: border-box;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.message-composer {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n width: 100%;\n margin: 0;\n}\n\n.message-composer__attachments:empty,\n.message-composer__tools:empty,\n.message-composer__error-actions:empty {\n display: none;\n}\n\n.message-composer__error-support,\n.message-composer__error-message,\n.message-composer__error-actions {\n display: flex;\n align-items: center;\n}\n\n.message-composer__error-support {\n justify-content: space-between;\n flex-wrap: wrap;\n gap: var(--dimension-space-075) var(--dimension-space-100);\n min-width: 0;\n padding: var(--dimension-space-075) var(--dimension-space-100);\n background: var(--color-background-faint-negative);\n}\n\n.message-composer__error-message {\n flex: 1 1 var(--dimension-panel-width-xs);\n gap: var(--dimension-space-050);\n min-width: 0;\n color: var(--color-foreground-bold-negative);\n}\n\n.message-composer__error-actions {\n flex: 0 1 auto;\n flex-wrap: wrap;\n gap: var(--dimension-space-050);\n}\n\n.message-composer__stack {\n min-width: 0;\n}\n\n.message-composer--error .message-composer__stack {\n overflow: hidden;\n border: var(--dimension-stroke-width-012) solid var(--color-border-bold-negative);\n border-radius: var(--dimension-radius-050);\n background: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-md);\n}\n\n.message-composer__field {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n padding: var(--dimension-space-100);\n border-radius: var(--dimension-radius-050);\n background: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-md);\n overflow: hidden;\n}\n\n.message-composer:not(.message-composer--error) .message-composer__field:focus-within {\n box-shadow:\n var(--effect-elevation-elevated-md),\n inset 0 0 0 var(--dimension-stroke-width-018) var(--color-border-bold-brand);\n}\n\n.message-composer--error .message-composer__field {\n border-radius: 0;\n box-shadow: none;\n}\n\ntextarea {\n field-sizing: content;\n width: 100%;\n min-height: calc(var(--typography-lineheight-md) * 2 + var(--dimension-space-150));\n max-height: calc(var(--typography-lineheight-md) * 6 + var(--dimension-space-150));\n padding: var(--dimension-space-075);\n border: none;\n outline: none;\n resize: none;\n overflow-y: auto;\n box-sizing: border-box;\n background: transparent;\n color: var(--color-foreground-primary);\n font-family: var(--typography-font-family-ui);\n font-size: var(--typography-fontsize-md);\n line-height: var(--typography-lineheight-md);\n font-weight: var(--typography-weight-regular);\n letter-spacing: var(--typography-letterspacing-negative-half);\n -webkit-user-select: text;\n user-select: text;\n}\n\ntextarea::placeholder {\n color: var(--color-foreground-secondary);\n}\n\ntextarea:focus::placeholder {\n color: var(--color-foreground-quaternary);\n}\n\ntextarea:focus,\ntextarea:focus-visible {\n outline: none;\n}\n\n.message-composer__tools {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n min-height: var(--dimension-size-400);\n}\n\n.message-composer__controls {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--dimension-space-050);\n width: 100%;\n min-width: 0;\n}\n\n.message-composer__actions {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-100);\n flex: 0 0 auto;\n margin-inline-start: auto;\n}\n\n@media (forced-colors: active) {\n .message-composer__field {\n border: var(--dimension-stroke-width-012) solid var(--ds-forced-color-control-boundary);\n box-shadow: none;\n }\n\n .message-composer--error .message-composer__field {\n border: 0;\n }\n\n .message-composer--error .message-composer__stack {\n border: var(--dimension-stroke-width-025) dashed var(--ds-forced-color-content);\n box-shadow: none;\n }\n\n .message-composer__error-support {\n border-block-end: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n background: var(--ds-forced-color-surface);\n }\n}\n",
311
311
  "type": "registry:ui"
312
312
  },
313
313
  {
314
314
  "path": "src/wc/components/MessageComposer/MessageComposer.tsx",
315
- "content": "import { Component, Element, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';\nimport type { ButtonFilledIntent } from '../ButtonFilled/ButtonFilled';\nimport type { MessageComposerStatus } from '../conversation-types';\n\nlet composerId = 0;\n\n@Component({\n tag: 'ds-message-composer',\n styleUrl: 'MessageComposer.css',\n scoped: true,\n})\nexport class MessageComposer {\n @Element() el!: HTMLElement;\n\n @Prop({ mutable: true }) value: string = '';\n @Prop() placeholder: string = 'Write a message';\n @Prop() label: string = 'Message';\n @Prop() status: MessageComposerStatus = 'ready';\n /** Submission failure shown while status is error. */\n @Prop() errorMessage?: string;\n @Prop() isInactive: boolean = false;\n @Prop() submitIntent: ButtonFilledIntent = 'brand';\n\n @Event() dsInput!: EventEmitter<string>;\n @Event() dsSubmit!: EventEmitter<{ text: string }>;\n @Event() dsStop!: EventEmitter<void>;\n\n private textarea?: HTMLTextAreaElement;\n private readonly errorId = `ds-message-composer-error-${++composerId}`;\n\n @Method()\n async setFocus() {\n this.textarea?.focus();\n }\n\n private get streaming(): boolean {\n return this.status === 'submitted' || this.status === 'streaming';\n }\n\n private handleInput = (event: Event) => {\n this.value = (event.target as HTMLTextAreaElement).value;\n this.dsInput.emit(this.value);\n };\n\n private submit() {\n const text = this.value.trim();\n if (!text || this.isInactive || this.streaming) return;\n this.dsSubmit.emit({ text });\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Enter' || event.shiftKey || event.isComposing) return;\n event.preventDefault();\n this.submit();\n };\n\n private handleAction = () => {\n if (this.streaming) this.dsStop.emit();\n else this.submit();\n };\n\n render() {\n const error = this.status === 'error';\n const visibleErrorMessage = this.errorMessage || 'Message could not be sent.';\n const actionInactive = !this.streaming && (this.isInactive || !this.value.trim());\n return (\n <Host>\n <form\n class={{ 'message-composer': true, 'message-composer--error': error }}\n aria-busy={this.streaming ? 'true' : undefined}\n onSubmit={(event: Event) => {\n event.preventDefault();\n this.submit();\n }}\n >\n <div class=\"message-composer__attachments\">\n <slot name=\"attachments\" />\n </div>\n <div class=\"message-composer__stack\">\n {error ? (\n <div class=\"message-composer__error-support\">\n <div id={this.errorId} class=\"message-composer__error-message\" role=\"alert\">\n <ds-icon name=\"ExclamationTriangle\" size=\"xs\" color=\"inherit\" />\n <ds-text variant=\"text-body-small\" color=\"negative\">\n {visibleErrorMessage}\n </ds-text>\n </div>\n <div class=\"message-composer__error-actions\">\n <slot name=\"error-actions\" />\n </div>\n </div>\n ) : null}\n <div class=\"message-composer__field\">\n <textarea\n ref={element => {\n this.textarea = element;\n }}\n value={this.value}\n placeholder={this.placeholder}\n aria-label={this.label}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={error ? this.errorId : undefined}\n disabled={this.isInactive}\n onInput={this.handleInput}\n onKeyDown={this.handleKeyDown}\n />\n <div class=\"message-composer__controls\">\n <div class=\"message-composer__tools\">\n <slot name=\"tools\" />\n </div>\n <div class=\"message-composer__actions\">\n <slot name=\"actions\" />\n {actionInactive ? (\n <ds-tooltip label=\"Send message\" side=\"top\" size=\"sm\">\n <ds-button-unfilled\n class=\"message-composer__action\"\n variant=\"icon\"\n icon=\"ArrowUp\"\n size=\"md\"\n aria-label=\"Send message\"\n hasBorder\n isInactive\n onDsClick={this.handleAction}\n />\n </ds-tooltip>\n ) : (\n <ds-tooltip\n label={this.streaming ? 'Stop response' : 'Send message'}\n side=\"top\"\n size=\"sm\"\n >\n <ds-button-filled\n class=\"message-composer__action\"\n variant=\"icon\"\n icon={this.streaming ? 'SquareFilled' : 'ArrowUp'}\n intent={this.streaming ? 'brand' : this.submitIntent}\n contrast=\"bold\"\n size=\"md\"\n aria-label={this.streaming ? 'Stop response' : 'Send message'}\n onDsClick={this.handleAction}\n />\n </ds-tooltip>\n )}\n </div>\n </div>\n </div>\n </div>\n </form>\n </Host>\n );\n }\n}\n",
315
+ "content": "import { Component, Element, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';\nimport type { ButtonFilledIntent } from '../ButtonFilled/ButtonFilled';\nimport type { MessageComposerStatus } from '../conversation-types';\n\nlet composerId = 0;\n\n@Component({\n tag: 'ds-message-composer',\n styleUrl: 'MessageComposer.css',\n scoped: true,\n})\nexport class MessageComposer {\n @Element() el!: HTMLElement;\n\n @Prop({ mutable: true }) value: string = '';\n @Prop() placeholder: string = 'Write a message';\n @Prop() label: string = 'Message';\n @Prop() status: MessageComposerStatus = 'ready';\n /** Submission failure shown while status is error. */\n @Prop() errorMessage?: string;\n @Prop() isInactive: boolean = false;\n @Prop() submitIntent: ButtonFilledIntent = 'brand';\n\n @Event() dsInput!: EventEmitter<string>;\n @Event() dsSubmit!: EventEmitter<{ text: string }>;\n @Event() dsStop!: EventEmitter<void>;\n\n private textarea?: HTMLTextAreaElement;\n private readonly errorId = `ds-message-composer-error-${++composerId}`;\n\n @Method()\n async setFocus() {\n this.textarea?.focus();\n }\n\n private get streaming(): boolean {\n return this.status === 'submitted' || this.status === 'streaming';\n }\n\n private handleInput = (event: Event) => {\n this.value = (event.target as HTMLTextAreaElement).value;\n this.dsInput.emit(this.value);\n };\n\n private submit() {\n const text = this.value.trim();\n if (!text || this.isInactive || this.streaming) return;\n this.dsSubmit.emit({ text });\n }\n\n private handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Enter' || event.shiftKey || event.isComposing) return;\n event.preventDefault();\n this.submit();\n };\n\n private handleAction = () => {\n if (this.streaming) this.dsStop.emit();\n else this.submit();\n };\n\n render() {\n const error = this.status === 'error';\n const visibleErrorMessage = this.errorMessage || 'Message could not be sent.';\n const actionInactive = !this.streaming && (this.isInactive || !this.value.trim());\n return (\n <Host>\n <form\n class={{ 'message-composer': true, 'message-composer--error': error }}\n aria-busy={this.streaming ? 'true' : undefined}\n onSubmit={(event: Event) => {\n event.preventDefault();\n this.submit();\n }}\n >\n <div class=\"message-composer__attachments\">\n <slot name=\"attachments\" />\n </div>\n <div class=\"message-composer__stack\">\n {error ? (\n <div class=\"message-composer__error-support\">\n <div id={this.errorId} class=\"message-composer__error-message\" role=\"alert\">\n <ds-icon name=\"ExclamationTriangle\" size=\"xs\" color=\"inherit\" />\n <ds-text variant=\"text-body-small\" color=\"negative\">\n {visibleErrorMessage}\n </ds-text>\n </div>\n <div class=\"message-composer__error-actions\">\n <slot name=\"error-actions\" />\n </div>\n </div>\n ) : null}\n <div class=\"message-composer__field\">\n <textarea\n ref={element => {\n this.textarea = element;\n }}\n value={this.value}\n placeholder={this.placeholder}\n aria-label={this.label}\n aria-invalid={error ? 'true' : undefined}\n aria-describedby={error ? this.errorId : undefined}\n disabled={this.isInactive}\n onInput={this.handleInput}\n onKeyDown={this.handleKeyDown}\n />\n <div class=\"message-composer__controls\">\n <div class=\"message-composer__tools\">\n <slot name=\"tools\" />\n </div>\n <div class=\"message-composer__actions\">\n <slot name=\"actions\" />\n {actionInactive ? (\n <ds-tooltip label=\"Send message\" side=\"top\" size=\"sm\">\n <ds-button-unfilled\n class=\"message-composer__action\"\n variant=\"icon\"\n icon=\"ArrowUp\"\n size=\"md\"\n rounded\n aria-label=\"Send message\"\n hasBorder\n isInactive\n onDsClick={this.handleAction}\n />\n </ds-tooltip>\n ) : (\n <ds-tooltip\n label={this.streaming ? 'Stop response' : 'Send message'}\n side=\"top\"\n size=\"sm\"\n >\n <ds-button-filled\n class=\"message-composer__action\"\n variant=\"icon\"\n icon={this.streaming ? 'SquareFilled' : 'ArrowUp'}\n intent={this.streaming ? 'brand' : this.submitIntent}\n contrast=\"bold\"\n size=\"md\"\n rounded\n aria-label={this.streaming ? 'Stop response' : 'Send message'}\n onDsClick={this.handleAction}\n />\n </ds-tooltip>\n )}\n </div>\n </div>\n </div>\n </div>\n </form>\n </Host>\n );\n }\n}\n",
316
316
  "type": "registry:ui"
317
317
  }
318
318
  ]
@@ -212,8 +212,8 @@
212
212
  },
213
213
  "peerDependencies": {
214
214
  "required": [
215
- "@ds-mo/tokens ^6.5.1",
216
- "@ds-mo/icons ^8.1.0"
215
+ "@ds-mo/tokens ^6.6.1",
216
+ "@ds-mo/icons ^8.1.1"
217
217
  ],
218
218
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
219
219
  }
@@ -259,8 +259,8 @@
259
259
  },
260
260
  "peerDependencies": {
261
261
  "required": [
262
- "@ds-mo/tokens ^6.5.1",
263
- "@ds-mo/icons ^8.1.0"
262
+ "@ds-mo/tokens ^6.6.1",
263
+ "@ds-mo/icons ^8.1.1"
264
264
  ],
265
265
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
266
266
  }
@@ -276,7 +276,7 @@
276
276
  "files": [
277
277
  {
278
278
  "path": "src/wc/components/Message/Message.css",
279
- "content": ":host {\n display: block;\n box-sizing: border-box;\n content-visibility: auto;\n contain-intrinsic-size: auto var(--dimension-size-800);\n -webkit-user-select: none;\n user-select: none;\n}\n\n:host(.message-host--group-middle),\n:host(.message-host--group-last) {\n margin-block-start: calc(var(--dimension-space-050) - var(--dimension-space-300));\n}\n\n.message {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: end;\n gap: 0;\n width: 100%;\n box-sizing: border-box;\n}\n\n.message--outgoing {\n grid-template-columns: minmax(0, 1fr) auto;\n}\n\n.message__header:empty,\n.message__footer:empty,\n.message__metadata-actions:empty,\n.message__actions:empty {\n display: none;\n}\n\n.message__actions:not(:empty) {\n margin-inline-start: var(--dimension-space-075);\n}\n\n.message__body {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: var(--dimension-space-050);\n}\n\n.message--incoming .message__body {\n width: 100%;\n}\n\n.message--outgoing .message__body {\n align-items: flex-end;\n}\n\n.message--outgoing .message__header {\n display: none;\n}\n\n.message--system .message__body {\n align-items: center;\n}\n\n.message__header,\n.message__footer,\n.message__metadata-actions,\n.message__actions {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .message--metadata-hover .message__footer {\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--effect-motion-short-2);\n }\n\n .message--metadata-hover:hover .message__footer,\n .message--metadata-hover:focus-within .message__footer {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .message--metadata-hover .message__footer {\n transition: none;\n }\n}\n\n.message__content {\n width: 100%;\n min-width: 0;\n -webkit-user-select: text;\n user-select: text;\n}\n\n.message--outgoing .message__content {\n display: flex;\n justify-content: flex-end;\n}\n\n.message__footer time {\n display: inline-flex;\n}\n\n.message--group-middle .message__header,\n.message--group-last .message__header {\n display: none;\n}\n\n.message--group-first .message__footer,\n.message--group-middle .message__footer {\n display: none;\n}\n",
279
+ "content": ":host {\n display: block;\n box-sizing: border-box;\n content-visibility: auto;\n contain-intrinsic-size: auto var(--dimension-size-800);\n -webkit-user-select: none;\n user-select: none;\n}\n\n:host(.message-host--group-middle),\n:host(.message-host--group-last) {\n margin-block-start: calc(var(--dimension-space-050) - var(--dimension-space-300));\n}\n\n.message {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: end;\n gap: 0;\n width: 100%;\n box-sizing: border-box;\n}\n\n.message--outgoing {\n grid-template-columns: minmax(0, 1fr) auto;\n}\n\n.message__header:empty,\n.message__footer:empty,\n.message__metadata-actions:empty,\n.message__actions:empty {\n display: none;\n}\n\n.message__actions:not(:empty) {\n margin-inline-start: var(--dimension-space-075);\n}\n\n.message__body {\n display: flex;\n flex-direction: column;\n min-width: 0;\n gap: var(--dimension-space-050);\n}\n\n.message--incoming .message__body {\n width: 100%;\n}\n\n.message__body:has(.message__content > ds-message-bubble) .message__header {\n padding-inline-start: calc(var(--dimension-space-100) + var(--dimension-space-025));\n}\n\n.message--outgoing .message__body {\n align-items: flex-end;\n}\n\n.message--outgoing .message__header {\n display: none;\n}\n\n.message--system .message__body {\n align-items: center;\n}\n\n.message__header,\n.message__footer,\n.message__metadata-actions,\n.message__actions {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .message--metadata-hover .message__footer {\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--effect-motion-short-2);\n }\n\n .message--metadata-hover:hover .message__footer,\n .message--metadata-hover:focus-within .message__footer {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .message--metadata-hover .message__footer {\n transition: none;\n }\n}\n\n.message__content {\n width: 100%;\n min-width: 0;\n -webkit-user-select: text;\n user-select: text;\n}\n\n.message--outgoing .message__content {\n display: flex;\n justify-content: flex-end;\n}\n\n.message__footer time {\n display: inline-flex;\n}\n\n.message--group-middle .message__header,\n.message--group-last .message__header {\n display: none;\n}\n\n.message--group-first .message__footer,\n.message--group-middle .message__footer {\n display: none;\n}\n",
280
280
  "type": "registry:ui"
281
281
  },
282
282
  {
@@ -429,8 +429,8 @@
429
429
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: currentArea.",
430
430
  "peerDependencies": {
431
431
  "required": [
432
- "@ds-mo/tokens ^6.5.1",
433
- "@ds-mo/icons ^8.1.0"
432
+ "@ds-mo/tokens ^6.6.1",
433
+ "@ds-mo/icons ^8.1.1"
434
434
  ],
435
435
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
436
436
  }
@@ -368,8 +368,8 @@
368
368
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: sections, subsections.",
369
369
  "peerDependencies": {
370
370
  "required": [
371
- "@ds-mo/tokens ^6.5.1",
372
- "@ds-mo/icons ^8.1.0"
371
+ "@ds-mo/tokens ^6.6.1",
372
+ "@ds-mo/icons ^8.1.1"
373
373
  ],
374
374
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
375
375
  }
@@ -228,8 +228,8 @@
228
228
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: sections.",
229
229
  "peerDependencies": {
230
230
  "required": [
231
- "@ds-mo/tokens ^6.5.1",
232
- "@ds-mo/icons ^8.1.0"
231
+ "@ds-mo/tokens ^6.6.1",
232
+ "@ds-mo/icons ^8.1.1"
233
233
  ],
234
234
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
235
235
  }
@@ -390,8 +390,8 @@
390
390
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: dashboardGroups, settingsGroups.",
391
391
  "peerDependencies": {
392
392
  "required": [
393
- "@ds-mo/tokens ^6.5.1",
394
- "@ds-mo/icons ^8.1.0"
393
+ "@ds-mo/tokens ^6.6.1",
394
+ "@ds-mo/icons ^8.1.1"
395
395
  ],
396
396
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
397
397
  }
@@ -298,8 +298,8 @@
298
298
  },
299
299
  "peerDependencies": {
300
300
  "required": [
301
- "@ds-mo/tokens ^6.5.1",
302
- "@ds-mo/icons ^8.1.0"
301
+ "@ds-mo/tokens ^6.6.1",
302
+ "@ds-mo/icons ^8.1.1"
303
303
  ],
304
304
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
305
305
  }
@@ -410,8 +410,8 @@
410
410
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: pageSizeOptions.",
411
411
  "peerDependencies": {
412
412
  "required": [
413
- "@ds-mo/tokens ^6.5.1",
414
- "@ds-mo/icons ^8.1.0"
413
+ "@ds-mo/tokens ^6.6.1",
414
+ "@ds-mo/icons ^8.1.1"
415
415
  ],
416
416
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
417
417
  }