@ds-mo/ui 15.1.1 → 15.3.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 (414) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +4 -4
  3. package/dist/agent.json +711 -48
  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-input-time.d.ts +1 -1
  7. package/dist/angular/ds-input-time.js +3 -3
  8. package/dist/angular/ds-input.d.ts +5 -1
  9. package/dist/angular/ds-input.js +10 -4
  10. package/dist/angular/ds-map-cluster-marker.d.ts +18 -0
  11. package/dist/angular/ds-map-cluster-marker.js +43 -0
  12. package/dist/angular/ds-map-entity-marker.d.ts +18 -0
  13. package/dist/angular/ds-map-entity-marker.js +43 -0
  14. package/dist/angular/ds-radio-tile.d.ts +15 -0
  15. package/dist/angular/ds-radio-tile.js +43 -0
  16. package/dist/angular/ds-setting-row.d.ts +18 -0
  17. package/dist/angular/ds-setting-row.js +42 -0
  18. package/dist/angular/ds-slider.d.ts +1 -1
  19. package/dist/angular/ds-slider.js +3 -3
  20. package/dist/angular/ds-textarea.d.ts +1 -1
  21. package/dist/angular/ds-textarea.js +3 -3
  22. package/dist/angular/ds-time-picker.d.ts +1 -1
  23. package/dist/angular/ds-time-picker.js +3 -3
  24. package/dist/angular/index.d.ts +1 -1
  25. package/dist/angular/index.js +4 -0
  26. package/dist/angular/number-value-accessor.d.ts +9 -0
  27. package/dist/angular/number-value-accessor.js +39 -0
  28. package/dist/angular/proxies.d.ts +4 -0
  29. package/dist/angular/proxies.js +4 -0
  30. package/dist/angular/radio-value-accessor.d.ts +1 -1
  31. package/dist/angular/radio-value-accessor.js +2 -2
  32. package/dist/angular/select-value-accessor.d.ts +1 -1
  33. package/dist/angular/select-value-accessor.js +2 -2
  34. package/dist/angular/text-value-accessor.d.ts +1 -1
  35. package/dist/angular/text-value-accessor.js +2 -2
  36. package/dist/components/ds-agent-activity.js +1 -1
  37. package/dist/components/ds-agent-questionnaire.js +1 -1
  38. package/dist/components/ds-agent-response.js +1 -1
  39. package/dist/components/ds-agent-source-list.js +1 -1
  40. package/dist/components/ds-agent-tool-call.js +1 -1
  41. package/dist/components/ds-attachment-list.js +1 -1
  42. package/dist/components/ds-badge.js +1 -1
  43. package/dist/components/ds-banner.js +1 -1
  44. package/dist/components/ds-bar-action.js +1 -1
  45. package/dist/components/ds-bar-nav.js +1 -1
  46. package/dist/components/ds-bar-page-title.js +1 -1
  47. package/dist/components/ds-bar-title.js +1 -1
  48. package/dist/components/ds-bar-workflow.js +1 -1
  49. package/dist/components/ds-breadcrumb.js +1 -1
  50. package/dist/components/ds-button-filled.js +1 -1
  51. package/dist/components/ds-button-inverted.js +1 -1
  52. package/dist/components/ds-button-unfilled.js +1 -1
  53. package/dist/components/ds-calendar.js +1 -1
  54. package/dist/components/ds-card-action-center.js +1 -1
  55. package/dist/components/ds-card-chart.js +1 -1
  56. package/dist/components/ds-card-navigation.js +1 -1
  57. package/dist/components/ds-card-overview.js +1 -1
  58. package/dist/components/ds-card-setting.js +1 -1
  59. package/dist/components/ds-card-setting.js.map +1 -1
  60. package/dist/components/ds-card-settings-scope.js +1 -1
  61. package/dist/components/ds-chart-legend.js +1 -1
  62. package/dist/components/ds-chart.js +1 -1
  63. package/dist/components/ds-checkbox.js +1 -1
  64. package/dist/components/ds-chip.js +1 -1
  65. package/dist/components/ds-code-block.js +1 -1
  66. package/dist/components/ds-conversation-list-item.js +1 -1
  67. package/dist/components/ds-conversation-list-section.js +1 -1
  68. package/dist/components/ds-conversation-list.js +1 -1
  69. package/dist/components/ds-data-customize.js +1 -1
  70. package/dist/components/ds-data-customize.js.map +1 -1
  71. package/dist/components/ds-data-filter.js +1 -1
  72. package/dist/components/ds-data-filter.js.map +1 -1
  73. package/dist/components/ds-data-group.js +1 -1
  74. package/dist/components/ds-data-preferences.js +1 -1
  75. package/dist/components/ds-data-preferences.js.map +1 -1
  76. package/dist/components/ds-data-saved-views.js +1 -1
  77. package/dist/components/ds-data-saved-views.js.map +1 -1
  78. package/dist/components/ds-data-search.js +1 -1
  79. package/dist/components/ds-data-search.js.map +1 -1
  80. package/dist/components/ds-data-sort.js +1 -1
  81. package/dist/components/ds-data-toolbar.js +1 -1
  82. package/dist/components/ds-empty-state.js +1 -1
  83. package/dist/components/ds-field.js +1 -1
  84. package/dist/components/ds-filter-menu.js +1 -1
  85. package/dist/components/ds-input-date.js +1 -1
  86. package/dist/components/ds-input-date.js.map +1 -1
  87. package/dist/components/ds-input-time.js +1 -1
  88. package/dist/components/ds-input-time.js.map +1 -1
  89. package/dist/components/ds-input.js +1 -1
  90. package/dist/components/ds-map-cluster-marker.d.ts +11 -0
  91. package/dist/components/ds-map-cluster-marker.js +2 -0
  92. package/dist/components/ds-map-cluster-marker.js.map +1 -0
  93. package/dist/components/ds-map-entity-marker.d.ts +11 -0
  94. package/dist/components/ds-map-entity-marker.js +2 -0
  95. package/dist/components/ds-map-entity-marker.js.map +1 -0
  96. package/dist/components/ds-markdown.js +1 -1
  97. package/dist/components/ds-menu.js +1 -1
  98. package/dist/components/ds-message-actions.js +1 -1
  99. package/dist/components/ds-message-bubble.js +1 -1
  100. package/dist/components/ds-message-bubble.js.map +1 -1
  101. package/dist/components/ds-message-composer.js +1 -1
  102. package/dist/components/ds-message-scroller.js +1 -1
  103. package/dist/components/ds-message.js +1 -1
  104. package/dist/components/ds-mobile-bar-nav.js +1 -1
  105. package/dist/components/ds-mobile-header.js +1 -1
  106. package/dist/components/ds-mobile-section-switcher.js +1 -1
  107. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  108. package/dist/components/ds-modal.js +1 -1
  109. package/dist/components/ds-pagination.js +1 -1
  110. package/dist/components/ds-panel-nav.js +1 -1
  111. package/dist/components/ds-panel-sub-nav.js +1 -1
  112. package/dist/components/ds-panel-tool-header.js +1 -1
  113. package/dist/components/ds-panel-tool-search.js +1 -1
  114. package/dist/components/ds-panel-tool-search.js.map +1 -1
  115. package/dist/components/ds-panel-tools.js +1 -1
  116. package/dist/components/ds-paper-texture.js +1 -1
  117. package/dist/components/ds-radio-tile.d.ts +11 -0
  118. package/dist/components/ds-radio-tile.js +2 -0
  119. package/dist/components/ds-radio-tile.js.map +1 -0
  120. package/dist/components/ds-radio.js +1 -1
  121. package/dist/components/ds-score.js +1 -1
  122. package/dist/components/ds-scroll-overlay.js +1 -1
  123. package/dist/components/ds-select.js +1 -1
  124. package/dist/components/ds-setting-row.d.ts +11 -0
  125. package/dist/components/ds-setting-row.js +2 -0
  126. package/dist/components/ds-setting-row.js.map +1 -0
  127. package/dist/components/ds-shell-app.js +1 -1
  128. package/dist/components/ds-shell-page.js +1 -1
  129. package/dist/components/ds-shell-tools.js +1 -1
  130. package/dist/components/ds-skeleton.js +1 -1
  131. package/dist/components/ds-slider.js +1 -1
  132. package/dist/components/ds-slider.js.map +1 -1
  133. package/dist/components/ds-swatch-picker.js +1 -1
  134. package/dist/components/ds-switch.js +1 -1
  135. package/dist/components/ds-tab-group.js +1 -1
  136. package/dist/components/ds-table.js +1 -1
  137. package/dist/components/ds-table.js.map +1 -1
  138. package/dist/components/ds-tag.js +1 -1
  139. package/dist/components/ds-text.js +1 -1
  140. package/dist/components/ds-textarea.js +1 -1
  141. package/dist/components/ds-textarea.js.map +1 -1
  142. package/dist/components/ds-time-picker.js +1 -1
  143. package/dist/components/ds-toast.js +1 -1
  144. package/dist/components/ds-tooltip-chart.js +1 -1
  145. package/dist/components/ds-tooltip.js +1 -1
  146. package/dist/components/ds-typing-indicator.js +1 -1
  147. package/dist/components/{p-etifxiDc.js → p-3bsypMrY.js} +2 -2
  148. package/dist/components/{p-Bm7rqs3C.js → p-AM_ht6Im.js} +2 -2
  149. package/dist/components/{p-Bm7rqs3C.js.map → p-AM_ht6Im.js.map} +1 -1
  150. package/dist/components/{p-Bn8I7iw6.js → p-AmT4GlhM.js} +2 -2
  151. package/dist/components/{p-FIBCluwV.js → p-B-HOVYoH.js} +2 -2
  152. package/dist/components/{p-CmexIVnE.js → p-B7QEpaMe.js} +2 -2
  153. package/dist/components/{p-CUcUHwI3.js → p-B7bXN-vf.js} +2 -2
  154. package/dist/components/p-BHI4LcGK.js +2 -0
  155. package/dist/components/p-BHI4LcGK.js.map +1 -0
  156. package/dist/components/{p-BhJXmuRA.js → p-BSuMDPaV.js} +2 -2
  157. package/dist/components/{p-0FYD2bev.js → p-BU1B6NW8.js} +2 -2
  158. package/dist/components/{p-Do2FJd1y.js → p-BVwg5XVz.js} +2 -2
  159. package/dist/components/{p-CYzFfFcH.js → p-BXSHN1OK.js} +2 -2
  160. package/dist/components/{p-ljbw3UMZ.js → p-BYJtvRQm.js} +2 -2
  161. package/dist/components/{p-CzIpquvw.js → p-Bh1Fx0aW.js} +2 -2
  162. package/dist/components/{p-CiJ1WR11.js → p-Bm3KWMe4.js} +2 -2
  163. package/dist/components/{p-DVINzOoK.js → p-Bo7GxFBh.js} +2 -2
  164. package/dist/components/{p-8yBdCXCn.js → p-BsM37Prt.js} +2 -2
  165. package/dist/components/p-Bu4OmhKK.js +2 -0
  166. package/dist/components/{p-CdGXzRP8.js.map → p-Bu4OmhKK.js.map} +1 -1
  167. package/dist/components/{p-DpoTwJAR.js → p-BugKaVWc.js} +2 -2
  168. package/dist/components/p-C-c8SJ00.js +2 -0
  169. package/dist/components/p-C-c8SJ00.js.map +1 -0
  170. package/dist/components/{p-Bpd6YCo4.js → p-C3-dcROG.js} +2 -2
  171. package/dist/components/p-C4VeD49U.js +2 -0
  172. package/dist/components/{p-BKZdqJQB.js.map → p-C4VeD49U.js.map} +1 -1
  173. package/dist/components/{p-CNxvnQ6A.js → p-CCpJT31M.js} +2 -2
  174. package/dist/components/p-CCpJT31M.js.map +1 -0
  175. package/dist/components/{p-Dzndkdx5.js → p-CI7c9kp-.js} +2 -2
  176. package/dist/components/{p-CdgOLWX9.js → p-CJD0kLeV.js} +2 -2
  177. package/dist/components/{p-BeNa6tw5.js → p-C_gJD8l3.js} +2 -2
  178. package/dist/components/{p-DwbcNDJF.js → p-Cihjy4WY.js} +2 -2
  179. package/dist/components/{p-BgQMEHRa.js → p-Co5MiPNa.js} +2 -2
  180. package/dist/components/{p-CD4DZPy_.js → p-CrL9wxZg.js} +2 -2
  181. package/dist/components/{p-CGidq1iC.js → p-CuwopElg.js} +2 -2
  182. package/dist/components/p-CwUXroLs.js +2 -0
  183. package/dist/components/{p-etg-Uk1u.js.map → p-CwUXroLs.js.map} +1 -1
  184. package/dist/components/{p-Cqc2U1ZQ.js → p-CzQ_JF6A.js} +2 -2
  185. package/dist/components/{p-BciTtTwx.js → p-CztB8Pbq.js} +2 -2
  186. package/dist/components/{p-BciTtTwx.js.map → p-CztB8Pbq.js.map} +1 -1
  187. package/dist/components/{p-ZhP2tVmM.js → p-D0KD-Nr_.js} +2 -2
  188. package/dist/components/{p-DOAybCp0.js → p-DCLRAH5i.js} +2 -2
  189. package/dist/components/{p-Dn9QHL4O.js → p-DFkw6wrS.js} +2 -2
  190. package/dist/components/{p-D1vQGJzc.js → p-DHapI2sf.js} +2 -2
  191. package/dist/components/p-DQPzqcYR.js +2 -0
  192. package/dist/components/p-DQPzqcYR.js.map +1 -0
  193. package/dist/components/{p-DHICPS4n.js → p-DWmYCOKz.js} +2 -2
  194. package/dist/components/p-DX2RyZba.js +2 -0
  195. package/dist/components/{p-C-3YqeTb.js.map → p-DX2RyZba.js.map} +1 -1
  196. package/dist/components/{p-vfCu7XSc.js → p-DZ58Sg5a.js} +2 -2
  197. package/dist/components/{p-D0y7Sja6.js → p-Dcn1eDVt.js} +2 -2
  198. package/dist/components/{p-E5W27Fu_.js → p-DcrdyDRw.js} +2 -2
  199. package/dist/components/p-DhKvqh5G.js +2 -0
  200. package/dist/components/p-DhKvqh5G.js.map +1 -0
  201. package/dist/components/p-Fkkd3gMB.js +2 -0
  202. package/dist/components/{p-DEW7r0U9.js.map → p-Fkkd3gMB.js.map} +1 -1
  203. package/dist/components/{p-xdmJCPCg.js → p-Gb-vTuXr.js} +2 -2
  204. package/dist/components/p-TVkFIMXz.js +2 -0
  205. package/dist/components/p-TVkFIMXz.js.map +1 -0
  206. package/dist/components/p-cuZva5tl.js +2 -0
  207. package/dist/components/{p-Dw9sE6Iw.js.map → p-cuZva5tl.js.map} +1 -1
  208. package/dist/components/p-fYZK3zqM.js +2 -0
  209. package/dist/components/{p-C6xVxqOn.js.map → p-fYZK3zqM.js.map} +1 -1
  210. package/dist/components/{p-CiH4GG6r.js → p-iGNHXFZA.js} +2 -2
  211. package/dist/components/{p-5URekSny.js → p-lADW-TI8.js} +2 -2
  212. package/dist/components/{p-D922f6Tb.js → p-p_MwknM3.js} +2 -2
  213. package/dist/components/{p-Dfs98tpL.js → p-tJaC01aE.js} +2 -2
  214. package/dist/components/{p-B_jdoM7e.js → p-z8L-YMi3.js} +2 -2
  215. package/dist/docs/components.json +1909 -44
  216. package/dist/framework/angular.d.ts +1 -0
  217. package/dist/framework/angular.js +1 -0
  218. package/dist/lint/index.js +1 -1
  219. package/dist/mcp-data/registry/agent-activity.json +2 -2
  220. package/dist/mcp-data/registry/agent-questionnaire.json +2 -2
  221. package/dist/mcp-data/registry/agent-response.json +2 -2
  222. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  223. package/dist/mcp-data/registry/agent-tool-call.json +2 -2
  224. package/dist/mcp-data/registry/attachment-list.json +2 -2
  225. package/dist/mcp-data/registry/avatar.json +2 -2
  226. package/dist/mcp-data/registry/badge.json +2 -2
  227. package/dist/mcp-data/registry/banner.json +2 -2
  228. package/dist/mcp-data/registry/bar-action.json +2 -2
  229. package/dist/mcp-data/registry/bar-nav.json +2 -2
  230. package/dist/mcp-data/registry/bar-page-title.json +2 -2
  231. package/dist/mcp-data/registry/bar-title.json +4 -4
  232. package/dist/mcp-data/registry/bar-workflow.json +2 -2
  233. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  234. package/dist/mcp-data/registry/button-filled.json +2 -2
  235. package/dist/mcp-data/registry/button-inverted.json +2 -2
  236. package/dist/mcp-data/registry/button-unfilled.json +2 -2
  237. package/dist/mcp-data/registry/calendar.json +2 -2
  238. package/dist/mcp-data/registry/card-action-center.json +2 -2
  239. package/dist/mcp-data/registry/card-chart.json +2 -2
  240. package/dist/mcp-data/registry/card-navigation.json +2 -2
  241. package/dist/mcp-data/registry/card-overview.json +2 -2
  242. package/dist/mcp-data/registry/card-setting.json +36 -15
  243. package/dist/mcp-data/registry/card-settings-scope.json +2 -2
  244. package/dist/mcp-data/registry/chart-legend.json +2 -2
  245. package/dist/mcp-data/registry/chart.json +2 -2
  246. package/dist/mcp-data/registry/checkbox.json +2 -2
  247. package/dist/mcp-data/registry/chip.json +2 -2
  248. package/dist/mcp-data/registry/code-block.json +2 -2
  249. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  250. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  251. package/dist/mcp-data/registry/conversation-list.json +2 -2
  252. package/dist/mcp-data/registry/data-customize.json +3 -3
  253. package/dist/mcp-data/registry/data-filter.json +2 -2
  254. package/dist/mcp-data/registry/data-group.json +2 -2
  255. package/dist/mcp-data/registry/data-preferences.json +2 -2
  256. package/dist/mcp-data/registry/data-saved-views.json +2 -2
  257. package/dist/mcp-data/registry/data-search.json +2 -2
  258. package/dist/mcp-data/registry/data-sort.json +2 -2
  259. package/dist/mcp-data/registry/data-toolbar.json +2 -2
  260. package/dist/mcp-data/registry/divider.json +2 -2
  261. package/dist/mcp-data/registry/empty-state.json +27 -14
  262. package/dist/mcp-data/registry/field.json +6 -5
  263. package/dist/mcp-data/registry/filter-menu.json +2 -2
  264. package/dist/mcp-data/registry/icon.json +2 -2
  265. package/dist/mcp-data/registry/input-date.json +2 -2
  266. package/dist/mcp-data/registry/input-time.json +26 -7
  267. package/dist/mcp-data/registry/input.json +265 -15
  268. package/dist/mcp-data/registry/loader.json +2 -2
  269. package/dist/mcp-data/registry/map-cluster-marker.json +263 -0
  270. package/dist/mcp-data/registry/map-entity-marker.json +321 -0
  271. package/dist/mcp-data/registry/markdown.json +2 -2
  272. package/dist/mcp-data/registry/menu.json +2 -2
  273. package/dist/mcp-data/registry/message-actions.json +2 -2
  274. package/dist/mcp-data/registry/message-bubble.json +2 -2
  275. package/dist/mcp-data/registry/message-composer.json +2 -2
  276. package/dist/mcp-data/registry/message-scroller.json +2 -2
  277. package/dist/mcp-data/registry/message.json +2 -2
  278. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  279. package/dist/mcp-data/registry/mobile-header.json +2 -2
  280. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  281. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  282. package/dist/mcp-data/registry/modal.json +2 -2
  283. package/dist/mcp-data/registry/pagination.json +2 -2
  284. package/dist/mcp-data/registry/panel-nav.json +2 -2
  285. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  286. package/dist/mcp-data/registry/panel-tool-header.json +2 -2
  287. package/dist/mcp-data/registry/panel-tool-search.json +2 -2
  288. package/dist/mcp-data/registry/panel-tools.json +2 -2
  289. package/dist/mcp-data/registry/paper-texture.json +2 -2
  290. package/dist/mcp-data/registry/radio-tile.json +398 -0
  291. package/dist/mcp-data/registry/radio.json +2 -2
  292. package/dist/mcp-data/registry/registry.json +724 -49
  293. package/dist/mcp-data/registry/score.json +2 -2
  294. package/dist/mcp-data/registry/scroll-overlay.json +2 -2
  295. package/dist/mcp-data/registry/select.json +2 -2
  296. package/dist/mcp-data/registry/setting-row.json +213 -0
  297. package/dist/mcp-data/registry/shell-app.json +3 -3
  298. package/dist/mcp-data/registry/shell-page.json +5 -5
  299. package/dist/mcp-data/registry/shell-tools.json +2 -2
  300. package/dist/mcp-data/registry/skeleton.json +2 -2
  301. package/dist/mcp-data/registry/slider.json +32 -12
  302. package/dist/mcp-data/registry/swatch-picker.json +2 -2
  303. package/dist/mcp-data/registry/switch.json +2 -2
  304. package/dist/mcp-data/registry/tab-group.json +2 -2
  305. package/dist/mcp-data/registry/table.json +5 -5
  306. package/dist/mcp-data/registry/tag.json +2 -2
  307. package/dist/mcp-data/registry/text.json +2 -2
  308. package/dist/mcp-data/registry/textarea.json +72 -5
  309. package/dist/mcp-data/registry/time-picker.json +28 -9
  310. package/dist/mcp-data/registry/toast.json +2 -2
  311. package/dist/mcp-data/registry/tooltip-chart.json +2 -2
  312. package/dist/mcp-data/registry/tooltip.json +2 -2
  313. package/dist/mcp-data/registry/typing-indicator.json +2 -2
  314. package/dist/react/components.d.ts +4 -0
  315. package/dist/react/components.js +4 -0
  316. package/dist/react/ds-input.d.ts +2 -0
  317. package/dist/react/ds-input.js +2 -0
  318. package/dist/react/ds-map-cluster-marker.d.ts +12 -0
  319. package/dist/react/ds-map-cluster-marker.js +12 -0
  320. package/dist/react/ds-map-entity-marker.d.ts +12 -0
  321. package/dist/react/ds-map-entity-marker.js +12 -0
  322. package/dist/react/ds-radio-tile.d.ts +12 -0
  323. package/dist/react/ds-radio-tile.js +12 -0
  324. package/dist/react/ds-setting-row.d.ts +12 -0
  325. package/dist/react/ds-setting-row.js +12 -0
  326. package/dist/types/components/CardSetting/CardSetting.d.ts +5 -3
  327. package/dist/types/components/CardSetting/index.d.ts +1 -1
  328. package/dist/types/components/EmptyState/EmptyState.d.ts +3 -0
  329. package/dist/types/components/Field/Field.d.ts +4 -0
  330. package/dist/types/components/Input/Input.d.ts +50 -1
  331. package/dist/types/components/InputTime/InputTime.d.ts +3 -0
  332. package/dist/types/components/MapClusterMarker/MapClusterMarker.d.ts +19 -0
  333. package/dist/types/components/MapEntityMarker/MapEntityMarker.d.ts +26 -0
  334. package/dist/types/components/RadioTile/RadioTile.d.ts +40 -0
  335. package/dist/types/components/RadioTile/index.d.ts +2 -0
  336. package/dist/types/components/SettingRow/SettingRow.d.ts +18 -0
  337. package/dist/types/components/Slider/Slider.d.ts +8 -1
  338. package/dist/types/components/Slider/index.d.ts +1 -1
  339. package/dist/types/components/Textarea/Textarea.d.ts +12 -0
  340. package/dist/types/components/TimePicker/TimePicker.d.ts +4 -0
  341. package/dist/types/components.d.ts +627 -11
  342. package/dist/types/utils/text-constraints.d.ts +20 -0
  343. package/dist/vue/components.d.ts +4 -0
  344. package/dist/vue/components.js +4 -0
  345. package/dist/vue/ds-card-setting.js +1 -0
  346. package/dist/vue/ds-input-time.js +1 -0
  347. package/dist/vue/ds-input.js +17 -0
  348. package/dist/vue/ds-map-cluster-marker.d.ts +3 -0
  349. package/dist/vue/ds-map-cluster-marker.js +14 -0
  350. package/dist/vue/ds-map-entity-marker.d.ts +3 -0
  351. package/dist/vue/ds-map-entity-marker.js +17 -0
  352. package/dist/vue/ds-radio-tile.d.ts +3 -0
  353. package/dist/vue/ds-radio-tile.js +24 -0
  354. package/dist/vue/ds-setting-row.d.ts +3 -0
  355. package/dist/vue/ds-setting-row.js +14 -0
  356. package/dist/vue/ds-slider.d.ts +1 -1
  357. package/dist/vue/ds-slider.js +2 -1
  358. package/dist/vue/ds-textarea.js +4 -0
  359. package/dist/vue/ds-time-picker.js +1 -0
  360. package/package.json +5 -5
  361. package/dist/components/p-0qY_HDId.js +0 -2
  362. package/dist/components/p-0qY_HDId.js.map +0 -1
  363. package/dist/components/p-BKZdqJQB.js +0 -2
  364. package/dist/components/p-C-3YqeTb.js +0 -2
  365. package/dist/components/p-C6xVxqOn.js +0 -2
  366. package/dist/components/p-CNxvnQ6A.js.map +0 -1
  367. package/dist/components/p-CdGXzRP8.js +0 -2
  368. package/dist/components/p-DEW7r0U9.js +0 -2
  369. package/dist/components/p-DVOjjuXc.js +0 -2
  370. package/dist/components/p-DVOjjuXc.js.map +0 -1
  371. package/dist/components/p-Di5FH7eh.js +0 -2
  372. package/dist/components/p-Di5FH7eh.js.map +0 -1
  373. package/dist/components/p-Dw9sE6Iw.js +0 -2
  374. package/dist/components/p-etg-Uk1u.js +0 -2
  375. package/dist/components/p-xtGGIZmU.js +0 -2
  376. package/dist/components/p-xtGGIZmU.js.map +0 -1
  377. /package/dist/components/{p-etifxiDc.js.map → p-3bsypMrY.js.map} +0 -0
  378. /package/dist/components/{p-Bn8I7iw6.js.map → p-AmT4GlhM.js.map} +0 -0
  379. /package/dist/components/{p-FIBCluwV.js.map → p-B-HOVYoH.js.map} +0 -0
  380. /package/dist/components/{p-CmexIVnE.js.map → p-B7QEpaMe.js.map} +0 -0
  381. /package/dist/components/{p-CUcUHwI3.js.map → p-B7bXN-vf.js.map} +0 -0
  382. /package/dist/components/{p-BhJXmuRA.js.map → p-BSuMDPaV.js.map} +0 -0
  383. /package/dist/components/{p-0FYD2bev.js.map → p-BU1B6NW8.js.map} +0 -0
  384. /package/dist/components/{p-Do2FJd1y.js.map → p-BVwg5XVz.js.map} +0 -0
  385. /package/dist/components/{p-CYzFfFcH.js.map → p-BXSHN1OK.js.map} +0 -0
  386. /package/dist/components/{p-ljbw3UMZ.js.map → p-BYJtvRQm.js.map} +0 -0
  387. /package/dist/components/{p-CzIpquvw.js.map → p-Bh1Fx0aW.js.map} +0 -0
  388. /package/dist/components/{p-CiJ1WR11.js.map → p-Bm3KWMe4.js.map} +0 -0
  389. /package/dist/components/{p-DVINzOoK.js.map → p-Bo7GxFBh.js.map} +0 -0
  390. /package/dist/components/{p-8yBdCXCn.js.map → p-BsM37Prt.js.map} +0 -0
  391. /package/dist/components/{p-DpoTwJAR.js.map → p-BugKaVWc.js.map} +0 -0
  392. /package/dist/components/{p-Bpd6YCo4.js.map → p-C3-dcROG.js.map} +0 -0
  393. /package/dist/components/{p-Dzndkdx5.js.map → p-CI7c9kp-.js.map} +0 -0
  394. /package/dist/components/{p-CdgOLWX9.js.map → p-CJD0kLeV.js.map} +0 -0
  395. /package/dist/components/{p-BeNa6tw5.js.map → p-C_gJD8l3.js.map} +0 -0
  396. /package/dist/components/{p-DwbcNDJF.js.map → p-Cihjy4WY.js.map} +0 -0
  397. /package/dist/components/{p-BgQMEHRa.js.map → p-Co5MiPNa.js.map} +0 -0
  398. /package/dist/components/{p-CD4DZPy_.js.map → p-CrL9wxZg.js.map} +0 -0
  399. /package/dist/components/{p-CGidq1iC.js.map → p-CuwopElg.js.map} +0 -0
  400. /package/dist/components/{p-Cqc2U1ZQ.js.map → p-CzQ_JF6A.js.map} +0 -0
  401. /package/dist/components/{p-ZhP2tVmM.js.map → p-D0KD-Nr_.js.map} +0 -0
  402. /package/dist/components/{p-DOAybCp0.js.map → p-DCLRAH5i.js.map} +0 -0
  403. /package/dist/components/{p-Dn9QHL4O.js.map → p-DFkw6wrS.js.map} +0 -0
  404. /package/dist/components/{p-D1vQGJzc.js.map → p-DHapI2sf.js.map} +0 -0
  405. /package/dist/components/{p-DHICPS4n.js.map → p-DWmYCOKz.js.map} +0 -0
  406. /package/dist/components/{p-vfCu7XSc.js.map → p-DZ58Sg5a.js.map} +0 -0
  407. /package/dist/components/{p-D0y7Sja6.js.map → p-Dcn1eDVt.js.map} +0 -0
  408. /package/dist/components/{p-E5W27Fu_.js.map → p-DcrdyDRw.js.map} +0 -0
  409. /package/dist/components/{p-xdmJCPCg.js.map → p-Gb-vTuXr.js.map} +0 -0
  410. /package/dist/components/{p-CiH4GG6r.js.map → p-iGNHXFZA.js.map} +0 -0
  411. /package/dist/components/{p-5URekSny.js.map → p-lADW-TI8.js.map} +0 -0
  412. /package/dist/components/{p-D922f6Tb.js.map → p-p_MwknM3.js.map} +0 -0
  413. /package/dist/components/{p-Dfs98tpL.js.map → p-tJaC01aE.js.map} +0 -0
  414. /package/dist/components/{p-B_jdoM7e.js.map → p-z8L-YMi3.js.map} +0 -0
@@ -12,8 +12,8 @@
12
12
  "themeSetup": "Set data-theme=\"dark\" on <html> for dark mode. Light is default.",
13
13
  "peerDependencies": {
14
14
  "required": [
15
- "@ds-mo/tokens ^6.5.1",
16
- "@ds-mo/icons ^8.1.0"
15
+ "@ds-mo/tokens ^6.5.2",
16
+ "@ds-mo/icons ^8.1.1"
17
17
  ],
18
18
  "optional": [],
19
19
  "frameworks": "None required for Custom Elements; generated React, Vue, and Angular adapters are included."
@@ -1700,7 +1700,7 @@
1700
1700
  "Dividers in sections or actions create separate Menu groups without becoming selectable rows.",
1701
1701
  "The overflow trigger uses its bordered treatment whenever any visible action sits beside it; overflow-only presentations keep the trigger borderless.",
1702
1702
  "Ordered actions preserve authored order, but only the first eligible filled button, unfilled button, icon button, labeled menu button, or split button renders beside the title. Remaining commands use the shared overflow, whose rows are text-only. Menu choices and overflowed split commands become separate rows and share the same flat action event.",
1703
- "expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after 32px top padding; the following title and right-side actions share one top alignment. Compact renders 48px chrome with the existing icon Back action; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
1703
+ "expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after 16px top padding; the following title and right-side actions share one top alignment. Compact renders 48px chrome with the existing icon Back action; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
1704
1704
  "The one visible ordered action collapses by default in constrained presentation. Use never for an exceptional action whose hierarchy must remain visible; explicit overflow actions never leave the shared menu.",
1705
1705
  "showDivider=false removes the bottom divider when the surrounding page composition supplies the boundary; showCompactDivider can independently restore or remove that boundary in compact and constrained variants.",
1706
1706
  "placement=shell-bar remains compact slotted chrome for advanced ShellApp composition. Managed panel-mode ShellApp uses BarPageTitle instead. It omits description and breadcrumb presentation and preserves applicable Back, section, primary, and overflow controls.",
@@ -3923,7 +3923,7 @@
3923
3923
  {
3924
3924
  "name": "card-setting",
3925
3925
  "title": "CardSetting",
3926
- "description": "Persistent settings-section surface with a heading, controlled view/edit chrome, fixed edit-save-cancel actions, and application-owned body content.",
3926
+ "description": "Persistent settings-section surface with a heading, optional controlled edit chrome, and application-owned body content.",
3927
3927
  "type": "registry:ui",
3928
3928
  "meta": {
3929
3929
  "library": "@ds-mo/ui",
@@ -3934,17 +3934,17 @@
3934
3934
  "intent": {
3935
3935
  "audience": "general",
3936
3936
  "status": "stable",
3937
- "summary": "Persistent settings-section surface with a heading, controlled view/edit chrome, fixed edit-save-cancel actions, and application-owned body content.",
3937
+ "summary": "Persistent settings-section surface with a heading, optional controlled edit chrome, and application-owned body content.",
3938
3938
  "useWhen": [
3939
3939
  "A settings page needs a persistent section that switches between read-only and editable content.",
3940
3940
  "The parent can control one active editing section and owns validation, persistence, cancellation, and body content.",
3941
- "The section uses the standard Pencil, Save, and Cancel header workflow."
3941
+ "The section uses the standard Pencil, Save, and Cancel header workflow.",
3942
+ "Settings apply immediately through their own controls and share the standard section surface without edit, save, or cancel actions."
3942
3943
  ],
3943
3944
  "avoidWhen": [
3944
3945
  "The surface contains a chart, legend, metric visualization, or other data-visualization composition.",
3945
3946
  "The content is a general-purpose read-only card with no settings edit workflow.",
3946
3947
  "The task must block the rest of the interface or requires confirmation in a modal.",
3947
- "Several sections must remain editable at the same time.",
3948
3948
  "The header requires custom actions beyond the fixed edit-save-cancel workflow."
3949
3949
  ],
3950
3950
  "alternatives": [
@@ -3969,7 +3969,8 @@
3969
3969
  "component:ds-input",
3970
3970
  "component:ds-select",
3971
3971
  "component:ds-switch",
3972
- "component:ds-text"
3972
+ "component:ds-text",
3973
+ "component:ds-setting-row"
3973
3974
  ],
3974
3975
  "accessibility": [
3975
3976
  "Provide a concise heading that identifies the settings section; CardSetting renders it as an h2.",
@@ -3986,10 +3987,11 @@
3986
3987
  "When another section requests edit, the parent keeps one active section and resolves any dirty current section before switching.",
3987
3988
  "The parent owns read-only versus editable body composition, dirty state, validation, persistence, loading, success, and error consequences.",
3988
3989
  "A save request keeps the section editing while validation or persistence is pending; the parent exits only after success.",
3989
- "A cancel request does not persist changes; the parent restores its chosen value snapshot and exits editing."
3990
+ "A cancel request does not persist changes; the parent restores its chosen value snapshot and exits editing.",
3991
+ "The immediate variant keeps the resting card surface and omits header actions even if editing is supplied. The application applies and persists each control change independently."
3990
3992
  ],
3991
3993
  "responsiveBehavior": [
3992
- "Choose sm, md, or lg from the parent layout; each width uses its matching token-based minimum height.",
3994
+ "Choose sm, md, or lg from the parent layout. Editable cards use the matching minimum height; immediate cards fit their content.",
3993
3995
  "The surface never exceeds its parent width, while the parent owns wrapping, columns, stacking, and breakpoint changes.",
3994
3996
  "At narrow widths, keep the fixed header actions visible and let application-owned body layouts collapse before allowing horizontal overflow."
3995
3997
  ],
@@ -4042,9 +4044,10 @@
4042
4044
  "width",
4043
4045
  "min-height"
4044
4046
  ],
4045
- "reason": "Card width selects the component geometry; use cardWidth and let the parent constrain available space.",
4047
+ "reason": "Card width selects the component geometry; immediate cards fit their content. Let the parent constrain available space.",
4046
4048
  "props": [
4047
- "cardWidth"
4049
+ "cardWidth",
4050
+ "variant"
4048
4051
  ]
4049
4052
  }
4050
4053
  ],
@@ -4075,6 +4078,10 @@
4075
4078
  "saveLabel": {
4076
4079
  "type": "string",
4077
4080
  "required": false
4081
+ },
4082
+ "variant": {
4083
+ "type": "CardSettingVariant",
4084
+ "required": false
4078
4085
  }
4079
4086
  },
4080
4087
  "events": [
@@ -6856,7 +6863,7 @@
6856
6863
  {
6857
6864
  "name": "empty-state",
6858
6865
  "title": "EmptyState",
6859
- "description": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
6866
+ "description": "Centered empty-content message with optional consumer-owned recovery actions.",
6860
6867
  "type": "registry:ui",
6861
6868
  "meta": {
6862
6869
  "library": "@ds-mo/ui",
@@ -6867,16 +6874,16 @@
6867
6874
  "intent": {
6868
6875
  "audience": "general",
6869
6876
  "status": "stable",
6870
- "summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
6877
+ "summary": "Centered empty-content message with optional consumer-owned recovery actions.",
6871
6878
  "useWhen": [
6872
6879
  "A bounded content area is in a first-use, no-content, filtered no-results, or no-access state and needs a calm explanatory message tailored to that cause.",
6873
6880
  "A prominent empty region benefits from a decorative icon, visual title, and supporting body copy.",
6874
- "A compact owner such as a Select popup needs only centered body copy."
6881
+ "A compact owner such as a Select popup needs only centered body copy.",
6882
+ "An empty region needs a concise recovery action that helps the user reveal or create content."
6875
6883
  ],
6876
6884
  "avoidWhen": [
6877
6885
  "Content is still loading; use Skeleton for predictable structure or Loader for an indeterminate operation.",
6878
6886
  "The state is an error, warning, or confirmation that needs semantic intent and announcement from the owning workflow.",
6879
- "The state needs a recovery action, link, or other interactive content; the current EmptyState pattern is intentionally message-only.",
6880
6887
  "A decorative illustration, arbitrary rich content, or custom layout is required."
6881
6888
  ],
6882
6889
  "alternatives": [
@@ -6900,20 +6907,23 @@
6900
6907
  "component:ds-table",
6901
6908
  "component:ds-select",
6902
6909
  "component:ds-text",
6903
- "component:ds-icon"
6910
+ "component:ds-icon",
6911
+ "component:ds-button-unfilled"
6904
6912
  ],
6905
6913
  "accessibility": [
6906
6914
  "The optional icon is decorative; the title and body provide all meaning in text.",
6907
6915
  "EmptyState does not create a live region or alert automatically. The owner decides whether a dynamic transition requires announcement.",
6908
6916
  "The visual title does not impose a document heading level because the correct hierarchy belongs to the consuming page or region.",
6909
- "Keep localized body copy concise and sufficient when using the body-only variant."
6917
+ "Keep localized body copy concise and sufficient when using the body-only variant.",
6918
+ "Give recovery controls explicit accessible names and keep their behavior with the owning workflow."
6910
6919
  ],
6911
6920
  "states": [
6912
6921
  "Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
6913
6922
  "The decorative icon renders at xl in the primary foreground with an 8px gap before the text group and only when a title is also provided.",
6914
6923
  "The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
6915
- "All content is centered. The owner supplies container size and surrounding padding; repeated panel and master-detail owners should share one empty-region geometry instead of wrapping each EmptyState differently. Do not compose actions into or immediately alongside the current EmptyState pattern.",
6916
- "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
6924
+ "All content is centered. The owner supplies container size and surrounding padding; repeated panel and master-detail owners should share one empty-region geometry instead of wrapping each EmptyState differently.",
6925
+ "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants.",
6926
+ "Recovery actions are optional. The consumer owns the action labels, control choice, and behavior; the component centers them below the message and wraps multiple actions when needed."
6917
6927
  ],
6918
6928
  "responsiveBehavior": [
6919
6929
  "The owner controls available width and height; text wraps naturally while remaining centered.",
@@ -6961,7 +6971,9 @@
6961
6971
  }
6962
6972
  },
6963
6973
  "events": [],
6964
- "slots": [],
6974
+ "slots": [
6975
+ "actions"
6976
+ ],
6965
6977
  "exports": {
6966
6978
  "customElement": "ds-empty-state",
6967
6979
  "react": "DsEmptyState",
@@ -7034,7 +7046,8 @@
7034
7046
  "Field exposes data-focused, data-filled, data-dirty, data-touched, data-invalid, data-disabled, and data-required hooks while the slotted control remains the source of value and interaction behavior.",
7035
7047
  "A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
7036
7048
  "Field owns validation presentation but not validation timing; the form decides when to set error and errorMessage.",
7037
- "The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text."
7049
+ "The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text.",
7050
+ "Input and Textarea contribute constraint messages and character counts to the supporting row. Helper text yields to an error, with the count at the opposite edge; a count alone begins at the text origin."
7038
7051
  ],
7039
7052
  "responsiveBehavior": [
7040
7053
  "Field fills the width supplied by its parent and makes the slotted control fill that field width.",
@@ -7604,7 +7617,7 @@
7604
7617
  {
7605
7618
  "name": "input",
7606
7619
  "title": "Input",
7607
- "description": "Form-associated single-line text and number field for primary and secondary application backgrounds, with native input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
7620
+ "description": "Form-associated text and number input with constraints, optional free-text suggestions, token entry, and character counts.",
7608
7621
  "type": "registry:ui",
7609
7622
  "meta": {
7610
7623
  "library": "@ds-mo/ui",
@@ -7615,7 +7628,7 @@
7615
7628
  "intent": {
7616
7629
  "audience": "general",
7617
7630
  "status": "stable",
7618
- "summary": "Form-associated single-line text and number field for primary and secondary application backgrounds, with native input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
7631
+ "summary": "Form-associated text and number input with constraints, optional free-text suggestions, token entry, and character counts.",
7619
7632
  "useWhen": [
7620
7633
  "A user must enter or edit one line of text, an email address, telephone number, URL, search query, password, or exact number.",
7621
7634
  "The value must participate in native, Angular, React, or Vue form state.",
@@ -7666,7 +7679,7 @@
7666
7679
  "Error text is associated with the native input and announced as an alert when the invalid state is rendered.",
7667
7680
  "Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission.",
7668
7681
  "Password fields keep a named show-or-hide action beside the value. Revealing the value changes only the native input type; the submitted string does not change. The action restores focus to the field after activation.",
7669
- "Number stepper actions are pointer affordances hidden from the accessibility tree; the native spinbutton remains the single keyboard and assistive-technology control.",
7682
+ "Optional number stepper actions are named buttons available to keyboard and assistive-technology users. The native spinbutton also retains arrow-key stepping; activating either button returns focus to the field.",
7670
7683
  "Prefix and suffix content must not carry information that is otherwise absent from the field's visible label, value, or description.",
7671
7684
  "A nested prefix or suffix Select is a separate control from the editable value and must have its own accessible name."
7672
7685
  ],
@@ -7681,10 +7694,13 @@
7681
7694
  "Search fields used with owned result sets forward aria-controls and aria-activedescendant to the native field so keyboard focus can remain in the query while assistive technology tracks the active result.",
7682
7695
  "The prefix and suffix slots host compact leading or trailing units such as a currency code, or a nested same-size inset Select. Text adornments use the control's balanced text inset. Nested Selects match the field density, set isInset, hasBorder false, width hug, and indicator up-down, keep a selected value, set allowClear false so the menu has no clear footer, set neutralTrigger so the selected unit stays on the secondary adornment foreground, and do not carry the field's error message. Configurable prefix and suffix controls are separated from the editable value by a vertical divider at the density icon height. The nested inset keeps its 2px remainder toward the line; the editable value keeps the same inline padding from the line as a non-prefixed field keeps from its border. The optional leading icon is decorative and does not replace the field label. Password, search-clear, and date or time actions stay type-owned trailing buttons rather than suffix-slot content.",
7683
7696
  "Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
7684
- "Number fields preserve native spinbutton semantics, keyboard stepping, and min/max constraint behavior while dsChange continues to report the native string value. Two borderless inset chevron actions split the available inner height, disable independently at their numeric bound, and restore focus to the spinbutton after pointer activation.",
7697
+ "Number fields preserve native spinbutton semantics, keyboard stepping, and min/max constraint behavior while dsChange continues to report the native string value. Optional borderless inset Plus and Minus buttons share the field density, appear in that order, disable independently at their numeric bound, and restore focus to the spinbutton after activation. Hide them when direct numeric entry is preferable; browser spinner chrome stays hidden.",
7685
7698
  "textAlign positions the editable value while the numeric stepper stays on the opposite inline edge, keeping the actions clear of the number: start-aligned values use an inline-end stepper and end-aligned values use an inline-start stepper.",
7686
7699
  "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
7687
- "Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts."
7700
+ "Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts.",
7701
+ "Length constraints validate both typed and programmatic values. By default excess text is retained and shown as an error; restrict mode uses a hard input limit. Counters show the draft length and maximum below the field, beside helper or error text when present.",
7702
+ "Suggestions assist free text rather than constrain selection. Arrow keys highlight suggestions, Enter accepts one, and Escape dismisses the popup without changing the value.",
7703
+ "Tokenized text and search fields use removable double-inset chips and commit trimmed, unique values with Enter or comma, accept delimited paste, and remove the last token with Backspace on an empty draft. Committed tokens submit as repeated entries; value remains the draft and must be committed before submission. Length and pattern constraints apply per token."
7688
7704
  ],
7689
7705
  "responsiveBehavior": [
7690
7706
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
@@ -7694,16 +7710,20 @@
7694
7710
  "frameworkCaveats": {
7695
7711
  "customElements": [
7696
7712
  "Listen for dsChange for user edits and dsClear for the search clear action.",
7697
- "Use the form attribute on the host when associating an input rendered outside its owning form."
7713
+ "Use the form attribute on the host when associating an input rendered outside its owning form.",
7714
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7698
7715
  ],
7699
7716
  "react": [
7700
- "Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear."
7717
+ "Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear.",
7718
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7701
7719
  ],
7702
7720
  "vue": [
7703
- "Use DsInput with v-model for the value, and listen for dsChange and dsClear."
7721
+ "Use DsInput with v-model for the value, and listen for dsChange and dsClear.",
7722
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7704
7723
  ],
7705
7724
  "angular": [
7706
- "Import DsInput with TextValueAccessor when integrating with Angular Forms."
7725
+ "Use TextValueAccessor for text inputs and NumericValueAccessor for a statically declared type=\"number\" input. Numeric forms receive numbers or null while the component event remains a string.",
7726
+ "For tokenized input bind tokens and dsTokensChange explicitly; value and dsChange represent only the draft. Do not attach a scalar form value accessor to token mode."
7707
7727
  ]
7708
7728
  },
7709
7729
  "references": [
@@ -7797,6 +7817,10 @@
7797
7817
  "type": "string",
7798
7818
  "required": false
7799
7819
  },
7820
+ "decrementLabel": {
7821
+ "type": "string",
7822
+ "required": false
7823
+ },
7800
7824
  "disabled": {
7801
7825
  "type": "boolean",
7802
7826
  "required": false
@@ -7833,6 +7857,10 @@
7833
7857
  "type": "string | undefined",
7834
7858
  "required": false
7835
7859
  },
7860
+ "incrementLabel": {
7861
+ "type": "string",
7862
+ "required": false
7863
+ },
7836
7864
  "inputId": {
7837
7865
  "type": "string | undefined",
7838
7866
  "required": false
@@ -7845,18 +7873,38 @@
7845
7873
  "type": "boolean",
7846
7874
  "required": false
7847
7875
  },
7876
+ "lengthBehavior": {
7877
+ "type": "'error' | 'restrict'",
7878
+ "required": false
7879
+ },
7848
7880
  "max": {
7849
7881
  "type": "number | undefined",
7850
7882
  "required": false
7851
7883
  },
7884
+ "maxLength": {
7885
+ "type": "number | undefined",
7886
+ "required": false
7887
+ },
7852
7888
  "min": {
7853
7889
  "type": "number | undefined",
7854
7890
  "required": false
7855
7891
  },
7892
+ "minLength": {
7893
+ "type": "number | undefined",
7894
+ "required": false
7895
+ },
7856
7896
  "name": {
7857
7897
  "type": "string | undefined",
7858
7898
  "required": false
7859
7899
  },
7900
+ "pattern": {
7901
+ "type": "string | undefined",
7902
+ "required": false
7903
+ },
7904
+ "patternMessage": {
7905
+ "type": "string | undefined",
7906
+ "required": false
7907
+ },
7860
7908
  "placeholder": {
7861
7909
  "type": "string | undefined",
7862
7910
  "required": false
@@ -7865,6 +7913,10 @@
7865
7913
  "type": "boolean",
7866
7914
  "required": false
7867
7915
  },
7916
+ "removeTokenLabel": {
7917
+ "type": "string",
7918
+ "required": false
7919
+ },
7868
7920
  "required": {
7869
7921
  "type": "boolean",
7870
7922
  "required": false
@@ -7873,10 +7925,18 @@
7873
7925
  "type": "string",
7874
7926
  "required": false
7875
7927
  },
7928
+ "showCharacterCount": {
7929
+ "type": "boolean",
7930
+ "required": false
7931
+ },
7876
7932
  "showPasswordLabel": {
7877
7933
  "type": "string",
7878
7934
  "required": false
7879
7935
  },
7936
+ "showStepper": {
7937
+ "type": "boolean",
7938
+ "required": false
7939
+ },
7880
7940
  "size": {
7881
7941
  "type": "InputSize",
7882
7942
  "required": false
@@ -7885,10 +7945,22 @@
7885
7945
  "type": "number | undefined",
7886
7946
  "required": false
7887
7947
  },
7948
+ "suggestions": {
7949
+ "type": "string[]",
7950
+ "required": false
7951
+ },
7888
7952
  "textAlign": {
7889
7953
  "type": "InputTextAlign",
7890
7954
  "required": false
7891
7955
  },
7956
+ "tokenized": {
7957
+ "type": "boolean",
7958
+ "required": false
7959
+ },
7960
+ "tokens": {
7961
+ "type": "string[]",
7962
+ "required": false
7963
+ },
7892
7964
  "type": {
7893
7965
  "type": "InputType",
7894
7966
  "required": false
@@ -7910,6 +7982,14 @@
7910
7982
  {
7911
7983
  "name": "dsClear",
7912
7984
  "detail": "void"
7985
+ },
7986
+ {
7987
+ "name": "dsSuggestionSelect",
7988
+ "detail": "string"
7989
+ },
7990
+ {
7991
+ "name": "dsTokensChange",
7992
+ "detail": "string[]"
7913
7993
  }
7914
7994
  ],
7915
7995
  "slots": [],
@@ -7927,8 +8007,10 @@
7927
8007
  ],
7928
8008
  "registryDependencies": [
7929
8009
  "button-unfilled",
8010
+ "chip",
7930
8011
  "divider",
7931
8012
  "icon",
8013
+ "input",
7932
8014
  "text"
7933
8015
  ]
7934
8016
  },
@@ -8229,7 +8311,7 @@
8229
8311
  {
8230
8312
  "when": "The hour, minute, and AM/PM lists are needed without a form field.",
8231
8313
  "component": "component:ds-time-picker",
8232
- "reason": "TimePicker owns the bounded 12-hour lists and selected-tile treatment."
8314
+ "reason": "TimePicker owns the bounded clock lists and selected-tile treatment."
8233
8315
  },
8234
8316
  {
8235
8317
  "when": "The user chooses from a finite set of named times or cadences.",
@@ -8247,9 +8329,9 @@
8247
8329
  ],
8248
8330
  "accessibility": [
8249
8331
  "Provide a persistent visible label through the owning field or an external native label.",
8250
- "The text field remains the keyboard and assistive-technology value control. Users can type HH:MM, H:MM, or a 12-hour label such as 9:00 AM.",
8332
+ "The text field remains the keyboard and assistive-technology value control. Users can type HH:MM, H:MM, or a 12- or 24-hour label such as 9:00 AM.",
8251
8333
  "The trailing clock button is a named disclosure that opens a non-modal time dialog. It shares the field's density, uses the single inset recipe, and reports expanded state while the picker is open.",
8252
- "Filled values keep HH:MM as the form value. Visible text uses a 12-hour label such as 9:00 AM so the field does not show 24-hour chrome. That label reuses Input's value typography and text-container inset.",
8334
+ "Filled values keep HH:MM as the form value. Visible text uses a 12- or 24-hour label such as 9:00 AM so the field does not show 24-hour chrome. That label reuses Input's value typography and text-container inset.",
8253
8335
  "Error text is associated with the text field and announced as an alert when the invalid state is rendered.",
8254
8336
  "Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission."
8255
8337
  ],
@@ -8259,7 +8341,8 @@
8259
8341
  "The normal field boundary uses the shared secondary inset border. Focus promotes it to the thicker bold-brand inset stroke, while error uses the thicker bold-negative inset stroke without changing geometry. When hasBorder is false, supporting error copy insets to the field's text origin rather than the resting border box.",
8260
8342
  "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
8261
8343
  "The trailing clock action is an unfilled icon button of the same density as the field, borderless and square, with the single inset recipe so the 4px height reduction insets it equally from the field's top, end, and bottom edges. It does not replace the field label or the submitted time value. Inactive or disabled fields apply that treatment on the host only, so the nested button is not faded a second time.",
8262
- "Activating the clock button opens the shared TimePicker in a choice-popup dialog anchored to the field's end edge, beside the trailing clock action. Choosing hour, minute, or AM/PM commits that part of the time and leaves the dialog open so the other columns can be adjusted. Typing in the field commits a parsed time without requiring the picker. Invalid typed text reverts to the last committed value on blur."
8344
+ "Activating the clock button opens the shared TimePicker in a choice-popup dialog anchored to the field's end edge, beside the trailing clock action. Choosing hour, minute, or AM/PM commits that part of the time and leaves the dialog open so the other columns can be adjusted. Typing in the field commits a parsed time without requiring the picker. Invalid typed text reverts to the last committed value on blur.",
8345
+ "The default twelve-hour presentation includes AM/PM. Twenty-four-hour presentation uses hours 00–23 and omits the period column; both keep HH:MM form values and the same time bounds."
8263
8346
  ],
8264
8347
  "responsiveBehavior": [
8265
8348
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
@@ -8380,6 +8463,10 @@
8380
8463
  "type": "boolean",
8381
8464
  "required": false
8382
8465
  },
8466
+ "hourFormat": {
8467
+ "type": "'12' | '24'",
8468
+ "required": false
8469
+ },
8383
8470
  "inputId": {
8384
8471
  "type": "string | undefined",
8385
8472
  "required": false
@@ -8583,6 +8670,294 @@
8583
8670
  ],
8584
8671
  "registryDependencies": []
8585
8672
  },
8673
+ {
8674
+ "name": "map-cluster-marker",
8675
+ "title": "MapClusterMarker",
8676
+ "description": "Engine-independent map cluster button with compact count formatting and a hover or focus caption.",
8677
+ "type": "registry:ui",
8678
+ "meta": {
8679
+ "library": "@ds-mo/ui",
8680
+ "distribution": "npm",
8681
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/map-cluster-marker",
8682
+ "source": "src/wc/components/MapClusterMarker/MapClusterMarker.tsx",
8683
+ "intentStatus": "complete",
8684
+ "intent": {
8685
+ "audience": "general",
8686
+ "status": "experimental",
8687
+ "summary": "Engine-independent map cluster button with compact count formatting and a hover or focus caption.",
8688
+ "useWhen": [
8689
+ "An application map needs one interactive marker to represent several nearby entities.",
8690
+ "The map engine can mount a custom element and retain ownership of clustering, coordinates, anchoring, and camera behavior."
8691
+ ],
8692
+ "avoidWhen": [
8693
+ "The marker represents one vehicle, asset, person, or travel group; use MapEntityMarker.",
8694
+ "The count is a notification attached to another control; use Badge.",
8695
+ "The component would be asked to calculate clusters or own geographic and selected-entity business state."
8696
+ ],
8697
+ "alternatives": [
8698
+ {
8699
+ "when": "One map entity needs operating state, bearing, and an optional dashed outline.",
8700
+ "component": "component:ds-map-entity-marker",
8701
+ "reason": "MapEntityMarker owns single-entity marker semantics and geometry."
8702
+ },
8703
+ {
8704
+ "when": "A count supplements another non-map control.",
8705
+ "component": "component:ds-badge",
8706
+ "reason": "Badge owns compact notification and counter indicators."
8707
+ }
8708
+ ],
8709
+ "commonlyComposedWith": [
8710
+ "component:ds-map-entity-marker",
8711
+ "component:ds-text"
8712
+ ],
8713
+ "accessibility": [
8714
+ "The component renders a native button and label is its accessible action name. Prefer a label that includes the full count and outcome, such as ‘Zoom to 24 vehicles’.",
8715
+ "Caption is a supplemental visual identifier and is hidden from assistive technology to avoid duplicating label.",
8716
+ "Keyboard focus reveals the same caption as hover and uses the shared visible focus ring.",
8717
+ "The compact displayed count does not replace the full count in label."
8718
+ ],
8719
+ "states": [
8720
+ "count is rounded to a non-negative whole number and compacts with a k suffix at one thousand and above.",
8721
+ "dimmed is visual de-emphasis only. The map owner decides when selection context should dim cluster peers and keeps every cluster operable. A dimmed cluster returns to full opacity while hovered or keyboard-focused so its revealed caption remains legible.",
8722
+ "Activation emits dsClick without calculating a cluster expansion or changing camera state internally."
8723
+ ],
8724
+ "responsiveBehavior": [
8725
+ "Marker height and minimum width stay fixed across breakpoints so map-engine anchors remain stable; width grows only for the compact count.",
8726
+ "The map owner controls collision handling, overlays, and viewport-aware caption placement."
8727
+ ],
8728
+ "frameworkCaveats": {
8729
+ "customElements": [
8730
+ "A map engine that accepts an Element for a custom marker or div icon can mount ds-map-cluster-marker directly.",
8731
+ "Listen for dsClick and keep cluster membership, expansion zoom, z-index, coordinates, and camera movement in application state."
8732
+ ],
8733
+ "react": [
8734
+ "Pass count as a number and handle dsClick through the generated event binding."
8735
+ ],
8736
+ "angular": [
8737
+ "Bind count as a number and keep map-engine marker lifecycle in the owning map adapter."
8738
+ ]
8739
+ },
8740
+ "references": [
8741
+ {
8742
+ "label": "Storybook examples",
8743
+ "path": "src/wc/components/MapClusterMarker/MapClusterMarker.stories.ts"
8744
+ }
8745
+ ],
8746
+ "styling": {
8747
+ "rationale": "The component owns stable map anchoring geometry and semantic cluster recipes; the map engine owns host placement and stacking.",
8748
+ "protected": [
8749
+ {
8750
+ "properties": [
8751
+ "height",
8752
+ "min-width",
8753
+ "padding",
8754
+ "border-radius",
8755
+ "background",
8756
+ "color",
8757
+ "opacity"
8758
+ ],
8759
+ "reason": "Cluster geometry, count legibility, interaction treatment, and de-emphasis are one accessible visual recipe.",
8760
+ "props": [
8761
+ "count",
8762
+ "dimmed"
8763
+ ]
8764
+ }
8765
+ ],
8766
+ "customProperties": []
8767
+ }
8768
+ },
8769
+ "props": {
8770
+ "caption": {
8771
+ "type": "string",
8772
+ "required": false
8773
+ },
8774
+ "count": {
8775
+ "type": "number",
8776
+ "required": false
8777
+ },
8778
+ "dimmed": {
8779
+ "type": "boolean",
8780
+ "required": false
8781
+ },
8782
+ "label": {
8783
+ "type": "string",
8784
+ "required": true
8785
+ }
8786
+ },
8787
+ "events": [
8788
+ {
8789
+ "name": "dsClick",
8790
+ "detail": "MouseEvent"
8791
+ }
8792
+ ],
8793
+ "slots": [],
8794
+ "exports": {
8795
+ "customElement": "ds-map-cluster-marker",
8796
+ "react": "DsMapClusterMarker",
8797
+ "vue": "DsMapClusterMarker",
8798
+ "angular": "DsMapClusterMarker"
8799
+ }
8800
+ },
8801
+ "dependencies": [
8802
+ "@ds-mo/ui",
8803
+ "@ds-mo/tokens"
8804
+ ],
8805
+ "registryDependencies": [
8806
+ "text"
8807
+ ]
8808
+ },
8809
+ {
8810
+ "name": "map-entity-marker",
8811
+ "title": "MapEntityMarker",
8812
+ "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.",
8813
+ "type": "registry:ui",
8814
+ "meta": {
8815
+ "library": "@ds-mo/ui",
8816
+ "distribution": "npm",
8817
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/map-entity-marker",
8818
+ "source": "src/wc/components/MapEntityMarker/MapEntityMarker.tsx",
8819
+ "intentStatus": "complete",
8820
+ "intent": {
8821
+ "audience": "general",
8822
+ "status": "experimental",
8823
+ "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.",
8824
+ "useWhen": [
8825
+ "An application map needs a consistent interactive marker for one entity.",
8826
+ "The map engine can mount a custom element and retain ownership of coordinates, anchoring, and camera behavior."
8827
+ ],
8828
+ "avoidWhen": [
8829
+ "Several nearby entities must be represented as one count; use MapClusterMarker.",
8830
+ "The content is a legend item or non-interactive status swatch.",
8831
+ "The component would be asked to own geographic coordinates, clustering, map-engine adapters, or selected-entity business state."
8832
+ ],
8833
+ "alternatives": [
8834
+ {
8835
+ "when": "Several nearby entities are represented by a compact count.",
8836
+ "component": "component:ds-map-cluster-marker",
8837
+ "reason": "MapClusterMarker owns cluster count formatting and cluster interaction geometry."
8838
+ }
8839
+ ],
8840
+ "commonlyComposedWith": [
8841
+ "component:ds-map-cluster-marker",
8842
+ "component:ds-icon"
8843
+ ],
8844
+ "accessibility": [
8845
+ "The component renders a native button and label is its accessible action name. Prefer an action-oriented label such as ‘Open vehicle 412’.",
8846
+ "Caption is a supplemental visual identifier and is hidden from assistive technology to avoid duplicating label.",
8847
+ "Keyboard focus reveals the same caption as hover and uses the shared visible focus ring.",
8848
+ "Operating-state and outline meaning must be present in nearby map legend or application detail content; do not rely on marker color alone.",
8849
+ "The optional dashed outline remains differentiated by a dashed border in forced-colors mode."
8850
+ ],
8851
+ "states": [
8852
+ "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.",
8853
+ "The dashed outline is an independent visual option. Unknown is solid unless the owner explicitly requests dashes.",
8854
+ "immobilized always renders the upright MapKey glyph instead of the entity icon so the state is identifiable without interpreting bearing.",
8855
+ "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.",
8856
+ "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.",
8857
+ "Activation emits dsClick without changing application selection internally."
8858
+ ],
8859
+ "responsiveBehavior": [
8860
+ "Marker geometry stays fixed across breakpoints so map-engine anchors remain stable.",
8861
+ "The map owner controls collision handling, overlays, and viewport-aware caption placement."
8862
+ ],
8863
+ "frameworkCaveats": {
8864
+ "customElements": [
8865
+ "A map engine that accepts an Element for a custom marker or div icon can mount ds-map-entity-marker directly.",
8866
+ "Listen for dsClick and keep selected entity, z-index, coordinates, and camera movement in application state."
8867
+ ],
8868
+ "react": [
8869
+ "Pass numeric bearing as a property and handle dsClick through the generated event binding."
8870
+ ],
8871
+ "angular": [
8872
+ "Bind bearing as a number and keep map-engine marker lifecycle in the owning map adapter."
8873
+ ]
8874
+ },
8875
+ "references": [
8876
+ {
8877
+ "label": "Storybook examples",
8878
+ "path": "src/wc/components/MapEntityMarker/MapEntityMarker.stories.ts"
8879
+ }
8880
+ ],
8881
+ "styling": {
8882
+ "rationale": "The component owns stable map anchoring geometry and semantic marker recipes; the map engine owns host placement and stacking.",
8883
+ "protected": [
8884
+ {
8885
+ "properties": [
8886
+ "width",
8887
+ "height",
8888
+ "min-width",
8889
+ "padding",
8890
+ "border",
8891
+ "border-radius",
8892
+ "background",
8893
+ "color",
8894
+ "opacity"
8895
+ ],
8896
+ "reason": "Marker geometry, operating-state colors, outline distinction, and de-emphasis are one accessible visual recipe.",
8897
+ "props": [
8898
+ "state",
8899
+ "dashed",
8900
+ "dimmed"
8901
+ ]
8902
+ }
8903
+ ],
8904
+ "customProperties": []
8905
+ }
8906
+ },
8907
+ "props": {
8908
+ "bearing": {
8909
+ "type": "number",
8910
+ "required": false
8911
+ },
8912
+ "caption": {
8913
+ "type": "string",
8914
+ "required": false
8915
+ },
8916
+ "dashed": {
8917
+ "type": "boolean",
8918
+ "required": false
8919
+ },
8920
+ "dimmed": {
8921
+ "type": "boolean",
8922
+ "required": false
8923
+ },
8924
+ "icon": {
8925
+ "type": "string",
8926
+ "required": false
8927
+ },
8928
+ "label": {
8929
+ "type": "string",
8930
+ "required": true
8931
+ },
8932
+ "state": {
8933
+ "type": "MapEntityMarkerState",
8934
+ "required": false
8935
+ }
8936
+ },
8937
+ "events": [
8938
+ {
8939
+ "name": "dsClick",
8940
+ "detail": "MouseEvent"
8941
+ }
8942
+ ],
8943
+ "slots": [],
8944
+ "exports": {
8945
+ "customElement": "ds-map-entity-marker",
8946
+ "react": "DsMapEntityMarker",
8947
+ "vue": "DsMapEntityMarker",
8948
+ "angular": "DsMapEntityMarker"
8949
+ }
8950
+ },
8951
+ "dependencies": [
8952
+ "@ds-mo/ui",
8953
+ "@ds-mo/tokens",
8954
+ "@ds-mo/icons"
8955
+ ],
8956
+ "registryDependencies": [
8957
+ "icon",
8958
+ "text"
8959
+ ]
8960
+ },
8586
8961
  {
8587
8962
  "name": "markdown",
8588
8963
  "title": "Markdown",
@@ -11801,6 +12176,176 @@
11801
12176
  "text"
11802
12177
  ]
11803
12178
  },
12179
+ {
12180
+ "name": "radio-tile",
12181
+ "title": "RadioTile",
12182
+ "description": "A form-associated group of fully clickable radio tiles with labels and optional descriptions.",
12183
+ "type": "registry:ui",
12184
+ "meta": {
12185
+ "library": "@ds-mo/ui",
12186
+ "distribution": "npm",
12187
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/radio-tile",
12188
+ "source": "src/wc/components/RadioTile/RadioTile.tsx",
12189
+ "intentStatus": "complete",
12190
+ "intent": {
12191
+ "audience": "general",
12192
+ "status": "experimental",
12193
+ "summary": "A form-associated group of fully clickable radio tiles with labels and optional descriptions.",
12194
+ "useWhen": [
12195
+ "A small set of mutually exclusive choices benefits from descriptive cards and large click targets."
12196
+ ],
12197
+ "avoidWhen": [
12198
+ "The choices are brief and compact; use Radio.",
12199
+ "More than one value may be chosen."
12200
+ ],
12201
+ "alternatives": [
12202
+ {
12203
+ "when": "A user may select zero or multiple independent choices.",
12204
+ "component": "component:ds-checkbox",
12205
+ "reason": "Checkbox communicates independent selection rather than one-of-many choice."
12206
+ },
12207
+ {
12208
+ "when": "A binary setting applies immediately.",
12209
+ "component": "component:ds-switch",
12210
+ "reason": "Switch communicates an immediately applied on/off setting."
12211
+ },
12212
+ {
12213
+ "when": "The option list is long or the available space is constrained.",
12214
+ "component": "component:ds-select",
12215
+ "reason": "Select keeps a larger one-of-many choice set compact."
12216
+ }
12217
+ ],
12218
+ "commonlyComposedWith": [
12219
+ "component:ds-field",
12220
+ "component:ds-text"
12221
+ ],
12222
+ "accessibility": [
12223
+ "Native radio inputs own keyboard selection, focus, and checked semantics; the complete tile activates its input.",
12224
+ "Label the group with Field or an accessible name. Descriptions name each option separately."
12225
+ ],
12226
+ "states": [
12227
+ "Selection is shown by the radio indicator while the tile keeps its neutral border. Error retains the negative border, and keyboard focus keeps the focus-token outline. Inactive options cannot be selected.",
12228
+ "The component owns form values, required validation, reset, and disabled-fieldset behavior."
12229
+ ],
12230
+ "responsiveBehavior": [
12231
+ "Horizontal tiles wrap to available space; use a vertical group when descriptions need more room."
12232
+ ],
12233
+ "frameworkCaveats": {
12234
+ "angular": [
12235
+ "Use the generated radio value accessor with the standalone adapter."
12236
+ ],
12237
+ "vue": [
12238
+ "Bind value with v-model."
12239
+ ]
12240
+ },
12241
+ "references": [
12242
+ {
12243
+ "label": "Storybook review",
12244
+ "path": "src/wc/components/RadioTile/RadioTile.stories.ts"
12245
+ }
12246
+ ],
12247
+ "styling": {
12248
+ "rationale": "Tile anatomy and radio treatment belong to the component; the owner controls group width.",
12249
+ "protected": [
12250
+ {
12251
+ "properties": [
12252
+ "padding",
12253
+ "gap",
12254
+ "border-radius",
12255
+ "background",
12256
+ "border",
12257
+ "box-shadow",
12258
+ "color"
12259
+ ],
12260
+ "reason": "Use the supported group direction and state instead of replacing tile internals.",
12261
+ "props": [
12262
+ "direction"
12263
+ ]
12264
+ }
12265
+ ],
12266
+ "customProperties": []
12267
+ }
12268
+ },
12269
+ "props": {
12270
+ "ariaDescribedby": {
12271
+ "type": "string | undefined",
12272
+ "required": false
12273
+ },
12274
+ "ariaLabel": {
12275
+ "type": "string | null",
12276
+ "required": false
12277
+ },
12278
+ "ariaLabelledby": {
12279
+ "type": "string | undefined",
12280
+ "required": false
12281
+ },
12282
+ "direction": {
12283
+ "type": "'horizontal' | 'vertical'",
12284
+ "required": false
12285
+ },
12286
+ "disabled": {
12287
+ "type": "boolean",
12288
+ "required": false
12289
+ },
12290
+ "error": {
12291
+ "type": "boolean",
12292
+ "required": false
12293
+ },
12294
+ "form": {
12295
+ "type": "string | undefined",
12296
+ "required": false
12297
+ },
12298
+ "inputId": {
12299
+ "type": "string | undefined",
12300
+ "required": false
12301
+ },
12302
+ "isInactive": {
12303
+ "type": "boolean",
12304
+ "required": false
12305
+ },
12306
+ "name": {
12307
+ "type": "string | undefined",
12308
+ "required": false
12309
+ },
12310
+ "options": {
12311
+ "type": "RadioTileOption[]",
12312
+ "required": false
12313
+ },
12314
+ "required": {
12315
+ "type": "boolean",
12316
+ "required": false
12317
+ },
12318
+ "requiredMessage": {
12319
+ "type": "string",
12320
+ "required": false
12321
+ },
12322
+ "value": {
12323
+ "type": "string",
12324
+ "required": false
12325
+ }
12326
+ },
12327
+ "events": [
12328
+ {
12329
+ "name": "dsChange",
12330
+ "detail": "string"
12331
+ }
12332
+ ],
12333
+ "slots": [],
12334
+ "exports": {
12335
+ "customElement": "ds-radio-tile",
12336
+ "react": "DsRadioTile",
12337
+ "vue": "DsRadioTile",
12338
+ "angular": "DsRadioTile"
12339
+ }
12340
+ },
12341
+ "dependencies": [
12342
+ "@ds-mo/ui",
12343
+ "@ds-mo/tokens"
12344
+ ],
12345
+ "registryDependencies": [
12346
+ "text"
12347
+ ]
12348
+ },
11804
12349
  {
11805
12350
  "name": "score",
11806
12351
  "title": "Score",
@@ -12454,6 +12999,106 @@
12454
12999
  "tooltip"
12455
13000
  ]
12456
13001
  },
13002
+ {
13003
+ "name": "setting-row",
13004
+ "title": "SettingRow",
13005
+ "description": "Two-column immediate binary setting with descriptive copy and an accessible switch.",
13006
+ "type": "registry:ui",
13007
+ "meta": {
13008
+ "library": "@ds-mo/ui",
13009
+ "distribution": "npm",
13010
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/setting-row",
13011
+ "source": "src/wc/components/SettingRow/SettingRow.tsx",
13012
+ "intentStatus": "complete",
13013
+ "intent": {
13014
+ "audience": "general",
13015
+ "status": "experimental",
13016
+ "summary": "Two-column immediate binary setting with descriptive copy and an accessible switch.",
13017
+ "useWhen": [
13018
+ "A settings list pairs a setting name and explanation with one immediate on/off control."
13019
+ ],
13020
+ "avoidWhen": [
13021
+ "The value needs a text input, multiple choices, or an explicit Save workflow."
13022
+ ],
13023
+ "commonlyComposedWith": [
13024
+ "component:ds-card-setting",
13025
+ "component:ds-switch",
13026
+ "component:ds-text"
13027
+ ],
13028
+ "accessibility": [
13029
+ "The visible label names the switch and the optional description supplies its accessible description.",
13030
+ "Switch owns focus, keyboard activation, checked state, and disabled semantics. The row adds no second tab stop.",
13031
+ "For a settings list, the owner supplies list semantics and marks each row as a list item."
13032
+ ],
13033
+ "states": [
13034
+ "The application accepts or rejects change requests by updating the controlled checked value and owns persistence and errors.",
13035
+ "Name the enabled setting consistently; the label must not change when the switch is toggled."
13036
+ ],
13037
+ "responsiveBehavior": [
13038
+ "The copy wraps while the switch keeps its natural size in the trailing column, including at narrow widths."
13039
+ ],
13040
+ "references": [
13041
+ {
13042
+ "label": "Usage states",
13043
+ "path": "src/wc/components/SettingRow/SettingRow.stories.ts"
13044
+ }
13045
+ ],
13046
+ "styling": {
13047
+ "rationale": "The row owns copy/control spacing; its parent owns the section surface and width.",
13048
+ "protected": [
13049
+ {
13050
+ "properties": [
13051
+ "padding",
13052
+ "gap"
13053
+ ],
13054
+ "reason": "Preserve the shared settings-row spacing recipe.",
13055
+ "props": []
13056
+ }
13057
+ ],
13058
+ "customProperties": []
13059
+ }
13060
+ },
13061
+ "props": {
13062
+ "checked": {
13063
+ "type": "boolean",
13064
+ "required": false
13065
+ },
13066
+ "description": {
13067
+ "type": "string",
13068
+ "required": false
13069
+ },
13070
+ "disabled": {
13071
+ "type": "boolean",
13072
+ "required": false
13073
+ },
13074
+ "label": {
13075
+ "type": "string",
13076
+ "required": true
13077
+ }
13078
+ },
13079
+ "events": [
13080
+ {
13081
+ "name": "dsChange",
13082
+ "detail": "boolean"
13083
+ }
13084
+ ],
13085
+ "slots": [],
13086
+ "exports": {
13087
+ "customElement": "ds-setting-row",
13088
+ "react": "DsSettingRow",
13089
+ "vue": "DsSettingRow",
13090
+ "angular": "DsSettingRow"
13091
+ }
13092
+ },
13093
+ "dependencies": [
13094
+ "@ds-mo/ui",
13095
+ "@ds-mo/tokens"
13096
+ ],
13097
+ "registryDependencies": [
13098
+ "switch",
13099
+ "text"
13100
+ ]
13101
+ },
12457
13102
  {
12458
13103
  "name": "shell-app",
12459
13104
  "title": "ShellApp",
@@ -12542,7 +13187,7 @@
12542
13187
  "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
12543
13188
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
12544
13189
  "On desktop and tablet, panel section navigation replaces BarNav with BarPageTitle; collapsed PanelNav exposes child sections through its anchored flyout.",
12545
- "When panel section navigation moves BarPageTitle into the shell bar, routed content starts at the standard 32px desktop or 16px tablet gutter and ShellPage reports no page-local sticky-header height.",
13190
+ "When panel section navigation moves BarPageTitle into the shell bar, routed content starts at the standard 16px desktop and tablet gutter and ShellPage reports no page-local sticky-header height.",
12546
13191
  "On mobile, ShellApp hides and inerts desktop chrome, uses a solid primary stage, and composes MobileHeader, MobileSheetNav, ShellTools, and the persistent MobileBarNav around the same application-owned content.",
12547
13192
  "The section-navigation preference also selects mobile navigation: bar preserves flat area selection and the header section picker; panel expands child routes inline in MobileSheetNav and combines the page title with any local subsection in one sheet trigger.",
12548
13193
  "Opening MobileSheetNav temporarily overlays the active routed page or global tool; closing it without selecting an area restores that same destination and its nested state. The sheet exposes the router-derived current area only while the routed area owns the mobile stage, so a global tool never leaves an underlying route highlighted.",
@@ -12842,7 +13487,7 @@
12842
13487
  "A ShellPage-managed BarTitle remains concealed until headerCapacity is available and its rendered variant matches the resolved presentation, preventing a default-variant flash during route activation.",
12843
13488
  "responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
12844
13489
  "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
12845
- "The default content inset is balanced on every side: 32px in desktop mode and 16px in tablet and mobile modes.",
13490
+ "The default content inset is balanced at 16px on every side in desktop, tablet, and mobile modes.",
12846
13491
  "When desktopHeaderPlacement=shell-bar, desktop and tablet ignore page-header-specific block-start seam overrides and expose --ds-shell-page-content-block-start-offset as the responsive gutter only; mobile keeps its MobileHeader geometry and existing seam.",
12847
13492
  "contentInsetBlockStart can independently remove the top gutter for table and canvas pages that should meet the sticky header; exact roomy and compact block-start sizes support pages whose seam changes with header capacity.",
12848
13493
  "The selected content surface persists unchanged across desktop, tablet, and mobile modes.",
@@ -13381,14 +14026,15 @@
13381
14026
  "Assign a two-number array through the JavaScript value property to create a range; values are ordered, clamped, stepped, and prevented from crossing.",
13382
14027
  "minStepsBetweenValues reserves a minimum stepped distance between range thumbs.",
13383
14028
  "The initial normalized value is the native form-reset baseline and range values submit as repeated entries under the same name.",
13384
- "Focused, filled, dirty, touched, dragging, valid, disabled, read-only, and orientation data hooks expose interaction state without changing the value contract."
14029
+ "Focused, filled, dirty, touched, dragging, valid, disabled, read-only, and orientation data hooks expose interaction state without changing the value contract.",
14030
+ "Explicit ticks define the only selectable snap points and may carry labels. Marks sit below a horizontal track, or beside a vertical track, with labels beyond the marks. Horizontal labels center on their marks and shift inward only when they reach the control edges. Without ticks, step=\"any\" permits smooth adjustment; ordinary stepped behavior remains available. Arrow keys traverse adjacent ticks and Home/End reach the available extremes."
13385
14031
  ],
13386
14032
  "responsiveBehavior": [
13387
14033
  "The visible label uses the same primary emphasized text-body-small recipe as Field at every density; the value uses the same primary metric without emphasis.",
13388
14034
  "Horizontal Slider fills the width supplied by its parent; the parent chooses an appropriate readable track length.",
13389
14035
  "Vertical Slider owns a token-based default length that may be overridden with --ds-slider-vertical-length in layout-specific compositions.",
13390
14036
  "Use md in ordinary forms and sm or xs only when the surrounding control density uses the same recipe.",
13391
- "Track thickness scales with density: 8px at md, 6px at sm, and 4px at xs. The unfilled track is transparent with a tertiary-foreground inset outline, the filled range is brand, and the square thumb uses a 2px radius with a 1.5px brand inset ring.",
14037
+ "Track thickness scales with density. The unfilled track has a neutral border, the filled range uses brand color, and the thumb uses the primary surface with subtle elevation.",
13392
14038
  "Horizontal value direction is left-to-right; the design system does not author RTL-specific component behavior."
13393
14039
  ],
13394
14040
  "frameworkCaveats": {
@@ -13400,7 +14046,10 @@
13400
14046
  "Use DsSlider with a number or two-number value array and handle onDsChange and onDsCommit custom events."
13401
14047
  ],
13402
14048
  "angular": [
13403
- "Use DsSlider with property binding for range arrays; the generated number value accessor is appropriate only for a single numeric value."
14049
+ "Use DsSlider with SelectValueAccessor for Angular Forms; it preserves either a number or a two-number array."
14050
+ ],
14051
+ "vue": [
14052
+ "Use v-model for a number or a two-number array. Assign ticks through property binding."
13404
14053
  ]
13405
14054
  },
13406
14055
  "references": [
@@ -13541,13 +14190,17 @@
13541
14190
  "required": false
13542
14191
  },
13543
14192
  "step": {
13544
- "type": "number",
14193
+ "type": "number | 'any'",
13545
14194
  "required": false
13546
14195
  },
13547
14196
  "thumbAlignment": {
13548
14197
  "type": "SliderThumbAlignment",
13549
14198
  "required": false
13550
14199
  },
14200
+ "ticks": {
14201
+ "type": "SliderTick[]",
14202
+ "required": false
14203
+ },
13551
14204
  "value": {
13552
14205
  "type": "SliderValue",
13553
14206
  "required": false
@@ -14192,7 +14845,7 @@
14192
14845
  "pattern:menu-trigger"
14193
14846
  ],
14194
14847
  "accessibility": [
14195
- "The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty. The native caption remains visually hidden as the table's accessible name. When caption visibility is enabled, a 48px header bar renders as component chrome outside the data scrollport. It defaults to a presentational caption title that does not duplicate the accessible name. Application-owned labeled controls supplied through the single named header slot replace that fallback and share one horizontal caption overflow row with table-owned actions inside the component-owned 8px inset. Table caption buttons keep pressed interaction paint without physically scaling. When columnCustomizer is enabled, the table adds a trailing Customize control named Customize table. Its label uses regular weight and its resting foreground remains neutral when hidden or reordered columns differ from the catalog default. The control is icon-label at typical widths and the icon-only Table menu button below 900px, where a tooltip preserves the Customize label. The always-icon-only table-variant control also exposes its label through a tooltip. Otherwise the header slot receives the complete content width.",
14848
+ "The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty. The native caption remains visually hidden as the table's accessible name. When caption visibility is enabled, a 48px header bar renders as component chrome outside the data scrollport. It defaults to a presentational caption title that does not duplicate the accessible name. Application-owned labeled controls supplied through the single named header slot replace that fallback and share one horizontal caption overflow row with table-owned actions inside the component-owned 8px inset. Table caption buttons keep pressed interaction paint without physically scaling. When columnCustomizer is enabled, the table adds a trailing Customize control named Customize table. Its label uses regular weight and its resting foreground remains neutral when hidden or reordered columns differ from the catalog default. The control is icon-label at typical widths and the icon-only Customize menu button below 900px, where a tooltip preserves the Customize label. The always-icon-only table-variant control also exposes its label through a tooltip. Otherwise the header slot receives the complete content width.",
14196
14849
  "The data-mode switcher is the shared Menu of the table's supported infinite, pagination, and virtual modes. It uses an Ellipses trigger. The switcher is the final caption-bar action; when the column customizer is also present, a decorative vertical divider separates the two controls. dataMode remains controlled, and the application responds to change intent by supplying the matching records, pagination state, loading behavior, and query consequences. Escape, dismissal, and selection return focus to the trigger.",
14197
14850
  "The column customizer is the shared Menu of switch rows, not a table-owned dialog. Data columns can be shown, hidden, and reordered. Action columns and the selection checkbox never appear in the menu. The last remaining visible data column cannot be hidden, but it stays focusable so it can still be reordered. Escape and outside click restore focus to the trigger. Persistence stays in the application.",
14198
14851
  "Sorting controls remain buttons inside column headers and expose the table's one controlled member-row sort through aria-sort. ds-data-sort in the toolbar trailing cluster is the matching menu of Data and Order sections; it emits the same dsSortChange shape so header clicks and menu choices stay in sync. Grouping never adds a second sort indicator or header control; ds-data-group controls the grouping data point and ascending or descending group-section order while the application supplies the resulting groups. Optional column help underlines the header label with the shared dotted decoration and shows ds-tooltip from that label; it does not add a second header control or replace the column name.",
@@ -14224,7 +14877,7 @@
14224
14877
  ],
14225
14878
  "responsiveBehavior": [
14226
14879
  "The table keeps native semantics at narrow widths and scrolls horizontally instead of transforming into cards.",
14227
- "Inside the named ds-table container, caption Search retains its standard maximum width and flexes smaller only when the complete row needs space. Filter, Group, and Sort controls that opt into collapseLabel become icon-only below 900px by omitting their labels and chevrons. Active filtering or grouping promotes the visible icon to primary. Sort keeps resting secondary chrome because its selection lives in the menu and headers. Customize switches to the icon-only Table menu button below 900px and keeps its neutral resting foreground regardless of the controlled column configuration. The caption, frame, and footer remain within the table host at every width. The complete caption row scrolls together only when those compact controls no longer fit, while data columns scroll inside the viewport; table-owned trailing actions never stay pinned over the scrolling toolbar.",
14880
+ "Inside the named ds-table container, caption Search retains its standard maximum width and flexes smaller only when the complete row needs space. Filter, Group, and Sort controls that opt into collapseLabel become icon-only below 900px by omitting their labels and chevrons. Active filtering or grouping promotes the visible icon to primary. Sort keeps resting secondary chrome because its selection lives in the menu and headers. Customize switches to the icon-only Customize menu button below 900px and keeps its neutral resting foreground regardless of the controlled column configuration. The caption, frame, and footer remain within the table host at every width. The complete caption row scrolls together only when those compact controls no longer fit, while data columns scroll inside the viewport; table-owned trailing actions never stay pinned over the scrolling toolbar.",
14228
14881
  "stickyHeader follows the active vertical scroll owner: a maxHeight, height, or fitViewport table keeps its native header and group sections inside one bounded table scrollport, while a document-flow table retains a semantic native header and renders a sticky control header whose columns follow the body's native inline scroll timeline. Consumers set --ds-table-sticky-header-offset when page chrome occupies an unbounded document scrollport edge. When the 48px table header bar is visible, it sticks at that external offset and the column header stacks immediately below it.",
14229
14882
  "fitViewport uses viewportInsetBlockStart and viewportInsetBlockEnd to describe compact surrounding chrome and page gutters relative to the nearest vertical scroll owner. Before the table reaches that compact position, its host reserves the eventual height while the visible composition grows and vertical input remains owned by the outer page. Once settled, the internal table viewport becomes the vertical scroll owner. Bounded grouped tables use browser-native sticky section rows inside real block row-group boundaries, so scroll and resize do not run component JavaScript or trigger reactive section swaps. Document-flow tables retain the synchronized visual lane required by their separate horizontal scrollport.",
14230
14883
  "Without maxHeight the table grows the document and automatic lazy loading observes the browser viewport. Horizontal scrolling chains vertical wheel and trackpad movement to the page instead of trapping it.",
@@ -15167,7 +15820,8 @@
15167
15820
  "The default four visible rows can be changed with rows; rows is clamped to at least one.",
15168
15821
  "Vertical resizing is enabled by default and can be disabled when the surrounding layout owns the field height.",
15169
15822
  "Size changes typography and inset spacing without changing the authored row count.",
15170
- "Border, focus, error, placeholder, inactive, hover, and pressed treatments follow the same shared recipes as Input. When hasBorder is false, supporting error copy insets to the text origin rather than the resting border box."
15823
+ "Border, focus, error, placeholder, inactive, hover, and pressed treatments follow the same shared recipes as Input. When hasBorder is false, supporting error copy insets to the text origin rather than the resting border box.",
15824
+ "Length constraints validate typed and programmatic text. Excess content is retained with an error by default; restrict mode enforces the maximum during editing. A character count appears below the field, right of supporting text or left when no supporting text exists."
15171
15825
  ],
15172
15826
  "responsiveBehavior": [
15173
15827
  "Textarea fills its parent by default and follows the width supplied by Field or the form layout.",
@@ -15295,6 +15949,18 @@
15295
15949
  "type": "boolean",
15296
15950
  "required": false
15297
15951
  },
15952
+ "lengthBehavior": {
15953
+ "type": "'error' | 'restrict'",
15954
+ "required": false
15955
+ },
15956
+ "maxLength": {
15957
+ "type": "number | undefined",
15958
+ "required": false
15959
+ },
15960
+ "minLength": {
15961
+ "type": "number | undefined",
15962
+ "required": false
15963
+ },
15298
15964
  "name": {
15299
15965
  "type": "string | undefined",
15300
15966
  "required": false
@@ -15323,6 +15989,10 @@
15323
15989
  "type": "number",
15324
15990
  "required": false
15325
15991
  },
15992
+ "showCharacterCount": {
15993
+ "type": "boolean",
15994
+ "required": false
15995
+ },
15326
15996
  "size": {
15327
15997
  "type": "TextareaSize",
15328
15998
  "required": false
@@ -15365,7 +16035,7 @@
15365
16035
  {
15366
16036
  "name": "time-picker",
15367
16037
  "title": "TimePicker",
15368
- "description": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
16038
+ "description": "Bounded 12- or 24-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
15369
16039
  "type": "registry:ui",
15370
16040
  "meta": {
15371
16041
  "library": "@ds-mo/ui",
@@ -15376,7 +16046,7 @@
15376
16046
  "intent": {
15377
16047
  "audience": "general",
15378
16048
  "status": "stable",
15379
- "summary": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
16049
+ "summary": "Bounded 12- or 24-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
15380
16050
  "useWhen": [
15381
16051
  "A user picks a clock time from hour, minute, and AM/PM lists.",
15382
16052
  "A time field needs 32px clock tiles that match calendar day geometry and the shared choice-list selected treatment."
@@ -15404,13 +16074,14 @@
15404
16074
  ],
15405
16075
  "accessibility": [
15406
16076
  "Hour, minute, and AM/PM are separate labelled listboxes without visible column headings. Each list keeps one tab stop on the selected option.",
15407
- "Arrow keys move to the next or previous option and stop at the first and last values; they do not wrap. Home and End jump to those ends. Left and Right move between columns and stop at Hour and AM/PM.",
16077
+ "Arrow keys move to the next or previous option and stop at the first and last values; they do not wrap. Home and End jump to those ends. Left and Right move between columns and stop at the first and last visible columns.",
15408
16078
  "Inactive pickers disable every option. Optional min and max times disable combinations outside that inclusive bound."
15409
16079
  ],
15410
16080
  "states": [
15411
16081
  "Selected hour, minute, and period tiles use the shared interaction-fill selected wash and primary text. Resting tiles use secondary text on a transparent 32px square.",
15412
- "Lists are finite. Hour runs 1 through 12, minutes follow the step, and AM/PM has two values. Scrolling and keyboard movement stop at those ends instead of looping.",
15413
- "An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state."
16082
+ "Lists are finite. Hours follow the selected clock format, minutes follow the step, and the twelve-hour period list has two values. Scrolling and keyboard movement stop at those ends instead of looping.",
16083
+ "An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state.",
16084
+ "The default twelve-hour presentation includes AM/PM. Twenty-four-hour presentation uses hours 00–23 and omits the period column; both keep HH:MM form values and the same time bounds."
15414
16085
  ],
15415
16086
  "responsiveBehavior": [
15416
16087
  "The three columns fill the width supplied by the owner. Tile size, 4px gaps, and the seven-tile list viewport are owned here; the owner supplies the popup or pane width."
@@ -15448,6 +16119,10 @@
15448
16119
  "type": "boolean",
15449
16120
  "required": false
15450
16121
  },
16122
+ "hourFormat": {
16123
+ "type": "'12' | '24'",
16124
+ "required": false
16125
+ },
15451
16126
  "isInactive": {
15452
16127
  "type": "boolean",
15453
16128
  "required": false