@ds-mo/ui 14.35.0 → 14.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +1105 -187
  4. package/dist/angular/ds-button-inverted.d.ts +17 -0
  5. package/dist/angular/ds-button-inverted.js +46 -0
  6. package/dist/angular/ds-calendar.d.ts +15 -0
  7. package/dist/angular/ds-calendar.js +43 -0
  8. package/dist/angular/ds-field.d.ts +1 -1
  9. package/dist/angular/ds-field.js +1 -1
  10. package/dist/angular/ds-input-date.d.ts +15 -0
  11. package/dist/angular/ds-input-date.js +43 -0
  12. package/dist/angular/ds-input-time.d.ts +15 -0
  13. package/dist/angular/ds-input-time.js +43 -0
  14. package/dist/angular/ds-input.d.ts +1 -1
  15. package/dist/angular/ds-input.js +3 -3
  16. package/dist/angular/ds-select.d.ts +1 -1
  17. package/dist/angular/ds-select.js +3 -3
  18. package/dist/angular/ds-time-picker.d.ts +15 -0
  19. package/dist/angular/ds-time-picker.js +43 -0
  20. package/dist/angular/index.d.ts +1 -1
  21. package/dist/angular/index.js +5 -0
  22. package/dist/angular/proxies.d.ts +5 -0
  23. package/dist/angular/proxies.js +5 -0
  24. package/dist/angular/text-value-accessor.d.ts +1 -1
  25. package/dist/angular/text-value-accessor.js +2 -2
  26. package/dist/components/ds-agent-activity.js +1 -1
  27. package/dist/components/ds-agent-questionnaire.js +1 -1
  28. package/dist/components/ds-agent-response.js +1 -1
  29. package/dist/components/ds-agent-source-list.js +1 -1
  30. package/dist/components/ds-agent-tool-call.js +1 -1
  31. package/dist/components/ds-attachment-list.js +1 -1
  32. package/dist/components/ds-badge.js +1 -1
  33. package/dist/components/ds-banner.js +1 -1
  34. package/dist/components/ds-bar-action.js +1 -1
  35. package/dist/components/ds-bar-nav.js +1 -1
  36. package/dist/components/ds-bar-page-title.js +1 -1
  37. package/dist/components/ds-bar-title.js +1 -1
  38. package/dist/components/ds-bar-workflow.js +1 -1
  39. package/dist/components/ds-breadcrumb.js +1 -1
  40. package/dist/components/ds-button-filled.js +1 -1
  41. package/dist/components/ds-button-inverted.d.ts +11 -0
  42. package/dist/components/ds-button-inverted.js +2 -0
  43. package/dist/components/ds-button-inverted.js.map +1 -0
  44. package/dist/components/ds-button-unfilled.js +1 -1
  45. package/dist/components/ds-calendar.d.ts +11 -0
  46. package/dist/components/ds-calendar.js +2 -0
  47. package/dist/components/ds-calendar.js.map +1 -0
  48. package/dist/components/ds-card-action-center.js +1 -1
  49. package/dist/components/ds-card-chart.js +1 -1
  50. package/dist/components/ds-card-navigation.js +1 -1
  51. package/dist/components/ds-card-navigation.js.map +1 -1
  52. package/dist/components/ds-card-overview.js +1 -1
  53. package/dist/components/ds-card-setting.js +1 -1
  54. package/dist/components/ds-card-settings-scope.js +1 -1
  55. package/dist/components/ds-card-settings-scope.js.map +1 -1
  56. package/dist/components/ds-chart-legend.js +1 -1
  57. package/dist/components/ds-chart.js +1 -1
  58. package/dist/components/ds-checkbox.js +1 -1
  59. package/dist/components/ds-chip.js +1 -1
  60. package/dist/components/ds-code-block.js +1 -1
  61. package/dist/components/ds-conversation-list-item.js +1 -1
  62. package/dist/components/ds-conversation-list-item.js.map +1 -1
  63. package/dist/components/ds-conversation-list-section.js +1 -1
  64. package/dist/components/ds-conversation-list.js +1 -1
  65. package/dist/components/ds-divider.js +1 -1
  66. package/dist/components/ds-empty-state.js +1 -1
  67. package/dist/components/ds-field.js +1 -1
  68. package/dist/components/ds-filter-menu.js +1 -1
  69. package/dist/components/ds-input-date.d.ts +11 -0
  70. package/dist/components/ds-input-date.js +2 -0
  71. package/dist/components/ds-input-date.js.map +1 -0
  72. package/dist/components/ds-input-time.d.ts +11 -0
  73. package/dist/components/ds-input-time.js +2 -0
  74. package/dist/components/ds-input-time.js.map +1 -0
  75. package/dist/components/ds-input.js +1 -1
  76. package/dist/components/ds-markdown.js +1 -1
  77. package/dist/components/ds-menu.js +1 -1
  78. package/dist/components/ds-message-actions.js +1 -1
  79. package/dist/components/ds-message-bubble.js +1 -1
  80. package/dist/components/ds-message-bubble.js.map +1 -1
  81. package/dist/components/ds-message-composer.js +1 -1
  82. package/dist/components/ds-message-scroller.js +1 -1
  83. package/dist/components/ds-message.js +1 -1
  84. package/dist/components/ds-mobile-bar-nav.js +1 -1
  85. package/dist/components/ds-mobile-header.js +1 -1
  86. package/dist/components/ds-mobile-section-switcher.js +1 -1
  87. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  88. package/dist/components/ds-modal.js +1 -1
  89. package/dist/components/ds-pagination.js +1 -1
  90. package/dist/components/ds-panel-nav.js +1 -1
  91. package/dist/components/ds-panel-sub-nav.js +1 -1
  92. package/dist/components/ds-panel-tool-header.js +1 -1
  93. package/dist/components/ds-panel-tool-search.js +1 -1
  94. package/dist/components/ds-panel-tools.js +1 -1
  95. package/dist/components/ds-paper-texture.js +1 -1
  96. package/dist/components/ds-radio.js +1 -1
  97. package/dist/components/ds-score.js +1 -1
  98. package/dist/components/ds-scroll-overlay.js +1 -1
  99. package/dist/components/ds-select.js +1 -1
  100. package/dist/components/ds-shell-app.js +1 -1
  101. package/dist/components/ds-shell-page.js +1 -1
  102. package/dist/components/ds-shell-tools.js +1 -1
  103. package/dist/components/ds-skeleton.js +1 -1
  104. package/dist/components/ds-slider.js +1 -1
  105. package/dist/components/ds-slider.js.map +1 -1
  106. package/dist/components/ds-swatch-picker.js +1 -1
  107. package/dist/components/ds-switch.js +1 -1
  108. package/dist/components/ds-tab-group.js +1 -1
  109. package/dist/components/ds-table-filter.js +1 -1
  110. package/dist/components/ds-table-filter.js.map +1 -1
  111. package/dist/components/ds-table-group.js +1 -1
  112. package/dist/components/ds-table-preferences.js +1 -1
  113. package/dist/components/ds-table-preferences.js.map +1 -1
  114. package/dist/components/ds-table-saved-views.js +1 -1
  115. package/dist/components/ds-table-saved-views.js.map +1 -1
  116. package/dist/components/ds-table-search.js +1 -1
  117. package/dist/components/ds-table-search.js.map +1 -1
  118. package/dist/components/ds-table-sort.js +1 -1
  119. package/dist/components/ds-table-sort.js.map +1 -1
  120. package/dist/components/ds-table-toolbar.js +1 -1
  121. package/dist/components/ds-table.js +1 -1
  122. package/dist/components/ds-tag.js +1 -1
  123. package/dist/components/ds-text.js +1 -1
  124. package/dist/components/ds-textarea.js +1 -1
  125. package/dist/components/ds-textarea.js.map +1 -1
  126. package/dist/components/ds-time-picker.d.ts +11 -0
  127. package/dist/components/ds-time-picker.js +2 -0
  128. package/dist/components/ds-time-picker.js.map +1 -0
  129. package/dist/components/ds-toast.js +1 -1
  130. package/dist/components/ds-tooltip-chart.js +1 -1
  131. package/dist/components/ds-tooltip.js +1 -1
  132. package/dist/components/ds-typing-indicator.js +1 -1
  133. package/dist/components/{p-CI7VfYC3.js → p-2GVGhrh0.js} +2 -2
  134. package/dist/components/p-7O-2D29W.js +2 -0
  135. package/dist/components/p-7O-2D29W.js.map +1 -0
  136. package/dist/components/{p-CE540WZ7.js → p-8oRkhvjy.js} +2 -2
  137. package/dist/components/p-B27_chI7.js +2 -0
  138. package/dist/components/p-B27_chI7.js.map +1 -0
  139. package/dist/components/{p-xHGqrz_p.js → p-BOhpMUwO.js} +2 -2
  140. package/dist/components/{p-DdspY23v.js → p-BV5T1hzN.js} +2 -2
  141. package/dist/components/{p-DTDLlinw.js → p-BWfzaSc3.js} +2 -2
  142. package/dist/components/{p-CLGtPE0K.js → p-BgLI9JoT.js} +2 -2
  143. package/dist/components/{p-DGzn4k4h.js → p-C-dHtQMi.js} +2 -2
  144. package/dist/components/p-C0CE2v5D.js +2 -0
  145. package/dist/components/{p-yZRXPHDe.js → p-C2JnoaWI.js} +2 -2
  146. package/dist/components/{p-umAf0fBn.js → p-C4m8y9ki.js} +2 -2
  147. package/dist/components/{p-CAxDdYjh.js → p-CDJ2Ntcq.js} +2 -2
  148. package/dist/components/{p-DQQFN2sw.js → p-CMQUuGvl.js} +2 -2
  149. package/dist/components/{p-BQaO7cg_.js → p-CQ5RwY2C.js} +2 -2
  150. package/dist/components/p-CQIh2yRP.js +2 -0
  151. package/dist/components/{p-C1_3CVma.js.map → p-CQIh2yRP.js.map} +1 -1
  152. package/dist/components/{p-DEGNrPLe.js → p-CWPT3aOB.js} +2 -2
  153. package/dist/components/p-CWog26I_.js +2 -0
  154. package/dist/components/p-CWog26I_.js.map +1 -0
  155. package/dist/components/{p-beRFLHbB.js → p-CaNCGKEJ.js} +2 -2
  156. package/dist/components/p-CbSUyv5B.js +2 -0
  157. package/dist/components/{p-BINSI_KF.js.map → p-CbSUyv5B.js.map} +1 -1
  158. package/dist/components/{p-Dhw_W8nk.js → p-Cc3ZUQlJ.js} +2 -2
  159. package/dist/components/p-Cc3ZUQlJ.js.map +1 -0
  160. package/dist/components/{p-DFjIBS5B.js → p-Ce4zy8q1.js} +2 -2
  161. package/dist/components/{p-BcdHgPi5.js → p-CeXf9-X3.js} +2 -2
  162. package/dist/components/{p-omPm8_vx.js → p-Cga6Ex0E.js} +2 -2
  163. package/dist/components/{p-y06IxxoN.js → p-Cl9phSf0.js} +2 -2
  164. package/dist/components/{p-Dk-8Ju0Q.js → p-ClJhuG5Y.js} +2 -2
  165. package/dist/components/{p-BmFeeR4q.js → p-CqW2eyiF.js} +2 -2
  166. package/dist/components/p-Cus1Sigh.js +2 -0
  167. package/dist/components/{p-N5SHSVo2.js.map → p-Cus1Sigh.js.map} +1 -1
  168. package/dist/components/{p-CzbsTZt7.js → p-Cxr0IQjC.js} +2 -2
  169. package/dist/components/{p-CwqFJMvP.js → p-D7yBIPB6.js} +2 -2
  170. package/dist/components/p-D8rpKod8.js +2 -0
  171. package/dist/components/p-D8rpKod8.js.map +1 -0
  172. package/dist/components/{p-DtLQIMsa.js → p-DBwa1OXP.js} +2 -2
  173. package/dist/components/{p-BQsVI_vO.js → p-DK9Ex3aY.js} +2 -2
  174. package/dist/components/{p-CqlBlv55.js → p-DLXXGgmf.js} +2 -2
  175. package/dist/components/{p-BnzsBNUY.js → p-DVd1TIxi.js} +2 -2
  176. package/dist/components/p-DZ58Sg5a.js.map +1 -1
  177. package/dist/components/{p-CZOiTaNa.js → p-DgG9W9N4.js} +2 -2
  178. package/dist/components/{p-mpk_Mm8_.js → p-DkfM55x8.js} +2 -2
  179. package/dist/components/p-DkikNSSO.js +2 -0
  180. package/dist/components/p-DkikNSSO.js.map +1 -0
  181. package/dist/components/{p-C7CZ9pnP.js → p-Dryt3COt.js} +2 -2
  182. package/dist/components/{p-eo_pmPqp.js → p-Ds51RgCi.js} +2 -2
  183. package/dist/components/p-DtkLtKY0.js +2 -0
  184. package/dist/components/p-DtkLtKY0.js.map +1 -0
  185. package/dist/components/{p-C8ek-1SP.js → p-DvzI2A_M.js} +2 -2
  186. package/dist/components/p-J5x-QtlD.js +2 -0
  187. package/dist/components/{p-beCz9OnD.js.map → p-J5x-QtlD.js.map} +1 -1
  188. package/dist/components/{p-CSnsz3Eb.js → p-Jaqdfw4E.js} +2 -2
  189. package/dist/components/p-MQ36mEgn.js +2 -0
  190. package/dist/components/{p-UAIxh67Q.js.map → p-MQ36mEgn.js.map} +1 -1
  191. package/dist/components/{p-BnWxbhFP.js → p-PmcUwTQ_.js} +2 -2
  192. package/dist/components/p-TjXGRPik.js +2 -0
  193. package/dist/components/{p-B-9fdIWv.js.map → p-TjXGRPik.js.map} +1 -1
  194. package/dist/components/{p-Cq_Qpe_C.js → p-bM3LH3kc.js} +2 -2
  195. package/dist/components/{p-BPhbwXOv.js → p-ji09W9el.js} +2 -2
  196. package/dist/components/{p-n68x-ZKp.js → p-neWTRxmf.js} +2 -2
  197. package/dist/components/{p-BPlWEidl.js → p-rYePOPbJ.js} +2 -2
  198. package/dist/components/{p-D44g2Kw1.js → p-su6y4hLK.js} +2 -2
  199. package/dist/components/p-su6y4hLK.js.map +1 -0
  200. package/dist/components/{p-DC69DgAR.js → p-tNQ0YulU.js} +2 -2
  201. package/dist/components/{p-Cwz9TPVS.js → p-x1wf38q3.js} +2 -2
  202. package/dist/docs/components.json +6485 -3451
  203. package/dist/lib/utils/button-render.d.ts +1 -1
  204. package/dist/lib/utils/clock-time.d.ts +22 -0
  205. package/dist/lib/utils/date-filter-value.d.ts +4 -0
  206. package/dist/lib/utils/index.d.ts +3 -1
  207. package/dist/lib/utils/index.js +133 -0
  208. package/dist/lib/utils/index.js.map +4 -4
  209. package/dist/mcp-data/registry/bar-title.json +2 -2
  210. package/dist/mcp-data/registry/button-inverted.json +580 -0
  211. package/dist/mcp-data/registry/calendar.json +273 -0
  212. package/dist/mcp-data/registry/card-navigation.json +4 -2
  213. package/dist/mcp-data/registry/field.json +19 -14
  214. package/dist/mcp-data/registry/filter-menu.json +6 -10
  215. package/dist/mcp-data/registry/input-date.json +516 -0
  216. package/dist/mcp-data/registry/input-time.json +535 -0
  217. package/dist/mcp-data/registry/input.json +56 -8
  218. package/dist/mcp-data/registry/registry.json +1118 -185
  219. package/dist/mcp-data/registry/select.json +63 -7
  220. package/dist/mcp-data/registry/table-saved-views.json +6 -4
  221. package/dist/mcp-data/registry/textarea.json +2 -2
  222. package/dist/mcp-data/registry/time-picker.json +259 -0
  223. package/dist/react/components.d.ts +5 -0
  224. package/dist/react/components.js +5 -0
  225. package/dist/react/ds-button-inverted.d.ts +13 -0
  226. package/dist/react/ds-button-inverted.js +15 -0
  227. package/dist/react/ds-calendar.d.ts +12 -0
  228. package/dist/react/ds-calendar.js +12 -0
  229. package/dist/react/ds-field.d.ts +1 -1
  230. package/dist/react/ds-input-date.d.ts +12 -0
  231. package/dist/react/ds-input-date.js +12 -0
  232. package/dist/react/ds-input-time.d.ts +12 -0
  233. package/dist/react/ds-input-time.js +12 -0
  234. package/dist/react/ds-time-picker.d.ts +12 -0
  235. package/dist/react/ds-time-picker.js +12 -0
  236. package/dist/types/components/BarTitle/BarTitle.d.ts +1 -0
  237. package/dist/types/components/BarTitle/bar-title-action-chrome.d.ts +2 -0
  238. package/dist/types/components/ButtonInverted/ButtonInverted.d.ts +83 -0
  239. package/dist/types/components/ButtonInverted/index.d.ts +2 -0
  240. package/dist/types/components/Calendar/Calendar.d.ts +32 -0
  241. package/dist/types/components/Calendar/calendar-grid.d.ts +19 -0
  242. package/dist/types/components/Field/Field.d.ts +7 -2
  243. package/dist/types/components/FilterMenu/FilterMenu.d.ts +0 -10
  244. package/dist/types/components/Input/Input.d.ts +10 -0
  245. package/dist/types/components/InputDate/InputDate.d.ts +78 -0
  246. package/dist/types/components/InputTime/InputTime.d.ts +80 -0
  247. package/dist/types/components/Select/Select.d.ts +8 -1
  248. package/dist/types/components/TimePicker/TimePicker.d.ts +33 -0
  249. package/dist/types/components.d.ts +858 -27
  250. package/dist/types/utils/button-render.d.ts +1 -1
  251. package/dist/types/utils/clock-time.d.ts +23 -0
  252. package/dist/types/utils/date-filter-value.d.ts +4 -0
  253. package/dist/types/utils/index.d.ts +3 -1
  254. package/dist/vue/components.d.ts +5 -0
  255. package/dist/vue/components.js +5 -0
  256. package/dist/vue/ds-button-inverted.d.ts +3 -0
  257. package/dist/vue/ds-button-inverted.js +33 -0
  258. package/dist/vue/ds-calendar.d.ts +3 -0
  259. package/dist/vue/ds-calendar.js +16 -0
  260. package/dist/vue/ds-input-date.d.ts +3 -0
  261. package/dist/vue/ds-input-date.js +31 -0
  262. package/dist/vue/ds-input-time.d.ts +3 -0
  263. package/dist/vue/ds-input-time.js +32 -0
  264. package/dist/vue/ds-input.js +2 -0
  265. package/dist/vue/ds-select.js +3 -0
  266. package/dist/vue/ds-time-picker.d.ts +3 -0
  267. package/dist/vue/ds-time-picker.js +16 -0
  268. package/package.json +1 -1
  269. package/dist/components/p-B-9fdIWv.js +0 -2
  270. package/dist/components/p-BINSI_KF.js +0 -2
  271. package/dist/components/p-BbfBvMRR.js +0 -2
  272. package/dist/components/p-BbfBvMRR.js.map +0 -1
  273. package/dist/components/p-C1_3CVma.js +0 -2
  274. package/dist/components/p-Cmj04E5Q.js +0 -2
  275. package/dist/components/p-Cmj04E5Q.js.map +0 -1
  276. package/dist/components/p-D44g2Kw1.js.map +0 -1
  277. package/dist/components/p-D_u8WhlU.js +0 -2
  278. package/dist/components/p-Dhw_W8nk.js.map +0 -1
  279. package/dist/components/p-FPZbS19l.js +0 -2
  280. package/dist/components/p-FPZbS19l.js.map +0 -1
  281. package/dist/components/p-N5SHSVo2.js +0 -2
  282. package/dist/components/p-QjkufCcn.js +0 -2
  283. package/dist/components/p-QjkufCcn.js.map +0 -1
  284. package/dist/components/p-UAIxh67Q.js +0 -2
  285. package/dist/components/p-beCz9OnD.js +0 -2
  286. package/dist/types/components/FilterMenu/filter-menu-calendar.d.ts +0 -13
  287. /package/dist/components/{p-CI7VfYC3.js.map → p-2GVGhrh0.js.map} +0 -0
  288. /package/dist/components/{p-CE540WZ7.js.map → p-8oRkhvjy.js.map} +0 -0
  289. /package/dist/components/{p-xHGqrz_p.js.map → p-BOhpMUwO.js.map} +0 -0
  290. /package/dist/components/{p-DdspY23v.js.map → p-BV5T1hzN.js.map} +0 -0
  291. /package/dist/components/{p-DTDLlinw.js.map → p-BWfzaSc3.js.map} +0 -0
  292. /package/dist/components/{p-CLGtPE0K.js.map → p-BgLI9JoT.js.map} +0 -0
  293. /package/dist/components/{p-DGzn4k4h.js.map → p-C-dHtQMi.js.map} +0 -0
  294. /package/dist/components/{p-D_u8WhlU.js.map → p-C0CE2v5D.js.map} +0 -0
  295. /package/dist/components/{p-yZRXPHDe.js.map → p-C2JnoaWI.js.map} +0 -0
  296. /package/dist/components/{p-umAf0fBn.js.map → p-C4m8y9ki.js.map} +0 -0
  297. /package/dist/components/{p-CAxDdYjh.js.map → p-CDJ2Ntcq.js.map} +0 -0
  298. /package/dist/components/{p-DQQFN2sw.js.map → p-CMQUuGvl.js.map} +0 -0
  299. /package/dist/components/{p-BQaO7cg_.js.map → p-CQ5RwY2C.js.map} +0 -0
  300. /package/dist/components/{p-DEGNrPLe.js.map → p-CWPT3aOB.js.map} +0 -0
  301. /package/dist/components/{p-beRFLHbB.js.map → p-CaNCGKEJ.js.map} +0 -0
  302. /package/dist/components/{p-DFjIBS5B.js.map → p-Ce4zy8q1.js.map} +0 -0
  303. /package/dist/components/{p-BcdHgPi5.js.map → p-CeXf9-X3.js.map} +0 -0
  304. /package/dist/components/{p-omPm8_vx.js.map → p-Cga6Ex0E.js.map} +0 -0
  305. /package/dist/components/{p-y06IxxoN.js.map → p-Cl9phSf0.js.map} +0 -0
  306. /package/dist/components/{p-Dk-8Ju0Q.js.map → p-ClJhuG5Y.js.map} +0 -0
  307. /package/dist/components/{p-BmFeeR4q.js.map → p-CqW2eyiF.js.map} +0 -0
  308. /package/dist/components/{p-CzbsTZt7.js.map → p-Cxr0IQjC.js.map} +0 -0
  309. /package/dist/components/{p-CwqFJMvP.js.map → p-D7yBIPB6.js.map} +0 -0
  310. /package/dist/components/{p-DtLQIMsa.js.map → p-DBwa1OXP.js.map} +0 -0
  311. /package/dist/components/{p-BQsVI_vO.js.map → p-DK9Ex3aY.js.map} +0 -0
  312. /package/dist/components/{p-CqlBlv55.js.map → p-DLXXGgmf.js.map} +0 -0
  313. /package/dist/components/{p-BnzsBNUY.js.map → p-DVd1TIxi.js.map} +0 -0
  314. /package/dist/components/{p-CZOiTaNa.js.map → p-DgG9W9N4.js.map} +0 -0
  315. /package/dist/components/{p-mpk_Mm8_.js.map → p-DkfM55x8.js.map} +0 -0
  316. /package/dist/components/{p-C7CZ9pnP.js.map → p-Dryt3COt.js.map} +0 -0
  317. /package/dist/components/{p-eo_pmPqp.js.map → p-Ds51RgCi.js.map} +0 -0
  318. /package/dist/components/{p-C8ek-1SP.js.map → p-DvzI2A_M.js.map} +0 -0
  319. /package/dist/components/{p-CSnsz3Eb.js.map → p-Jaqdfw4E.js.map} +0 -0
  320. /package/dist/components/{p-BnWxbhFP.js.map → p-PmcUwTQ_.js.map} +0 -0
  321. /package/dist/components/{p-Cq_Qpe_C.js.map → p-bM3LH3kc.js.map} +0 -0
  322. /package/dist/components/{p-BPhbwXOv.js.map → p-ji09W9el.js.map} +0 -0
  323. /package/dist/components/{p-n68x-ZKp.js.map → p-neWTRxmf.js.map} +0 -0
  324. /package/dist/components/{p-BPlWEidl.js.map → p-rYePOPbJ.js.map} +0 -0
  325. /package/dist/components/{p-DC69DgAR.js.map → p-tNQ0YulU.js.map} +0 -0
  326. /package/dist/components/{p-Cwz9TPVS.js.map → p-x1wf38q3.js.map} +0 -0
@@ -2230,6 +2230,221 @@
2230
2230
  "text"
2231
2231
  ]
2232
2232
  },
2233
+ {
2234
+ "name": "button-inverted",
2235
+ "title": "ButtonInverted",
2236
+ "description": "Single-recipe filled command button with an inverted background and primary foreground for actions that must remain legible across ordinary surfaces.",
2237
+ "type": "registry:ui",
2238
+ "meta": {
2239
+ "library": "@ds-mo/ui",
2240
+ "distribution": "npm",
2241
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/button-inverted",
2242
+ "source": "src/wc/components/ButtonInverted/ButtonInverted.tsx",
2243
+ "intentStatus": "complete",
2244
+ "intent": {
2245
+ "audience": "general",
2246
+ "status": "stable",
2247
+ "summary": "Single-recipe filled command button with an inverted background and primary foreground for actions that must remain legible across ordinary surfaces.",
2248
+ "useWhen": [
2249
+ "A command needs the filled button structure with the fixed inverted background treatment.",
2250
+ "The action should use primary foreground content on the inverted surface without exposing intent or contrast choices.",
2251
+ "A compact, icon-only inverted action needs an explicit accessible name.",
2252
+ "The command has closely related alternatives and needs split mode while keeping the same inverted recipe."
2253
+ ],
2254
+ "avoidWhen": [
2255
+ "The action needs semantic intent or contrast-specific filled treatments; use ButtonFilled.",
2256
+ "The action is unfilled icon-only shell, navigation, overflow, or tool-rail chrome; use ButtonUnfilled.",
2257
+ "The element represents navigation rather than a command.",
2258
+ "The content is a persistent selected state rather than an action."
2259
+ ],
2260
+ "alternatives": [
2261
+ {
2262
+ "when": "The action's consequence needs a semantic intent or the fill must adapt through contrast.",
2263
+ "component": "component:ds-button-filled",
2264
+ "reason": "ButtonFilled owns intent and contrast-aware filled command treatments."
2265
+ },
2266
+ {
2267
+ "when": "The action is shell, navigation, overflow, or tool-rail chrome.",
2268
+ "component": "component:ds-button-unfilled",
2269
+ "reason": "ButtonUnfilled owns unfilled chrome, active state, borders, and surface-aware interaction states."
2270
+ },
2271
+ {
2272
+ "when": "The user is choosing a destination in application navigation.",
2273
+ "component": "component:ds-panel-nav",
2274
+ "reason": "PanelNav owns destination selection and navigation semantics."
2275
+ }
2276
+ ],
2277
+ "commonlyComposedWith": [
2278
+ "component:ds-modal",
2279
+ "component:ds-field",
2280
+ "component:ds-menu"
2281
+ ],
2282
+ "patterns": [
2283
+ "pattern:menu-trigger"
2284
+ ],
2285
+ "accessibility": [
2286
+ "Provide an explicit accessible name for icon-only buttons.",
2287
+ "In split mode, provide menuAriaLabel for the appended ChevronDown segment, pass controls with the Menu id, and synchronize expanded with the Menu open state.",
2288
+ "Set hasMenu when the action opens a Menu; it implies aria-haspopup of menu and renders the trailing chevron. Pass controls with the Menu id and expanded from the same open state given to Menu.",
2289
+ "Use haspopup directly for a non-menu popup such as a dialog; that case gets no chevron.",
2290
+ "Loading keeps the action focused and named, exposes busy and disabled state, and blocks activation.",
2291
+ "Use native submit behavior for form submission and handle the form submit event rather than submitting from the button click event."
2292
+ ],
2293
+ "states": [
2294
+ "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
2295
+ "The inverted background and primary foreground are fixed; ButtonInverted has no intent, contrast, parent-surface, or optional-border props.",
2296
+ "Every button has a minimum inline size equal to its resolved height. Short labels therefore form a square control while longer labels continue to hug their content.",
2297
+ "Set isInset only when the button is nested inside a same-size control. The default single inset removes 4px overall; insetDepth double removes 8px overall and falls back to single at xs.",
2298
+ "Rounded changes only the control radius to the half-radius treatment; it does not change the inverted recipe, size, variant, or interaction semantics.",
2299
+ "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
2300
+ "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
2301
+ "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.",
2302
+ "ButtonInverted has no active, pressed, or selected state; a filled action is a command, not a toggle or persistent selection.",
2303
+ "An open popup is a transient pressed state. While surfaceOpen is true the pressed wash is held for the popup's complete rendered lifecycle without introducing selected styling.",
2304
+ "Split mode supports label, icon, and icon-label primary segments. The primary segment emits dsClick and the appended menu segment emits dsMenuClick."
2305
+ ],
2306
+ "responsiveBehavior": [
2307
+ "Use fill width only when the parent layout calls for a full-width action, commonly on narrow form layouts.",
2308
+ "Choose density from the containing layout so the inverted action matches neighboring controls."
2309
+ ],
2310
+ "frameworkCaveats": {
2311
+ "customElements": [
2312
+ "For form submission, use the native submit type and listen to the form submit event; use dsClick for non-submit commands."
2313
+ ],
2314
+ "react": [
2315
+ "Keep async state in the owner and pass it to the loading state until the command settles."
2316
+ ],
2317
+ "angular": [
2318
+ "Keep async state in the owner and pass it to the loading state until the command settles."
2319
+ ]
2320
+ },
2321
+ "references": [
2322
+ {
2323
+ "label": "Storybook examples",
2324
+ "path": "src/wc/components/ButtonInverted/ButtonInverted.stories.ts"
2325
+ },
2326
+ {
2327
+ "label": "Surface ownership and trigger state",
2328
+ "path": "src/docs/SurfaceOwnership.mdx"
2329
+ }
2330
+ ]
2331
+ },
2332
+ "props": {
2333
+ "ariaLabel": {
2334
+ "type": "string | null",
2335
+ "required": false
2336
+ },
2337
+ "controls": {
2338
+ "type": "string | undefined",
2339
+ "required": false
2340
+ },
2341
+ "expanded": {
2342
+ "type": "boolean | undefined",
2343
+ "required": false
2344
+ },
2345
+ "hasMenu": {
2346
+ "type": "boolean",
2347
+ "required": false
2348
+ },
2349
+ "haspopup": {
2350
+ "type": "ButtonInvertedPopup | undefined",
2351
+ "required": false
2352
+ },
2353
+ "icon": {
2354
+ "type": "string",
2355
+ "required": false
2356
+ },
2357
+ "insetDepth": {
2358
+ "type": "ControlInsetDepth",
2359
+ "required": false
2360
+ },
2361
+ "isInactive": {
2362
+ "type": "boolean",
2363
+ "required": false
2364
+ },
2365
+ "isInset": {
2366
+ "type": "boolean",
2367
+ "required": false
2368
+ },
2369
+ "isLoading": {
2370
+ "type": "boolean",
2371
+ "required": false
2372
+ },
2373
+ "label": {
2374
+ "type": "string",
2375
+ "required": false
2376
+ },
2377
+ "labelEmphasis": {
2378
+ "type": "boolean",
2379
+ "required": false
2380
+ },
2381
+ "menuAriaLabel": {
2382
+ "type": "string",
2383
+ "required": false
2384
+ },
2385
+ "pressScale": {
2386
+ "type": "boolean",
2387
+ "required": false
2388
+ },
2389
+ "rounded": {
2390
+ "type": "boolean",
2391
+ "required": false
2392
+ },
2393
+ "size": {
2394
+ "type": "ButtonInvertedSize",
2395
+ "required": false
2396
+ },
2397
+ "split": {
2398
+ "type": "boolean",
2399
+ "required": false
2400
+ },
2401
+ "surfaceOpen": {
2402
+ "type": "boolean | undefined",
2403
+ "required": false
2404
+ },
2405
+ "type": {
2406
+ "type": "'button' | 'submit' | 'reset'",
2407
+ "required": false
2408
+ },
2409
+ "variant": {
2410
+ "type": "ButtonInvertedVariant",
2411
+ "required": false
2412
+ },
2413
+ "width": {
2414
+ "type": "ButtonInvertedWidth",
2415
+ "required": false
2416
+ }
2417
+ },
2418
+ "events": [
2419
+ {
2420
+ "name": "dsClick",
2421
+ "detail": "MouseEvent"
2422
+ },
2423
+ {
2424
+ "name": "dsMenuClick",
2425
+ "detail": "MouseEvent"
2426
+ }
2427
+ ],
2428
+ "slots": [],
2429
+ "exports": {
2430
+ "customElement": "ds-button-inverted",
2431
+ "react": "DsButtonInverted",
2432
+ "vue": "DsButtonInverted",
2433
+ "angular": "DsButtonInverted"
2434
+ }
2435
+ },
2436
+ "dependencies": [
2437
+ "@ds-mo/ui",
2438
+ "@ds-mo/tokens",
2439
+ "@ds-mo/icons"
2440
+ ],
2441
+ "registryDependencies": [
2442
+ "badge",
2443
+ "icon",
2444
+ "loader",
2445
+ "text"
2446
+ ]
2447
+ },
2233
2448
  {
2234
2449
  "name": "button-unfilled",
2235
2450
  "title": "ButtonUnfilled",
@@ -2498,104 +2713,231 @@
2498
2713
  ]
2499
2714
  },
2500
2715
  {
2501
- "name": "card-action-center",
2502
- "title": "CardActionCenter",
2503
- "description": "Compact bordered card that groups overview-page actions, optional values or status tags, and native destinations into named sections.",
2716
+ "name": "calendar",
2717
+ "title": "Calendar",
2718
+ "description": "Month calendar grid for choosing one calendar date or an inclusive date range, reused by form date fields and filter range selection.",
2504
2719
  "type": "registry:ui",
2505
2720
  "meta": {
2506
2721
  "library": "@ds-mo/ui",
2507
2722
  "distribution": "npm",
2508
- "storybook": "https://zainadeel.github.io/compomo/?path=/story/card-action-center",
2509
- "source": "src/wc/components/CardActionCenter/CardActionCenter.tsx",
2723
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/calendar",
2724
+ "source": "src/wc/components/Calendar/Calendar.tsx",
2510
2725
  "intentStatus": "complete",
2511
2726
  "intent": {
2512
2727
  "audience": "general",
2513
2728
  "status": "experimental",
2514
- "summary": "Compact bordered card that groups overview-page actions, optional values or status tags, and native destinations into named sections.",
2729
+ "summary": "Month calendar grid for choosing one calendar date or an inclusive date range, reused by form date fields and filter range selection.",
2515
2730
  "useWhen": [
2516
- "An overview rail needs a compact action center with multiple named groups.",
2517
- "Action rows need optional counts or short values aligned at the trailing edge.",
2518
- "Related reports or resource destinations belong beside attention items in one bounded surface."
2731
+ "A user picks one calendar day from a month grid.",
2732
+ "A user builds an inclusive start and end date by choosing two days.",
2733
+ "A date field or filter needs the shared month navigation, weekday headings, and selected-day treatment."
2519
2734
  ],
2520
2735
  "avoidWhen": [
2521
- "The complete card leads to one destination; use CardNavigation.",
2522
- "The surface edits settings in place; use CardSetting.",
2523
- "The content is a chart, legend, metric visualization, or other data-visualization composition; use CardChart or CardOverview.",
2524
- "Rows require descriptions, nested controls, menus, or selection state instead of one direct action."
2736
+ "The user types a date without opening a calendar; the owning field keeps that editable value.",
2737
+ "The user chooses a relative preset such as last 7 days rather than fixed calendar days.",
2738
+ "The popup also has to host filter categories, search, or apply actions; that surface stays with FilterMenu."
2525
2739
  ],
2526
2740
  "alternatives": [
2527
2741
  {
2528
- "when": "The entire surface represents one destination.",
2529
- "component": "component:ds-card-navigation",
2530
- "reason": "CardNavigation provides the single native-link card contract."
2742
+ "when": "The date is a form field that can be typed or picked.",
2743
+ "component": "component:ds-input-date",
2744
+ "reason": "InputDate owns the editable field, form association, and the calendar popup."
2531
2745
  },
2532
2746
  {
2533
- "when": "The card presents page-level score and metric summaries.",
2534
- "component": "component:ds-card-overview",
2535
- "reason": "CardOverview owns summary metrics, comparison periods, and selectable metric cells."
2747
+ "when": "The value is a clock time rather than a calendar date.",
2748
+ "component": "component:ds-time-picker",
2749
+ "reason": "TimePicker owns bounded hour, minute, and AM/PM lists with the same 32px tile geometry."
2750
+ },
2751
+ {
2752
+ "when": "The user chooses relative presets or mixed filter families from one trigger.",
2753
+ "component": "component:ds-filter-menu",
2754
+ "reason": "FilterMenu owns relative date presets and hosts this calendar only for fixed ranges."
2536
2755
  }
2537
2756
  ],
2538
2757
  "commonlyComposedWith": [
2539
- "component:ds-tag",
2758
+ "component:ds-input-date",
2759
+ "component:ds-filter-menu",
2760
+ "component:ds-button-unfilled",
2540
2761
  "component:ds-text"
2541
2762
  ],
2542
2763
  "accessibility": [
2543
- "Each non-empty group is a section labelled by an h2 heading, and each row is a native button or link.",
2544
- "Use href for real destinations so link context menus, modified clicks, and native browser semantics remain available.",
2545
- "Prevent the cancelable dsAction event only when an application router takes ownership of the same link activation.",
2546
- "Inactive items become disabled buttons and are removed from keyboard navigation rather than exposing a false destination.",
2547
- "Keep item labels concise; a visible trailing value participates in the action's accessible name."
2764
+ "The month grid is labelled with the visible month and year. Days are grid cells with an accessible date name.",
2765
+ "The grid keeps one tab stop. Arrow keys move by day or week, Home and End move within the week, and Page Up or Page Down change month.",
2766
+ "In range mode, the first chosen day applies immediately as a one-day range. Hovering or focusing another day previews the inclusive span without changing the value until the second activation.",
2767
+ "Month navigation buttons are named Previous month and Next month. Inactive calendars disable day and month controls."
2548
2768
  ],
2549
2769
  "states": [
2550
- "Rows expose distinct rest, hover, pressed, keyboard-focus, and inactive states.",
2551
- "An empty sections array or groups with no items render the configured empty message.",
2552
- "The application owns loading, error, permission, routing, and post-activation consequences and reflects availability through the supplied item data."
2770
+ "Single selection paints the current value with the shared interaction-fill selected wash and primary text. A committed range paints inclusive days with the faint brand fill and both edges boldly.",
2771
+ "Today uses emphasized primary text without becoming selected on its own.",
2772
+ "Days outside the visible month remain in the six-week grid and use tertiary text. Optional min and max dates disable days outside that inclusive bound.",
2773
+ "After the first range day is chosen, that day keeps the shared pressed overlay. Hovering or focusing toward another day paints the inclusive span with the shared hover overlay on top of the previous committed range, which stays visible until the replacement is completed. Completing the end day orders the two dates inclusively and replaces those overlays with brand fill."
2553
2774
  ],
2554
2775
  "responsiveBehavior": [
2555
- "The card fills its parent width and never establishes a product breakpoint.",
2556
- "Long labels wrap while trailing values remain visible; the page owns rail width and movement below primary content.",
2557
- "Groups retain their order when the parent layout moves the complete card between desktop and mobile regions."
2776
+ "The grid fills the width supplied by its owner. Seven equal day columns and the shared 4px gaps are owned here; the owner supplies the popup or pane width."
2558
2777
  ],
2559
2778
  "frameworkCaveats": {
2560
2779
  "customElements": [
2561
- "Assign sections as a JavaScript property; complex arrays are not supported as string attributes.",
2562
- "Listen for dsAction and inspect sectionId, itemId, item, and the original pointer event."
2780
+ "Listen for dsChange. Single mode emits YYYY-MM-DD. Range mode emits range:start/end using the shared date-filter string."
2563
2781
  ],
2564
2782
  "react": [
2565
- "Pass sections as an array and handle onDsAction for product actions or client-side routing.",
2566
- "Prevent the event only when replacing native navigation for an item with href."
2567
- ],
2568
- "angular": [
2569
- "Bind [sections] through the generated standalone adapter and inspect $event.detail from (dsAction).",
2570
- "Keep product data and activation consequences in the Angular owner rather than embedding them in the component contract."
2783
+ "Use DsCalendar, bind value, and handle onDsChange."
2571
2784
  ]
2572
2785
  },
2573
2786
  "references": [
2574
2787
  {
2575
- "label": "Storybook grouped, value, and empty examples",
2576
- "path": "src/wc/components/CardActionCenter/CardActionCenter.stories.ts"
2577
- },
2578
- {
2579
- "label": "Rendered semantics, interaction, and geometry coverage",
2580
- "path": "tests/e2e/card-action-center.spec.ts"
2788
+ "label": "Storybook examples",
2789
+ "path": "src/wc/components/Calendar/Calendar.stories.ts"
2581
2790
  }
2582
2791
  ]
2583
2792
  },
2584
2793
  "props": {
2585
- "emptyMessage": {
2586
- "type": "string",
2794
+ "autoFocus": {
2795
+ "type": "boolean",
2587
2796
  "required": false
2588
2797
  },
2589
- "sections": {
2590
- "type": "ReadonlyArray<CardActionCenterSection>",
2798
+ "isInactive": {
2799
+ "type": "boolean",
2800
+ "required": false
2801
+ },
2802
+ "max": {
2803
+ "type": "string | undefined",
2804
+ "required": false
2805
+ },
2806
+ "min": {
2807
+ "type": "string | undefined",
2808
+ "required": false
2809
+ },
2810
+ "selectionMode": {
2811
+ "type": "CalendarSelectionMode",
2812
+ "required": false
2813
+ },
2814
+ "value": {
2815
+ "type": "string",
2591
2816
  "required": false
2592
2817
  }
2593
2818
  },
2594
2819
  "events": [
2595
2820
  {
2596
- "name": "dsAction",
2597
- "detail": "CardActionCenterActionDetail"
2598
- }
2821
+ "name": "dsChange",
2822
+ "detail": "string"
2823
+ }
2824
+ ],
2825
+ "slots": [],
2826
+ "exports": {
2827
+ "customElement": "ds-calendar",
2828
+ "react": "DsCalendar",
2829
+ "vue": "DsCalendar",
2830
+ "angular": "DsCalendar"
2831
+ }
2832
+ },
2833
+ "dependencies": [
2834
+ "@ds-mo/ui",
2835
+ "@ds-mo/tokens"
2836
+ ],
2837
+ "registryDependencies": [
2838
+ "button-unfilled",
2839
+ "text"
2840
+ ]
2841
+ },
2842
+ {
2843
+ "name": "card-action-center",
2844
+ "title": "CardActionCenter",
2845
+ "description": "Compact bordered card that groups overview-page actions, optional values or status tags, and native destinations into named sections.",
2846
+ "type": "registry:ui",
2847
+ "meta": {
2848
+ "library": "@ds-mo/ui",
2849
+ "distribution": "npm",
2850
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/card-action-center",
2851
+ "source": "src/wc/components/CardActionCenter/CardActionCenter.tsx",
2852
+ "intentStatus": "complete",
2853
+ "intent": {
2854
+ "audience": "general",
2855
+ "status": "experimental",
2856
+ "summary": "Compact bordered card that groups overview-page actions, optional values or status tags, and native destinations into named sections.",
2857
+ "useWhen": [
2858
+ "An overview rail needs a compact action center with multiple named groups.",
2859
+ "Action rows need optional counts or short values aligned at the trailing edge.",
2860
+ "Related reports or resource destinations belong beside attention items in one bounded surface."
2861
+ ],
2862
+ "avoidWhen": [
2863
+ "The complete card leads to one destination; use CardNavigation.",
2864
+ "The surface edits settings in place; use CardSetting.",
2865
+ "The content is a chart, legend, metric visualization, or other data-visualization composition; use CardChart or CardOverview.",
2866
+ "Rows require descriptions, nested controls, menus, or selection state instead of one direct action."
2867
+ ],
2868
+ "alternatives": [
2869
+ {
2870
+ "when": "The entire surface represents one destination.",
2871
+ "component": "component:ds-card-navigation",
2872
+ "reason": "CardNavigation provides the single native-link card contract."
2873
+ },
2874
+ {
2875
+ "when": "The card presents page-level score and metric summaries.",
2876
+ "component": "component:ds-card-overview",
2877
+ "reason": "CardOverview owns summary metrics, comparison periods, and selectable metric cells."
2878
+ }
2879
+ ],
2880
+ "commonlyComposedWith": [
2881
+ "component:ds-tag",
2882
+ "component:ds-text"
2883
+ ],
2884
+ "accessibility": [
2885
+ "Each non-empty group is a section labelled by an h2 heading, and each row is a native button or link.",
2886
+ "Use href for real destinations so link context menus, modified clicks, and native browser semantics remain available.",
2887
+ "Prevent the cancelable dsAction event only when an application router takes ownership of the same link activation.",
2888
+ "Inactive items become disabled buttons and are removed from keyboard navigation rather than exposing a false destination.",
2889
+ "Keep item labels concise; a visible trailing value participates in the action's accessible name."
2890
+ ],
2891
+ "states": [
2892
+ "Rows expose distinct rest, hover, pressed, keyboard-focus, and inactive states.",
2893
+ "An empty sections array or groups with no items render the configured empty message.",
2894
+ "The application owns loading, error, permission, routing, and post-activation consequences and reflects availability through the supplied item data."
2895
+ ],
2896
+ "responsiveBehavior": [
2897
+ "The card fills its parent width and never establishes a product breakpoint.",
2898
+ "Long labels wrap while trailing values remain visible; the page owns rail width and movement below primary content.",
2899
+ "Groups retain their order when the parent layout moves the complete card between desktop and mobile regions."
2900
+ ],
2901
+ "frameworkCaveats": {
2902
+ "customElements": [
2903
+ "Assign sections as a JavaScript property; complex arrays are not supported as string attributes.",
2904
+ "Listen for dsAction and inspect sectionId, itemId, item, and the original pointer event."
2905
+ ],
2906
+ "react": [
2907
+ "Pass sections as an array and handle onDsAction for product actions or client-side routing.",
2908
+ "Prevent the event only when replacing native navigation for an item with href."
2909
+ ],
2910
+ "angular": [
2911
+ "Bind [sections] through the generated standalone adapter and inspect $event.detail from (dsAction).",
2912
+ "Keep product data and activation consequences in the Angular owner rather than embedding them in the component contract."
2913
+ ]
2914
+ },
2915
+ "references": [
2916
+ {
2917
+ "label": "Storybook grouped, value, and empty examples",
2918
+ "path": "src/wc/components/CardActionCenter/CardActionCenter.stories.ts"
2919
+ },
2920
+ {
2921
+ "label": "Rendered semantics, interaction, and geometry coverage",
2922
+ "path": "tests/e2e/card-action-center.spec.ts"
2923
+ }
2924
+ ]
2925
+ },
2926
+ "props": {
2927
+ "emptyMessage": {
2928
+ "type": "string",
2929
+ "required": false
2930
+ },
2931
+ "sections": {
2932
+ "type": "ReadonlyArray<CardActionCenterSection>",
2933
+ "required": false
2934
+ }
2935
+ },
2936
+ "events": [
2937
+ {
2938
+ "name": "dsAction",
2939
+ "detail": "CardActionCenterActionDetail"
2940
+ }
2599
2941
  ],
2600
2942
  "slots": [],
2601
2943
  "exports": {
@@ -2783,10 +3125,12 @@
2783
3125
  "The native link owns hover, pressed, and focus-visible states across the complete card in navigation-only mode.",
2784
3126
  "In content mode, the native link owns those interaction states only across the header while the body remains application-owned.",
2785
3127
  "An empty or unsafe href renders non-interactive card chrome without a false keyboard target.",
3128
+ "Copy is always stacked, so a missing description keeps the heading at the start of the column instead of centering it in the header.",
2786
3129
  "The application owns destination loading, authorization, not-found, and recovery states after navigation."
2787
3130
  ],
2788
3131
  "responsiveBehavior": [
2789
3132
  "Choose sm, md, or lg from the parent layout; the surface never exceeds its parent width.",
3133
+ "The heading stays at the start of the stacked copy column whether or not supporting copy is present, so mixed destination lists keep titles aligned. The chevron stays vertically centered in the header.",
2790
3134
  "Supporting copy wraps while the chevron remains visible at the trailing edge.",
2791
3135
  "The parent owns wrapping, columns, stacking, and breakpoint changes between cards."
2792
3136
  ],
@@ -4444,7 +4788,7 @@
4444
4788
  {
4445
4789
  "name": "field",
4446
4790
  "title": "Field",
4447
- "description": "Accessible form-field composition that gives one Input, Textarea, or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
4791
+ "description": "Accessible form-field composition that gives one Input, InputDate, InputTime, Textarea, or Select an optional visible label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
4448
4792
  "type": "registry:ui",
4449
4793
  "meta": {
4450
4794
  "library": "@ds-mo/ui",
@@ -4455,9 +4799,10 @@
4455
4799
  "intent": {
4456
4800
  "audience": "general",
4457
4801
  "status": "stable",
4458
- "summary": "Accessible form-field composition that gives one Input, Textarea, or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
4802
+ "summary": "Accessible form-field composition that gives one Input, InputDate, InputTime, Textarea, or Select an optional visible label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
4459
4803
  "useWhen": [
4460
- "An Input, Textarea, or Select needs a persistent visible label in a form.",
4804
+ "An Input, InputDate, InputTime, Textarea, or Select needs a persistent visible label in a form.",
4805
+ "A nearby heading already names the field, and the control still needs Field's error association and message rhythm.",
4461
4806
  "Help text or an error message must be programmatically associated with one control.",
4462
4807
  "A form layout needs one consistent label-control-message rhythm."
4463
4808
  ],
@@ -4475,19 +4820,23 @@
4475
4820
  ],
4476
4821
  "commonlyComposedWith": [
4477
4822
  "component:ds-input",
4823
+ "component:ds-input-date",
4824
+ "component:ds-input-time",
4478
4825
  "component:ds-textarea",
4479
4826
  "component:ds-select",
4480
4827
  "component:ds-text"
4481
4828
  ],
4482
4829
  "accessibility": [
4483
- "Slot exactly one form control. Field assigns its stable control ID and connects the visible label automatically.",
4830
+ "Slot exactly one form control. When a visible label is provided, Field assigns its stable control ID and connects that label automatically.",
4831
+ "Omit the visible label when a nearby heading already names the field. Keep a programmatic name on the slotted control, such as aria-label, and do not set aria-labelledby to an empty value.",
4484
4832
  "The visible description or error ID is merged with any authored aria-describedby references; a rendered error replaces the description.",
4485
4833
  "The error prop forwards aria-invalid and supported design-system control error styling; put visible error text on Field, not again on the child control.",
4486
4834
  "Clicking the label focuses the slotted design-system control without opening a Select popup.",
4487
4835
  "Do not use placeholder text as the only label. Keep label text concise and put format or consequence guidance in description."
4488
4836
  ],
4489
4837
  "states": [
4490
- "Label, control, description, and error content follow the shared 4px vertical field flow without changing the slotted control's width or semantics.",
4838
+ "The visible label is optional. Omit it when a nearby heading already names the field; Field still associates description and error text with the slotted control.",
4839
+ "Label, control, description, and error content follow the shared 4px vertical field flow without changing the slotted control's width or semantics. When the slotted control is borderless, description and error copy inset to that control's text origin instead of the resting bordered edge.",
4491
4840
  "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.",
4492
4841
  "A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
4493
4842
  "Field owns validation presentation but not validation timing; the form decides when to set error and errorMessage.",
@@ -4503,7 +4852,7 @@
4503
4852
  "Assign child component values and option arrays through their normal JavaScript properties."
4504
4853
  ],
4505
4854
  "react": [
4506
- "Compose one DsInput, DsTextarea, or DsSelect child and control validation timing in the form owner."
4855
+ "Compose one DsInput, DsInputDate, DsInputTime, DsTextarea, or DsSelect child and control validation timing in the form owner."
4507
4856
  ],
4508
4857
  "angular": [
4509
4858
  "Compose the generated Field adapter around the control adapter and its matching Angular value accessor."
@@ -4539,7 +4888,7 @@
4539
4888
  },
4540
4889
  "label": {
4541
4890
  "type": "string",
4542
- "required": true
4891
+ "required": false
4543
4892
  }
4544
4893
  },
4545
4894
  "events": [],
@@ -4598,14 +4947,15 @@
4598
4947
  "commonlyComposedWith": [
4599
4948
  "component:ds-select",
4600
4949
  "component:ds-table",
4601
- "component:ds-checkbox"
4950
+ "component:ds-checkbox",
4951
+ "component:ds-calendar"
4602
4952
  ],
4603
4953
  "accessibility": [
4604
4954
  "The built-in select trigger exposes combobox semantics with a dialog popup, synchronizes expanded state, holds the pressed interaction wash without changing resting foreground while open, and restores focus after dismissal.",
4605
4955
  "The category pane is a vertical tab list. Arrow Up and Arrow Down wrap, Home and End jump, Arrow Right enters the option pane, and Arrow Left returns to the active category.",
4606
4956
  "Every non-date category begins with a labelled search field. Arrow Down and Arrow Up enter the first or last visible option, while Left and Right retain native text-caret behavior. Search matches option labels and descriptions without changing selected values.",
4607
4957
  "Escape and outside activation close the popup and restore trigger focus. Tab moves through option controls and closes only when it leaves the popup boundary.",
4608
- "Date filters expose containerless Range and Relative tabs in a secondary-background header with 4px padding around the 32px medium control. Relative presets use listbox semantics; the range calendar exposes a labelled grid, one tab stop, arrow-key day navigation, Home and End week navigation, and Page Up or Page Down month navigation. After a range start is chosen, pointer hover and keyboard focus preview the possible inclusive range without changing selection semantics.",
4958
+ "Date filters expose containerless Range and Relative tabs in a secondary-background header with 4px padding around the 32px medium control. Relative presets use listbox semantics. Range selection hosts Calendar, which owns the labelled month grid, one tab stop, arrow-key day navigation, Home and End week navigation, and Page Up or Page Down month navigation. After a range start is chosen, pointer hover and keyboard focus preview the possible inclusive range without changing selection semantics.",
4609
4959
  "When an external trigger is inside an open shadow tree, pass its HTMLElement through anchor so outside activation, focus return, and Tab continuation use the composed tree.",
4610
4960
  "The trigger count reports active filter categories. Multiple-choice category tags report individual selected criteria, while an applied Date category uses a visual dot because its value is singular. The default summary footer announces the total; the categories-clear footer recipe reserves a visually empty category-pane action row and exposes its divider and only Clear when criteria are active."
4611
4961
  ],
@@ -4840,7 +5190,7 @@
4840
5190
  ],
4841
5191
  "registryDependencies": [
4842
5192
  "badge",
4843
- "button-unfilled",
5193
+ "calendar",
4844
5194
  "checkbox",
4845
5195
  "empty-state",
4846
5196
  "icon",
@@ -4947,129 +5297,625 @@
4947
5297
  "type": "IconColor",
4948
5298
  "required": false
4949
5299
  },
4950
- "label": {
5300
+ "label": {
5301
+ "type": "string | undefined",
5302
+ "required": false
5303
+ },
5304
+ "name": {
5305
+ "type": "string",
5306
+ "required": false
5307
+ },
5308
+ "size": {
5309
+ "type": "IconSize",
5310
+ "required": false
5311
+ }
5312
+ },
5313
+ "events": [],
5314
+ "slots": [],
5315
+ "exports": {
5316
+ "customElement": "ds-icon",
5317
+ "react": "DsIcon",
5318
+ "vue": "DsIcon",
5319
+ "angular": "DsIcon"
5320
+ }
5321
+ },
5322
+ "dependencies": [
5323
+ "@ds-mo/ui",
5324
+ "@ds-mo/tokens",
5325
+ "@ds-mo/icons"
5326
+ ],
5327
+ "registryDependencies": []
5328
+ },
5329
+ {
5330
+ "name": "input",
5331
+ "title": "Input",
5332
+ "description": "Form-associated single-line text and number field for primary and secondary application backgrounds, with native input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
5333
+ "type": "registry:ui",
5334
+ "meta": {
5335
+ "library": "@ds-mo/ui",
5336
+ "distribution": "npm",
5337
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/input",
5338
+ "source": "src/wc/components/Input/Input.tsx",
5339
+ "intentStatus": "complete",
5340
+ "intent": {
5341
+ "audience": "general",
5342
+ "status": "stable",
5343
+ "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.",
5344
+ "useWhen": [
5345
+ "A user must enter or edit one line of text, an email address, telephone number, URL, search query, password, or exact number.",
5346
+ "The value must participate in native, Angular, React, or Vue form state.",
5347
+ "A compact filter or toolbar needs a single-line search field that follows the shared control-density recipe."
5348
+ ],
5349
+ "avoidWhen": [
5350
+ "The user chooses from a finite set of known values.",
5351
+ "The user must enter multiple paragraphs or formatted content.",
5352
+ "The value is adjusted primarily by dragging within a numeric range.",
5353
+ "The value is a calendar date or a clock time."
5354
+ ],
5355
+ "alternatives": [
5356
+ {
5357
+ "when": "The value comes from a finite set of known choices.",
5358
+ "component": "component:ds-select",
5359
+ "reason": "Select exposes the available values and owns listbox selection behavior."
5360
+ },
5361
+ {
5362
+ "when": "The value is a calendar date.",
5363
+ "component": "component:ds-input-date",
5364
+ "reason": "InputDate owns calendar date form values, shared Input density, and the Calendar picker."
5365
+ },
5366
+ {
5367
+ "when": "The value is a clock time.",
5368
+ "component": "component:ds-input-time",
5369
+ "reason": "InputTime owns clock time form values, shared Input density, and the TimePicker."
5370
+ },
5371
+ {
5372
+ "when": "The value is an immediate on/off setting.",
5373
+ "component": "component:ds-switch",
5374
+ "reason": "Switch communicates a binary setting instead of free text entry."
5375
+ },
5376
+ {
5377
+ "when": "The value is chosen from a bounded numeric range.",
5378
+ "component": "component:ds-slider",
5379
+ "reason": "Slider supports direct range adjustment and communicates the current position."
5380
+ }
5381
+ ],
5382
+ "commonlyComposedWith": [
5383
+ "component:ds-field",
5384
+ "component:ds-icon",
5385
+ "component:ds-text",
5386
+ "component:ds-select"
5387
+ ],
5388
+ "accessibility": [
5389
+ "Provide a persistent visible label through the owning field or an external native label; placeholder text is guidance and must not be the field's only label.",
5390
+ "Choose the native input type that matches the value so browsers and assistive technology can provide appropriate semantics and keyboards.",
5391
+ "Error text is associated with the native input and announced as an alert when the invalid state is rendered.",
5392
+ "Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission.",
5393
+ "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.",
5394
+ "Number stepper actions are pointer affordances hidden from the accessibility tree; the native spinbutton remains the single keyboard and assistive-technology control.",
5395
+ "Prefix and suffix content must not carry information that is otherwise absent from the field's visible label, value, or description.",
5396
+ "A nested prefix or suffix Select is a separate control from the editable value and must have its own accessible name."
5397
+ ],
5398
+ "states": [
5399
+ "Every size applies one complete control-density recipe across frame height, inline padding, icon zones, text-container inset, gap, and radius; supporting error content follows the shared 4px field flow.",
5400
+ "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. Set hasBorder to false only in chrome that supplies enough surrounding structure; supporting error copy then insets to the field's text origin rather than the resting border box. Set hasInteractionFill to false when that containing chrome also owns hover and pressed feedback.",
5401
+ "Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins. Single-line placeholder and entered value text truncate with an ellipsis when the field is narrower than its content.",
5402
+ "Entered values use the parent surface's primary foreground; prefix icons, prefix text, suffix content, and resting placeholder text use its secondary foreground.",
5403
+ "Search fields show a standard borderless CrossCircle icon action only while they contain a value. Clearing emits the empty value and restores focus to the native field.",
5404
+ "Password fields show a standard inset Eye action at the field's density. EyeDisabled replaces it while the value is visible. The action stays available on read-only fields and is inactive with the field.",
5405
+ "Search fields disable browser autocomplete history, automatic capitalization, autocorrection, and spellchecking by default so browser-owned suggestions do not compete with product-owned results. Consumers can explicitly provide autoComplete when a different native history behavior is required.",
5406
+ "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.",
5407
+ "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.",
5408
+ "Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
5409
+ "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.",
5410
+ "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.",
5411
+ "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
5412
+ "Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts."
5413
+ ],
5414
+ "responsiveBehavior": [
5415
+ "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
5416
+ "Choose density from the containing layout: md for ordinary forms, lg for a touch-primary layout, and sm or xs only where surrounding controls use the same compact recipe.",
5417
+ "The owner supplies layout constraints and decides when a compact field moves to its own row."
5418
+ ],
5419
+ "frameworkCaveats": {
5420
+ "customElements": [
5421
+ "Listen for dsChange for user edits and dsClear for the search clear action.",
5422
+ "Use the form attribute on the host when associating an input rendered outside its owning form."
5423
+ ],
5424
+ "react": [
5425
+ "Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear."
5426
+ ],
5427
+ "vue": [
5428
+ "Use DsInput with v-model for the value, and listen for dsChange and dsClear."
5429
+ ],
5430
+ "angular": [
5431
+ "Import DsInput with TextValueAccessor when integrating with Angular Forms."
5432
+ ]
5433
+ },
5434
+ "references": [
5435
+ {
5436
+ "label": "Storybook examples",
5437
+ "path": "src/wc/components/Input/Input.stories.ts"
5438
+ },
5439
+ {
5440
+ "label": "Cross-browser form and accessibility coverage",
5441
+ "path": "tests/e2e/forms.spec.ts"
5442
+ }
5443
+ ]
5444
+ },
5445
+ "props": {
5446
+ "ariaActiveDescendant": {
5447
+ "type": "string | undefined",
5448
+ "required": false
5449
+ },
5450
+ "ariaControls": {
5451
+ "type": "string | undefined",
5452
+ "required": false
5453
+ },
5454
+ "ariaDescribedby": {
5455
+ "type": "string | undefined",
5456
+ "required": false
5457
+ },
5458
+ "ariaLabel": {
5459
+ "type": "string | null",
5460
+ "required": false
5461
+ },
5462
+ "ariaLabelledby": {
5463
+ "type": "string | undefined",
5464
+ "required": false
5465
+ },
5466
+ "autoComplete": {
5467
+ "type": "string | undefined",
5468
+ "required": false
5469
+ },
5470
+ "autoFocus": {
5471
+ "type": "boolean",
5472
+ "required": false
5473
+ },
5474
+ "clearLabel": {
5475
+ "type": "string",
5476
+ "required": false
5477
+ },
5478
+ "disabled": {
5479
+ "type": "boolean",
5480
+ "required": false
5481
+ },
5482
+ "enterKeyHint": {
5483
+ "type": "string",
5484
+ "required": false
5485
+ },
5486
+ "error": {
5487
+ "type": "boolean",
5488
+ "required": false
5489
+ },
5490
+ "errorMessage": {
5491
+ "type": "string | undefined",
5492
+ "required": false
5493
+ },
5494
+ "form": {
5495
+ "type": "string | undefined",
5496
+ "required": false
5497
+ },
5498
+ "hasBorder": {
5499
+ "type": "boolean",
5500
+ "required": false
5501
+ },
5502
+ "hasInteractionFill": {
5503
+ "type": "boolean",
5504
+ "required": false
5505
+ },
5506
+ "hidePasswordLabel": {
5507
+ "type": "string",
5508
+ "required": false
5509
+ },
5510
+ "icon": {
5511
+ "type": "string | undefined",
5512
+ "required": false
5513
+ },
5514
+ "inputId": {
5515
+ "type": "string | undefined",
5516
+ "required": false
5517
+ },
5518
+ "inputMode": {
5519
+ "type": "string",
5520
+ "required": false
5521
+ },
5522
+ "isInactive": {
5523
+ "type": "boolean",
5524
+ "required": false
5525
+ },
5526
+ "max": {
5527
+ "type": "number | undefined",
5528
+ "required": false
5529
+ },
5530
+ "min": {
5531
+ "type": "number | undefined",
5532
+ "required": false
5533
+ },
5534
+ "name": {
5535
+ "type": "string | undefined",
5536
+ "required": false
5537
+ },
5538
+ "placeholder": {
5539
+ "type": "string | undefined",
5540
+ "required": false
5541
+ },
5542
+ "readOnly": {
5543
+ "type": "boolean",
5544
+ "required": false
5545
+ },
5546
+ "required": {
5547
+ "type": "boolean",
5548
+ "required": false
5549
+ },
5550
+ "requiredMessage": {
5551
+ "type": "string",
5552
+ "required": false
5553
+ },
5554
+ "showPasswordLabel": {
5555
+ "type": "string",
5556
+ "required": false
5557
+ },
5558
+ "size": {
5559
+ "type": "InputSize",
5560
+ "required": false
5561
+ },
5562
+ "step": {
5563
+ "type": "number | undefined",
5564
+ "required": false
5565
+ },
5566
+ "textAlign": {
5567
+ "type": "InputTextAlign",
5568
+ "required": false
5569
+ },
5570
+ "type": {
5571
+ "type": "InputType",
5572
+ "required": false
5573
+ },
5574
+ "value": {
5575
+ "type": "string",
5576
+ "required": false
5577
+ },
5578
+ "width": {
5579
+ "type": "InputWidth",
5580
+ "required": false
5581
+ }
5582
+ },
5583
+ "events": [
5584
+ {
5585
+ "name": "dsChange",
5586
+ "detail": "string"
5587
+ },
5588
+ {
5589
+ "name": "dsClear",
5590
+ "detail": "void"
5591
+ }
5592
+ ],
5593
+ "slots": [],
5594
+ "exports": {
5595
+ "customElement": "ds-input",
5596
+ "react": "DsInput",
5597
+ "vue": "DsInput",
5598
+ "angular": "DsInput"
5599
+ }
5600
+ },
5601
+ "dependencies": [
5602
+ "@ds-mo/ui",
5603
+ "@ds-mo/tokens",
5604
+ "@ds-mo/icons"
5605
+ ],
5606
+ "registryDependencies": [
5607
+ "button-unfilled",
5608
+ "divider",
5609
+ "icon",
5610
+ "text"
5611
+ ]
5612
+ },
5613
+ {
5614
+ "name": "input-date",
5615
+ "title": "InputDate",
5616
+ "description": "Form-associated calendar date field that reuses Input density, focus, validation, and field composition, with a typeable value and a Calendar picker.",
5617
+ "type": "registry:ui",
5618
+ "meta": {
5619
+ "library": "@ds-mo/ui",
5620
+ "distribution": "npm",
5621
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/input-date",
5622
+ "source": "src/wc/components/InputDate/InputDate.tsx",
5623
+ "intentStatus": "complete",
5624
+ "intent": {
5625
+ "audience": "general",
5626
+ "status": "experimental",
5627
+ "summary": "Form-associated calendar date field that reuses Input density, focus, validation, and field composition, with a typeable value and a Calendar picker.",
5628
+ "useWhen": [
5629
+ "A user must enter or edit a calendar date as an ISO date string.",
5630
+ "The date must participate in native, Angular, React, or Vue form state.",
5631
+ "The control should match Input geometry, typography, and field composition rather than a one-off native date input."
5632
+ ],
5633
+ "avoidWhen": [
5634
+ "The value is freeform text, a number, or a search query.",
5635
+ "The value is a clock time without a calendar date.",
5636
+ "The user chooses a predefined relative range such as last 7 days."
5637
+ ],
5638
+ "alternatives": [
5639
+ {
5640
+ "when": "The value is one line of text, email, search, or an exact number.",
5641
+ "component": "component:ds-input",
5642
+ "reason": "Input owns those native types, adornments, search clearing, and numeric stepping."
5643
+ },
5644
+ {
5645
+ "when": "The value is a clock time.",
5646
+ "component": "component:ds-input-time",
5647
+ "reason": "InputTime owns clock time form values and the TimePicker."
5648
+ },
5649
+ {
5650
+ "when": "The user chooses a relative or bounded date range from presets.",
5651
+ "component": "component:ds-filter-menu",
5652
+ "reason": "FilterMenu owns relative date presets and range selection rather than a single calendar date."
5653
+ },
5654
+ {
5655
+ "when": "The month grid is needed without a form field.",
5656
+ "component": "component:ds-calendar",
5657
+ "reason": "Calendar owns the shared month grid and can select a single date or a range."
5658
+ }
5659
+ ],
5660
+ "commonlyComposedWith": [
5661
+ "component:ds-field",
5662
+ "component:ds-calendar",
5663
+ "component:ds-button-unfilled",
5664
+ "component:ds-icon",
5665
+ "component:ds-text",
5666
+ "component:ds-input-time"
5667
+ ],
5668
+ "accessibility": [
5669
+ "Provide a persistent visible label through the owning field or an external native label.",
5670
+ "The text field remains the keyboard and assistive-technology value control. Users can type an ISO date, a numeric M/D/YYYY date, or a short-month label such as Sep 10, 2026.",
5671
+ "The trailing calendar button is a named disclosure that opens a non-modal calendar dialog. It shares the field's density, uses the single inset recipe, and reports expanded state while the picker is open.",
5672
+ "Filled values keep YYYY-MM-DD as the form value. Visible text uses a short-month calendar label such as Sep 10, 2026 so the field does not show ISO chrome. That label reuses Input's value typography and text-container inset.",
5673
+ "Error text is associated with the text field and announced as an alert when the invalid state is rendered.",
5674
+ "Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission."
5675
+ ],
5676
+ "states": [
5677
+ "Every size applies the shared control-density recipe, including md body-medium text, across frame height, inline padding, icon zones, and radius.",
5678
+ "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.",
5679
+ "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
5680
+ "The trailing calendar 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 date value. Inactive or disabled fields apply that treatment on the host only, so the nested button is not faded a second time.",
5681
+ "Activating the calendar button opens the shared Calendar grid in a choice-popup dialog anchored to the field's end edge, beside the trailing calendar action. Choosing a day commits that date and closes the dialog. Typing in the field commits a parsed date without requiring the picker. Invalid typed text reverts to the last committed value on blur."
5682
+ ],
5683
+ "responsiveBehavior": [
5684
+ "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
5685
+ "Choose density from the containing layout: md for ordinary forms, lg for a touch-primary layout, and sm or xs only where surrounding controls use the same compact recipe.",
5686
+ "The calendar dialog uses the shared choice-popup recipe with the same 4px sm chrome inset as choice lists, aligns to the field's end edge, flips when the field collides with the overlay boundary, and stays in the top layer."
5687
+ ],
5688
+ "frameworkCaveats": {
5689
+ "customElements": [
5690
+ "Listen for dsChange for user edits. The detail is the ISO calendar date string YYYY-MM-DD.",
5691
+ "Use the form attribute on the host when associating a date field rendered outside its owning form."
5692
+ ],
5693
+ "react": [
5694
+ "Use DsInputDate, bind value for controlled application state, and handle onDsChange."
5695
+ ],
5696
+ "vue": [
5697
+ "Use DsInputDate with v-model for the value, and listen for dsChange."
5698
+ ],
5699
+ "angular": [
5700
+ "Import DsInputDate with TextValueAccessor when integrating with Angular Forms."
5701
+ ]
5702
+ },
5703
+ "references": [
5704
+ {
5705
+ "label": "Storybook examples",
5706
+ "path": "src/wc/components/InputDate/InputDate.stories.ts"
5707
+ },
5708
+ {
5709
+ "label": "Cross-browser form and accessibility coverage",
5710
+ "path": "tests/e2e/forms.spec.ts"
5711
+ }
5712
+ ]
5713
+ },
5714
+ "props": {
5715
+ "ariaDescribedby": {
5716
+ "type": "string | undefined",
5717
+ "required": false
5718
+ },
5719
+ "ariaLabel": {
5720
+ "type": "string | null",
5721
+ "required": false
5722
+ },
5723
+ "ariaLabelledby": {
5724
+ "type": "string | undefined",
5725
+ "required": false
5726
+ },
5727
+ "autoFocus": {
5728
+ "type": "boolean",
5729
+ "required": false
5730
+ },
5731
+ "disabled": {
5732
+ "type": "boolean",
5733
+ "required": false
5734
+ },
5735
+ "error": {
5736
+ "type": "boolean",
5737
+ "required": false
5738
+ },
5739
+ "errorMessage": {
5740
+ "type": "string | undefined",
5741
+ "required": false
5742
+ },
5743
+ "form": {
5744
+ "type": "string | undefined",
5745
+ "required": false
5746
+ },
5747
+ "hasBorder": {
5748
+ "type": "boolean",
5749
+ "required": false
5750
+ },
5751
+ "hasInteractionFill": {
5752
+ "type": "boolean",
5753
+ "required": false
5754
+ },
5755
+ "inputId": {
5756
+ "type": "string | undefined",
5757
+ "required": false
5758
+ },
5759
+ "isInactive": {
5760
+ "type": "boolean",
5761
+ "required": false
5762
+ },
5763
+ "max": {
5764
+ "type": "string | undefined",
5765
+ "required": false
5766
+ },
5767
+ "min": {
4951
5768
  "type": "string | undefined",
4952
5769
  "required": false
4953
5770
  },
4954
5771
  "name": {
5772
+ "type": "string | undefined",
5773
+ "required": false
5774
+ },
5775
+ "readOnly": {
5776
+ "type": "boolean",
5777
+ "required": false
5778
+ },
5779
+ "required": {
5780
+ "type": "boolean",
5781
+ "required": false
5782
+ },
5783
+ "requiredMessage": {
4955
5784
  "type": "string",
4956
5785
  "required": false
4957
5786
  },
4958
5787
  "size": {
4959
- "type": "IconSize",
5788
+ "type": "InputDateSize",
5789
+ "required": false
5790
+ },
5791
+ "value": {
5792
+ "type": "string",
5793
+ "required": false
5794
+ },
5795
+ "width": {
5796
+ "type": "InputDateWidth",
4960
5797
  "required": false
4961
5798
  }
4962
5799
  },
4963
- "events": [],
5800
+ "events": [
5801
+ {
5802
+ "name": "dsChange",
5803
+ "detail": "string"
5804
+ }
5805
+ ],
4964
5806
  "slots": [],
4965
5807
  "exports": {
4966
- "customElement": "ds-icon",
4967
- "react": "DsIcon",
4968
- "vue": "DsIcon",
4969
- "angular": "DsIcon"
5808
+ "customElement": "ds-input-date",
5809
+ "react": "DsInputDate",
5810
+ "vue": "DsInputDate",
5811
+ "angular": "DsInputDate"
4970
5812
  }
4971
5813
  },
4972
5814
  "dependencies": [
4973
5815
  "@ds-mo/ui",
4974
- "@ds-mo/tokens",
4975
- "@ds-mo/icons"
5816
+ "@ds-mo/tokens"
4976
5817
  ],
4977
- "registryDependencies": []
5818
+ "registryDependencies": [
5819
+ "button-unfilled",
5820
+ "calendar",
5821
+ "text"
5822
+ ]
4978
5823
  },
4979
5824
  {
4980
- "name": "input",
4981
- "title": "Input",
4982
- "description": "Form-associated single-line text and number field for primary and secondary application backgrounds, with native input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
5825
+ "name": "input-time",
5826
+ "title": "InputTime",
5827
+ "description": "Form-associated clock time field that reuses Input density, focus, validation, and field composition, with a typeable value and a TimePicker.",
4983
5828
  "type": "registry:ui",
4984
5829
  "meta": {
4985
5830
  "library": "@ds-mo/ui",
4986
5831
  "distribution": "npm",
4987
- "storybook": "https://zainadeel.github.io/compomo/?path=/story/input",
4988
- "source": "src/wc/components/Input/Input.tsx",
5832
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/input-time",
5833
+ "source": "src/wc/components/InputTime/InputTime.tsx",
4989
5834
  "intentStatus": "complete",
4990
5835
  "intent": {
4991
5836
  "audience": "general",
4992
- "status": "stable",
4993
- "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.",
5837
+ "status": "experimental",
5838
+ "summary": "Form-associated clock time field that reuses Input density, focus, validation, and field composition, with a typeable value and a TimePicker.",
4994
5839
  "useWhen": [
4995
- "A user must enter or edit one line of text, an email address, telephone number, URL, search query, password, or exact number.",
4996
- "The value must participate in native, Angular, React, or Vue form state.",
4997
- "A compact filter or toolbar needs a single-line search field that follows the shared control-density recipe."
5840
+ "A user must enter or edit a clock time as a native time string.",
5841
+ "The time must participate in native, Angular, React, or Vue form state.",
5842
+ "The control should match Input geometry, typography, and field composition rather than a one-off native time input."
4998
5843
  ],
4999
5844
  "avoidWhen": [
5000
- "The user chooses from a finite set of known values.",
5001
- "The user must enter multiple paragraphs or formatted content.",
5002
- "The value is adjusted primarily by dragging within a numeric range."
5845
+ "The value is freeform text, a number, or a search query.",
5846
+ "The value is a calendar date without a clock time.",
5847
+ "The user chooses from a finite set of named schedule options rather than an exact time."
5003
5848
  ],
5004
5849
  "alternatives": [
5005
5850
  {
5006
- "when": "The value comes from a finite set of known choices.",
5007
- "component": "component:ds-select",
5008
- "reason": "Select exposes the available values and owns listbox selection behavior."
5851
+ "when": "The value is one line of text, email, search, or an exact number.",
5852
+ "component": "component:ds-input",
5853
+ "reason": "Input owns those native types, adornments, search clearing, and numeric stepping."
5009
5854
  },
5010
5855
  {
5011
- "when": "The value is an immediate on/off setting.",
5012
- "component": "component:ds-switch",
5013
- "reason": "Switch communicates a binary setting instead of free text entry."
5856
+ "when": "The value is a calendar date.",
5857
+ "component": "component:ds-input-date",
5858
+ "reason": "InputDate owns calendar date form values and the Calendar picker."
5014
5859
  },
5015
5860
  {
5016
- "when": "The value is chosen from a bounded numeric range.",
5017
- "component": "component:ds-slider",
5018
- "reason": "Slider supports direct range adjustment and communicates the current position."
5861
+ "when": "The hour, minute, and AM/PM lists are needed without a form field.",
5862
+ "component": "component:ds-time-picker",
5863
+ "reason": "TimePicker owns the bounded 12-hour lists and selected-tile treatment."
5864
+ },
5865
+ {
5866
+ "when": "The user chooses from a finite set of named times or cadences.",
5867
+ "component": "component:ds-select",
5868
+ "reason": "Select exposes the available values and owns listbox selection behavior."
5019
5869
  }
5020
5870
  ],
5021
5871
  "commonlyComposedWith": [
5022
5872
  "component:ds-field",
5873
+ "component:ds-time-picker",
5874
+ "component:ds-button-unfilled",
5023
5875
  "component:ds-icon",
5024
- "component:ds-text"
5876
+ "component:ds-text",
5877
+ "component:ds-input-date"
5025
5878
  ],
5026
5879
  "accessibility": [
5027
- "Provide a persistent visible label through the owning field or an external native label; placeholder text is guidance and must not be the field's only label.",
5028
- "Choose the native input type that matches the value so browsers and assistive technology can provide appropriate semantics and keyboards.",
5029
- "Error text is associated with the native input and announced as an alert when the invalid state is rendered.",
5030
- "Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission.",
5031
- "Number stepper actions are pointer affordances hidden from the accessibility tree; the native spinbutton remains the single keyboard and assistive-technology control.",
5032
- "Suffix content must not carry information that is otherwise absent from the field's visible label, value, or description."
5880
+ "Provide a persistent visible label through the owning field or an external native label.",
5881
+ "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.",
5882
+ "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.",
5883
+ "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.",
5884
+ "Error text is associated with the text field and announced as an alert when the invalid state is rendered.",
5885
+ "Read-only fields remain focusable and submittable while preventing edits; inactive or disabled fields leave the tab order and are omitted from form submission."
5033
5886
  ],
5034
5887
  "states": [
5035
- "Every size applies one complete control-density recipe across frame height, inline padding, icon zones, text-container inset, gap, and radius; supporting error content follows the shared 4px field flow.",
5036
- "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. Set hasBorder to false only in chrome that supplies enough surrounding structure; set hasInteractionFill to false when that containing chrome also owns hover and pressed feedback.",
5037
- "Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins. Single-line placeholder and entered value text truncate with an ellipsis when the field is narrower than its content.",
5038
- "Entered values use the parent surface's primary foreground; prefix icons, suffix content, and resting placeholder text use its secondary foreground.",
5039
- "Search fields show a standard borderless CrossCircle icon action only while they contain a value. Clearing emits the empty value and restores focus to the native field.",
5040
- "Search fields disable browser autocomplete history, automatic capitalization, autocorrection, and spellchecking by default so browser-owned suggestions do not compete with product-owned results. Consumers can explicitly provide autoComplete when a different native history behavior is required.",
5041
- "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.",
5042
- "The suffix slot is for compact units or decorations. The optional leading icon is decorative and does not replace the field label.",
5043
- "Use autoComplete, inputMode, and enterKeyHint to provide browser and virtual-keyboard hints without changing the value's semantic type.",
5044
- "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.",
5045
- "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.",
5888
+ "Every size applies the shared control-density recipe, including md body-medium text, across frame height, inline padding, icon zones, and radius.",
5889
+ "The default step is one minute so the field matches ordinary schedule entry; override step only when a coarser minute increment is required.",
5890
+ "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.",
5046
5891
  "The host exposes focused, filled, dirty, touched, invalid, disabled, read-only, and required data attributes for Field integration and diagnostics.",
5047
- "Use Input only on primary or secondary application backgrounds. It intentionally does not expose alternate surface contexts."
5892
+ "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.",
5893
+ "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."
5048
5894
  ],
5049
5895
  "responsiveBehavior": [
5050
5896
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
5051
5897
  "Choose density from the containing layout: md for ordinary forms, lg for a touch-primary layout, and sm or xs only where surrounding controls use the same compact recipe.",
5052
- "The owner supplies layout constraints and decides when a compact field moves to its own row."
5898
+ "The time dialog uses the shared choice-popup recipe with the same 4px sm chrome inset as choice lists, aligns to the field's end edge, flips when the field collides with the overlay boundary, and stays in the top layer."
5053
5899
  ],
5054
5900
  "frameworkCaveats": {
5055
5901
  "customElements": [
5056
- "Listen for dsChange for user edits and dsClear for the search clear action.",
5057
- "Use the form attribute on the host when associating an input rendered outside its owning form."
5902
+ "Listen for dsChange for user edits. The detail is the clock time string HH:MM.",
5903
+ "Use the form attribute on the host when associating a time field rendered outside its owning form."
5058
5904
  ],
5059
5905
  "react": [
5060
- "Use DsInput, bind value for controlled application state, and handle onDsChange and onDsClear."
5906
+ "Use DsInputTime, bind value for controlled application state, and handle onDsChange."
5061
5907
  ],
5062
5908
  "vue": [
5063
- "Use DsInput with v-model for the value, and listen for dsChange and dsClear."
5909
+ "Use DsInputTime with v-model for the value, and listen for dsChange."
5064
5910
  ],
5065
5911
  "angular": [
5066
- "Import DsInput with TextValueAccessor when integrating with Angular Forms."
5912
+ "Import DsInputTime with TextValueAccessor when integrating with Angular Forms."
5067
5913
  ]
5068
5914
  },
5069
5915
  "references": [
5070
5916
  {
5071
5917
  "label": "Storybook examples",
5072
- "path": "src/wc/components/Input/Input.stories.ts"
5918
+ "path": "src/wc/components/InputTime/InputTime.stories.ts"
5073
5919
  },
5074
5920
  {
5075
5921
  "label": "Cross-browser form and accessibility coverage",
@@ -5078,14 +5924,6 @@
5078
5924
  ]
5079
5925
  },
5080
5926
  "props": {
5081
- "ariaActiveDescendant": {
5082
- "type": "string | undefined",
5083
- "required": false
5084
- },
5085
- "ariaControls": {
5086
- "type": "string | undefined",
5087
- "required": false
5088
- },
5089
5927
  "ariaDescribedby": {
5090
5928
  "type": "string | undefined",
5091
5929
  "required": false
@@ -5098,26 +5936,14 @@
5098
5936
  "type": "string | undefined",
5099
5937
  "required": false
5100
5938
  },
5101
- "autoComplete": {
5102
- "type": "string | undefined",
5103
- "required": false
5104
- },
5105
5939
  "autoFocus": {
5106
5940
  "type": "boolean",
5107
5941
  "required": false
5108
5942
  },
5109
- "clearLabel": {
5110
- "type": "string",
5111
- "required": false
5112
- },
5113
5943
  "disabled": {
5114
5944
  "type": "boolean",
5115
5945
  "required": false
5116
5946
  },
5117
- "enterKeyHint": {
5118
- "type": "string",
5119
- "required": false
5120
- },
5121
5947
  "error": {
5122
5948
  "type": "boolean",
5123
5949
  "required": false
@@ -5138,35 +5964,23 @@
5138
5964
  "type": "boolean",
5139
5965
  "required": false
5140
5966
  },
5141
- "icon": {
5142
- "type": "string | undefined",
5143
- "required": false
5144
- },
5145
5967
  "inputId": {
5146
5968
  "type": "string | undefined",
5147
5969
  "required": false
5148
5970
  },
5149
- "inputMode": {
5150
- "type": "string",
5151
- "required": false
5152
- },
5153
5971
  "isInactive": {
5154
5972
  "type": "boolean",
5155
5973
  "required": false
5156
5974
  },
5157
5975
  "max": {
5158
- "type": "number | undefined",
5976
+ "type": "string | undefined",
5159
5977
  "required": false
5160
5978
  },
5161
5979
  "min": {
5162
- "type": "number | undefined",
5163
- "required": false
5164
- },
5165
- "name": {
5166
5980
  "type": "string | undefined",
5167
5981
  "required": false
5168
5982
  },
5169
- "placeholder": {
5983
+ "name": {
5170
5984
  "type": "string | undefined",
5171
5985
  "required": false
5172
5986
  },
@@ -5183,19 +5997,11 @@
5183
5997
  "required": false
5184
5998
  },
5185
5999
  "size": {
5186
- "type": "InputSize",
6000
+ "type": "InputTimeSize",
5187
6001
  "required": false
5188
6002
  },
5189
6003
  "step": {
5190
- "type": "number | undefined",
5191
- "required": false
5192
- },
5193
- "textAlign": {
5194
- "type": "InputTextAlign",
5195
- "required": false
5196
- },
5197
- "type": {
5198
- "type": "InputType",
6004
+ "type": "string | number",
5199
6005
  "required": false
5200
6006
  },
5201
6007
  "value": {
@@ -5203,7 +6009,7 @@
5203
6009
  "required": false
5204
6010
  },
5205
6011
  "width": {
5206
- "type": "InputWidth",
6012
+ "type": "InputTimeWidth",
5207
6013
  "required": false
5208
6014
  }
5209
6015
  },
@@ -5211,29 +6017,24 @@
5211
6017
  {
5212
6018
  "name": "dsChange",
5213
6019
  "detail": "string"
5214
- },
5215
- {
5216
- "name": "dsClear",
5217
- "detail": "void"
5218
6020
  }
5219
6021
  ],
5220
6022
  "slots": [],
5221
6023
  "exports": {
5222
- "customElement": "ds-input",
5223
- "react": "DsInput",
5224
- "vue": "DsInput",
5225
- "angular": "DsInput"
6024
+ "customElement": "ds-input-time",
6025
+ "react": "DsInputTime",
6026
+ "vue": "DsInputTime",
6027
+ "angular": "DsInputTime"
5226
6028
  }
5227
6029
  },
5228
6030
  "dependencies": [
5229
6031
  "@ds-mo/ui",
5230
- "@ds-mo/tokens",
5231
- "@ds-mo/icons"
6032
+ "@ds-mo/tokens"
5232
6033
  ],
5233
6034
  "registryDependencies": [
5234
6035
  "button-unfilled",
5235
- "icon",
5236
- "text"
6036
+ "text",
6037
+ "time-picker"
5237
6038
  ]
5238
6039
  },
5239
6040
  {
@@ -8414,7 +9215,8 @@
8414
9215
  "component:ds-text",
8415
9216
  "component:ds-icon",
8416
9217
  "component:ds-empty-state",
8417
- "component:ds-loader"
9218
+ "component:ds-loader",
9219
+ "component:ds-input"
8418
9220
  ],
8419
9221
  "accessibility": [
8420
9222
  "In forms, provide a persistent visible external field label; placeholder text is guidance and must not be the field's only label. In a compact filter bar, the trigger's visible text may supply the accessible name.",
@@ -8428,9 +9230,10 @@
8428
9230
  "Use errorMessage with error so the trigger is described by the rendered alert."
8429
9231
  ],
8430
9232
  "states": [
8431
- "Selected trigger foreground communicates the current value independently of fill. Opt into activeFill when the trigger needs additional selected emphasis; popup option selection keeps its own treatment.",
9233
+ "Selected trigger foreground communicates the current value independently of fill. Opt into activeFill when the trigger needs additional selected emphasis; popup option selection keeps its own treatment. Set neutralTrigger to keep the selected label on the resting secondary foreground, including Input prefix and suffix units.",
8432
9234
  "The multiple property changes cardinality without changing the component family: scalar mode selects and closes, while multiple mode toggles array values and keeps the popup open.",
8433
- "Every size applies one complete control-density recipe across trigger height, inline padding, icon zones, text-container inset, gap, and radius; error content follows the shared 4px field flow.",
9235
+ "Every size applies one complete control-density recipe across trigger height, inline padding, icon zones, text-container inset, gap, and radius; error content follows the shared 4px field flow. Set rounded to use the same half-radius pill as buttons on the trigger only; the popup keeps the menu radius.",
9236
+ "Set isInset only when the trigger is nested inside a same-size control, including an Input prefix or suffix. Match the host field's size, set hasBorder to false, use width hug, and set indicator to up-down. Prefix and suffix Selects keep a selected value, set allowClear false so the menu has no clear footer, and set neutralTrigger so the selected unit stays secondary like prefix text. The owning Input draws a vertical divider between the nested control and the editable value 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 default single inset removes 4px overall; insetDepth double removes 8px overall so the parent can add 4px per edge while preserving its outer alignment box. Double inset falls back to single at xs to protect minimum icon geometry. Inset and rounded change only the trigger's outer box. Popup option rows, search, and footer always use the selected size recipe and do not change for single or double inset or for rounded. Do not put error copy on the nested Select; the owning Input keeps validation.",
8434
9237
  "Value is controlled through the mutable value property as a string in scalar mode or a string array in multiple mode; dsChange reports the matching shape.",
8435
9238
  "Multiple mode keeps the persistent placeholder label visible, appends the selected count, and submits one repeated form entry per selected value.",
8436
9239
  "Required Selects begin without an automatic selection and require the user to make an explicit choice; do not preselect the first option merely to satisfy validity.",
@@ -8445,7 +9248,7 @@
8445
9248
  "Option labels and the selected trigger label stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
8446
9249
  "Use an option action only for a contextual menu about that user-managed option. The fixed ellipsis action appears on hover, keyboard activity, focus, and touch; surfaceOpen keeps it visible while its controlled menu is rendered. Activating it emits dsOptionAction without selecting the option or closing the Select popup.",
8447
9250
  "Use option subtextActions for a compact set of immediate actions that belong to one option. They render beneath only that option's label using the standard supporting-text inset and rhythm, use action or negative semantic color, and emit dsOptionSubtextAction without selecting the option or closing the popup. Unlike descriptive subtext, they do not reserve a blank supporting line on neighboring options.",
8448
- "The optional prefix icon and trailing indicator always use the parent surface's secondary foreground color, including when a selected value promotes the label to primary. When collapseLabel compact icon-only chrome is active, a selected value promotes the prefix icon to primary instead. The default down indicator communicates disclosure; up-down is reserved for compact value steppers such as pagination page size.",
9251
+ "The optional prefix icon and trailing indicator always use the parent surface's secondary foreground color, including when a selected value promotes the label to primary. When collapseLabel compact icon-only chrome is active, a selected value promotes the prefix icon to primary instead. The default down indicator communicates disclosure; up-down is for compact always-selected value pickers such as pagination page size and Input prefix or suffix units.",
8449
9252
  "While the popup is open, the trigger holds the pressed interaction wash without changing its resting foreground or selected-value treatment.",
8450
9253
  "The shared popup search control follows the Select density, using the same text, icon, and internal spacing as a borderless trigger. Its container uses menu-item padding on every side and owns a 1px bottom divider that becomes a 1.5px bold-brand stroke while search has focus. Search placeholder text is secondary at rest and quaternary while focused because it becomes decorative once the editable field is active.",
8451
9254
  "When search contains text, the shared control shows a rounded icon-only ButtonUnfilled with the CrossCircle icon and no border, sized to remain inset within the current row density. It clears the local term, stays hidden for an empty term, and returns focus to search.",
@@ -8454,7 +9257,7 @@
8454
9257
  "An empty filtered list composes the message-only body variant of EmptyState. Keep the default neutral no-results message unless localized product guidance makes the outcome clearer.",
8455
9258
  "Enable searchable for more than roughly 20 options, user-managed listings, large domains such as addresses, or sets users cannot efficiently scan. Local matching includes option labels, subtext, and section headings; the owner resolves remote data before assigning options.",
8456
9259
  "Validation timing belongs to the form owner and may be immediate or deferred until blur or submit; the Select exposes validity and error presentation without imposing that policy.",
8457
- "The error trigger uses a 1.5px bold-negative inset stroke so invalid state remains distinguishable from the normal 1px border without changing control geometry. Set hasBorder to false for chrome where the trigger must remain borderless at rest, when selected or focused, and when invalid; error semantics and supporting copy remain available.",
9260
+ "The error trigger uses a 1.5px bold-negative inset stroke so invalid state remains distinguishable from the normal 1px border without changing control geometry. Set hasBorder to false for chrome where the trigger must remain borderless at rest, when selected or focused, and when invalid; error semantics remain available, and supporting error copy insets to the trigger text origin rather than the resting border box.",
8458
9261
  "An initially empty option set is not an expected Select use case. The no-results state describes a search with no matches, not a source with no choices.",
8459
9262
  "Use options for a flat list or sections for grouped choices; when sections are present they take precedence.",
8460
9263
  "The background prop describes the actual parent surface and uses the same surface set as ButtonUnfilled.",
@@ -8574,10 +9377,18 @@
8574
9377
  "type": "string | undefined",
8575
9378
  "required": false
8576
9379
  },
9380
+ "insetDepth": {
9381
+ "type": "ControlInsetDepth",
9382
+ "required": false
9383
+ },
8577
9384
  "isInactive": {
8578
9385
  "type": "boolean",
8579
9386
  "required": false
8580
9387
  },
9388
+ "isInset": {
9389
+ "type": "boolean",
9390
+ "required": false
9391
+ },
8581
9392
  "isLoading": {
8582
9393
  "type": "boolean",
8583
9394
  "required": false
@@ -8626,6 +9437,10 @@
8626
9437
  "type": "string",
8627
9438
  "required": false
8628
9439
  },
9440
+ "rounded": {
9441
+ "type": "boolean",
9442
+ "required": false
9443
+ },
8629
9444
  "searchPlaceholder": {
8630
9445
  "type": "string",
8631
9446
  "required": false
@@ -11167,7 +11982,8 @@
11167
11982
  "component:ds-table",
11168
11983
  "component:ds-select",
11169
11984
  "component:ds-menu",
11170
- "component:ds-modal"
11985
+ "component:ds-modal",
11986
+ "component:ds-field"
11171
11987
  ],
11172
11988
  "patterns": [
11173
11989
  "pattern:menu-trigger"
@@ -11175,7 +11991,8 @@
11175
11991
  "accessibility": [
11176
11992
  "The primary control retains combobox semantics and exposes a direct accessible name.",
11177
11993
  "Each custom view exposes a separately named options trigger. The options menu supports keyboard navigation and returns focus through the shared Select and Menu behavior.",
11178
- "The naming dialog traps focus through Modal behavior, associates validation text with the input through Field, and restores focus to the saved-views control after closing."
11994
+ "The naming dialog traps focus through Modal behavior. The dialog heading names the task, so the name field omits a visible label; the input keeps aria-label Name, Field associates validation text, and focus returns to the saved-views control after closing.",
11995
+ "Footer actions are assigned with slot=\"footer\" on each button so Modal owns the two-action layout."
11179
11996
  ],
11180
11997
  "states": [
11181
11998
  "views, value, and dirty are controlled. Dirty state is presented only for a selected custom view; the default template never shows the trigger dot or save/discard actions even if dirty is supplied. Selection, create, save, discard, rename, and remove events communicate intent and never mutate application records.",
@@ -12084,7 +12901,7 @@
12084
12901
  "The default four visible rows can be changed with rows; rows is clamped to at least one.",
12085
12902
  "Vertical resizing is enabled by default and can be disabled when the surrounding layout owns the field height.",
12086
12903
  "Size changes typography and inset spacing without changing the authored row count.",
12087
- "Border, focus, error, placeholder, inactive, hover, and pressed treatments follow the same shared recipes as Input."
12904
+ "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."
12088
12905
  ],
12089
12906
  "responsiveBehavior": [
12090
12907
  "Textarea fills its parent by default and follows the width supplied by Field or the form layout.",
@@ -12242,6 +13059,122 @@
12242
13059
  "text"
12243
13060
  ]
12244
13061
  },
13062
+ {
13063
+ "name": "time-picker",
13064
+ "title": "TimePicker",
13065
+ "description": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
13066
+ "type": "registry:ui",
13067
+ "meta": {
13068
+ "library": "@ds-mo/ui",
13069
+ "distribution": "npm",
13070
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/time-picker",
13071
+ "source": "src/wc/components/TimePicker/TimePicker.tsx",
13072
+ "intentStatus": "complete",
13073
+ "intent": {
13074
+ "audience": "general",
13075
+ "status": "stable",
13076
+ "summary": "Bounded 12-hour clock lists for choosing hour, minute, and AM/PM, reused by form time fields.",
13077
+ "useWhen": [
13078
+ "A user picks a clock time from hour, minute, and AM/PM lists.",
13079
+ "A time field needs 32px clock tiles that match calendar day geometry and the shared choice-list selected treatment."
13080
+ ],
13081
+ "avoidWhen": [
13082
+ "The user types a time without opening a picker; the owning field keeps that editable value.",
13083
+ "The value is a calendar date rather than a clock time.",
13084
+ "The user chooses from a finite set of named schedule options rather than an exact time."
13085
+ ],
13086
+ "alternatives": [
13087
+ {
13088
+ "when": "The time is a form field that can be typed or picked.",
13089
+ "component": "component:ds-input-time",
13090
+ "reason": "InputTime owns the editable field, form association, and the time-picker popup."
13091
+ },
13092
+ {
13093
+ "when": "The value is a calendar date.",
13094
+ "component": "component:ds-calendar",
13095
+ "reason": "Calendar owns the month grid for single dates and ranges."
13096
+ }
13097
+ ],
13098
+ "commonlyComposedWith": [
13099
+ "component:ds-input-time",
13100
+ "component:ds-text"
13101
+ ],
13102
+ "accessibility": [
13103
+ "Hour, minute, and AM/PM are separate labelled listboxes without visible column headings. Each list keeps one tab stop on the selected option.",
13104
+ "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.",
13105
+ "Inactive pickers disable every option. Optional min and max times disable combinations outside that inclusive bound."
13106
+ ],
13107
+ "states": [
13108
+ "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.",
13109
+ "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.",
13110
+ "An empty value highlights 12:00 AM so the lists have a resting selection without inventing a second empty state."
13111
+ ],
13112
+ "responsiveBehavior": [
13113
+ "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."
13114
+ ],
13115
+ "frameworkCaveats": {
13116
+ "customElements": [
13117
+ "Listen for dsChange. The detail is the clock time string HH:MM."
13118
+ ],
13119
+ "react": [
13120
+ "Use DsTimePicker, bind value, and handle onDsChange."
13121
+ ]
13122
+ },
13123
+ "references": [
13124
+ {
13125
+ "label": "Storybook examples",
13126
+ "path": "src/wc/components/TimePicker/TimePicker.stories.ts"
13127
+ }
13128
+ ]
13129
+ },
13130
+ "props": {
13131
+ "autoFocus": {
13132
+ "type": "boolean",
13133
+ "required": false
13134
+ },
13135
+ "isInactive": {
13136
+ "type": "boolean",
13137
+ "required": false
13138
+ },
13139
+ "max": {
13140
+ "type": "string | undefined",
13141
+ "required": false
13142
+ },
13143
+ "min": {
13144
+ "type": "string | undefined",
13145
+ "required": false
13146
+ },
13147
+ "step": {
13148
+ "type": "string | number",
13149
+ "required": false
13150
+ },
13151
+ "value": {
13152
+ "type": "string",
13153
+ "required": false
13154
+ }
13155
+ },
13156
+ "events": [
13157
+ {
13158
+ "name": "dsChange",
13159
+ "detail": "string"
13160
+ }
13161
+ ],
13162
+ "slots": [],
13163
+ "exports": {
13164
+ "customElement": "ds-time-picker",
13165
+ "react": "DsTimePicker",
13166
+ "vue": "DsTimePicker",
13167
+ "angular": "DsTimePicker"
13168
+ }
13169
+ },
13170
+ "dependencies": [
13171
+ "@ds-mo/ui",
13172
+ "@ds-mo/tokens"
13173
+ ],
13174
+ "registryDependencies": [
13175
+ "text"
13176
+ ]
13177
+ },
12245
13178
  {
12246
13179
  "name": "toast",
12247
13180
  "title": "Toast",