@ds-mo/ui 15.2.0 → 15.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (504) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +3 -3
  3. package/dist/agent.json +936 -80
  4. package/dist/angular/ds-card-setting.d.ts +1 -1
  5. package/dist/angular/ds-card-setting.js +3 -3
  6. package/dist/angular/ds-checkbox-group.d.ts +12 -0
  7. package/dist/angular/ds-checkbox-group.js +38 -0
  8. package/dist/angular/ds-checkbox.d.ts +1 -1
  9. package/dist/angular/ds-checkbox.js +3 -3
  10. package/dist/angular/ds-inline-banner-settings.d.ts +12 -0
  11. package/dist/angular/ds-inline-banner-settings.js +38 -0
  12. package/dist/angular/ds-input-time.d.ts +1 -1
  13. package/dist/angular/ds-input-time.js +3 -3
  14. package/dist/angular/ds-input.d.ts +5 -1
  15. package/dist/angular/ds-input.js +10 -4
  16. package/dist/angular/ds-map-entity-marker.d.ts +1 -1
  17. package/dist/angular/ds-map-entity-marker.js +3 -3
  18. package/dist/angular/ds-radio-tile.d.ts +15 -0
  19. package/dist/angular/ds-radio-tile.js +43 -0
  20. package/dist/angular/ds-radio.d.ts +1 -1
  21. package/dist/angular/ds-radio.js +3 -3
  22. package/dist/angular/ds-setting-row-checkbox.d.ts +12 -0
  23. package/dist/angular/ds-setting-row-checkbox.js +38 -0
  24. package/dist/angular/ds-setting-row-radio.d.ts +12 -0
  25. package/dist/angular/ds-setting-row-radio.js +38 -0
  26. package/dist/angular/ds-setting-row-toggle.d.ts +18 -0
  27. package/dist/angular/ds-setting-row-toggle.js +42 -0
  28. package/dist/angular/ds-slider.d.ts +1 -1
  29. package/dist/angular/ds-slider.js +3 -3
  30. package/dist/angular/ds-textarea.d.ts +1 -1
  31. package/dist/angular/ds-textarea.js +3 -3
  32. package/dist/angular/ds-time-picker.d.ts +1 -1
  33. package/dist/angular/ds-time-picker.js +3 -3
  34. package/dist/angular/index.d.ts +1 -1
  35. package/dist/angular/index.js +6 -0
  36. package/dist/angular/number-value-accessor.d.ts +9 -0
  37. package/dist/angular/number-value-accessor.js +39 -0
  38. package/dist/angular/proxies.d.ts +6 -0
  39. package/dist/angular/proxies.js +6 -0
  40. package/dist/angular/radio-value-accessor.d.ts +1 -1
  41. package/dist/angular/radio-value-accessor.js +2 -2
  42. package/dist/angular/select-value-accessor.d.ts +1 -1
  43. package/dist/angular/select-value-accessor.js +2 -2
  44. package/dist/angular/text-value-accessor.d.ts +1 -1
  45. package/dist/angular/text-value-accessor.js +2 -2
  46. package/dist/components/ds-agent-activity.js +1 -1
  47. package/dist/components/ds-agent-questionnaire.js +1 -1
  48. package/dist/components/ds-agent-response.js +1 -1
  49. package/dist/components/ds-agent-response.js.map +1 -1
  50. package/dist/components/ds-agent-source-list.js +1 -1
  51. package/dist/components/ds-agent-tool-call.js +1 -1
  52. package/dist/components/ds-attachment-list.js +1 -1
  53. package/dist/components/ds-badge.js +1 -1
  54. package/dist/components/ds-banner.js +1 -1
  55. package/dist/components/ds-bar-action.js +1 -1
  56. package/dist/components/ds-bar-nav.js +1 -1
  57. package/dist/components/ds-bar-page-title.js +1 -1
  58. package/dist/components/ds-bar-title.js +1 -1
  59. package/dist/components/ds-bar-workflow.js +1 -1
  60. package/dist/components/ds-breadcrumb.js +1 -1
  61. package/dist/components/ds-button-filled.js +1 -1
  62. package/dist/components/ds-button-inverted.js +1 -1
  63. package/dist/components/ds-button-inverted.js.map +1 -1
  64. package/dist/components/ds-button-unfilled.js +1 -1
  65. package/dist/components/ds-calendar.js +1 -1
  66. package/dist/components/ds-card-action-center.js +1 -1
  67. package/dist/components/ds-card-action-center.js.map +1 -1
  68. package/dist/components/ds-card-chart.js +1 -1
  69. package/dist/components/ds-card-navigation.js +1 -1
  70. package/dist/components/ds-card-navigation.js.map +1 -1
  71. package/dist/components/ds-card-overview.js +1 -1
  72. package/dist/components/ds-card-overview.js.map +1 -1
  73. package/dist/components/ds-card-setting.js +1 -1
  74. package/dist/components/ds-card-setting.js.map +1 -1
  75. package/dist/components/ds-card-settings-scope.js +1 -1
  76. package/dist/components/ds-card-settings-scope.js.map +1 -1
  77. package/dist/components/ds-chart-legend.js +1 -1
  78. package/dist/components/ds-chart-legend.js.map +1 -1
  79. package/dist/components/ds-chart.js +1 -1
  80. package/dist/components/ds-checkbox-group.d.ts +11 -0
  81. package/dist/components/ds-checkbox-group.js +2 -0
  82. package/dist/components/ds-checkbox-group.js.map +1 -0
  83. package/dist/components/ds-checkbox.js +1 -1
  84. package/dist/components/ds-chip.js +1 -1
  85. package/dist/components/ds-code-block.js +1 -1
  86. package/dist/components/ds-conversation-list-item.js +1 -1
  87. package/dist/components/ds-conversation-list-item.js.map +1 -1
  88. package/dist/components/ds-conversation-list-section.js +1 -1
  89. package/dist/components/ds-conversation-list.js +1 -1
  90. package/dist/components/ds-data-customize.js +1 -1
  91. package/dist/components/ds-data-customize.js.map +1 -1
  92. package/dist/components/ds-data-filter.js +1 -1
  93. package/dist/components/ds-data-filter.js.map +1 -1
  94. package/dist/components/ds-data-group.js +1 -1
  95. package/dist/components/ds-data-preferences.js +1 -1
  96. package/dist/components/ds-data-preferences.js.map +1 -1
  97. package/dist/components/ds-data-saved-views.js +1 -1
  98. package/dist/components/ds-data-saved-views.js.map +1 -1
  99. package/dist/components/ds-data-search.js +1 -1
  100. package/dist/components/ds-data-search.js.map +1 -1
  101. package/dist/components/ds-data-sort.js +1 -1
  102. package/dist/components/ds-data-toolbar.js +1 -1
  103. package/dist/components/ds-divider.js +1 -1
  104. package/dist/components/ds-empty-state.js +1 -1
  105. package/dist/components/ds-field.js +1 -1
  106. package/dist/components/ds-filter-menu.js +1 -1
  107. package/dist/components/ds-inline-banner-settings.d.ts +11 -0
  108. package/dist/components/ds-inline-banner-settings.js +2 -0
  109. package/dist/components/ds-inline-banner-settings.js.map +1 -0
  110. package/dist/components/ds-input-date.js +1 -1
  111. package/dist/components/ds-input-date.js.map +1 -1
  112. package/dist/components/ds-input-time.js +1 -1
  113. package/dist/components/ds-input-time.js.map +1 -1
  114. package/dist/components/ds-input.js +1 -1
  115. package/dist/components/ds-map-cluster-marker.js +1 -1
  116. package/dist/components/ds-map-entity-marker.js +1 -1
  117. package/dist/components/ds-map-entity-marker.js.map +1 -1
  118. package/dist/components/ds-markdown.js +1 -1
  119. package/dist/components/ds-menu.js +1 -1
  120. package/dist/components/ds-message-actions.js +1 -1
  121. package/dist/components/ds-message-bubble.js +1 -1
  122. package/dist/components/ds-message-bubble.js.map +1 -1
  123. package/dist/components/ds-message-composer.js +1 -1
  124. package/dist/components/ds-message-composer.js.map +1 -1
  125. package/dist/components/ds-message-scroller.js +1 -1
  126. package/dist/components/ds-message.js +1 -1
  127. package/dist/components/ds-mobile-bar-nav.js +1 -1
  128. package/dist/components/ds-mobile-header.js +1 -1
  129. package/dist/components/ds-mobile-section-switcher.js +1 -1
  130. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  131. package/dist/components/ds-modal.js +1 -1
  132. package/dist/components/ds-pagination.js +1 -1
  133. package/dist/components/ds-panel-nav.js +1 -1
  134. package/dist/components/ds-panel-sub-nav.js +1 -1
  135. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  136. package/dist/components/ds-panel-tool-header.js +1 -1
  137. package/dist/components/ds-panel-tool-search.js +1 -1
  138. package/dist/components/ds-panel-tool-search.js.map +1 -1
  139. package/dist/components/ds-panel-tools.js +1 -1
  140. package/dist/components/ds-paper-texture.js +1 -1
  141. package/dist/components/ds-radio-tile.d.ts +11 -0
  142. package/dist/components/ds-radio-tile.js +2 -0
  143. package/dist/components/ds-radio-tile.js.map +1 -0
  144. package/dist/components/ds-radio.js +1 -1
  145. package/dist/components/ds-score.js +1 -1
  146. package/dist/components/ds-scroll-overlay.js +1 -1
  147. package/dist/components/ds-select.js +1 -1
  148. package/dist/components/ds-setting-row-checkbox.d.ts +11 -0
  149. package/dist/components/ds-setting-row-checkbox.js +2 -0
  150. package/dist/components/ds-setting-row-checkbox.js.map +1 -0
  151. package/dist/components/ds-setting-row-radio.d.ts +11 -0
  152. package/dist/components/ds-setting-row-radio.js +2 -0
  153. package/dist/components/ds-setting-row-radio.js.map +1 -0
  154. package/dist/components/ds-setting-row-toggle.d.ts +11 -0
  155. package/dist/components/ds-setting-row-toggle.js +2 -0
  156. package/dist/components/ds-setting-row-toggle.js.map +1 -0
  157. package/dist/components/ds-shell-app.js +1 -1
  158. package/dist/components/ds-shell-app.js.map +1 -1
  159. package/dist/components/ds-shell-page.js +1 -1
  160. package/dist/components/ds-shell-tools.js +1 -1
  161. package/dist/components/ds-skeleton.js +1 -1
  162. package/dist/components/ds-slider.js +1 -1
  163. package/dist/components/ds-slider.js.map +1 -1
  164. package/dist/components/ds-swatch-picker.js +1 -1
  165. package/dist/components/ds-switch.js +1 -1
  166. package/dist/components/ds-tab-group.js +1 -1
  167. package/dist/components/ds-table.js +1 -1
  168. package/dist/components/ds-table.js.map +1 -1
  169. package/dist/components/ds-tag.js +1 -1
  170. package/dist/components/ds-text.js +1 -1
  171. package/dist/components/ds-textarea.js +1 -1
  172. package/dist/components/ds-textarea.js.map +1 -1
  173. package/dist/components/ds-time-picker.js +1 -1
  174. package/dist/components/ds-toast.js +1 -1
  175. package/dist/components/ds-tooltip-chart.js +1 -1
  176. package/dist/components/ds-tooltip.js +1 -1
  177. package/dist/components/ds-typing-indicator.js +1 -1
  178. package/dist/components/p-7TVdPhGR.js +2 -0
  179. package/dist/components/{p-YrnU2fM7.js.map → p-7TVdPhGR.js.map} +1 -1
  180. package/dist/components/{p-7V1AhetH.js → p-B0BQCVkq.js} +2 -2
  181. package/dist/components/p-B0EpvBDs.js +2 -0
  182. package/dist/components/{p-lamoJZE4.js.map → p-B0EpvBDs.js.map} +1 -1
  183. package/dist/components/{p-Cu8o2rOz.js → p-B39iJO8F.js} +2 -2
  184. package/dist/components/p-B9TM6FqC.js +2 -0
  185. package/dist/components/{p-BJJh-Bf7.js.map → p-B9TM6FqC.js.map} +1 -1
  186. package/dist/components/{p-B6qQaYkB.js → p-B9y6azEw.js} +2 -2
  187. package/dist/components/p-BDdlJZyL.js +2 -0
  188. package/dist/components/{p-CZ7hxDy_.js.map → p-BDdlJZyL.js.map} +1 -1
  189. package/dist/components/{p-5SVmAjXY.js → p-BERXvOCf.js} +2 -2
  190. package/dist/components/{p-xhn1cZgU.js → p-BFHpU-uU.js} +2 -2
  191. package/dist/components/{p-CuWPWC3t.js → p-BQspV5U7.js} +2 -2
  192. package/dist/components/p-BWSIw8AQ.js +2 -0
  193. package/dist/components/p-BWSIw8AQ.js.map +1 -0
  194. package/dist/components/p-BhjqYTiY.js +2 -0
  195. package/dist/components/p-BhjqYTiY.js.map +1 -0
  196. package/dist/components/{p-BOhefRMt.js → p-Bk3poU91.js} +2 -2
  197. package/dist/components/{p-QWukusRL.js → p-BnuNaXR2.js} +2 -2
  198. package/dist/components/p-BwdnVqAY.js +2 -0
  199. package/dist/components/p-BwdnVqAY.js.map +1 -0
  200. package/dist/components/p-C4huuwed.js +2 -0
  201. package/dist/components/{p-CRk0TjQv.js.map → p-C4huuwed.js.map} +1 -1
  202. package/dist/components/{p-BtnTQp4K.js → p-C8V4lkVy.js} +2 -2
  203. package/dist/components/p-CJ1NnOEW.js +2 -0
  204. package/dist/components/p-CJ1NnOEW.js.map +1 -0
  205. package/dist/components/p-CPamUzaj.js +2 -0
  206. package/dist/components/{p-CNZ6-kWd.js.map → p-CPamUzaj.js.map} +1 -1
  207. package/dist/components/{p-Dqfc6Nvd.js → p-CUDocY23.js} +2 -2
  208. package/dist/components/{p-Dqfc6Nvd.js.map → p-CUDocY23.js.map} +1 -1
  209. package/dist/components/p-CX6ZxUQT.js +2 -0
  210. package/dist/components/p-CX6ZxUQT.js.map +1 -0
  211. package/dist/components/p-CZNZTcYS.js +2 -0
  212. package/dist/components/p-CZNZTcYS.js.map +1 -0
  213. package/dist/components/p-CbCN9ew9.js +2 -0
  214. package/dist/components/p-CbCN9ew9.js.map +1 -0
  215. package/dist/components/p-CeXf9-X3.js.map +1 -1
  216. package/dist/components/p-Cgn-BORA.js +2 -0
  217. package/dist/components/p-Cgn-BORA.js.map +1 -0
  218. package/dist/components/{p-mux14tWZ.js → p-Co1rUdOR.js} +2 -2
  219. package/dist/components/p-Co1rUdOR.js.map +1 -0
  220. package/dist/components/{p-CGidq1iC.js → p-CuwopElg.js} +2 -2
  221. package/dist/components/p-CwUXroLs.js +2 -0
  222. package/dist/components/{p-etg-Uk1u.js.map → p-CwUXroLs.js.map} +1 -1
  223. package/dist/components/{p-Cn6AfzeF.js → p-CwdRaJER.js} +2 -2
  224. package/dist/components/p-D6FRqNhN.js +2 -0
  225. package/dist/components/p-D6FRqNhN.js.map +1 -0
  226. package/dist/components/{p-ZwRLjD5M.js → p-D8OWhnID.js} +2 -2
  227. package/dist/components/p-DCyJ3_PL.js +2 -0
  228. package/dist/components/{p-BZ_e69zx.js.map → p-DCyJ3_PL.js.map} +1 -1
  229. package/dist/components/{p-C_Ma6Xa-.js → p-DIQiHX0q.js} +2 -2
  230. package/dist/components/{p-B3CZvMXs.js → p-DJDbskZf.js} +2 -2
  231. package/dist/components/p-DRdoGSGX.js +2 -0
  232. package/dist/components/{p-CTGgXIXM.js.map → p-DRdoGSGX.js.map} +1 -1
  233. package/dist/components/{p-C1gaWjOm.js → p-DSZPO06T.js} +2 -2
  234. package/dist/components/{p-uADksYMl.js → p-DSmDyI2o.js} +2 -2
  235. package/dist/components/{p-UY63jmrO.js → p-DVEx-Xg9.js} +2 -2
  236. package/dist/components/p-DXk1eml1.js +2 -0
  237. package/dist/components/{p-Dlp1HqgS.js.map → p-DXk1eml1.js.map} +1 -1
  238. package/dist/components/{p-p0FVyEFa.js → p-DYQa1DVF.js} +2 -2
  239. package/dist/components/p-DYQa1DVF.js.map +1 -0
  240. package/dist/components/p-DYsE6HLk.js +2 -0
  241. package/dist/components/p-DYsE6HLk.js.map +1 -0
  242. package/dist/components/{p-vfCu7XSc.js → p-DZ58Sg5a.js} +2 -2
  243. package/dist/components/p-DebLYW7A.js +2 -0
  244. package/dist/components/p-DebLYW7A.js.map +1 -0
  245. package/dist/components/p-DhKvqh5G.js +2 -0
  246. package/dist/components/p-DhKvqh5G.js.map +1 -0
  247. package/dist/components/{p-DFO5lV_A.js → p-DmSnHVW6.js} +2 -2
  248. package/dist/components/p-Dnt5xUBD.js +2 -0
  249. package/dist/components/{p-BR5OC2PX.js.map → p-Dnt5xUBD.js.map} +1 -1
  250. package/dist/components/p-Doa2blZT.js +2 -0
  251. package/dist/components/{p-BLuqpHvp.js.map → p-Doa2blZT.js.map} +1 -1
  252. package/dist/components/{p-DsLXlxt3.js → p-Dyqd-cub.js} +2 -2
  253. package/dist/components/p-Dyqd-cub.js.map +1 -0
  254. package/dist/components/p-DzvTC27M.js +2 -0
  255. package/dist/components/p-DzvTC27M.js.map +1 -0
  256. package/dist/components/p-JBki_jyY.js +2 -0
  257. package/dist/components/{p-C0JkLR83.js.map → p-JBki_jyY.js.map} +1 -1
  258. package/dist/components/p-MOJmB6vX.js +2 -0
  259. package/dist/components/{p-BzYW1IqO.js.map → p-MOJmB6vX.js.map} +1 -1
  260. package/dist/components/p-TVkFIMXz.js +2 -0
  261. package/dist/components/p-TVkFIMXz.js.map +1 -0
  262. package/dist/components/{p-ER5M085B.js → p-UJMEz8_O.js} +2 -2
  263. package/dist/components/{p-CR-Jjdcn.js → p-_IqSPt5V.js} +2 -2
  264. package/dist/components/p-g0jsfEXz.js +2 -0
  265. package/dist/components/{p-BfF4RZdp.js.map → p-g0jsfEXz.js.map} +1 -1
  266. package/dist/components/{p-BLSSaVWm.js → p-pp1IQN4Z.js} +2 -2
  267. package/dist/docs/components.json +2901 -835
  268. package/dist/framework/angular.d.ts +1 -0
  269. package/dist/framework/angular.js +1 -0
  270. package/dist/lib/shell/index.js +1 -1
  271. package/dist/lib/shell/index.js.map +1 -1
  272. package/dist/lint/index.js +1 -1
  273. package/dist/mcp-data/registry/agent-activity.json +2 -2
  274. package/dist/mcp-data/registry/agent-questionnaire.json +2 -2
  275. package/dist/mcp-data/registry/agent-response.json +3 -3
  276. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  277. package/dist/mcp-data/registry/agent-tool-call.json +2 -2
  278. package/dist/mcp-data/registry/attachment-list.json +2 -2
  279. package/dist/mcp-data/registry/avatar.json +2 -2
  280. package/dist/mcp-data/registry/badge.json +2 -2
  281. package/dist/mcp-data/registry/banner.json +2 -2
  282. package/dist/mcp-data/registry/bar-action.json +2 -2
  283. package/dist/mcp-data/registry/bar-nav.json +5 -5
  284. package/dist/mcp-data/registry/bar-page-title.json +4 -4
  285. package/dist/mcp-data/registry/bar-title.json +4 -4
  286. package/dist/mcp-data/registry/bar-workflow.json +2 -2
  287. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  288. package/dist/mcp-data/registry/button-filled.json +2 -2
  289. package/dist/mcp-data/registry/button-inverted.json +2 -2
  290. package/dist/mcp-data/registry/button-unfilled.json +9 -9
  291. package/dist/mcp-data/registry/calendar.json +2 -2
  292. package/dist/mcp-data/registry/card-action-center.json +2 -2
  293. package/dist/mcp-data/registry/card-chart.json +2 -2
  294. package/dist/mcp-data/registry/card-navigation.json +2 -2
  295. package/dist/mcp-data/registry/card-overview.json +2 -2
  296. package/dist/mcp-data/registry/card-setting.json +50 -15
  297. package/dist/mcp-data/registry/card-settings-scope.json +2 -2
  298. package/dist/mcp-data/registry/chart-legend.json +2 -2
  299. package/dist/mcp-data/registry/chart.json +2 -2
  300. package/dist/mcp-data/registry/checkbox-group.json +246 -0
  301. package/dist/mcp-data/registry/checkbox.json +26 -6
  302. package/dist/mcp-data/registry/chip.json +2 -2
  303. package/dist/mcp-data/registry/code-block.json +2 -2
  304. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  305. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  306. package/dist/mcp-data/registry/conversation-list.json +2 -2
  307. package/dist/mcp-data/registry/data-customize.json +3 -3
  308. package/dist/mcp-data/registry/data-filter.json +2 -2
  309. package/dist/mcp-data/registry/data-group.json +2 -2
  310. package/dist/mcp-data/registry/data-preferences.json +2 -2
  311. package/dist/mcp-data/registry/data-saved-views.json +2 -2
  312. package/dist/mcp-data/registry/data-search.json +2 -2
  313. package/dist/mcp-data/registry/data-sort.json +2 -2
  314. package/dist/mcp-data/registry/data-toolbar.json +2 -2
  315. package/dist/mcp-data/registry/divider.json +2 -2
  316. package/dist/mcp-data/registry/empty-state.json +27 -14
  317. package/dist/mcp-data/registry/field.json +6 -5
  318. package/dist/mcp-data/registry/filter-menu.json +2 -2
  319. package/dist/mcp-data/registry/icon.json +2 -2
  320. package/dist/mcp-data/registry/inline-banner-settings.json +175 -0
  321. package/dist/mcp-data/registry/input-date.json +2 -2
  322. package/dist/mcp-data/registry/input-time.json +26 -7
  323. package/dist/mcp-data/registry/input.json +265 -15
  324. package/dist/mcp-data/registry/loader.json +2 -2
  325. package/dist/mcp-data/registry/map-cluster-marker.json +3 -3
  326. package/dist/mcp-data/registry/map-entity-marker.json +56 -56
  327. package/dist/mcp-data/registry/markdown.json +2 -2
  328. package/dist/mcp-data/registry/menu.json +2 -2
  329. package/dist/mcp-data/registry/message-actions.json +2 -2
  330. package/dist/mcp-data/registry/message-bubble.json +5 -5
  331. package/dist/mcp-data/registry/message-composer.json +7 -7
  332. package/dist/mcp-data/registry/message-scroller.json +2 -2
  333. package/dist/mcp-data/registry/message.json +3 -3
  334. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  335. package/dist/mcp-data/registry/mobile-header.json +2 -2
  336. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  337. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  338. package/dist/mcp-data/registry/modal.json +2 -2
  339. package/dist/mcp-data/registry/pagination.json +2 -2
  340. package/dist/mcp-data/registry/panel-nav.json +4 -4
  341. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  342. package/dist/mcp-data/registry/panel-tool-header.json +4 -4
  343. package/dist/mcp-data/registry/panel-tool-search.json +3 -3
  344. package/dist/mcp-data/registry/panel-tools.json +4 -4
  345. package/dist/mcp-data/registry/paper-texture.json +2 -2
  346. package/dist/mcp-data/registry/radio-tile.json +399 -0
  347. package/dist/mcp-data/registry/radio.json +51 -9
  348. package/dist/mcp-data/registry/registry.json +954 -80
  349. package/dist/mcp-data/registry/score.json +2 -2
  350. package/dist/mcp-data/registry/scroll-overlay.json +2 -2
  351. package/dist/mcp-data/registry/select.json +2 -2
  352. package/dist/mcp-data/registry/setting-row-checkbox.json +197 -0
  353. package/dist/mcp-data/registry/setting-row-radio.json +196 -0
  354. package/dist/mcp-data/registry/setting-row-toggle.json +233 -0
  355. package/dist/mcp-data/registry/shell-app.json +4 -4
  356. package/dist/mcp-data/registry/shell-page.json +2 -2
  357. package/dist/mcp-data/registry/shell-tools.json +2 -2
  358. package/dist/mcp-data/registry/skeleton.json +2 -2
  359. package/dist/mcp-data/registry/slider.json +32 -12
  360. package/dist/mcp-data/registry/swatch-picker.json +2 -2
  361. package/dist/mcp-data/registry/switch.json +4 -4
  362. package/dist/mcp-data/registry/tab-group.json +2 -2
  363. package/dist/mcp-data/registry/table.json +5 -5
  364. package/dist/mcp-data/registry/tag.json +2 -2
  365. package/dist/mcp-data/registry/text.json +2 -2
  366. package/dist/mcp-data/registry/textarea.json +72 -5
  367. package/dist/mcp-data/registry/time-picker.json +28 -9
  368. package/dist/mcp-data/registry/toast.json +2 -2
  369. package/dist/mcp-data/registry/tooltip-chart.json +2 -2
  370. package/dist/mcp-data/registry/tooltip.json +2 -2
  371. package/dist/mcp-data/registry/typing-indicator.json +2 -2
  372. package/dist/react/components.d.ts +6 -0
  373. package/dist/react/components.js +6 -0
  374. package/dist/react/ds-checkbox-group.d.ts +9 -0
  375. package/dist/react/ds-checkbox-group.js +12 -0
  376. package/dist/react/ds-inline-banner-settings.d.ts +9 -0
  377. package/dist/react/ds-inline-banner-settings.js +12 -0
  378. package/dist/react/ds-input.d.ts +2 -0
  379. package/dist/react/ds-input.js +2 -0
  380. package/dist/react/ds-radio-tile.d.ts +12 -0
  381. package/dist/react/ds-radio-tile.js +12 -0
  382. package/dist/react/ds-setting-row-checkbox.d.ts +9 -0
  383. package/dist/react/ds-setting-row-checkbox.js +12 -0
  384. package/dist/react/ds-setting-row-radio.d.ts +9 -0
  385. package/dist/react/ds-setting-row-radio.js +12 -0
  386. package/dist/react/ds-setting-row-toggle.d.ts +12 -0
  387. package/dist/react/ds-setting-row-toggle.js +12 -0
  388. package/dist/types/components/BarPageTitle/BarPageTitle.d.ts +2 -0
  389. package/dist/types/components/BarTitle/bar-title-action-chrome.d.ts +4 -0
  390. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +5 -2
  391. package/dist/types/components/CardSetting/CardSetting.d.ts +15 -3
  392. package/dist/types/components/CardSetting/index.d.ts +1 -1
  393. package/dist/types/components/Checkbox/Checkbox.d.ts +2 -0
  394. package/dist/types/components/CheckboxGroup/CheckboxGroup.d.ts +20 -0
  395. package/dist/types/components/EmptyState/EmptyState.d.ts +3 -0
  396. package/dist/types/components/Field/Field.d.ts +4 -0
  397. package/dist/types/components/InlineBannerSettings/InlineBannerSettings.d.ts +6 -0
  398. package/dist/types/components/Input/Input.d.ts +50 -1
  399. package/dist/types/components/InputTime/InputTime.d.ts +3 -0
  400. package/dist/types/components/MapEntityMarker/MapEntityMarker.d.ts +5 -5
  401. package/dist/types/components/Radio/Radio.d.ts +8 -0
  402. package/dist/types/components/RadioTile/RadioTile.d.ts +40 -0
  403. package/dist/types/components/RadioTile/index.d.ts +2 -0
  404. package/dist/types/components/SettingRowCheckbox/SettingRowCheckbox.d.ts +19 -0
  405. package/dist/types/components/SettingRowRadio/SettingRowRadio.d.ts +19 -0
  406. package/dist/types/components/SettingRowToggle/SettingRowToggle.d.ts +21 -0
  407. package/dist/types/components/Slider/Slider.d.ts +8 -1
  408. package/dist/types/components/Slider/index.d.ts +1 -1
  409. package/dist/types/components/Switch/Switch.d.ts +7 -0
  410. package/dist/types/components/Textarea/Textarea.d.ts +12 -0
  411. package/dist/types/components/TimePicker/TimePicker.d.ts +4 -0
  412. package/dist/types/components.d.ts +728 -37
  413. package/dist/types/utils/text-constraints.d.ts +20 -0
  414. package/dist/vue/components.d.ts +6 -0
  415. package/dist/vue/components.js +6 -0
  416. package/dist/vue/ds-card-setting.js +1 -0
  417. package/dist/vue/ds-checkbox-group.d.ts +3 -0
  418. package/dist/vue/ds-checkbox-group.js +12 -0
  419. package/dist/vue/ds-checkbox.js +1 -0
  420. package/dist/vue/ds-inline-banner-settings.d.ts +3 -0
  421. package/dist/vue/ds-inline-banner-settings.js +8 -0
  422. package/dist/vue/ds-input-time.js +1 -0
  423. package/dist/vue/ds-input.js +17 -0
  424. package/dist/vue/ds-map-entity-marker.js +2 -2
  425. package/dist/vue/ds-radio-tile.d.ts +3 -0
  426. package/dist/vue/ds-radio-tile.js +24 -0
  427. package/dist/vue/ds-radio.js +2 -0
  428. package/dist/vue/ds-setting-row-checkbox.d.ts +3 -0
  429. package/dist/vue/ds-setting-row-checkbox.js +11 -0
  430. package/dist/vue/ds-setting-row-radio.d.ts +3 -0
  431. package/dist/vue/ds-setting-row-radio.js +11 -0
  432. package/dist/vue/ds-setting-row-toggle.d.ts +3 -0
  433. package/dist/vue/ds-setting-row-toggle.js +15 -0
  434. package/dist/vue/ds-slider.d.ts +1 -1
  435. package/dist/vue/ds-slider.js +2 -1
  436. package/dist/vue/ds-textarea.js +4 -0
  437. package/dist/vue/ds-time-picker.js +1 -0
  438. package/package.json +5 -5
  439. package/dist/components/p-BCnzbfma.js +0 -2
  440. package/dist/components/p-BCnzbfma.js.map +0 -1
  441. package/dist/components/p-BJJh-Bf7.js +0 -2
  442. package/dist/components/p-BLuqpHvp.js +0 -2
  443. package/dist/components/p-BR5OC2PX.js +0 -2
  444. package/dist/components/p-BX506yEW.js +0 -2
  445. package/dist/components/p-BX506yEW.js.map +0 -1
  446. package/dist/components/p-BZ_e69zx.js +0 -2
  447. package/dist/components/p-BfF4RZdp.js +0 -2
  448. package/dist/components/p-Br5e83Fr.js +0 -2
  449. package/dist/components/p-Br5e83Fr.js.map +0 -1
  450. package/dist/components/p-Bv9rSkp0.js +0 -2
  451. package/dist/components/p-Bv9rSkp0.js.map +0 -1
  452. package/dist/components/p-BzYW1IqO.js +0 -2
  453. package/dist/components/p-C0JkLR83.js +0 -2
  454. package/dist/components/p-C6Aavz9h.js +0 -2
  455. package/dist/components/p-C6Aavz9h.js.map +0 -1
  456. package/dist/components/p-C6zycbhC.js +0 -2
  457. package/dist/components/p-C6zycbhC.js.map +0 -1
  458. package/dist/components/p-CNZ6-kWd.js +0 -2
  459. package/dist/components/p-CRk0TjQv.js +0 -2
  460. package/dist/components/p-CTGgXIXM.js +0 -2
  461. package/dist/components/p-CZ7hxDy_.js +0 -2
  462. package/dist/components/p-Cc3ZUQlJ.js +0 -2
  463. package/dist/components/p-Cc3ZUQlJ.js.map +0 -1
  464. package/dist/components/p-D5HxZrMA.js +0 -2
  465. package/dist/components/p-D5HxZrMA.js.map +0 -1
  466. package/dist/components/p-D7K1ZHML.js +0 -2
  467. package/dist/components/p-D7K1ZHML.js.map +0 -1
  468. package/dist/components/p-Dlp1HqgS.js +0 -2
  469. package/dist/components/p-DsLXlxt3.js.map +0 -1
  470. package/dist/components/p-YrnU2fM7.js +0 -2
  471. package/dist/components/p-ZYWnJaye.js +0 -2
  472. package/dist/components/p-ZYWnJaye.js.map +0 -1
  473. package/dist/components/p-etg-Uk1u.js +0 -2
  474. package/dist/components/p-lamoJZE4.js +0 -2
  475. package/dist/components/p-mV4vSjSK.js +0 -2
  476. package/dist/components/p-mV4vSjSK.js.map +0 -1
  477. package/dist/components/p-mux14tWZ.js.map +0 -1
  478. package/dist/components/p-mxZoWfnS.js +0 -2
  479. package/dist/components/p-mxZoWfnS.js.map +0 -1
  480. package/dist/components/p-p0FVyEFa.js.map +0 -1
  481. package/dist/components/p-xtGGIZmU.js +0 -2
  482. package/dist/components/p-xtGGIZmU.js.map +0 -1
  483. /package/dist/components/{p-7V1AhetH.js.map → p-B0BQCVkq.js.map} +0 -0
  484. /package/dist/components/{p-Cu8o2rOz.js.map → p-B39iJO8F.js.map} +0 -0
  485. /package/dist/components/{p-B6qQaYkB.js.map → p-B9y6azEw.js.map} +0 -0
  486. /package/dist/components/{p-5SVmAjXY.js.map → p-BERXvOCf.js.map} +0 -0
  487. /package/dist/components/{p-xhn1cZgU.js.map → p-BFHpU-uU.js.map} +0 -0
  488. /package/dist/components/{p-CuWPWC3t.js.map → p-BQspV5U7.js.map} +0 -0
  489. /package/dist/components/{p-BOhefRMt.js.map → p-Bk3poU91.js.map} +0 -0
  490. /package/dist/components/{p-QWukusRL.js.map → p-BnuNaXR2.js.map} +0 -0
  491. /package/dist/components/{p-BtnTQp4K.js.map → p-C8V4lkVy.js.map} +0 -0
  492. /package/dist/components/{p-CGidq1iC.js.map → p-CuwopElg.js.map} +0 -0
  493. /package/dist/components/{p-Cn6AfzeF.js.map → p-CwdRaJER.js.map} +0 -0
  494. /package/dist/components/{p-ZwRLjD5M.js.map → p-D8OWhnID.js.map} +0 -0
  495. /package/dist/components/{p-C_Ma6Xa-.js.map → p-DIQiHX0q.js.map} +0 -0
  496. /package/dist/components/{p-B3CZvMXs.js.map → p-DJDbskZf.js.map} +0 -0
  497. /package/dist/components/{p-C1gaWjOm.js.map → p-DSZPO06T.js.map} +0 -0
  498. /package/dist/components/{p-uADksYMl.js.map → p-DSmDyI2o.js.map} +0 -0
  499. /package/dist/components/{p-UY63jmrO.js.map → p-DVEx-Xg9.js.map} +0 -0
  500. /package/dist/components/{p-vfCu7XSc.js.map → p-DZ58Sg5a.js.map} +0 -0
  501. /package/dist/components/{p-DFO5lV_A.js.map → p-DmSnHVW6.js.map} +0 -0
  502. /package/dist/components/{p-ER5M085B.js.map → p-UJMEz8_O.js.map} +0 -0
  503. /package/dist/components/{p-CR-Jjdcn.js.map → p-_IqSPt5V.js.map} +0 -0
  504. /package/dist/components/{p-BLSSaVWm.js.map → p-pp1IQN4Z.js.map} +0 -0
@@ -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.6.1",
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."
@@ -1346,7 +1346,7 @@
1346
1346
  }
1347
1347
  ],
1348
1348
  "styling": {
1349
- "rationale": "The host participates in shell-owned layout; internal tabs and chrome own their recipes.",
1349
+ "rationale": "The host participates in ShellApp-owned layout; ShellApp owns the shared Chrome base and wash while BarNav owns Chrome foreground, border, and interaction recipes.",
1350
1350
  "protected": [],
1351
1351
  "customProperties": []
1352
1352
  }
@@ -2862,7 +2862,7 @@
2862
2862
  "General content UI keeps the selected interaction fill and border for pressed or active emphasis.",
2863
2863
  "Shell, navigation, and tool-rail composites use isActive with primary foreground across the complete control and no selected fill or border.",
2864
2864
  "The omitted default surface treatment is for primary and secondary parent surfaces and uses the brand-active selected fill; pass faint explicitly on faint surfaces to use the neutral active fill.",
2865
- "Surface context must match the actual parent surface; translucent, inverted, media, and always-dark treatments are reserved for those surfaces.",
2865
+ "Surface context must match the actual parent surface; chrome, translucent, inverted, media, and always-dark treatments are reserved for those surfaces. The chrome variant uses the chrome foreground, border, and interaction families and does not paint the parent surface.",
2866
2866
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
2867
2867
  "Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, or interaction semantics.",
2868
2868
  "Physical press scaling is on by default. Disable it only when an owning composite must keep child or background geometry fixed; hover and pressed interaction washes remain available.",
@@ -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,11 @@
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-toggle",
3974
+ "component:ds-setting-row-radio",
3975
+ "component:ds-setting-row-checkbox",
3976
+ "component:ds-inline-banner-settings"
3973
3977
  ],
3974
3978
  "accessibility": [
3975
3979
  "Provide a concise heading that identifies the settings section; CardSetting renders it as an h2.",
@@ -3984,25 +3988,30 @@
3984
3988
  "The editing property is controlled; CardSetting never changes it internally.",
3985
3989
  "dsAction emits edit, save, or cancel with the original pointer event. The parent decides whether and when editing changes.",
3986
3990
  "When another section requests edit, the parent keeps one active section and resolves any dirty current section before switching.",
3991
+ "Project persistent informational copy into the banner slot so it sits above the padded content body and does not receive content-area padding.",
3987
3992
  "The parent owns read-only versus editable body composition, dirty state, validation, persistence, loading, success, and error consequences.",
3988
3993
  "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."
3994
+ "A cancel request does not persist changes; the parent restores its chosen value snapshot and exits editing.",
3995
+ "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
3996
  ],
3991
3997
  "responsiveBehavior": [
3992
- "Choose sm, md, or lg from the parent layout; each width uses its matching token-based minimum height.",
3998
+ "Choose sm, md, or lg from the parent layout. Empty editable cards use the matching minimum height. Cards with body content, and immediate cards, fit that content.",
3993
3999
  "The surface never exceeds its parent width, while the parent owns wrapping, columns, stacking, and breakpoint changes.",
3994
4000
  "At narrow widths, keep the fixed header actions visible and let application-owned body layouts collapse before allowing horizontal overflow."
3995
4001
  ],
3996
4002
  "frameworkCaveats": {
3997
4003
  "customElements": [
4004
+ "Project ds-inline-banner-settings with slot=\"banner\". Leave setting rows and other controls in the default slot.",
3998
4005
  "Set editing as a JavaScript property and inspect dsAction.detail.action before updating the controlled state.",
3999
4006
  "When one section emits edit, update every sibling CardSetting so only the requested section remains editing."
4000
4007
  ],
4001
4008
  "react": [
4009
+ "Pass slot=\"banner\" on ds-inline-banner-settings. Leave setting rows and other controls in the default slot.",
4002
4010
  "Pass editing from parent state and inspect onDsAction event detail; do not treat Save as successful until validation and persistence complete.",
4003
4011
  "Store one active section id and derive each CardSetting editing prop from that id."
4004
4012
  ],
4005
4013
  "angular": [
4014
+ "Set slot=\"banner\" on ds-inline-banner-settings. Leave setting rows and other controls in the default slot.",
4006
4015
  "Bind [editing] and inspect $event.detail.action from (dsAction); do not treat Save as successful until validation and persistence complete.",
4007
4016
  "Store one active section id and derive each CardSetting editing binding from that id."
4008
4017
  ]
@@ -4037,14 +4046,22 @@
4037
4046
  "reason": "The component owns its surface radius; retain the shared recipe and customize an outer wrapper when needed.",
4038
4047
  "props": []
4039
4048
  },
4049
+ {
4050
+ "properties": [
4051
+ "padding"
4052
+ ],
4053
+ "reason": "Content-area padding-block belongs on the body. The banner slot sits above that padding and does not receive it.",
4054
+ "props": []
4055
+ },
4040
4056
  {
4041
4057
  "properties": [
4042
4058
  "width",
4043
4059
  "min-height"
4044
4060
  ],
4045
- "reason": "Card width selects the component geometry; use cardWidth and let the parent constrain available space.",
4061
+ "reason": "Card width selects the component geometry. Empty editable cards keep the matching minimum height; cards with body content and immediate cards fit that content. Let the parent constrain available space.",
4046
4062
  "props": [
4047
- "cardWidth"
4063
+ "cardWidth",
4064
+ "variant"
4048
4065
  ]
4049
4066
  }
4050
4067
  ],
@@ -4075,6 +4092,10 @@
4075
4092
  "saveLabel": {
4076
4093
  "type": "string",
4077
4094
  "required": false
4095
+ },
4096
+ "variant": {
4097
+ "type": "CardSettingVariant",
4098
+ "required": false
4078
4099
  }
4079
4100
  },
4080
4101
  "events": [
@@ -4570,7 +4591,8 @@
4570
4591
  "The initial checked and indeterminate values are restored by native form reset; checked values submit under name and unchecked values submit nothing.",
4571
4592
  "Sizes are lg with a 20px box in a 24px placement, md with a 16px box in a 20px placement, sm with a 12px box in a 16px placement, and xs with an 8px box in a 12px placement.",
4572
4593
  "Presentation mode removes checkbox semantics, focus, interaction, label rendering, description rendering, and form submission while preserving the visual state.",
4573
- "Description-rich checkboxes grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy."
4594
+ "Description-rich checkboxes grow beyond the fixed density height while retaining its minimum target size and align the checkbox placement with the primary label line.",
4595
+ "Form and settings usage omits a row hover or pressed wash by default; set hasInteractionFill only when the checkbox itself is presented as a choice-list row."
4574
4596
  ],
4575
4597
  "responsiveBehavior": [
4576
4598
  "Choose size from the density of the containing row; labels and descriptions may wrap while the placement box stays fixed.",
@@ -4631,7 +4653,8 @@
4631
4653
  "reason": "The component owns its surface and interaction treatment; use its semantic presentation props or compose an application-owned surrounding surface.",
4632
4654
  "props": [
4633
4655
  "size",
4634
- "presentation"
4656
+ "presentation",
4657
+ "hasInteractionFill"
4635
4658
  ]
4636
4659
  }
4637
4660
  ],
@@ -4651,6 +4674,10 @@
4651
4674
  "type": "boolean",
4652
4675
  "required": false
4653
4676
  },
4677
+ "hasInteractionFill": {
4678
+ "type": "boolean",
4679
+ "required": false
4680
+ },
4654
4681
  "indeterminate": {
4655
4682
  "type": "boolean",
4656
4683
  "required": false
@@ -4710,6 +4737,140 @@
4710
4737
  "text"
4711
4738
  ]
4712
4739
  },
4740
+ {
4741
+ "name": "checkbox-group",
4742
+ "title": "CheckboxGroup",
4743
+ "description": "A visible, accessible label and shared vertical rhythm for a list of independent Checkbox controls.",
4744
+ "type": "registry:ui",
4745
+ "meta": {
4746
+ "library": "@ds-mo/ui",
4747
+ "distribution": "npm",
4748
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/checkbox-group",
4749
+ "source": "src/wc/components/CheckboxGroup/CheckboxGroup.tsx",
4750
+ "intentStatus": "complete",
4751
+ "intent": {
4752
+ "audience": "general",
4753
+ "status": "experimental",
4754
+ "summary": "A visible, accessible label and shared vertical rhythm for a list of independent Checkbox controls.",
4755
+ "useWhen": [
4756
+ "Two or more related checkboxes need one visible group label in a form.",
4757
+ "A checkbox list should use the same density-aligned heading geometry as other compact option lists."
4758
+ ],
4759
+ "avoidWhen": [
4760
+ "Only one standalone checkbox is needed.",
4761
+ "Exactly one option may be selected; use Radio instead.",
4762
+ "The list is a settings-card row; use component:ds-setting-row-checkbox, which owns the heading and view/edit presentation."
4763
+ ],
4764
+ "alternatives": [
4765
+ {
4766
+ "when": "Exactly one option may be selected.",
4767
+ "component": "component:ds-radio",
4768
+ "reason": "Radio owns mutually exclusive selection and keyboard traversal."
4769
+ }
4770
+ ],
4771
+ "commonlyComposedWith": [
4772
+ "component:ds-checkbox",
4773
+ "component:ds-text",
4774
+ "component:ds-setting-row-checkbox"
4775
+ ],
4776
+ "accessibility": [
4777
+ "The visible label names the role=group container; each slotted Checkbox keeps its own visible label, state, focus, and form value.",
4778
+ "Inside ds-setting-row-checkbox the visible form label is omitted on first paint; the row heading is the accessible name via aria-labelledby.",
4779
+ "Use aria-describedby to associate group-level guidance or validation copy.",
4780
+ "Use the same size on CheckboxGroup and every slotted Checkbox so their text origins and density remain aligned."
4781
+ ],
4782
+ "states": [
4783
+ "The label uses the shared density section-heading row and body-small emphasis.",
4784
+ "Vertical checkbox options use a 4px gap; at medium density the group label and each single-line checkbox row are 32px high.",
4785
+ "Selection, mixed, inactive, validation, and form behavior remain owned by each slotted Checkbox."
4786
+ ],
4787
+ "responsiveBehavior": [
4788
+ "The group fills the width supplied by its parent while each Checkbox keeps its intrinsic row width and allows copy to wrap."
4789
+ ],
4790
+ "frameworkCaveats": {
4791
+ "customElements": [
4792
+ "Slot two or more ds-checkbox children and keep their name, value, and checked state application-owned."
4793
+ ],
4794
+ "react": [
4795
+ "Compose DsCheckbox children inside DsCheckboxGroup."
4796
+ ],
4797
+ "vue": [
4798
+ "Compose DsCheckbox children inside DsCheckboxGroup."
4799
+ ],
4800
+ "angular": [
4801
+ "Compose generated DsCheckbox adapters inside DsCheckboxGroup."
4802
+ ]
4803
+ },
4804
+ "references": [
4805
+ {
4806
+ "label": "Storybook examples",
4807
+ "path": "src/wc/components/CheckboxGroup/CheckboxGroup.stories.ts"
4808
+ },
4809
+ {
4810
+ "label": "Rendered form geometry coverage",
4811
+ "path": "tests/e2e/forms.spec.ts"
4812
+ }
4813
+ ],
4814
+ "styling": {
4815
+ "rationale": "The group owns only its label and option-list rhythm; each Checkbox owns its own selection anatomy.",
4816
+ "protected": [
4817
+ {
4818
+ "properties": [
4819
+ "gap",
4820
+ "padding",
4821
+ "font",
4822
+ "font-size",
4823
+ "font-weight",
4824
+ "line-height"
4825
+ ],
4826
+ "reason": "Use size to keep the heading and slotted controls on the shared density recipe.",
4827
+ "props": [
4828
+ "size"
4829
+ ]
4830
+ }
4831
+ ],
4832
+ "customProperties": []
4833
+ }
4834
+ },
4835
+ "props": {
4836
+ "ariaDescribedby": {
4837
+ "type": "string | undefined",
4838
+ "required": false
4839
+ },
4840
+ "ariaLabel": {
4841
+ "type": "string | null",
4842
+ "required": false
4843
+ },
4844
+ "ariaLabelledby": {
4845
+ "type": "string | undefined",
4846
+ "required": false
4847
+ },
4848
+ "label": {
4849
+ "type": "string",
4850
+ "required": false
4851
+ },
4852
+ "size": {
4853
+ "type": "CheckboxGroupSize",
4854
+ "required": false
4855
+ }
4856
+ },
4857
+ "events": [],
4858
+ "slots": [],
4859
+ "exports": {
4860
+ "customElement": "ds-checkbox-group",
4861
+ "react": "DsCheckboxGroup",
4862
+ "vue": "DsCheckboxGroup",
4863
+ "angular": "DsCheckboxGroup"
4864
+ }
4865
+ },
4866
+ "dependencies": [
4867
+ "@ds-mo/ui",
4868
+ "@ds-mo/tokens"
4869
+ ],
4870
+ "registryDependencies": [
4871
+ "text"
4872
+ ]
4873
+ },
4713
4874
  {
4714
4875
  "name": "chip",
4715
4876
  "title": "Chip",
@@ -6856,7 +7017,7 @@
6856
7017
  {
6857
7018
  "name": "empty-state",
6858
7019
  "title": "EmptyState",
6859
- "description": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
7020
+ "description": "Centered empty-content message with optional consumer-owned recovery actions.",
6860
7021
  "type": "registry:ui",
6861
7022
  "meta": {
6862
7023
  "library": "@ds-mo/ui",
@@ -6867,16 +7028,16 @@
6867
7028
  "intent": {
6868
7029
  "audience": "general",
6869
7030
  "status": "stable",
6870
- "summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
7031
+ "summary": "Centered empty-content message with optional consumer-owned recovery actions.",
6871
7032
  "useWhen": [
6872
7033
  "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
7034
  "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."
7035
+ "A compact owner such as a Select popup needs only centered body copy.",
7036
+ "An empty region needs a concise recovery action that helps the user reveal or create content."
6875
7037
  ],
6876
7038
  "avoidWhen": [
6877
7039
  "Content is still loading; use Skeleton for predictable structure or Loader for an indeterminate operation.",
6878
7040
  "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
7041
  "A decorative illustration, arbitrary rich content, or custom layout is required."
6881
7042
  ],
6882
7043
  "alternatives": [
@@ -6900,20 +7061,23 @@
6900
7061
  "component:ds-table",
6901
7062
  "component:ds-select",
6902
7063
  "component:ds-text",
6903
- "component:ds-icon"
7064
+ "component:ds-icon",
7065
+ "component:ds-button-unfilled"
6904
7066
  ],
6905
7067
  "accessibility": [
6906
7068
  "The optional icon is decorative; the title and body provide all meaning in text.",
6907
7069
  "EmptyState does not create a live region or alert automatically. The owner decides whether a dynamic transition requires announcement.",
6908
7070
  "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."
7071
+ "Keep localized body copy concise and sufficient when using the body-only variant.",
7072
+ "Give recovery controls explicit accessible names and keep their behavior with the owning workflow."
6910
7073
  ],
6911
7074
  "states": [
6912
7075
  "Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
6913
7076
  "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
7077
  "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."
7078
+ "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.",
7079
+ "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants.",
7080
+ "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
7081
  ],
6918
7082
  "responsiveBehavior": [
6919
7083
  "The owner controls available width and height; text wraps naturally while remaining centered.",
@@ -6961,7 +7125,9 @@
6961
7125
  }
6962
7126
  },
6963
7127
  "events": [],
6964
- "slots": [],
7128
+ "slots": [
7129
+ "actions"
7130
+ ],
6965
7131
  "exports": {
6966
7132
  "customElement": "ds-empty-state",
6967
7133
  "react": "DsEmptyState",
@@ -7034,7 +7200,8 @@
7034
7200
  "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
7201
  "A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
7036
7202
  "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."
7203
+ "The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text.",
7204
+ "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
7205
  ],
7039
7206
  "responsiveBehavior": [
7040
7207
  "Field fills the width supplied by its parent and makes the slotted control fill that field width.",
@@ -7601,10 +7768,125 @@
7601
7768
  ],
7602
7769
  "registryDependencies": []
7603
7770
  },
7771
+ {
7772
+ "name": "inline-banner-settings",
7773
+ "title": "InlineBannerSettings",
7774
+ "description": "Compact non-interactive informational copy row for settings cards.",
7775
+ "type": "registry:ui",
7776
+ "meta": {
7777
+ "library": "@ds-mo/ui",
7778
+ "distribution": "npm",
7779
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/inline-banner-settings",
7780
+ "source": "src/wc/components/InlineBannerSettings/InlineBannerSettings.tsx",
7781
+ "intentStatus": "complete",
7782
+ "intent": {
7783
+ "audience": "general",
7784
+ "status": "stable",
7785
+ "summary": "Compact non-interactive informational copy row for settings cards.",
7786
+ "useWhen": [
7787
+ "A settings card needs persistent informational copy above its content.",
7788
+ "The message should remain visible in both read-only and editing presentations of the settings card.",
7789
+ "The message needs body-small typography, compact spacing, and a single tertiary bottom boundary."
7790
+ ],
7791
+ "avoidWhen": [
7792
+ "The message belongs in general bounded content outside a settings card; reserve the general inline-banner component for that use case.",
7793
+ "The message is application-wide or needs dismissal, actions, or announcement urgency; use Banner.",
7794
+ "The message is transient or follows a completed action; use Toast."
7795
+ ],
7796
+ "alternatives": [
7797
+ {
7798
+ "when": "A persistent application-wide condition needs optional actions or dismissal.",
7799
+ "component": "component:ds-banner",
7800
+ "reason": "Banner owns shell-level messaging, actions, dismissal, and announcement behavior."
7801
+ },
7802
+ {
7803
+ "when": "A field needs supporting or validation copy tied to its control.",
7804
+ "component": "component:ds-field",
7805
+ "reason": "Field owns the control relationship and supporting-message semantics."
7806
+ }
7807
+ ],
7808
+ "commonlyComposedWith": [
7809
+ "component:ds-card-setting",
7810
+ "component:ds-text"
7811
+ ],
7812
+ "accessibility": [
7813
+ "Keep the description concise and authored; InlineBannerSettings does not transform, truncate, or announce the copy.",
7814
+ "Use InlineBannerSettings for static context. Applications must choose a live-region component when a dynamic announcement is required.",
7815
+ "The informational copy remains plain text and has no interactive controls or dismissal affordance."
7816
+ ],
7817
+ "states": [
7818
+ "The description renders verbatim in every state in which the owning settings card projects the component.",
7819
+ "The component has no internal visibility, editing, or dismissal state; the owning settings card controls whether it is present.",
7820
+ "The content height is intrinsic: the banner contributes 8px block padding and its inner content container contributes 4px block padding. A single body-small line is 24px inside that container (4px + 16px line-height + 4px), followed by the tertiary bottom boundary."
7821
+ ],
7822
+ "responsiveBehavior": [
7823
+ "The component fills the available inline size and lets body-small copy wrap naturally.",
7824
+ "The effective inline inset remains 16px: 8px banner padding, 6px inner content padding, and 2px text-side padding."
7825
+ ],
7826
+ "frameworkCaveats": {
7827
+ "customElements": [
7828
+ "Pass the complete authored message through description, assign slot=\"banner\" on CardSetting, and do not apply a CSS casing transform or mutate the text for presentation."
7829
+ ],
7830
+ "react": [
7831
+ "Pass the complete authored message through the description prop, set slot=\"banner\" on CardSetting, and keep the component mounted for every settings-card state that needs the context."
7832
+ ],
7833
+ "angular": [
7834
+ "Bind [description] from the settings card's stable copy source and project the component into CardSetting's banner slot for every state that needs the context."
7835
+ ]
7836
+ },
7837
+ "references": [
7838
+ {
7839
+ "label": "Settings inline banner examples",
7840
+ "path": "src/wc/components/InlineBannerSettings/InlineBannerSettings.stories.ts"
7841
+ },
7842
+ {
7843
+ "label": "Rendered geometry coverage",
7844
+ "path": "tests/e2e/inline-banner-settings.spec.ts"
7845
+ }
7846
+ ],
7847
+ "styling": {
7848
+ "rationale": "The component owns only the compact settings informational row recipe; its card owns the surrounding surface and layout.",
7849
+ "protected": [
7850
+ {
7851
+ "properties": [
7852
+ "border-bottom",
7853
+ "color",
7854
+ "padding"
7855
+ ],
7856
+ "reason": "The component owns the readable informational row treatment and keeps its spacing consistent across settings cards.",
7857
+ "props": []
7858
+ }
7859
+ ],
7860
+ "customProperties": []
7861
+ }
7862
+ },
7863
+ "props": {
7864
+ "description": {
7865
+ "type": "string",
7866
+ "required": true
7867
+ }
7868
+ },
7869
+ "events": [],
7870
+ "slots": [],
7871
+ "exports": {
7872
+ "customElement": "ds-inline-banner-settings",
7873
+ "react": "DsInlineBannerSettings",
7874
+ "vue": "DsInlineBannerSettings",
7875
+ "angular": "DsInlineBannerSettings"
7876
+ }
7877
+ },
7878
+ "dependencies": [
7879
+ "@ds-mo/ui",
7880
+ "@ds-mo/tokens"
7881
+ ],
7882
+ "registryDependencies": [
7883
+ "text"
7884
+ ]
7885
+ },
7604
7886
  {
7605
7887
  "name": "input",
7606
7888
  "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.",
7889
+ "description": "Form-associated text and number input with constraints, optional free-text suggestions, token entry, and character counts.",
7608
7890
  "type": "registry:ui",
7609
7891
  "meta": {
7610
7892
  "library": "@ds-mo/ui",
@@ -7615,7 +7897,7 @@
7615
7897
  "intent": {
7616
7898
  "audience": "general",
7617
7899
  "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.",
7900
+ "summary": "Form-associated text and number input with constraints, optional free-text suggestions, token entry, and character counts.",
7619
7901
  "useWhen": [
7620
7902
  "A user must enter or edit one line of text, an email address, telephone number, URL, search query, password, or exact number.",
7621
7903
  "The value must participate in native, Angular, React, or Vue form state.",
@@ -7666,7 +7948,7 @@
7666
7948
  "Error text is associated with the native input and announced as an alert when the invalid state is rendered.",
7667
7949
  "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
7950
  "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.",
7951
+ "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
7952
  "Prefix and suffix content must not carry information that is otherwise absent from the field's visible label, value, or description.",
7671
7953
  "A nested prefix or suffix Select is a separate control from the editable value and must have its own accessible name."
7672
7954
  ],
@@ -7681,10 +7963,13 @@
7681
7963
  "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
7964
  "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
7965
  "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.",
7966
+ "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
7967
  "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
7968
  "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."
7969
+ "Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts.",
7970
+ "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.",
7971
+ "Suggestions assist free text rather than constrain selection. Arrow keys highlight suggestions, Enter accepts one, and Escape dismisses the popup without changing the value.",
7972
+ "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
7973
  ],
7689
7974
  "responsiveBehavior": [
7690
7975
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
@@ -7694,16 +7979,20 @@
7694
7979
  "frameworkCaveats": {
7695
7980
  "customElements": [
7696
7981
  "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."
7982
+ "Use the form attribute on the host when associating an input rendered outside its owning form.",
7983
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7698
7984
  ],
7699
7985
  "react": [
7700
- "Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear."
7986
+ "Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear.",
7987
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7701
7988
  ],
7702
7989
  "vue": [
7703
- "Use DsInput with v-model for the value, and listen for dsChange and dsClear."
7990
+ "Use DsInput with v-model for the value, and listen for dsChange and dsClear.",
7991
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7704
7992
  ],
7705
7993
  "angular": [
7706
- "Import DsInput with TextValueAccessor when integrating with Angular Forms."
7994
+ "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.",
7995
+ "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
7996
  ]
7708
7997
  },
7709
7998
  "references": [
@@ -7797,6 +8086,10 @@
7797
8086
  "type": "string",
7798
8087
  "required": false
7799
8088
  },
8089
+ "decrementLabel": {
8090
+ "type": "string",
8091
+ "required": false
8092
+ },
7800
8093
  "disabled": {
7801
8094
  "type": "boolean",
7802
8095
  "required": false
@@ -7833,6 +8126,10 @@
7833
8126
  "type": "string | undefined",
7834
8127
  "required": false
7835
8128
  },
8129
+ "incrementLabel": {
8130
+ "type": "string",
8131
+ "required": false
8132
+ },
7836
8133
  "inputId": {
7837
8134
  "type": "string | undefined",
7838
8135
  "required": false
@@ -7845,18 +8142,38 @@
7845
8142
  "type": "boolean",
7846
8143
  "required": false
7847
8144
  },
8145
+ "lengthBehavior": {
8146
+ "type": "'error' | 'restrict'",
8147
+ "required": false
8148
+ },
7848
8149
  "max": {
7849
8150
  "type": "number | undefined",
7850
8151
  "required": false
7851
8152
  },
8153
+ "maxLength": {
8154
+ "type": "number | undefined",
8155
+ "required": false
8156
+ },
7852
8157
  "min": {
7853
8158
  "type": "number | undefined",
7854
8159
  "required": false
7855
8160
  },
8161
+ "minLength": {
8162
+ "type": "number | undefined",
8163
+ "required": false
8164
+ },
7856
8165
  "name": {
7857
8166
  "type": "string | undefined",
7858
8167
  "required": false
7859
8168
  },
8169
+ "pattern": {
8170
+ "type": "string | undefined",
8171
+ "required": false
8172
+ },
8173
+ "patternMessage": {
8174
+ "type": "string | undefined",
8175
+ "required": false
8176
+ },
7860
8177
  "placeholder": {
7861
8178
  "type": "string | undefined",
7862
8179
  "required": false
@@ -7865,6 +8182,10 @@
7865
8182
  "type": "boolean",
7866
8183
  "required": false
7867
8184
  },
8185
+ "removeTokenLabel": {
8186
+ "type": "string",
8187
+ "required": false
8188
+ },
7868
8189
  "required": {
7869
8190
  "type": "boolean",
7870
8191
  "required": false
@@ -7873,10 +8194,18 @@
7873
8194
  "type": "string",
7874
8195
  "required": false
7875
8196
  },
8197
+ "showCharacterCount": {
8198
+ "type": "boolean",
8199
+ "required": false
8200
+ },
7876
8201
  "showPasswordLabel": {
7877
8202
  "type": "string",
7878
8203
  "required": false
7879
8204
  },
8205
+ "showStepper": {
8206
+ "type": "boolean",
8207
+ "required": false
8208
+ },
7880
8209
  "size": {
7881
8210
  "type": "InputSize",
7882
8211
  "required": false
@@ -7885,10 +8214,22 @@
7885
8214
  "type": "number | undefined",
7886
8215
  "required": false
7887
8216
  },
8217
+ "suggestions": {
8218
+ "type": "string[]",
8219
+ "required": false
8220
+ },
7888
8221
  "textAlign": {
7889
8222
  "type": "InputTextAlign",
7890
8223
  "required": false
7891
8224
  },
8225
+ "tokenized": {
8226
+ "type": "boolean",
8227
+ "required": false
8228
+ },
8229
+ "tokens": {
8230
+ "type": "string[]",
8231
+ "required": false
8232
+ },
7892
8233
  "type": {
7893
8234
  "type": "InputType",
7894
8235
  "required": false
@@ -7910,6 +8251,14 @@
7910
8251
  {
7911
8252
  "name": "dsClear",
7912
8253
  "detail": "void"
8254
+ },
8255
+ {
8256
+ "name": "dsSuggestionSelect",
8257
+ "detail": "string"
8258
+ },
8259
+ {
8260
+ "name": "dsTokensChange",
8261
+ "detail": "string[]"
7913
8262
  }
7914
8263
  ],
7915
8264
  "slots": [],
@@ -7927,8 +8276,10 @@
7927
8276
  ],
7928
8277
  "registryDependencies": [
7929
8278
  "button-unfilled",
8279
+ "chip",
7930
8280
  "divider",
7931
8281
  "icon",
8282
+ "input",
7932
8283
  "text"
7933
8284
  ]
7934
8285
  },
@@ -8229,7 +8580,7 @@
8229
8580
  {
8230
8581
  "when": "The hour, minute, and AM/PM lists are needed without a form field.",
8231
8582
  "component": "component:ds-time-picker",
8232
- "reason": "TimePicker owns the bounded 12-hour lists and selected-tile treatment."
8583
+ "reason": "TimePicker owns the bounded clock lists and selected-tile treatment."
8233
8584
  },
8234
8585
  {
8235
8586
  "when": "The user chooses from a finite set of named times or cadences.",
@@ -8247,9 +8598,9 @@
8247
8598
  ],
8248
8599
  "accessibility": [
8249
8600
  "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.",
8601
+ "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
8602
  "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.",
8603
+ "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
8604
  "Error text is associated with the text field and announced as an alert when the invalid state is rendered.",
8254
8605
  "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
8606
  ],
@@ -8259,7 +8610,8 @@
8259
8610
  "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
8611
  "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
8261
8612
  "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."
8613
+ "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.",
8614
+ "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
8615
  ],
8264
8616
  "responsiveBehavior": [
8265
8617
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
@@ -8380,6 +8732,10 @@
8380
8732
  "type": "boolean",
8381
8733
  "required": false
8382
8734
  },
8735
+ "hourFormat": {
8736
+ "type": "'12' | '24'",
8737
+ "required": false
8738
+ },
8383
8739
  "inputId": {
8384
8740
  "type": "string | undefined",
8385
8741
  "required": false
@@ -8609,7 +8965,7 @@
8609
8965
  ],
8610
8966
  "alternatives": [
8611
8967
  {
8612
- "when": "One map entity needs operating state, heading, and stale treatment.",
8968
+ "when": "One map entity needs operating state, bearing, and an optional dashed outline.",
8613
8969
  "component": "component:ds-map-entity-marker",
8614
8970
  "reason": "MapEntityMarker owns single-entity marker semantics and geometry."
8615
8971
  },
@@ -8722,7 +9078,7 @@
8722
9078
  {
8723
9079
  "name": "map-entity-marker",
8724
9080
  "title": "MapEntityMarker",
8725
- "description": "Engine-independent map marker button for a vehicle, asset, person, or travel group with operating-state color, heading, stale treatment, and a hover or focus caption.",
9081
+ "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.",
8726
9082
  "type": "registry:ui",
8727
9083
  "meta": {
8728
9084
  "library": "@ds-mo/ui",
@@ -8733,7 +9089,7 @@
8733
9089
  "intent": {
8734
9090
  "audience": "general",
8735
9091
  "status": "experimental",
8736
- "summary": "Engine-independent map marker button for a vehicle, asset, person, or travel group with operating-state color, heading, stale treatment, and a hover or focus caption.",
9092
+ "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.",
8737
9093
  "useWhen": [
8738
9094
  "An application map needs a consistent interactive marker for one entity.",
8739
9095
  "The map engine can mount a custom element and retain ownership of coordinates, anchoring, and camera behavior."
@@ -8758,14 +9114,14 @@
8758
9114
  "The component renders a native button and label is its accessible action name. Prefer an action-oriented label such as ‘Open vehicle 412’.",
8759
9115
  "Caption is a supplemental visual identifier and is hidden from assistive technology to avoid duplicating label.",
8760
9116
  "Keyboard focus reveals the same caption as hover and uses the shared visible focus ring.",
8761
- "State and stale meaning must be present in nearby map legend or application detail content; do not rely on marker color alone.",
8762
- "The stale outline remains differentiated by a dashed border in forced-colors mode."
9117
+ "Operating-state and outline meaning must be present in nearby map legend or application detail content; do not rely on marker color alone.",
9118
+ "The optional dashed outline remains differentiated by a dashed border in forced-colors mode."
8763
9119
  ],
8764
9120
  "states": [
8765
- "state selects the semantic operating-state color. Use stale as a standalone state only when no last-known operating state is available.",
8766
- "stale adds a dashed outline while preserving state, matching last-known map data.",
8767
- "immobilized always renders the upright MapKey glyph instead of the entity icon so the state is identifiable without interpreting heading.",
8768
- "heading rotates only MapEntityTravelGroup and MapEntityVehicle glyphs and is normalized to a clockwise value from 0 through 359 degrees. Immobilized, asset, person, and other glyphs remain upright.",
9121
+ "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.",
9122
+ "The dashed outline is an independent visual option. Unknown is solid unless the owner explicitly requests dashes.",
9123
+ "immobilized always renders the upright MapKey glyph instead of the entity icon so the state is identifiable without interpreting bearing.",
9124
+ "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.",
8769
9125
  "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.",
8770
9126
  "Activation emits dsClick without changing application selection internally."
8771
9127
  ],
@@ -8779,10 +9135,10 @@
8779
9135
  "Listen for dsClick and keep selected entity, z-index, coordinates, and camera movement in application state."
8780
9136
  ],
8781
9137
  "react": [
8782
- "Pass numeric heading as a property and handle dsClick through the generated event binding."
9138
+ "Pass numeric bearing as a property and handle dsClick through the generated event binding."
8783
9139
  ],
8784
9140
  "angular": [
8785
- "Bind heading as a number and keep map-engine marker lifecycle in the owning map adapter."
9141
+ "Bind bearing as a number and keep map-engine marker lifecycle in the owning map adapter."
8786
9142
  ]
8787
9143
  },
8788
9144
  "references": [
@@ -8806,10 +9162,10 @@
8806
9162
  "color",
8807
9163
  "opacity"
8808
9164
  ],
8809
- "reason": "Marker geometry, operating-state colors, stale distinction, and de-emphasis are one accessible visual recipe.",
9165
+ "reason": "Marker geometry, operating-state colors, outline distinction, and de-emphasis are one accessible visual recipe.",
8810
9166
  "props": [
8811
9167
  "state",
8812
- "stale",
9168
+ "dashed",
8813
9169
  "dimmed"
8814
9170
  ]
8815
9171
  }
@@ -8818,16 +9174,20 @@
8818
9174
  }
8819
9175
  },
8820
9176
  "props": {
9177
+ "bearing": {
9178
+ "type": "number",
9179
+ "required": false
9180
+ },
8821
9181
  "caption": {
8822
9182
  "type": "string",
8823
9183
  "required": false
8824
9184
  },
8825
- "dimmed": {
9185
+ "dashed": {
8826
9186
  "type": "boolean",
8827
9187
  "required": false
8828
9188
  },
8829
- "heading": {
8830
- "type": "number",
9189
+ "dimmed": {
9190
+ "type": "boolean",
8831
9191
  "required": false
8832
9192
  },
8833
9193
  "icon": {
@@ -8838,10 +9198,6 @@
8838
9198
  "type": "string",
8839
9199
  "required": true
8840
9200
  },
8841
- "stale": {
8842
- "type": "boolean",
8843
- "required": false
8844
- },
8845
9201
  "state": {
8846
9202
  "type": "MapEntityMarkerState",
8847
9203
  "required": false
@@ -9468,8 +9824,8 @@
9468
9824
  "Surface styling does not add semantics; failed delivery belongs in Message metadata below the unchanged bubble rather than in an error bubble treatment."
9469
9825
  ],
9470
9826
  "states": [
9471
- "The user variant represents user-sent copy in agent and person-to-person channels and uses secondary foreground.",
9472
- "The received variant represents ordinary incoming person-to-person copy.",
9827
+ "The user variant represents user-sent copy in agent and person-to-person channels, uses primary foreground, and uses the Chrome primary background so body-medium copy meets contrast on that surface.",
9828
+ "The received variant represents ordinary incoming person-to-person copy, uses secondary foreground, and uses the Chrome secondary background.",
9473
9829
  "Typing and rich agent output are not MessageBubble variants."
9474
9830
  ],
9475
9831
  "responsiveBehavior": [
@@ -9566,10 +9922,10 @@
9566
9922
  "states": [
9567
9923
  "The owner controls draft value and transport state; the composer emits intent without performing transport.",
9568
9924
  "Error status never clears or disables the draft; the application supplies recovery actions through error-actions and owns retry semantics. The negative support surface appears above and attached to the composer box, within the component's measured ownership.",
9569
- "Use the tools slot for leading actions such as add and the actions slot for trailing actions such as dictation; the built-in submit or stop action remains last with an 8px gap from the preceding action. These icon buttons use the standard non-rounded control radius, and the application supplies tooltips for slotted icon actions.",
9570
- "The composer surface uses the 10px --dimension-radius-125 token.",
9925
+ "Use the tools slot for leading actions such as add and the actions slot for trailing actions such as dictation; the built-in submit or stop action remains last with an 8px gap from the preceding action. The built-in and application-provided composer buttons use the standard rounded control treatment, and the application supplies tooltips for slotted icon actions.",
9926
+ "The composer surface uses the 4px --dimension-radius-050 token.",
9571
9927
  "Mouse or keyboard focus on the textarea gives the complete composer surface the same bold-brand inset stroke width and color as an active Input; the native textarea never draws a separate outline.",
9572
- "The empty or otherwise inactive submit action is a disabled bordered ButtonUnfilled. Ready submit actions use submitIntent, while the streaming stop action remains a bold-brand ButtonFilled.",
9928
+ "The empty or otherwise inactive submit action is a disabled bordered, rounded ButtonUnfilled. Ready submit actions use submitIntent and the rounded control treatment, while the streaming stop action remains a rounded bold-brand ButtonFilled.",
9573
9929
  "The attached error unit keeps a real boundary in forced colors and lets message text and application-owned recovery actions wrap at narrow widths."
9574
9930
  ],
9575
9931
  "responsiveBehavior": [
@@ -11897,7 +12253,7 @@
11897
12253
  {
11898
12254
  "name": "radio",
11899
12255
  "title": "Radio",
11900
- "description": "Form-associated one-of-many radio selection set with vertical or horizontal layout, optional per-option descriptions, four densities, per-option inactive state, and roving keyboard focus.",
12256
+ "description": "Form-associated one-of-many radio selection set with an optional visible group label, vertical or horizontal layout, per-option descriptions, four densities, per-option inactive state, and roving keyboard focus.",
11901
12257
  "type": "registry:ui",
11902
12258
  "meta": {
11903
12259
  "library": "@ds-mo/ui",
@@ -11908,7 +12264,7 @@
11908
12264
  "intent": {
11909
12265
  "audience": "general",
11910
12266
  "status": "stable",
11911
- "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, optional per-option descriptions, four densities, per-option inactive state, and roving keyboard focus.",
12267
+ "summary": "Form-associated one-of-many radio selection set with an optional visible group label, vertical or horizontal layout, per-option descriptions, four densities, per-option inactive state, and roving keyboard focus.",
11912
12268
  "useWhen": [
11913
12269
  "A user must select exactly one visible option from a small set.",
11914
12270
  "All available choices should remain visible for comparison.",
@@ -11941,7 +12297,9 @@
11941
12297
  "component:ds-text"
11942
12298
  ],
11943
12299
  "accessibility": [
11944
- "The host exposes radiogroup semantics and requires an accessible group name from aria-label or aria-labelledby.",
12300
+ "The host exposes radiogroup semantics and requires an accessible group name from the visible label, aria-label, or aria-labelledby.",
12301
+ "When groupLabel is provided, Radio renders it above the options and uses the same text as the radiogroup's accessible name.",
12302
+ "Inside ds-setting-row-radio the visible form groupLabel is omitted on first paint; the row heading is the accessible name via aria-labelledby. Independent multi-select settings use ds-setting-row-checkbox with ds-checkbox-group instead.",
11945
12303
  "Each visible option exposes radio semantics, its checked state, its label text, optional supporting description, and any inactive state.",
11946
12304
  "Arrow keys move and select through active options; Home and End select the first and last active options; Space and Enter select the focused option.",
11947
12305
  "Roving tabindex keeps one active option in the tab order, preferring the selected option; setFocus uses that same public focus target."
@@ -11951,7 +12309,10 @@
11951
12309
  "Selected circles remove the border, use a brand fill, and draw a centered on-bold foreground dot sized 10px at lg, 8px at md, 6px at sm, and 4px at xs.",
11952
12310
  "Sizes are lg with a 20px circle in a 24px placement, md with a 16px circle in a 20px placement, sm with a 12px circle in a 16px placement, and xs with an 8px circle in a 12px placement.",
11953
12311
  "The initial value is restored by native form reset; the selected value submits under name and a required set is invalid until one active option is selected.",
11954
- "Description-rich options grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy."
12312
+ "Description-rich options grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy.",
12313
+ "A visible group label uses the same density height and horizontal text origin as a menu section heading above the option list without adding a second interaction target. Copy uses text-body-small emphasis.",
12314
+ "Vertical form options use a 4px gap; a medium single-line option and its group label each use the shared 32px control height.",
12315
+ "Form and settings usage omits a row hover or pressed wash by default; set hasInteractionFill only when each radio option is presented as a choice-list row."
11955
12316
  ],
11956
12317
  "responsiveBehavior": [
11957
12318
  "Choose size from the density of the containing form or settings row.",
@@ -12010,7 +12371,8 @@
12010
12371
  ],
12011
12372
  "reason": "The component owns its surface and interaction treatment; use its semantic presentation props or compose an application-owned surrounding surface.",
12012
12373
  "props": [
12013
- "size"
12374
+ "size",
12375
+ "hasInteractionFill"
12014
12376
  ]
12015
12377
  }
12016
12378
  ],
@@ -12038,6 +12400,14 @@
12038
12400
  "type": "string | undefined",
12039
12401
  "required": false
12040
12402
  },
12403
+ "groupLabel": {
12404
+ "type": "string",
12405
+ "required": false
12406
+ },
12407
+ "hasInteractionFill": {
12408
+ "type": "boolean",
12409
+ "required": false
12410
+ },
12041
12411
  "isInactive": {
12042
12412
  "type": "boolean",
12043
12413
  "required": false
@@ -12089,6 +12459,177 @@
12089
12459
  "text"
12090
12460
  ]
12091
12461
  },
12462
+ {
12463
+ "name": "radio-tile",
12464
+ "title": "RadioTile",
12465
+ "description": "A form-associated group of fully clickable radio tiles with labels and optional descriptions.",
12466
+ "type": "registry:ui",
12467
+ "meta": {
12468
+ "library": "@ds-mo/ui",
12469
+ "distribution": "npm",
12470
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/radio-tile",
12471
+ "source": "src/wc/components/RadioTile/RadioTile.tsx",
12472
+ "intentStatus": "complete",
12473
+ "intent": {
12474
+ "audience": "general",
12475
+ "status": "experimental",
12476
+ "summary": "A form-associated group of fully clickable radio tiles with labels and optional descriptions.",
12477
+ "useWhen": [
12478
+ "A small set of mutually exclusive choices benefits from descriptive cards and large click targets."
12479
+ ],
12480
+ "avoidWhen": [
12481
+ "The choices are brief and compact; use Radio.",
12482
+ "More than one value may be chosen."
12483
+ ],
12484
+ "alternatives": [
12485
+ {
12486
+ "when": "A user may select zero or multiple independent choices.",
12487
+ "component": "component:ds-checkbox",
12488
+ "reason": "Checkbox communicates independent selection rather than one-of-many choice."
12489
+ },
12490
+ {
12491
+ "when": "A binary setting applies immediately.",
12492
+ "component": "component:ds-switch",
12493
+ "reason": "Switch communicates an immediately applied on/off setting."
12494
+ },
12495
+ {
12496
+ "when": "The option list is long or the available space is constrained.",
12497
+ "component": "component:ds-select",
12498
+ "reason": "Select keeps a larger one-of-many choice set compact."
12499
+ }
12500
+ ],
12501
+ "commonlyComposedWith": [
12502
+ "component:ds-field",
12503
+ "component:ds-text"
12504
+ ],
12505
+ "accessibility": [
12506
+ "Native radio inputs own keyboard selection, focus, and checked semantics; the complete tile activates its input.",
12507
+ "Label the group with Field or an accessible name. Descriptions name each option separately."
12508
+ ],
12509
+ "states": [
12510
+ "Selection is shown by the 16px radio indicator centered in a 20px placement box while the tile keeps its neutral border. The placement box and copy have a 12px gap inside the tile's 16px padding, and the tile uses the 2px compact radius. Error retains the negative border, and keyboard focus keeps the focus-token outline. Inactive options cannot be selected.",
12511
+ "Options with descriptions use primary body-medium emphasis for the title and secondary body-medium supporting text with a 4px gap. Text-only options use secondary body-medium text without emphasis.",
12512
+ "The component owns form values, required validation, reset, and disabled-fieldset behavior."
12513
+ ],
12514
+ "responsiveBehavior": [
12515
+ "Horizontal tiles wrap to available space; use a vertical group when descriptions need more room."
12516
+ ],
12517
+ "frameworkCaveats": {
12518
+ "angular": [
12519
+ "Use the generated radio value accessor with the standalone adapter."
12520
+ ],
12521
+ "vue": [
12522
+ "Bind value with v-model."
12523
+ ]
12524
+ },
12525
+ "references": [
12526
+ {
12527
+ "label": "Storybook review",
12528
+ "path": "src/wc/components/RadioTile/RadioTile.stories.ts"
12529
+ }
12530
+ ],
12531
+ "styling": {
12532
+ "rationale": "Tile anatomy and radio treatment belong to the component; the owner controls group width.",
12533
+ "protected": [
12534
+ {
12535
+ "properties": [
12536
+ "padding",
12537
+ "gap",
12538
+ "border-radius",
12539
+ "background",
12540
+ "border",
12541
+ "box-shadow",
12542
+ "color"
12543
+ ],
12544
+ "reason": "Use the supported group direction and state instead of replacing tile internals.",
12545
+ "props": [
12546
+ "direction"
12547
+ ]
12548
+ }
12549
+ ],
12550
+ "customProperties": []
12551
+ }
12552
+ },
12553
+ "props": {
12554
+ "ariaDescribedby": {
12555
+ "type": "string | undefined",
12556
+ "required": false
12557
+ },
12558
+ "ariaLabel": {
12559
+ "type": "string | null",
12560
+ "required": false
12561
+ },
12562
+ "ariaLabelledby": {
12563
+ "type": "string | undefined",
12564
+ "required": false
12565
+ },
12566
+ "direction": {
12567
+ "type": "'horizontal' | 'vertical'",
12568
+ "required": false
12569
+ },
12570
+ "disabled": {
12571
+ "type": "boolean",
12572
+ "required": false
12573
+ },
12574
+ "error": {
12575
+ "type": "boolean",
12576
+ "required": false
12577
+ },
12578
+ "form": {
12579
+ "type": "string | undefined",
12580
+ "required": false
12581
+ },
12582
+ "inputId": {
12583
+ "type": "string | undefined",
12584
+ "required": false
12585
+ },
12586
+ "isInactive": {
12587
+ "type": "boolean",
12588
+ "required": false
12589
+ },
12590
+ "name": {
12591
+ "type": "string | undefined",
12592
+ "required": false
12593
+ },
12594
+ "options": {
12595
+ "type": "RadioTileOption[]",
12596
+ "required": false
12597
+ },
12598
+ "required": {
12599
+ "type": "boolean",
12600
+ "required": false
12601
+ },
12602
+ "requiredMessage": {
12603
+ "type": "string",
12604
+ "required": false
12605
+ },
12606
+ "value": {
12607
+ "type": "string",
12608
+ "required": false
12609
+ }
12610
+ },
12611
+ "events": [
12612
+ {
12613
+ "name": "dsChange",
12614
+ "detail": "string"
12615
+ }
12616
+ ],
12617
+ "slots": [],
12618
+ "exports": {
12619
+ "customElement": "ds-radio-tile",
12620
+ "react": "DsRadioTile",
12621
+ "vue": "DsRadioTile",
12622
+ "angular": "DsRadioTile"
12623
+ }
12624
+ },
12625
+ "dependencies": [
12626
+ "@ds-mo/ui",
12627
+ "@ds-mo/tokens"
12628
+ ],
12629
+ "registryDependencies": [
12630
+ "text"
12631
+ ]
12632
+ },
12092
12633
  {
12093
12634
  "name": "score",
12094
12635
  "title": "Score",
@@ -12742,6 +13283,309 @@
12742
13283
  "tooltip"
12743
13284
  ]
12744
13285
  },
13286
+ {
13287
+ "name": "setting-row-checkbox",
13288
+ "title": "SettingRowCheckbox",
13289
+ "description": "Padded settings-row composition for an editable Checkbox group and its non-interactive saved-value readout.",
13290
+ "type": "registry:ui",
13291
+ "meta": {
13292
+ "library": "@ds-mo/ui",
13293
+ "distribution": "npm",
13294
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/setting-row-checkbox",
13295
+ "source": "src/wc/components/SettingRowCheckbox/SettingRowCheckbox.tsx",
13296
+ "intentStatus": "complete",
13297
+ "intent": {
13298
+ "audience": "general",
13299
+ "status": "experimental",
13300
+ "summary": "Padded settings-row composition for an editable Checkbox group and its non-interactive saved-value readout.",
13301
+ "useWhen": [
13302
+ "A settings card needs an independent multi-select Checkbox group as one padded row item.",
13303
+ "The same settings card needs to display the saved selected values without interactive checkbox controls in view mode."
13304
+ ],
13305
+ "avoidWhen": [
13306
+ "The Checkbox group is not part of a settings-row surface; compose ds-checkbox-group directly.",
13307
+ "Exactly one option may be selected; use component:ds-setting-row-radio.",
13308
+ "The setting is a single immediate on/off choice; use component:ds-setting-row-toggle."
13309
+ ],
13310
+ "commonlyComposedWith": [
13311
+ "component:ds-card-setting",
13312
+ "component:ds-checkbox-group",
13313
+ "component:ds-checkbox"
13314
+ ],
13315
+ "accessibility": [
13316
+ "Pass the settings heading as the row label. Do not pass CheckboxGroup's form label; the row owns the visible heading and points the slotted group at it with aria-labelledby.",
13317
+ "Keep each Checkbox's label, checked state, name, value, and dsChange owned by the application. Leave the Checkbox group slotted in view and edit; the row hides it in view.",
13318
+ "Do not add a second interaction layer to the row; each Checkbox owns its own focus and activation while settings usage keeps hasInteractionFill false.",
13319
+ "View presentation exposes readable label, saved selected-value copy, and optional supporting copy without checkbox semantics, checkbox controls, or a focus target."
13320
+ ],
13321
+ "states": [
13322
+ "The row is a neutral padded composition; selected, focus, mixed, and inactive states belong to the slotted Checkboxes without a choice-list hover or pressed wash.",
13323
+ "The owning application handles dsChange on each Checkbox and supplies valueLabel by joining the currently selected option labels.",
13324
+ "Heading, saved-value choice, and slotted Checkbox group stay mounted. presentation reflects on the host so view/edit is CSS visibility only; do not swap Host children or ngIf the group.",
13325
+ "View presentation hides the slotted Checkbox group with ::slotted host CSS and shows the saved selected values plus optional consequence copy. Omit description on the row and on each Checkbox when there is no supporting copy; view then shows only the selected-value labels. The group stays in the tree."
13326
+ ],
13327
+ "responsiveBehavior": [
13328
+ "The row never exceeds its parent width; the slotted Checkbox group keeps option copy in the flexible column and wraps descriptions when needed."
13329
+ ],
13330
+ "references": [
13331
+ {
13332
+ "label": "Settings mock",
13333
+ "path": "src/wc/components/SettingRowCheckbox/SettingRowCheckbox.stories.ts"
13334
+ }
13335
+ ],
13336
+ "styling": {
13337
+ "rationale": "The row uses the shared settings-row inline inset so view and edit copy share the same 16px origin, and zeros host padding-block because the heading, choice, and checkbox options already own vertical spacing. The heading is row-owned CSS, not CheckboxGroup's form label or control section-heading recipe. Checkbox owns option geometry.",
13338
+ "protected": [
13339
+ {
13340
+ "properties": [
13341
+ "padding"
13342
+ ],
13343
+ "reason": "Keep space-200 inline inset in view and edit, with no extra host padding-block.",
13344
+ "props": []
13345
+ }
13346
+ ],
13347
+ "customProperties": []
13348
+ }
13349
+ },
13350
+ "props": {
13351
+ "description": {
13352
+ "type": "string",
13353
+ "required": false
13354
+ },
13355
+ "label": {
13356
+ "type": "string",
13357
+ "required": false
13358
+ },
13359
+ "presentation": {
13360
+ "type": "SettingRowCheckboxPresentation",
13361
+ "required": false
13362
+ },
13363
+ "valueLabel": {
13364
+ "type": "string",
13365
+ "required": false
13366
+ }
13367
+ },
13368
+ "events": [],
13369
+ "slots": [],
13370
+ "exports": {
13371
+ "customElement": "ds-setting-row-checkbox",
13372
+ "react": "DsSettingRowCheckbox",
13373
+ "vue": "DsSettingRowCheckbox",
13374
+ "angular": "DsSettingRowCheckbox"
13375
+ }
13376
+ },
13377
+ "dependencies": [
13378
+ "@ds-mo/ui",
13379
+ "@ds-mo/tokens"
13380
+ ],
13381
+ "registryDependencies": [
13382
+ "text"
13383
+ ]
13384
+ },
13385
+ {
13386
+ "name": "setting-row-radio",
13387
+ "title": "SettingRowRadio",
13388
+ "description": "Padded settings-row composition for an editable Radio group and its non-interactive saved-value readout.",
13389
+ "type": "registry:ui",
13390
+ "meta": {
13391
+ "library": "@ds-mo/ui",
13392
+ "distribution": "npm",
13393
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/setting-row-radio",
13394
+ "source": "src/wc/components/SettingRowRadio/SettingRowRadio.tsx",
13395
+ "intentStatus": "complete",
13396
+ "intent": {
13397
+ "audience": "general",
13398
+ "status": "experimental",
13399
+ "summary": "Padded settings-row composition for an editable Radio group and its non-interactive saved-value readout.",
13400
+ "useWhen": [
13401
+ "A settings card needs a mutually exclusive Radio group as one padded row item.",
13402
+ "The same settings card needs to display the saved option without an interactive control in view mode."
13403
+ ],
13404
+ "avoidWhen": [
13405
+ "The Radio group is not part of a settings-row surface; compose ds-radio directly.",
13406
+ "The setting allows more than one option to be selected; use component:ds-setting-row-checkbox.",
13407
+ "The setting is a single immediate on/off choice; use component:ds-setting-row-toggle."
13408
+ ],
13409
+ "commonlyComposedWith": [
13410
+ "component:ds-card-setting",
13411
+ "component:ds-radio"
13412
+ ],
13413
+ "accessibility": [
13414
+ "Pass the settings heading as the row label. Do not pass Radio groupLabel; the row owns the visible heading and points the slotted radiogroup at it with aria-labelledby.",
13415
+ "Keep the Radio group's options, value, required state, and selection event owned by the application. Leave the Radio slotted in view and edit; the row hides it in view.",
13416
+ "Do not add a second interaction layer to the row; Radio owns option focus and keyboard selection while settings usage keeps hasInteractionFill false.",
13417
+ "View presentation exposes readable label, saved value, and optional supporting copy without radio semantics, a radio toggle, or a focus target."
13418
+ ],
13419
+ "states": [
13420
+ "The row is a neutral padded composition; selected, focus, and inactive states belong to the slotted Radio without a choice-list hover or pressed wash.",
13421
+ "The owning application handles dsChange and updates the slotted Radio value.",
13422
+ "Heading, saved-value choice, and slotted Radio stay mounted. presentation reflects on the host so view/edit is CSS visibility only; do not swap Host children or ngIf the Radio.",
13423
+ "View presentation hides the slotted Radio with ::slotted host CSS and shows the saved option label plus optional consequence copy. The Radio stays in the tree."
13424
+ ],
13425
+ "responsiveBehavior": [
13426
+ "The row never exceeds its parent width; the slotted Radio keeps its option copy in the flexible column and wraps descriptions when needed."
13427
+ ],
13428
+ "references": [
13429
+ {
13430
+ "label": "Settings mock",
13431
+ "path": "src/wc/components/SettingRowRadio/SettingRowRadio.stories.ts"
13432
+ }
13433
+ ],
13434
+ "styling": {
13435
+ "rationale": "The row uses the shared settings-row inline inset so view and edit copy share the same 16px origin, and zeros host padding-block because the heading, choice, and radio options already own vertical spacing. The heading is row-owned CSS, not Radio's form group-label or control section-heading recipe. Radio owns option geometry.",
13436
+ "protected": [
13437
+ {
13438
+ "properties": [
13439
+ "padding"
13440
+ ],
13441
+ "reason": "Keep space-200 inline inset in view and edit, with no extra host padding-block.",
13442
+ "props": []
13443
+ }
13444
+ ],
13445
+ "customProperties": []
13446
+ }
13447
+ },
13448
+ "props": {
13449
+ "description": {
13450
+ "type": "string",
13451
+ "required": false
13452
+ },
13453
+ "label": {
13454
+ "type": "string",
13455
+ "required": false
13456
+ },
13457
+ "presentation": {
13458
+ "type": "SettingRowRadioPresentation",
13459
+ "required": false
13460
+ },
13461
+ "valueLabel": {
13462
+ "type": "string",
13463
+ "required": false
13464
+ }
13465
+ },
13466
+ "events": [],
13467
+ "slots": [],
13468
+ "exports": {
13469
+ "customElement": "ds-setting-row-radio",
13470
+ "react": "DsSettingRowRadio",
13471
+ "vue": "DsSettingRowRadio",
13472
+ "angular": "DsSettingRowRadio"
13473
+ }
13474
+ },
13475
+ "dependencies": [
13476
+ "@ds-mo/ui",
13477
+ "@ds-mo/tokens"
13478
+ ],
13479
+ "registryDependencies": [
13480
+ "text"
13481
+ ]
13482
+ },
13483
+ {
13484
+ "name": "setting-row-toggle",
13485
+ "title": "SettingRowToggle",
13486
+ "description": "Two-column immediate binary setting with descriptive copy and an accessible switch.",
13487
+ "type": "registry:ui",
13488
+ "meta": {
13489
+ "library": "@ds-mo/ui",
13490
+ "distribution": "npm",
13491
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/setting-row-toggle",
13492
+ "source": "src/wc/components/SettingRowToggle/SettingRowToggle.tsx",
13493
+ "intentStatus": "complete",
13494
+ "intent": {
13495
+ "audience": "general",
13496
+ "status": "experimental",
13497
+ "summary": "Two-column immediate binary setting with descriptive copy and an accessible switch.",
13498
+ "useWhen": [
13499
+ "A settings list pairs a setting name and explanation with one immediate on/off control."
13500
+ ],
13501
+ "avoidWhen": [
13502
+ "The value needs a text input, multiple choices, or an explicit Save workflow."
13503
+ ],
13504
+ "commonlyComposedWith": [
13505
+ "component:ds-card-setting",
13506
+ "component:ds-switch",
13507
+ "component:ds-text"
13508
+ ],
13509
+ "accessibility": [
13510
+ "The visible label names the switch and the optional description supplies its accessible description.",
13511
+ "Switch owns focus, keyboard activation, checked state, and disabled semantics. The row adds no second tab stop.",
13512
+ "For a settings list, the owner supplies list semantics and marks each row as a list item."
13513
+ ],
13514
+ "states": [
13515
+ "The application accepts or rejects change requests by updating the controlled checked value and owns persistence and errors.",
13516
+ "Name the enabled setting consistently; the label must not change when the switch is toggled.",
13517
+ "Non-emphasis rows without supporting copy use ds-text color secondary (foreground-secondary) on the title. Non-emphasis rows with description keep a primary title.",
13518
+ "Supporting copy is text-body-small in every variant."
13519
+ ],
13520
+ "responsiveBehavior": [
13521
+ "The copy wraps while the switch keeps its natural size in the trailing column, including at narrow widths."
13522
+ ],
13523
+ "references": [
13524
+ {
13525
+ "label": "Usage states",
13526
+ "path": "src/wc/components/SettingRowToggle/SettingRowToggle.stories.ts"
13527
+ }
13528
+ ],
13529
+ "styling": {
13530
+ "rationale": "The row uses the shared settings-row inset; copy/control columns and the parent section surface stay component-owned.",
13531
+ "protected": [
13532
+ {
13533
+ "properties": [
13534
+ "padding",
13535
+ "gap"
13536
+ ],
13537
+ "reason": "Preserve the shared settings-row inset (space-100 block, space-200 inline) and copy-to-control gap.",
13538
+ "props": []
13539
+ }
13540
+ ],
13541
+ "customProperties": []
13542
+ }
13543
+ },
13544
+ "props": {
13545
+ "checked": {
13546
+ "type": "boolean",
13547
+ "required": false
13548
+ },
13549
+ "description": {
13550
+ "type": "string",
13551
+ "required": false
13552
+ },
13553
+ "disabled": {
13554
+ "type": "boolean",
13555
+ "required": false
13556
+ },
13557
+ "label": {
13558
+ "type": "string",
13559
+ "required": true
13560
+ },
13561
+ "variant": {
13562
+ "type": "SettingRowToggleVariant",
13563
+ "required": false
13564
+ }
13565
+ },
13566
+ "events": [
13567
+ {
13568
+ "name": "dsChange",
13569
+ "detail": "boolean"
13570
+ }
13571
+ ],
13572
+ "slots": [],
13573
+ "exports": {
13574
+ "customElement": "ds-setting-row-toggle",
13575
+ "react": "DsSettingRowToggle",
13576
+ "vue": "DsSettingRowToggle",
13577
+ "angular": "DsSettingRowToggle"
13578
+ }
13579
+ },
13580
+ "dependencies": [
13581
+ "@ds-mo/ui",
13582
+ "@ds-mo/tokens"
13583
+ ],
13584
+ "registryDependencies": [
13585
+ "switch",
13586
+ "text"
13587
+ ]
13588
+ },
12745
13589
  {
12746
13590
  "name": "shell-app",
12747
13591
  "title": "ShellApp",
@@ -13669,14 +14513,15 @@
13669
14513
  "Assign a two-number array through the JavaScript value property to create a range; values are ordered, clamped, stepped, and prevented from crossing.",
13670
14514
  "minStepsBetweenValues reserves a minimum stepped distance between range thumbs.",
13671
14515
  "The initial normalized value is the native form-reset baseline and range values submit as repeated entries under the same name.",
13672
- "Focused, filled, dirty, touched, dragging, valid, disabled, read-only, and orientation data hooks expose interaction state without changing the value contract."
14516
+ "Focused, filled, dirty, touched, dragging, valid, disabled, read-only, and orientation data hooks expose interaction state without changing the value contract.",
14517
+ "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."
13673
14518
  ],
13674
14519
  "responsiveBehavior": [
13675
14520
  "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.",
13676
14521
  "Horizontal Slider fills the width supplied by its parent; the parent chooses an appropriate readable track length.",
13677
14522
  "Vertical Slider owns a token-based default length that may be overridden with --ds-slider-vertical-length in layout-specific compositions.",
13678
14523
  "Use md in ordinary forms and sm or xs only when the surrounding control density uses the same recipe.",
13679
- "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.",
14524
+ "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.",
13680
14525
  "Horizontal value direction is left-to-right; the design system does not author RTL-specific component behavior."
13681
14526
  ],
13682
14527
  "frameworkCaveats": {
@@ -13688,7 +14533,10 @@
13688
14533
  "Use DsSlider with a number or two-number value array and handle onDsChange and onDsCommit custom events."
13689
14534
  ],
13690
14535
  "angular": [
13691
- "Use DsSlider with property binding for range arrays; the generated number value accessor is appropriate only for a single numeric value."
14536
+ "Use DsSlider with SelectValueAccessor for Angular Forms; it preserves either a number or a two-number array."
14537
+ ],
14538
+ "vue": [
14539
+ "Use v-model for a number or a two-number array. Assign ticks through property binding."
13692
14540
  ]
13693
14541
  },
13694
14542
  "references": [
@@ -13829,13 +14677,17 @@
13829
14677
  "required": false
13830
14678
  },
13831
14679
  "step": {
13832
- "type": "number",
14680
+ "type": "number | 'any'",
13833
14681
  "required": false
13834
14682
  },
13835
14683
  "thumbAlignment": {
13836
14684
  "type": "SliderThumbAlignment",
13837
14685
  "required": false
13838
14686
  },
14687
+ "ticks": {
14688
+ "type": "SliderTick[]",
14689
+ "required": false
14690
+ },
13839
14691
  "value": {
13840
14692
  "type": "SliderValue",
13841
14693
  "required": false
@@ -14480,7 +15332,7 @@
14480
15332
  "pattern:menu-trigger"
14481
15333
  ],
14482
15334
  "accessibility": [
14483
- "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.",
15335
+ "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.",
14484
15336
  "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.",
14485
15337
  "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.",
14486
15338
  "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.",
@@ -14512,7 +15364,7 @@
14512
15364
  ],
14513
15365
  "responsiveBehavior": [
14514
15366
  "The table keeps native semantics at narrow widths and scrolls horizontally instead of transforming into cards.",
14515
- "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.",
15367
+ "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.",
14516
15368
  "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.",
14517
15369
  "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.",
14518
15370
  "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.",
@@ -15455,7 +16307,8 @@
15455
16307
  "The default four visible rows can be changed with rows; rows is clamped to at least one.",
15456
16308
  "Vertical resizing is enabled by default and can be disabled when the surrounding layout owns the field height.",
15457
16309
  "Size changes typography and inset spacing without changing the authored row count.",
15458
- "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."
16310
+ "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.",
16311
+ "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."
15459
16312
  ],
15460
16313
  "responsiveBehavior": [
15461
16314
  "Textarea fills its parent by default and follows the width supplied by Field or the form layout.",
@@ -15583,6 +16436,18 @@
15583
16436
  "type": "boolean",
15584
16437
  "required": false
15585
16438
  },
16439
+ "lengthBehavior": {
16440
+ "type": "'error' | 'restrict'",
16441
+ "required": false
16442
+ },
16443
+ "maxLength": {
16444
+ "type": "number | undefined",
16445
+ "required": false
16446
+ },
16447
+ "minLength": {
16448
+ "type": "number | undefined",
16449
+ "required": false
16450
+ },
15586
16451
  "name": {
15587
16452
  "type": "string | undefined",
15588
16453
  "required": false
@@ -15611,6 +16476,10 @@
15611
16476
  "type": "number",
15612
16477
  "required": false
15613
16478
  },
16479
+ "showCharacterCount": {
16480
+ "type": "boolean",
16481
+ "required": false
16482
+ },
15614
16483
  "size": {
15615
16484
  "type": "TextareaSize",
15616
16485
  "required": false
@@ -15653,7 +16522,7 @@
15653
16522
  {
15654
16523
  "name": "time-picker",
15655
16524
  "title": "TimePicker",
15656
- "description": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
16525
+ "description": "Bounded 12- or 24-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
15657
16526
  "type": "registry:ui",
15658
16527
  "meta": {
15659
16528
  "library": "@ds-mo/ui",
@@ -15664,7 +16533,7 @@
15664
16533
  "intent": {
15665
16534
  "audience": "general",
15666
16535
  "status": "stable",
15667
- "summary": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
16536
+ "summary": "Bounded 12- or 24-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
15668
16537
  "useWhen": [
15669
16538
  "A user picks a clock time from hour, minute, and AM/PM lists.",
15670
16539
  "A time field needs 32px clock tiles that match calendar day geometry and the shared choice-list selected treatment."
@@ -15692,13 +16561,14 @@
15692
16561
  ],
15693
16562
  "accessibility": [
15694
16563
  "Hour, minute, and AM/PM are separate labelled listboxes without visible column headings. Each list keeps one tab stop on the selected option.",
15695
- "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.",
16564
+ "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.",
15696
16565
  "Inactive pickers disable every option. Optional min and max times disable combinations outside that inclusive bound."
15697
16566
  ],
15698
16567
  "states": [
15699
16568
  "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.",
15700
- "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.",
15701
- "An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state."
16569
+ "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.",
16570
+ "An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state.",
16571
+ "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."
15702
16572
  ],
15703
16573
  "responsiveBehavior": [
15704
16574
  "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."
@@ -15736,6 +16606,10 @@
15736
16606
  "type": "boolean",
15737
16607
  "required": false
15738
16608
  },
16609
+ "hourFormat": {
16610
+ "type": "'12' | '24'",
16611
+ "required": false
16612
+ },
15739
16613
  "isInactive": {
15740
16614
  "type": "boolean",
15741
16615
  "required": false