@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
package/dist/agent.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "15.2.0",
4
+ "packageVersion": "15.4.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -1296,7 +1296,7 @@
1296
1296
  }
1297
1297
  ],
1298
1298
  "styling": {
1299
- "rationale": "The host participates in shell-owned layout; internal tabs and chrome own their recipes.",
1299
+ "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.",
1300
1300
  "protected": [],
1301
1301
  "customProperties": []
1302
1302
  }
@@ -2791,7 +2791,7 @@
2791
2791
  "General content UI keeps the selected interaction fill and border for pressed or active emphasis.",
2792
2792
  "Shell, navigation, and tool-rail composites use isActive with primary foreground across the complete control and no selected fill or border.",
2793
2793
  "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.",
2794
- "Surface context must match the actual parent surface; translucent, inverted, media, and always-dark treatments are reserved for those surfaces.",
2794
+ "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.",
2795
2795
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
2796
2796
  "Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, or interaction semantics.",
2797
2797
  "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.",
@@ -3840,22 +3840,22 @@
3840
3840
  "tag": "ds-card-setting",
3841
3841
  "name": "card-setting",
3842
3842
  "title": "CardSetting",
3843
- "summary": "Persistent settings-section surface with a heading, controlled view/edit chrome, fixed edit-save-cancel actions, and application-owned body content.",
3843
+ "summary": "Persistent settings-section surface with a heading, optional controlled edit chrome, and application-owned body content.",
3844
3844
  "intentStatus": "complete",
3845
3845
  "intent": {
3846
3846
  "audience": "general",
3847
3847
  "status": "stable",
3848
- "summary": "Persistent settings-section surface with a heading, controlled view/edit chrome, fixed edit-save-cancel actions, and application-owned body content.",
3848
+ "summary": "Persistent settings-section surface with a heading, optional controlled edit chrome, and application-owned body content.",
3849
3849
  "useWhen": [
3850
3850
  "A settings page needs a persistent section that switches between read-only and editable content.",
3851
3851
  "The parent can control one active editing section and owns validation, persistence, cancellation, and body content.",
3852
- "The section uses the standard Pencil, Save, and Cancel header workflow."
3852
+ "The section uses the standard Pencil, Save, and Cancel header workflow.",
3853
+ "Settings apply immediately through their own controls and share the standard section surface without edit, save, or cancel actions."
3853
3854
  ],
3854
3855
  "avoidWhen": [
3855
3856
  "The surface contains a chart, legend, metric visualization, or other data-visualization composition.",
3856
3857
  "The content is a general-purpose read-only card with no settings edit workflow.",
3857
3858
  "The task must block the rest of the interface or requires confirmation in a modal.",
3858
- "Several sections must remain editable at the same time.",
3859
3859
  "The header requires custom actions beyond the fixed edit-save-cancel workflow."
3860
3860
  ],
3861
3861
  "alternatives": [
@@ -3880,7 +3880,11 @@
3880
3880
  "component:ds-input",
3881
3881
  "component:ds-select",
3882
3882
  "component:ds-switch",
3883
- "component:ds-text"
3883
+ "component:ds-text",
3884
+ "component:ds-setting-row-toggle",
3885
+ "component:ds-setting-row-radio",
3886
+ "component:ds-setting-row-checkbox",
3887
+ "component:ds-inline-banner-settings"
3884
3888
  ],
3885
3889
  "accessibility": [
3886
3890
  "Provide a concise heading that identifies the settings section; CardSetting renders it as an h2.",
@@ -3895,25 +3899,30 @@
3895
3899
  "The editing property is controlled; CardSetting never changes it internally.",
3896
3900
  "dsAction emits edit, save, or cancel with the original pointer event. The parent decides whether and when editing changes.",
3897
3901
  "When another section requests edit, the parent keeps one active section and resolves any dirty current section before switching.",
3902
+ "Project persistent informational copy into the banner slot so it sits above the padded content body and does not receive content-area padding.",
3898
3903
  "The parent owns read-only versus editable body composition, dirty state, validation, persistence, loading, success, and error consequences.",
3899
3904
  "A save request keeps the section editing while validation or persistence is pending; the parent exits only after success.",
3900
- "A cancel request does not persist changes; the parent restores its chosen value snapshot and exits editing."
3905
+ "A cancel request does not persist changes; the parent restores its chosen value snapshot and exits editing.",
3906
+ "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."
3901
3907
  ],
3902
3908
  "responsiveBehavior": [
3903
- "Choose sm, md, or lg from the parent layout; each width uses its matching token-based minimum height.",
3909
+ "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.",
3904
3910
  "The surface never exceeds its parent width, while the parent owns wrapping, columns, stacking, and breakpoint changes.",
3905
3911
  "At narrow widths, keep the fixed header actions visible and let application-owned body layouts collapse before allowing horizontal overflow."
3906
3912
  ],
3907
3913
  "frameworkCaveats": {
3908
3914
  "customElements": [
3915
+ "Project ds-inline-banner-settings with slot=\"banner\". Leave setting rows and other controls in the default slot.",
3909
3916
  "Set editing as a JavaScript property and inspect dsAction.detail.action before updating the controlled state.",
3910
3917
  "When one section emits edit, update every sibling CardSetting so only the requested section remains editing."
3911
3918
  ],
3912
3919
  "react": [
3920
+ "Pass slot=\"banner\" on ds-inline-banner-settings. Leave setting rows and other controls in the default slot.",
3913
3921
  "Pass editing from parent state and inspect onDsAction event detail; do not treat Save as successful until validation and persistence complete.",
3914
3922
  "Store one active section id and derive each CardSetting editing prop from that id."
3915
3923
  ],
3916
3924
  "angular": [
3925
+ "Set slot=\"banner\" on ds-inline-banner-settings. Leave setting rows and other controls in the default slot.",
3917
3926
  "Bind [editing] and inspect $event.detail.action from (dsAction); do not treat Save as successful until validation and persistence complete.",
3918
3927
  "Store one active section id and derive each CardSetting editing binding from that id."
3919
3928
  ]
@@ -3948,14 +3957,22 @@
3948
3957
  "reason": "The component owns its surface radius; retain the shared recipe and customize an outer wrapper when needed.",
3949
3958
  "props": []
3950
3959
  },
3960
+ {
3961
+ "properties": [
3962
+ "padding"
3963
+ ],
3964
+ "reason": "Content-area padding-block belongs on the body. The banner slot sits above that padding and does not receive it.",
3965
+ "props": []
3966
+ },
3951
3967
  {
3952
3968
  "properties": [
3953
3969
  "width",
3954
3970
  "min-height"
3955
3971
  ],
3956
- "reason": "Card width selects the component geometry; use cardWidth and let the parent constrain available space.",
3972
+ "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.",
3957
3973
  "props": [
3958
- "cardWidth"
3974
+ "cardWidth",
3975
+ "variant"
3959
3976
  ]
3960
3977
  }
3961
3978
  ],
@@ -3987,6 +4004,10 @@
3987
4004
  "saveLabel": {
3988
4005
  "type": "string",
3989
4006
  "required": false
4007
+ },
4008
+ "variant": {
4009
+ "type": "CardSettingVariant",
4010
+ "required": false
3990
4011
  }
3991
4012
  },
3992
4013
  "events": [
@@ -4469,7 +4490,8 @@
4469
4490
  "The initial checked and indeterminate values are restored by native form reset; checked values submit under name and unchecked values submit nothing.",
4470
4491
  "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.",
4471
4492
  "Presentation mode removes checkbox semantics, focus, interaction, label rendering, description rendering, and form submission while preserving the visual state.",
4472
- "Description-rich checkboxes grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy."
4493
+ "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.",
4494
+ "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."
4473
4495
  ],
4474
4496
  "responsiveBehavior": [
4475
4497
  "Choose size from the density of the containing row; labels and descriptions may wrap while the placement box stays fixed.",
@@ -4530,7 +4552,8 @@
4530
4552
  "reason": "The component owns its surface and interaction treatment; use its semantic presentation props or compose an application-owned surrounding surface.",
4531
4553
  "props": [
4532
4554
  "size",
4533
- "presentation"
4555
+ "presentation",
4556
+ "hasInteractionFill"
4534
4557
  ]
4535
4558
  }
4536
4559
  ],
@@ -4551,6 +4574,10 @@
4551
4574
  "type": "boolean",
4552
4575
  "required": false
4553
4576
  },
4577
+ "hasInteractionFill": {
4578
+ "type": "boolean",
4579
+ "required": false
4580
+ },
4554
4581
  "indeterminate": {
4555
4582
  "type": "boolean",
4556
4583
  "required": false
@@ -4610,6 +4637,137 @@
4610
4637
  "text"
4611
4638
  ]
4612
4639
  },
4640
+ {
4641
+ "id": "component:ds-checkbox-group",
4642
+ "tag": "ds-checkbox-group",
4643
+ "name": "checkbox-group",
4644
+ "title": "CheckboxGroup",
4645
+ "summary": "A visible, accessible label and shared vertical rhythm for a list of independent Checkbox controls.",
4646
+ "intentStatus": "complete",
4647
+ "intent": {
4648
+ "audience": "general",
4649
+ "status": "experimental",
4650
+ "summary": "A visible, accessible label and shared vertical rhythm for a list of independent Checkbox controls.",
4651
+ "useWhen": [
4652
+ "Two or more related checkboxes need one visible group label in a form.",
4653
+ "A checkbox list should use the same density-aligned heading geometry as other compact option lists."
4654
+ ],
4655
+ "avoidWhen": [
4656
+ "Only one standalone checkbox is needed.",
4657
+ "Exactly one option may be selected; use Radio instead.",
4658
+ "The list is a settings-card row; use component:ds-setting-row-checkbox, which owns the heading and view/edit presentation."
4659
+ ],
4660
+ "alternatives": [
4661
+ {
4662
+ "when": "Exactly one option may be selected.",
4663
+ "component": "component:ds-radio",
4664
+ "reason": "Radio owns mutually exclusive selection and keyboard traversal."
4665
+ }
4666
+ ],
4667
+ "commonlyComposedWith": [
4668
+ "component:ds-checkbox",
4669
+ "component:ds-text",
4670
+ "component:ds-setting-row-checkbox"
4671
+ ],
4672
+ "accessibility": [
4673
+ "The visible label names the role=group container; each slotted Checkbox keeps its own visible label, state, focus, and form value.",
4674
+ "Inside ds-setting-row-checkbox the visible form label is omitted on first paint; the row heading is the accessible name via aria-labelledby.",
4675
+ "Use aria-describedby to associate group-level guidance or validation copy.",
4676
+ "Use the same size on CheckboxGroup and every slotted Checkbox so their text origins and density remain aligned."
4677
+ ],
4678
+ "states": [
4679
+ "The label uses the shared density section-heading row and body-small emphasis.",
4680
+ "Vertical checkbox options use a 4px gap; at medium density the group label and each single-line checkbox row are 32px high.",
4681
+ "Selection, mixed, inactive, validation, and form behavior remain owned by each slotted Checkbox."
4682
+ ],
4683
+ "responsiveBehavior": [
4684
+ "The group fills the width supplied by its parent while each Checkbox keeps its intrinsic row width and allows copy to wrap."
4685
+ ],
4686
+ "frameworkCaveats": {
4687
+ "customElements": [
4688
+ "Slot two or more ds-checkbox children and keep their name, value, and checked state application-owned."
4689
+ ],
4690
+ "react": [
4691
+ "Compose DsCheckbox children inside DsCheckboxGroup."
4692
+ ],
4693
+ "vue": [
4694
+ "Compose DsCheckbox children inside DsCheckboxGroup."
4695
+ ],
4696
+ "angular": [
4697
+ "Compose generated DsCheckbox adapters inside DsCheckboxGroup."
4698
+ ]
4699
+ },
4700
+ "references": [
4701
+ {
4702
+ "label": "Storybook examples",
4703
+ "path": "src/wc/components/CheckboxGroup/CheckboxGroup.stories.ts"
4704
+ },
4705
+ {
4706
+ "label": "Rendered form geometry coverage",
4707
+ "path": "tests/e2e/forms.spec.ts"
4708
+ }
4709
+ ],
4710
+ "styling": {
4711
+ "rationale": "The group owns only its label and option-list rhythm; each Checkbox owns its own selection anatomy.",
4712
+ "protected": [
4713
+ {
4714
+ "properties": [
4715
+ "gap",
4716
+ "padding",
4717
+ "font",
4718
+ "font-size",
4719
+ "font-weight",
4720
+ "line-height"
4721
+ ],
4722
+ "reason": "Use size to keep the heading and slotted controls on the shared density recipe.",
4723
+ "props": [
4724
+ "size"
4725
+ ]
4726
+ }
4727
+ ],
4728
+ "customProperties": []
4729
+ }
4730
+ },
4731
+ "api": {
4732
+ "props": {
4733
+ "ariaDescribedby": {
4734
+ "type": "string | undefined",
4735
+ "required": false
4736
+ },
4737
+ "ariaLabel": {
4738
+ "type": "string | null",
4739
+ "required": false
4740
+ },
4741
+ "ariaLabelledby": {
4742
+ "type": "string | undefined",
4743
+ "required": false
4744
+ },
4745
+ "label": {
4746
+ "type": "string",
4747
+ "required": false
4748
+ },
4749
+ "size": {
4750
+ "type": "CheckboxGroupSize",
4751
+ "required": false
4752
+ }
4753
+ },
4754
+ "events": [],
4755
+ "slots": []
4756
+ },
4757
+ "exports": {
4758
+ "customElement": "ds-checkbox-group",
4759
+ "react": "DsCheckboxGroup",
4760
+ "vue": "DsCheckboxGroup",
4761
+ "angular": "DsCheckboxGroup"
4762
+ },
4763
+ "dependencies": [
4764
+ "@ds-mo/ui",
4765
+ "@ds-mo/tokens"
4766
+ ],
4767
+ "componentDependencies": [
4768
+ "text"
4769
+ ]
4770
+ },
4613
4771
  {
4614
4772
  "id": "component:ds-chip",
4615
4773
  "tag": "ds-chip",
@@ -6716,21 +6874,21 @@
6716
6874
  "tag": "ds-empty-state",
6717
6875
  "name": "empty-state",
6718
6876
  "title": "EmptyState",
6719
- "summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
6877
+ "summary": "Centered empty-content message with optional consumer-owned recovery actions.",
6720
6878
  "intentStatus": "complete",
6721
6879
  "intent": {
6722
6880
  "audience": "general",
6723
6881
  "status": "stable",
6724
- "summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
6882
+ "summary": "Centered empty-content message with optional consumer-owned recovery actions.",
6725
6883
  "useWhen": [
6726
6884
  "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.",
6727
6885
  "A prominent empty region benefits from a decorative icon, visual title, and supporting body copy.",
6728
- "A compact owner such as a Select popup needs only centered body copy."
6886
+ "A compact owner such as a Select popup needs only centered body copy.",
6887
+ "An empty region needs a concise recovery action that helps the user reveal or create content."
6729
6888
  ],
6730
6889
  "avoidWhen": [
6731
6890
  "Content is still loading; use Skeleton for predictable structure or Loader for an indeterminate operation.",
6732
6891
  "The state is an error, warning, or confirmation that needs semantic intent and announcement from the owning workflow.",
6733
- "The state needs a recovery action, link, or other interactive content; the current EmptyState pattern is intentionally message-only.",
6734
6892
  "A decorative illustration, arbitrary rich content, or custom layout is required."
6735
6893
  ],
6736
6894
  "alternatives": [
@@ -6754,20 +6912,23 @@
6754
6912
  "component:ds-table",
6755
6913
  "component:ds-select",
6756
6914
  "component:ds-text",
6757
- "component:ds-icon"
6915
+ "component:ds-icon",
6916
+ "component:ds-button-unfilled"
6758
6917
  ],
6759
6918
  "accessibility": [
6760
6919
  "The optional icon is decorative; the title and body provide all meaning in text.",
6761
6920
  "EmptyState does not create a live region or alert automatically. The owner decides whether a dynamic transition requires announcement.",
6762
6921
  "The visual title does not impose a document heading level because the correct hierarchy belongs to the consuming page or region.",
6763
- "Keep localized body copy concise and sufficient when using the body-only variant."
6922
+ "Keep localized body copy concise and sufficient when using the body-only variant.",
6923
+ "Give recovery controls explicit accessible names and keep their behavior with the owning workflow."
6764
6924
  ],
6765
6925
  "states": [
6766
6926
  "Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
6767
6927
  "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.",
6768
6928
  "The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
6769
- "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.",
6770
- "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
6929
+ "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.",
6930
+ "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants.",
6931
+ "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."
6771
6932
  ],
6772
6933
  "responsiveBehavior": [
6773
6934
  "The owner controls available width and height; text wraps naturally while remaining centered.",
@@ -6816,7 +6977,9 @@
6816
6977
  }
6817
6978
  },
6818
6979
  "events": [],
6819
- "slots": []
6980
+ "slots": [
6981
+ "actions"
6982
+ ]
6820
6983
  },
6821
6984
  "exports": {
6822
6985
  "customElement": "ds-empty-state",
@@ -6885,7 +7048,8 @@
6885
7048
  "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.",
6886
7049
  "A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
6887
7050
  "Field owns validation presentation but not validation timing; the form decides when to set error and errorMessage.",
6888
- "The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text."
7051
+ "The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text.",
7052
+ "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."
6889
7053
  ],
6890
7054
  "responsiveBehavior": [
6891
7055
  "Field fills the width supplied by its parent and makes the slotted control fill that field width.",
@@ -7447,17 +7611,129 @@
7447
7611
  ],
7448
7612
  "componentDependencies": []
7449
7613
  },
7614
+ {
7615
+ "id": "component:ds-inline-banner-settings",
7616
+ "tag": "ds-inline-banner-settings",
7617
+ "name": "inline-banner-settings",
7618
+ "title": "InlineBannerSettings",
7619
+ "summary": "Compact non-interactive informational copy row for settings cards.",
7620
+ "intentStatus": "complete",
7621
+ "intent": {
7622
+ "audience": "general",
7623
+ "status": "stable",
7624
+ "summary": "Compact non-interactive informational copy row for settings cards.",
7625
+ "useWhen": [
7626
+ "A settings card needs persistent informational copy above its content.",
7627
+ "The message should remain visible in both read-only and editing presentations of the settings card.",
7628
+ "The message needs body-small typography, compact spacing, and a single tertiary bottom boundary."
7629
+ ],
7630
+ "avoidWhen": [
7631
+ "The message belongs in general bounded content outside a settings card; reserve the general inline-banner component for that use case.",
7632
+ "The message is application-wide or needs dismissal, actions, or announcement urgency; use Banner.",
7633
+ "The message is transient or follows a completed action; use Toast."
7634
+ ],
7635
+ "alternatives": [
7636
+ {
7637
+ "when": "A persistent application-wide condition needs optional actions or dismissal.",
7638
+ "component": "component:ds-banner",
7639
+ "reason": "Banner owns shell-level messaging, actions, dismissal, and announcement behavior."
7640
+ },
7641
+ {
7642
+ "when": "A field needs supporting or validation copy tied to its control.",
7643
+ "component": "component:ds-field",
7644
+ "reason": "Field owns the control relationship and supporting-message semantics."
7645
+ }
7646
+ ],
7647
+ "commonlyComposedWith": [
7648
+ "component:ds-card-setting",
7649
+ "component:ds-text"
7650
+ ],
7651
+ "accessibility": [
7652
+ "Keep the description concise and authored; InlineBannerSettings does not transform, truncate, or announce the copy.",
7653
+ "Use InlineBannerSettings for static context. Applications must choose a live-region component when a dynamic announcement is required.",
7654
+ "The informational copy remains plain text and has no interactive controls or dismissal affordance."
7655
+ ],
7656
+ "states": [
7657
+ "The description renders verbatim in every state in which the owning settings card projects the component.",
7658
+ "The component has no internal visibility, editing, or dismissal state; the owning settings card controls whether it is present.",
7659
+ "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."
7660
+ ],
7661
+ "responsiveBehavior": [
7662
+ "The component fills the available inline size and lets body-small copy wrap naturally.",
7663
+ "The effective inline inset remains 16px: 8px banner padding, 6px inner content padding, and 2px text-side padding."
7664
+ ],
7665
+ "frameworkCaveats": {
7666
+ "customElements": [
7667
+ "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."
7668
+ ],
7669
+ "react": [
7670
+ "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."
7671
+ ],
7672
+ "angular": [
7673
+ "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."
7674
+ ]
7675
+ },
7676
+ "references": [
7677
+ {
7678
+ "label": "Settings inline banner examples",
7679
+ "path": "src/wc/components/InlineBannerSettings/InlineBannerSettings.stories.ts"
7680
+ },
7681
+ {
7682
+ "label": "Rendered geometry coverage",
7683
+ "path": "tests/e2e/inline-banner-settings.spec.ts"
7684
+ }
7685
+ ],
7686
+ "styling": {
7687
+ "rationale": "The component owns only the compact settings informational row recipe; its card owns the surrounding surface and layout.",
7688
+ "protected": [
7689
+ {
7690
+ "properties": [
7691
+ "border-bottom",
7692
+ "color",
7693
+ "padding"
7694
+ ],
7695
+ "reason": "The component owns the readable informational row treatment and keeps its spacing consistent across settings cards.",
7696
+ "props": []
7697
+ }
7698
+ ],
7699
+ "customProperties": []
7700
+ }
7701
+ },
7702
+ "api": {
7703
+ "props": {
7704
+ "description": {
7705
+ "type": "string",
7706
+ "required": true
7707
+ }
7708
+ },
7709
+ "events": [],
7710
+ "slots": []
7711
+ },
7712
+ "exports": {
7713
+ "customElement": "ds-inline-banner-settings",
7714
+ "react": "DsInlineBannerSettings",
7715
+ "vue": "DsInlineBannerSettings",
7716
+ "angular": "DsInlineBannerSettings"
7717
+ },
7718
+ "dependencies": [
7719
+ "@ds-mo/ui",
7720
+ "@ds-mo/tokens"
7721
+ ],
7722
+ "componentDependencies": [
7723
+ "text"
7724
+ ]
7725
+ },
7450
7726
  {
7451
7727
  "id": "component:ds-input",
7452
7728
  "tag": "ds-input",
7453
7729
  "name": "input",
7454
7730
  "title": "Input",
7455
- "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.",
7731
+ "summary": "Form-associated text and number input with constraints, optional free-text suggestions, token entry, and character counts.",
7456
7732
  "intentStatus": "complete",
7457
7733
  "intent": {
7458
7734
  "audience": "general",
7459
7735
  "status": "stable",
7460
- "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.",
7736
+ "summary": "Form-associated text and number input with constraints, optional free-text suggestions, token entry, and character counts.",
7461
7737
  "useWhen": [
7462
7738
  "A user must enter or edit one line of text, an email address, telephone number, URL, search query, password, or exact number.",
7463
7739
  "The value must participate in native, Angular, React, or Vue form state.",
@@ -7508,7 +7784,7 @@
7508
7784
  "Error text is associated with the native input and announced as an alert when the invalid state is rendered.",
7509
7785
  "Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission.",
7510
7786
  "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.",
7511
- "Number stepper actions are pointer affordances hidden from the accessibility tree; the native spinbutton remains the single keyboard and assistive-technology control.",
7787
+ "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.",
7512
7788
  "Prefix and suffix content must not carry information that is otherwise absent from the field's visible label, value, or description.",
7513
7789
  "A nested prefix or suffix Select is a separate control from the editable value and must have its own accessible name."
7514
7790
  ],
@@ -7523,10 +7799,13 @@
7523
7799
  "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.",
7524
7800
  "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.",
7525
7801
  "Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
7526
- "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.",
7802
+ "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.",
7527
7803
  "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.",
7528
7804
  "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
7529
- "Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts."
7805
+ "Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts.",
7806
+ "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.",
7807
+ "Suggestions assist free text rather than constrain selection. Arrow keys highlight suggestions, Enter accepts one, and Escape dismisses the popup without changing the value.",
7808
+ "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."
7530
7809
  ],
7531
7810
  "responsiveBehavior": [
7532
7811
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
@@ -7536,16 +7815,20 @@
7536
7815
  "frameworkCaveats": {
7537
7816
  "customElements": [
7538
7817
  "Listen for dsChange for user edits and dsClear for the search clear action.",
7539
- "Use the form attribute on the host when associating an input rendered outside its owning form."
7818
+ "Use the form attribute on the host when associating an input rendered outside its owning form.",
7819
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7540
7820
  ],
7541
7821
  "react": [
7542
- "Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear."
7822
+ "Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear.",
7823
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7543
7824
  ],
7544
7825
  "vue": [
7545
- "Use DsInput with v-model for the value, and listen for dsChange and dsClear."
7826
+ "Use DsInput with v-model for the value, and listen for dsChange and dsClear.",
7827
+ "Bind committed token arrays through tokens and dsTokensChange, separately from the draft value. Assign suggestions as a JavaScript array."
7546
7828
  ],
7547
7829
  "angular": [
7548
- "Import DsInput with TextValueAccessor when integrating with Angular Forms."
7830
+ "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.",
7831
+ "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."
7549
7832
  ]
7550
7833
  },
7551
7834
  "references": [
@@ -7640,6 +7923,10 @@
7640
7923
  "type": "string",
7641
7924
  "required": false
7642
7925
  },
7926
+ "decrementLabel": {
7927
+ "type": "string",
7928
+ "required": false
7929
+ },
7643
7930
  "disabled": {
7644
7931
  "type": "boolean",
7645
7932
  "required": false
@@ -7676,6 +7963,10 @@
7676
7963
  "type": "string | undefined",
7677
7964
  "required": false
7678
7965
  },
7966
+ "incrementLabel": {
7967
+ "type": "string",
7968
+ "required": false
7969
+ },
7679
7970
  "inputId": {
7680
7971
  "type": "string | undefined",
7681
7972
  "required": false
@@ -7688,18 +7979,38 @@
7688
7979
  "type": "boolean",
7689
7980
  "required": false
7690
7981
  },
7982
+ "lengthBehavior": {
7983
+ "type": "'error' | 'restrict'",
7984
+ "required": false
7985
+ },
7691
7986
  "max": {
7692
7987
  "type": "number | undefined",
7693
7988
  "required": false
7694
7989
  },
7990
+ "maxLength": {
7991
+ "type": "number | undefined",
7992
+ "required": false
7993
+ },
7695
7994
  "min": {
7696
7995
  "type": "number | undefined",
7697
7996
  "required": false
7698
7997
  },
7998
+ "minLength": {
7999
+ "type": "number | undefined",
8000
+ "required": false
8001
+ },
7699
8002
  "name": {
7700
8003
  "type": "string | undefined",
7701
8004
  "required": false
7702
8005
  },
8006
+ "pattern": {
8007
+ "type": "string | undefined",
8008
+ "required": false
8009
+ },
8010
+ "patternMessage": {
8011
+ "type": "string | undefined",
8012
+ "required": false
8013
+ },
7703
8014
  "placeholder": {
7704
8015
  "type": "string | undefined",
7705
8016
  "required": false
@@ -7708,6 +8019,10 @@
7708
8019
  "type": "boolean",
7709
8020
  "required": false
7710
8021
  },
8022
+ "removeTokenLabel": {
8023
+ "type": "string",
8024
+ "required": false
8025
+ },
7711
8026
  "required": {
7712
8027
  "type": "boolean",
7713
8028
  "required": false
@@ -7716,10 +8031,18 @@
7716
8031
  "type": "string",
7717
8032
  "required": false
7718
8033
  },
8034
+ "showCharacterCount": {
8035
+ "type": "boolean",
8036
+ "required": false
8037
+ },
7719
8038
  "showPasswordLabel": {
7720
8039
  "type": "string",
7721
8040
  "required": false
7722
8041
  },
8042
+ "showStepper": {
8043
+ "type": "boolean",
8044
+ "required": false
8045
+ },
7723
8046
  "size": {
7724
8047
  "type": "InputSize",
7725
8048
  "required": false
@@ -7728,10 +8051,22 @@
7728
8051
  "type": "number | undefined",
7729
8052
  "required": false
7730
8053
  },
8054
+ "suggestions": {
8055
+ "type": "string[]",
8056
+ "required": false
8057
+ },
7731
8058
  "textAlign": {
7732
8059
  "type": "InputTextAlign",
7733
8060
  "required": false
7734
8061
  },
8062
+ "tokenized": {
8063
+ "type": "boolean",
8064
+ "required": false
8065
+ },
8066
+ "tokens": {
8067
+ "type": "string[]",
8068
+ "required": false
8069
+ },
7735
8070
  "type": {
7736
8071
  "type": "InputType",
7737
8072
  "required": false
@@ -7753,6 +8088,14 @@
7753
8088
  {
7754
8089
  "name": "dsClear",
7755
8090
  "detail": "void"
8091
+ },
8092
+ {
8093
+ "name": "dsSuggestionSelect",
8094
+ "detail": "string"
8095
+ },
8096
+ {
8097
+ "name": "dsTokensChange",
8098
+ "detail": "string[]"
7756
8099
  }
7757
8100
  ],
7758
8101
  "slots": []
@@ -7770,8 +8113,10 @@
7770
8113
  ],
7771
8114
  "componentDependencies": [
7772
8115
  "button-unfilled",
8116
+ "chip",
7773
8117
  "divider",
7774
8118
  "icon",
8119
+ "input",
7775
8120
  "text"
7776
8121
  ]
7777
8122
  },
@@ -8065,7 +8410,7 @@
8065
8410
  {
8066
8411
  "when": "The hour, minute, and AM/PM lists are needed without a form field.",
8067
8412
  "component": "component:ds-time-picker",
8068
- "reason": "TimePicker owns the bounded 12-hour lists and selected-tile treatment."
8413
+ "reason": "TimePicker owns the bounded clock lists and selected-tile treatment."
8069
8414
  },
8070
8415
  {
8071
8416
  "when": "The user chooses from a finite set of named times or cadences.",
@@ -8083,9 +8428,9 @@
8083
8428
  ],
8084
8429
  "accessibility": [
8085
8430
  "Provide a persistent visible label through the owning field or an external native label.",
8086
- "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.",
8431
+ "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.",
8087
8432
  "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.",
8088
- "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.",
8433
+ "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.",
8089
8434
  "Error text is associated with the text field and announced as an alert when the invalid state is rendered.",
8090
8435
  "Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission."
8091
8436
  ],
@@ -8095,7 +8440,8 @@
8095
8440
  "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.",
8096
8441
  "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
8097
8442
  "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.",
8098
- "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."
8443
+ "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.",
8444
+ "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."
8099
8445
  ],
8100
8446
  "responsiveBehavior": [
8101
8447
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
@@ -8217,6 +8563,10 @@
8217
8563
  "type": "boolean",
8218
8564
  "required": false
8219
8565
  },
8566
+ "hourFormat": {
8567
+ "type": "'12' | '24'",
8568
+ "required": false
8569
+ },
8220
8570
  "inputId": {
8221
8571
  "type": "string | undefined",
8222
8572
  "required": false
@@ -8439,7 +8789,7 @@
8439
8789
  ],
8440
8790
  "alternatives": [
8441
8791
  {
8442
- "when": "One map entity needs operating state, heading, and stale treatment.",
8792
+ "when": "One map entity needs operating state, bearing, and an optional dashed outline.",
8443
8793
  "component": "component:ds-map-entity-marker",
8444
8794
  "reason": "MapEntityMarker owns single-entity marker semantics and geometry."
8445
8795
  },
@@ -8555,12 +8905,12 @@
8555
8905
  "tag": "ds-map-entity-marker",
8556
8906
  "name": "map-entity-marker",
8557
8907
  "title": "MapEntityMarker",
8558
- "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.",
8908
+ "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.",
8559
8909
  "intentStatus": "complete",
8560
8910
  "intent": {
8561
8911
  "audience": "general",
8562
8912
  "status": "experimental",
8563
- "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.",
8913
+ "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.",
8564
8914
  "useWhen": [
8565
8915
  "An application map needs a consistent interactive marker for one entity.",
8566
8916
  "The map engine can mount a custom element and retain ownership of coordinates, anchoring, and camera behavior."
@@ -8585,14 +8935,14 @@
8585
8935
  "The component renders a native button and label is its accessible action name. Prefer an action-oriented label such as ‘Open vehicle 412’.",
8586
8936
  "Caption is a supplemental visual identifier and is hidden from assistive technology to avoid duplicating label.",
8587
8937
  "Keyboard focus reveals the same caption as hover and uses the shared visible focus ring.",
8588
- "State and stale meaning must be present in nearby map legend or application detail content; do not rely on marker color alone.",
8589
- "The stale outline remains differentiated by a dashed border in forced-colors mode."
8938
+ "Operating-state and outline meaning must be present in nearby map legend or application detail content; do not rely on marker color alone.",
8939
+ "The optional dashed outline remains differentiated by a dashed border in forced-colors mode."
8590
8940
  ],
8591
8941
  "states": [
8592
- "state selects the semantic operating-state color. Use stale as a standalone state only when no last-known operating state is available.",
8593
- "stale adds a dashed outline while preserving state, matching last-known map data.",
8594
- "immobilized always renders the upright MapKey glyph instead of the entity icon so the state is identifiable without interpreting heading.",
8595
- "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.",
8942
+ "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.",
8943
+ "The dashed outline is an independent visual option. Unknown is solid unless the owner explicitly requests dashes.",
8944
+ "immobilized always renders the upright MapKey glyph instead of the entity icon so the state is identifiable without interpreting bearing.",
8945
+ "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.",
8596
8946
  "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.",
8597
8947
  "Activation emits dsClick without changing application selection internally."
8598
8948
  ],
@@ -8606,10 +8956,10 @@
8606
8956
  "Listen for dsClick and keep selected entity, z-index, coordinates, and camera movement in application state."
8607
8957
  ],
8608
8958
  "react": [
8609
- "Pass numeric heading as a property and handle dsClick through the generated event binding."
8959
+ "Pass numeric bearing as a property and handle dsClick through the generated event binding."
8610
8960
  ],
8611
8961
  "angular": [
8612
- "Bind heading as a number and keep map-engine marker lifecycle in the owning map adapter."
8962
+ "Bind bearing as a number and keep map-engine marker lifecycle in the owning map adapter."
8613
8963
  ]
8614
8964
  },
8615
8965
  "references": [
@@ -8633,10 +8983,10 @@
8633
8983
  "color",
8634
8984
  "opacity"
8635
8985
  ],
8636
- "reason": "Marker geometry, operating-state colors, stale distinction, and de-emphasis are one accessible visual recipe.",
8986
+ "reason": "Marker geometry, operating-state colors, outline distinction, and de-emphasis are one accessible visual recipe.",
8637
8987
  "props": [
8638
8988
  "state",
8639
- "stale",
8989
+ "dashed",
8640
8990
  "dimmed"
8641
8991
  ]
8642
8992
  }
@@ -8646,16 +8996,20 @@
8646
8996
  },
8647
8997
  "api": {
8648
8998
  "props": {
8999
+ "bearing": {
9000
+ "type": "number",
9001
+ "required": false
9002
+ },
8649
9003
  "caption": {
8650
9004
  "type": "string",
8651
9005
  "required": false
8652
9006
  },
8653
- "dimmed": {
9007
+ "dashed": {
8654
9008
  "type": "boolean",
8655
9009
  "required": false
8656
9010
  },
8657
- "heading": {
8658
- "type": "number",
9011
+ "dimmed": {
9012
+ "type": "boolean",
8659
9013
  "required": false
8660
9014
  },
8661
9015
  "icon": {
@@ -8666,10 +9020,6 @@
8666
9020
  "type": "string",
8667
9021
  "required": true
8668
9022
  },
8669
- "stale": {
8670
- "type": "boolean",
8671
- "required": false
8672
- },
8673
9023
  "state": {
8674
9024
  "type": "MapEntityMarkerState",
8675
9025
  "required": false
@@ -9280,8 +9630,8 @@
9280
9630
  "Surface styling does not add semantics; failed delivery belongs in Message metadata below the unchanged bubble rather than in an error bubble treatment."
9281
9631
  ],
9282
9632
  "states": [
9283
- "The user variant represents user-sent copy in agent and person-to-person channels and uses secondary foreground.",
9284
- "The received variant represents ordinary incoming person-to-person copy.",
9633
+ "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.",
9634
+ "The received variant represents ordinary incoming person-to-person copy, uses secondary foreground, and uses the Chrome secondary background.",
9285
9635
  "Typing and rich agent output are not MessageBubble variants."
9286
9636
  ],
9287
9637
  "responsiveBehavior": [
@@ -9375,10 +9725,10 @@
9375
9725
  "states": [
9376
9726
  "The owner controls draft value and transport state; the composer emits intent without performing transport.",
9377
9727
  "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.",
9378
- "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.",
9379
- "The composer surface uses the 10px --dimension-radius-125 token.",
9728
+ "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.",
9729
+ "The composer surface uses the 4px --dimension-radius-050 token.",
9380
9730
  "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.",
9381
- "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.",
9731
+ "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.",
9382
9732
  "The attached error unit keeps a real boundary in forced colors and lets message text and application-owned recovery actions wrap at narrow widths."
9383
9733
  ],
9384
9734
  "responsiveBehavior": [
@@ -11670,12 +12020,12 @@
11670
12020
  "tag": "ds-radio",
11671
12021
  "name": "radio",
11672
12022
  "title": "Radio",
11673
- "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.",
12023
+ "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.",
11674
12024
  "intentStatus": "complete",
11675
12025
  "intent": {
11676
12026
  "audience": "general",
11677
12027
  "status": "stable",
11678
- "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.",
12028
+ "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.",
11679
12029
  "useWhen": [
11680
12030
  "A user must select exactly one visible option from a small set.",
11681
12031
  "All available choices should remain visible for comparison.",
@@ -11708,7 +12058,9 @@
11708
12058
  "component:ds-text"
11709
12059
  ],
11710
12060
  "accessibility": [
11711
- "The host exposes radiogroup semantics and requires an accessible group name from aria-label or aria-labelledby.",
12061
+ "The host exposes radiogroup semantics and requires an accessible group name from the visible label, aria-label, or aria-labelledby.",
12062
+ "When groupLabel is provided, Radio renders it above the options and uses the same text as the radiogroup's accessible name.",
12063
+ "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.",
11712
12064
  "Each visible option exposes radio semantics, its checked state, its label text, optional supporting description, and any inactive state.",
11713
12065
  "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.",
11714
12066
  "Roving tabindex keeps one active option in the tab order, preferring the selected option; setFocus uses that same public focus target."
@@ -11718,7 +12070,10 @@
11718
12070
  "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.",
11719
12071
  "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.",
11720
12072
  "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.",
11721
- "Description-rich options grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy."
12073
+ "Description-rich options grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy.",
12074
+ "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.",
12075
+ "Vertical form options use a 4px gap; a medium single-line option and its group label each use the shared 32px control height.",
12076
+ "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."
11722
12077
  ],
11723
12078
  "responsiveBehavior": [
11724
12079
  "Choose size from the density of the containing form or settings row.",
@@ -11777,7 +12132,8 @@
11777
12132
  ],
11778
12133
  "reason": "The component owns its surface and interaction treatment; use its semantic presentation props or compose an application-owned surrounding surface.",
11779
12134
  "props": [
11780
- "size"
12135
+ "size",
12136
+ "hasInteractionFill"
11781
12137
  ]
11782
12138
  }
11783
12139
  ],
@@ -11806,7 +12162,15 @@
11806
12162
  "type": "string | undefined",
11807
12163
  "required": false
11808
12164
  },
11809
- "isInactive": {
12165
+ "groupLabel": {
12166
+ "type": "string",
12167
+ "required": false
12168
+ },
12169
+ "hasInteractionFill": {
12170
+ "type": "boolean",
12171
+ "required": false
12172
+ },
12173
+ "isInactive": {
11810
12174
  "type": "boolean",
11811
12175
  "required": false
11812
12176
  },
@@ -11857,6 +12221,174 @@
11857
12221
  "text"
11858
12222
  ]
11859
12223
  },
12224
+ {
12225
+ "id": "component:ds-radio-tile",
12226
+ "tag": "ds-radio-tile",
12227
+ "name": "radio-tile",
12228
+ "title": "RadioTile",
12229
+ "summary": "A form-associated group of fully clickable radio tiles with labels and optional descriptions.",
12230
+ "intentStatus": "complete",
12231
+ "intent": {
12232
+ "audience": "general",
12233
+ "status": "experimental",
12234
+ "summary": "A form-associated group of fully clickable radio tiles with labels and optional descriptions.",
12235
+ "useWhen": [
12236
+ "A small set of mutually exclusive choices benefits from descriptive cards and large click targets."
12237
+ ],
12238
+ "avoidWhen": [
12239
+ "The choices are brief and compact; use Radio.",
12240
+ "More than one value may be chosen."
12241
+ ],
12242
+ "alternatives": [
12243
+ {
12244
+ "when": "A user may select zero or multiple independent choices.",
12245
+ "component": "component:ds-checkbox",
12246
+ "reason": "Checkbox communicates independent selection rather than one-of-many choice."
12247
+ },
12248
+ {
12249
+ "when": "A binary setting applies immediately.",
12250
+ "component": "component:ds-switch",
12251
+ "reason": "Switch communicates an immediately applied on/off setting."
12252
+ },
12253
+ {
12254
+ "when": "The option list is long or the available space is constrained.",
12255
+ "component": "component:ds-select",
12256
+ "reason": "Select keeps a larger one-of-many choice set compact."
12257
+ }
12258
+ ],
12259
+ "commonlyComposedWith": [
12260
+ "component:ds-field",
12261
+ "component:ds-text"
12262
+ ],
12263
+ "accessibility": [
12264
+ "Native radio inputs own keyboard selection, focus, and checked semantics; the complete tile activates its input.",
12265
+ "Label the group with Field or an accessible name. Descriptions name each option separately."
12266
+ ],
12267
+ "states": [
12268
+ "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.",
12269
+ "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.",
12270
+ "The component owns form values, required validation, reset, and disabled-fieldset behavior."
12271
+ ],
12272
+ "responsiveBehavior": [
12273
+ "Horizontal tiles wrap to available space; use a vertical group when descriptions need more room."
12274
+ ],
12275
+ "frameworkCaveats": {
12276
+ "angular": [
12277
+ "Use the generated radio value accessor with the standalone adapter."
12278
+ ],
12279
+ "vue": [
12280
+ "Bind value with v-model."
12281
+ ]
12282
+ },
12283
+ "references": [
12284
+ {
12285
+ "label": "Storybook review",
12286
+ "path": "src/wc/components/RadioTile/RadioTile.stories.ts"
12287
+ }
12288
+ ],
12289
+ "styling": {
12290
+ "rationale": "Tile anatomy and radio treatment belong to the component; the owner controls group width.",
12291
+ "protected": [
12292
+ {
12293
+ "properties": [
12294
+ "padding",
12295
+ "gap",
12296
+ "border-radius",
12297
+ "background",
12298
+ "border",
12299
+ "box-shadow",
12300
+ "color"
12301
+ ],
12302
+ "reason": "Use the supported group direction and state instead of replacing tile internals.",
12303
+ "props": [
12304
+ "direction"
12305
+ ]
12306
+ }
12307
+ ],
12308
+ "customProperties": []
12309
+ }
12310
+ },
12311
+ "api": {
12312
+ "props": {
12313
+ "ariaDescribedby": {
12314
+ "type": "string | undefined",
12315
+ "required": false
12316
+ },
12317
+ "ariaLabel": {
12318
+ "type": "string | null",
12319
+ "required": false
12320
+ },
12321
+ "ariaLabelledby": {
12322
+ "type": "string | undefined",
12323
+ "required": false
12324
+ },
12325
+ "direction": {
12326
+ "type": "'horizontal' | 'vertical'",
12327
+ "required": false
12328
+ },
12329
+ "disabled": {
12330
+ "type": "boolean",
12331
+ "required": false
12332
+ },
12333
+ "error": {
12334
+ "type": "boolean",
12335
+ "required": false
12336
+ },
12337
+ "form": {
12338
+ "type": "string | undefined",
12339
+ "required": false
12340
+ },
12341
+ "inputId": {
12342
+ "type": "string | undefined",
12343
+ "required": false
12344
+ },
12345
+ "isInactive": {
12346
+ "type": "boolean",
12347
+ "required": false
12348
+ },
12349
+ "name": {
12350
+ "type": "string | undefined",
12351
+ "required": false
12352
+ },
12353
+ "options": {
12354
+ "type": "RadioTileOption[]",
12355
+ "required": false
12356
+ },
12357
+ "required": {
12358
+ "type": "boolean",
12359
+ "required": false
12360
+ },
12361
+ "requiredMessage": {
12362
+ "type": "string",
12363
+ "required": false
12364
+ },
12365
+ "value": {
12366
+ "type": "string",
12367
+ "required": false
12368
+ }
12369
+ },
12370
+ "events": [
12371
+ {
12372
+ "name": "dsChange",
12373
+ "detail": "string"
12374
+ }
12375
+ ],
12376
+ "slots": []
12377
+ },
12378
+ "exports": {
12379
+ "customElement": "ds-radio-tile",
12380
+ "react": "DsRadioTile",
12381
+ "vue": "DsRadioTile",
12382
+ "angular": "DsRadioTile"
12383
+ },
12384
+ "dependencies": [
12385
+ "@ds-mo/ui",
12386
+ "@ds-mo/tokens"
12387
+ ],
12388
+ "componentDependencies": [
12389
+ "text"
12390
+ ]
12391
+ },
11860
12392
  {
11861
12393
  "id": "component:ds-score",
11862
12394
  "tag": "ds-score",
@@ -12501,6 +13033,300 @@
12501
13033
  "tooltip"
12502
13034
  ]
12503
13035
  },
13036
+ {
13037
+ "id": "component:ds-setting-row-checkbox",
13038
+ "tag": "ds-setting-row-checkbox",
13039
+ "name": "setting-row-checkbox",
13040
+ "title": "SettingRowCheckbox",
13041
+ "summary": "Padded settings-row composition for an editable Checkbox group and its non-interactive saved-value readout.",
13042
+ "intentStatus": "complete",
13043
+ "intent": {
13044
+ "audience": "general",
13045
+ "status": "experimental",
13046
+ "summary": "Padded settings-row composition for an editable Checkbox group and its non-interactive saved-value readout.",
13047
+ "useWhen": [
13048
+ "A settings card needs an independent multi-select Checkbox group as one padded row item.",
13049
+ "The same settings card needs to display the saved selected values without interactive checkbox controls in view mode."
13050
+ ],
13051
+ "avoidWhen": [
13052
+ "The Checkbox group is not part of a settings-row surface; compose ds-checkbox-group directly.",
13053
+ "Exactly one option may be selected; use component:ds-setting-row-radio.",
13054
+ "The setting is a single immediate on/off choice; use component:ds-setting-row-toggle."
13055
+ ],
13056
+ "commonlyComposedWith": [
13057
+ "component:ds-card-setting",
13058
+ "component:ds-checkbox-group",
13059
+ "component:ds-checkbox"
13060
+ ],
13061
+ "accessibility": [
13062
+ "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.",
13063
+ "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.",
13064
+ "Do not add a second interaction layer to the row; each Checkbox owns its own focus and activation while settings usage keeps hasInteractionFill false.",
13065
+ "View presentation exposes readable label, saved selected-value copy, and optional supporting copy without checkbox semantics, checkbox controls, or a focus target."
13066
+ ],
13067
+ "states": [
13068
+ "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.",
13069
+ "The owning application handles dsChange on each Checkbox and supplies valueLabel by joining the currently selected option labels.",
13070
+ "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.",
13071
+ "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."
13072
+ ],
13073
+ "responsiveBehavior": [
13074
+ "The row never exceeds its parent width; the slotted Checkbox group keeps option copy in the flexible column and wraps descriptions when needed."
13075
+ ],
13076
+ "references": [
13077
+ {
13078
+ "label": "Settings mock",
13079
+ "path": "src/wc/components/SettingRowCheckbox/SettingRowCheckbox.stories.ts"
13080
+ }
13081
+ ],
13082
+ "styling": {
13083
+ "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.",
13084
+ "protected": [
13085
+ {
13086
+ "properties": [
13087
+ "padding"
13088
+ ],
13089
+ "reason": "Keep space-200 inline inset in view and edit, with no extra host padding-block.",
13090
+ "props": []
13091
+ }
13092
+ ],
13093
+ "customProperties": []
13094
+ }
13095
+ },
13096
+ "api": {
13097
+ "props": {
13098
+ "description": {
13099
+ "type": "string",
13100
+ "required": false
13101
+ },
13102
+ "label": {
13103
+ "type": "string",
13104
+ "required": false
13105
+ },
13106
+ "presentation": {
13107
+ "type": "SettingRowCheckboxPresentation",
13108
+ "required": false
13109
+ },
13110
+ "valueLabel": {
13111
+ "type": "string",
13112
+ "required": false
13113
+ }
13114
+ },
13115
+ "events": [],
13116
+ "slots": []
13117
+ },
13118
+ "exports": {
13119
+ "customElement": "ds-setting-row-checkbox",
13120
+ "react": "DsSettingRowCheckbox",
13121
+ "vue": "DsSettingRowCheckbox",
13122
+ "angular": "DsSettingRowCheckbox"
13123
+ },
13124
+ "dependencies": [
13125
+ "@ds-mo/ui",
13126
+ "@ds-mo/tokens"
13127
+ ],
13128
+ "componentDependencies": [
13129
+ "text"
13130
+ ]
13131
+ },
13132
+ {
13133
+ "id": "component:ds-setting-row-radio",
13134
+ "tag": "ds-setting-row-radio",
13135
+ "name": "setting-row-radio",
13136
+ "title": "SettingRowRadio",
13137
+ "summary": "Padded settings-row composition for an editable Radio group and its non-interactive saved-value readout.",
13138
+ "intentStatus": "complete",
13139
+ "intent": {
13140
+ "audience": "general",
13141
+ "status": "experimental",
13142
+ "summary": "Padded settings-row composition for an editable Radio group and its non-interactive saved-value readout.",
13143
+ "useWhen": [
13144
+ "A settings card needs a mutually exclusive Radio group as one padded row item.",
13145
+ "The same settings card needs to display the saved option without an interactive control in view mode."
13146
+ ],
13147
+ "avoidWhen": [
13148
+ "The Radio group is not part of a settings-row surface; compose ds-radio directly.",
13149
+ "The setting allows more than one option to be selected; use component:ds-setting-row-checkbox.",
13150
+ "The setting is a single immediate on/off choice; use component:ds-setting-row-toggle."
13151
+ ],
13152
+ "commonlyComposedWith": [
13153
+ "component:ds-card-setting",
13154
+ "component:ds-radio"
13155
+ ],
13156
+ "accessibility": [
13157
+ "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.",
13158
+ "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.",
13159
+ "Do not add a second interaction layer to the row; Radio owns option focus and keyboard selection while settings usage keeps hasInteractionFill false.",
13160
+ "View presentation exposes readable label, saved value, and optional supporting copy without radio semantics, a radio toggle, or a focus target."
13161
+ ],
13162
+ "states": [
13163
+ "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.",
13164
+ "The owning application handles dsChange and updates the slotted Radio value.",
13165
+ "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.",
13166
+ "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."
13167
+ ],
13168
+ "responsiveBehavior": [
13169
+ "The row never exceeds its parent width; the slotted Radio keeps its option copy in the flexible column and wraps descriptions when needed."
13170
+ ],
13171
+ "references": [
13172
+ {
13173
+ "label": "Settings mock",
13174
+ "path": "src/wc/components/SettingRowRadio/SettingRowRadio.stories.ts"
13175
+ }
13176
+ ],
13177
+ "styling": {
13178
+ "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.",
13179
+ "protected": [
13180
+ {
13181
+ "properties": [
13182
+ "padding"
13183
+ ],
13184
+ "reason": "Keep space-200 inline inset in view and edit, with no extra host padding-block.",
13185
+ "props": []
13186
+ }
13187
+ ],
13188
+ "customProperties": []
13189
+ }
13190
+ },
13191
+ "api": {
13192
+ "props": {
13193
+ "description": {
13194
+ "type": "string",
13195
+ "required": false
13196
+ },
13197
+ "label": {
13198
+ "type": "string",
13199
+ "required": false
13200
+ },
13201
+ "presentation": {
13202
+ "type": "SettingRowRadioPresentation",
13203
+ "required": false
13204
+ },
13205
+ "valueLabel": {
13206
+ "type": "string",
13207
+ "required": false
13208
+ }
13209
+ },
13210
+ "events": [],
13211
+ "slots": []
13212
+ },
13213
+ "exports": {
13214
+ "customElement": "ds-setting-row-radio",
13215
+ "react": "DsSettingRowRadio",
13216
+ "vue": "DsSettingRowRadio",
13217
+ "angular": "DsSettingRowRadio"
13218
+ },
13219
+ "dependencies": [
13220
+ "@ds-mo/ui",
13221
+ "@ds-mo/tokens"
13222
+ ],
13223
+ "componentDependencies": [
13224
+ "text"
13225
+ ]
13226
+ },
13227
+ {
13228
+ "id": "component:ds-setting-row-toggle",
13229
+ "tag": "ds-setting-row-toggle",
13230
+ "name": "setting-row-toggle",
13231
+ "title": "SettingRowToggle",
13232
+ "summary": "Two-column immediate binary setting with descriptive copy and an accessible switch.",
13233
+ "intentStatus": "complete",
13234
+ "intent": {
13235
+ "audience": "general",
13236
+ "status": "experimental",
13237
+ "summary": "Two-column immediate binary setting with descriptive copy and an accessible switch.",
13238
+ "useWhen": [
13239
+ "A settings list pairs a setting name and explanation with one immediate on/off control."
13240
+ ],
13241
+ "avoidWhen": [
13242
+ "The value needs a text input, multiple choices, or an explicit Save workflow."
13243
+ ],
13244
+ "commonlyComposedWith": [
13245
+ "component:ds-card-setting",
13246
+ "component:ds-switch",
13247
+ "component:ds-text"
13248
+ ],
13249
+ "accessibility": [
13250
+ "The visible label names the switch and the optional description supplies its accessible description.",
13251
+ "Switch owns focus, keyboard activation, checked state, and disabled semantics. The row adds no second tab stop.",
13252
+ "For a settings list, the owner supplies list semantics and marks each row as a list item."
13253
+ ],
13254
+ "states": [
13255
+ "The application accepts or rejects change requests by updating the controlled checked value and owns persistence and errors.",
13256
+ "Name the enabled setting consistently; the label must not change when the switch is toggled.",
13257
+ "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.",
13258
+ "Supporting copy is text-body-small in every variant."
13259
+ ],
13260
+ "responsiveBehavior": [
13261
+ "The copy wraps while the switch keeps its natural size in the trailing column, including at narrow widths."
13262
+ ],
13263
+ "references": [
13264
+ {
13265
+ "label": "Usage states",
13266
+ "path": "src/wc/components/SettingRowToggle/SettingRowToggle.stories.ts"
13267
+ }
13268
+ ],
13269
+ "styling": {
13270
+ "rationale": "The row uses the shared settings-row inset; copy/control columns and the parent section surface stay component-owned.",
13271
+ "protected": [
13272
+ {
13273
+ "properties": [
13274
+ "padding",
13275
+ "gap"
13276
+ ],
13277
+ "reason": "Preserve the shared settings-row inset (space-100 block, space-200 inline) and copy-to-control gap.",
13278
+ "props": []
13279
+ }
13280
+ ],
13281
+ "customProperties": []
13282
+ }
13283
+ },
13284
+ "api": {
13285
+ "props": {
13286
+ "checked": {
13287
+ "type": "boolean",
13288
+ "required": false
13289
+ },
13290
+ "description": {
13291
+ "type": "string",
13292
+ "required": false
13293
+ },
13294
+ "disabled": {
13295
+ "type": "boolean",
13296
+ "required": false
13297
+ },
13298
+ "label": {
13299
+ "type": "string",
13300
+ "required": true
13301
+ },
13302
+ "variant": {
13303
+ "type": "SettingRowToggleVariant",
13304
+ "required": false
13305
+ }
13306
+ },
13307
+ "events": [
13308
+ {
13309
+ "name": "dsChange",
13310
+ "detail": "boolean"
13311
+ }
13312
+ ],
13313
+ "slots": []
13314
+ },
13315
+ "exports": {
13316
+ "customElement": "ds-setting-row-toggle",
13317
+ "react": "DsSettingRowToggle",
13318
+ "vue": "DsSettingRowToggle",
13319
+ "angular": "DsSettingRowToggle"
13320
+ },
13321
+ "dependencies": [
13322
+ "@ds-mo/ui",
13323
+ "@ds-mo/tokens"
13324
+ ],
13325
+ "componentDependencies": [
13326
+ "switch",
13327
+ "text"
13328
+ ]
13329
+ },
12504
13330
  {
12505
13331
  "id": "component:ds-shell-app",
12506
13332
  "tag": "ds-shell-app",
@@ -13412,14 +14238,15 @@
13412
14238
  "Assign a two-number array through the JavaScript value property to create a range; values are ordered, clamped, stepped, and prevented from crossing.",
13413
14239
  "minStepsBetweenValues reserves a minimum stepped distance between range thumbs.",
13414
14240
  "The initial normalized value is the native form-reset baseline and range values submit as repeated entries under the same name.",
13415
- "Focused, filled, dirty, touched, dragging, valid, disabled, read-only, and orientation data hooks expose interaction state without changing the value contract."
14241
+ "Focused, filled, dirty, touched, dragging, valid, disabled, read-only, and orientation data hooks expose interaction state without changing the value contract.",
14242
+ "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."
13416
14243
  ],
13417
14244
  "responsiveBehavior": [
13418
14245
  "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.",
13419
14246
  "Horizontal Slider fills the width supplied by its parent; the parent chooses an appropriate readable track length.",
13420
14247
  "Vertical Slider owns a token-based default length that may be overridden with --ds-slider-vertical-length in layout-specific compositions.",
13421
14248
  "Use md in ordinary forms and sm or xs only when the surrounding control density uses the same recipe.",
13422
- "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.",
14249
+ "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.",
13423
14250
  "Horizontal value direction is left-to-right; the design system does not author RTL-specific component behavior."
13424
14251
  ],
13425
14252
  "frameworkCaveats": {
@@ -13431,7 +14258,10 @@
13431
14258
  "Use DsSlider with a number or two-number value array and handle onDsChange and onDsCommit custom events."
13432
14259
  ],
13433
14260
  "angular": [
13434
- "Use DsSlider with property binding for range arrays; the generated number value accessor is appropriate only for a single numeric value."
14261
+ "Use DsSlider with SelectValueAccessor for Angular Forms; it preserves either a number or a two-number array."
14262
+ ],
14263
+ "vue": [
14264
+ "Use v-model for a number or a two-number array. Assign ticks through property binding."
13435
14265
  ]
13436
14266
  },
13437
14267
  "references": [
@@ -13573,13 +14403,17 @@
13573
14403
  "required": false
13574
14404
  },
13575
14405
  "step": {
13576
- "type": "number",
14406
+ "type": "number | 'any'",
13577
14407
  "required": false
13578
14408
  },
13579
14409
  "thumbAlignment": {
13580
14410
  "type": "SliderThumbAlignment",
13581
14411
  "required": false
13582
14412
  },
14413
+ "ticks": {
14414
+ "type": "SliderTick[]",
14415
+ "required": false
14416
+ },
13583
14417
  "value": {
13584
14418
  "type": "SliderValue",
13585
14419
  "required": false
@@ -14211,7 +15045,7 @@
14211
15045
  "pattern:menu-trigger"
14212
15046
  ],
14213
15047
  "accessibility": [
14214
- "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.",
15048
+ "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.",
14215
15049
  "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.",
14216
15050
  "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.",
14217
15051
  "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.",
@@ -14243,7 +15077,7 @@
14243
15077
  ],
14244
15078
  "responsiveBehavior": [
14245
15079
  "The table keeps native semantics at narrow widths and scrolls horizontally instead of transforming into cards.",
14246
- "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.",
15080
+ "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.",
14247
15081
  "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.",
14248
15082
  "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.",
14249
15083
  "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.",
@@ -15177,7 +16011,8 @@
15177
16011
  "The default four visible rows can be changed with rows; rows is clamped to at least one.",
15178
16012
  "Vertical resizing is enabled by default and can be disabled when the surrounding layout owns the field height.",
15179
16013
  "Size changes typography and inset spacing without changing the authored row count.",
15180
- "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."
16014
+ "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.",
16015
+ "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."
15181
16016
  ],
15182
16017
  "responsiveBehavior": [
15183
16018
  "Textarea fills its parent by default and follows the width supplied by Field or the form layout.",
@@ -15306,6 +16141,18 @@
15306
16141
  "type": "boolean",
15307
16142
  "required": false
15308
16143
  },
16144
+ "lengthBehavior": {
16145
+ "type": "'error' | 'restrict'",
16146
+ "required": false
16147
+ },
16148
+ "maxLength": {
16149
+ "type": "number | undefined",
16150
+ "required": false
16151
+ },
16152
+ "minLength": {
16153
+ "type": "number | undefined",
16154
+ "required": false
16155
+ },
15309
16156
  "name": {
15310
16157
  "type": "string | undefined",
15311
16158
  "required": false
@@ -15334,6 +16181,10 @@
15334
16181
  "type": "number",
15335
16182
  "required": false
15336
16183
  },
16184
+ "showCharacterCount": {
16185
+ "type": "boolean",
16186
+ "required": false
16187
+ },
15337
16188
  "size": {
15338
16189
  "type": "TextareaSize",
15339
16190
  "required": false
@@ -15378,12 +16229,12 @@
15378
16229
  "tag": "ds-time-picker",
15379
16230
  "name": "time-picker",
15380
16231
  "title": "TimePicker",
15381
- "summary": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
16232
+ "summary": "Bounded 12- or 24-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
15382
16233
  "intentStatus": "complete",
15383
16234
  "intent": {
15384
16235
  "audience": "general",
15385
16236
  "status": "stable",
15386
- "summary": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
16237
+ "summary": "Bounded 12- or 24-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
15387
16238
  "useWhen": [
15388
16239
  "A user picks a clock time from hour, minute, and AM/PM lists.",
15389
16240
  "A time field needs 32px clock tiles that match calendar day geometry and the shared choice-list selected treatment."
@@ -15411,13 +16262,14 @@
15411
16262
  ],
15412
16263
  "accessibility": [
15413
16264
  "Hour, minute, and AM/PM are separate labelled listboxes without visible column headings. Each list keeps one tab stop on the selected option.",
15414
- "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.",
16265
+ "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.",
15415
16266
  "Inactive pickers disable every option. Optional min and max times disable combinations outside that inclusive bound."
15416
16267
  ],
15417
16268
  "states": [
15418
16269
  "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.",
15419
- "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.",
15420
- "An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state."
16270
+ "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.",
16271
+ "An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state.",
16272
+ "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."
15421
16273
  ],
15422
16274
  "responsiveBehavior": [
15423
16275
  "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."
@@ -15456,6 +16308,10 @@
15456
16308
  "type": "boolean",
15457
16309
  "required": false
15458
16310
  },
16311
+ "hourFormat": {
16312
+ "type": "'12' | '24'",
16313
+ "required": false
16314
+ },
15459
16315
  "isInactive": {
15460
16316
  "type": "boolean",
15461
16317
  "required": false