@ds-mo/ui 14.35.0 → 15.0.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 (577) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +5733 -4656
  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-conversation-list.d.ts +1 -1
  9. package/dist/angular/ds-conversation-list.js +3 -4
  10. package/dist/angular/ds-data-customize.d.ts +18 -0
  11. package/dist/angular/ds-data-customize.js +46 -0
  12. package/dist/angular/ds-data-filter.d.ts +50 -0
  13. package/dist/angular/{ds-table-filter.js → ds-data-filter.js} +10 -10
  14. package/dist/angular/ds-data-group.d.ts +29 -0
  15. package/dist/angular/{ds-table-group.js → ds-data-group.js} +10 -10
  16. package/dist/angular/ds-data-preferences.d.ts +39 -0
  17. package/dist/angular/{ds-table-preferences.js → ds-data-preferences.js} +15 -15
  18. package/dist/angular/ds-data-saved-views.d.ts +49 -0
  19. package/dist/angular/{ds-table-saved-views.js → ds-data-saved-views.js} +10 -10
  20. package/dist/angular/ds-data-search.d.ts +20 -0
  21. package/dist/angular/{ds-table-search.js → ds-data-search.js} +12 -12
  22. package/dist/angular/ds-data-sort.d.ts +16 -0
  23. package/dist/angular/{ds-table-sort.js → ds-data-sort.js} +12 -12
  24. package/dist/angular/ds-data-toolbar.d.ts +12 -0
  25. package/dist/angular/{ds-table-toolbar.js → ds-data-toolbar.js} +10 -10
  26. package/dist/angular/ds-field.d.ts +1 -1
  27. package/dist/angular/ds-field.js +1 -1
  28. package/dist/angular/ds-input-date.d.ts +15 -0
  29. package/dist/angular/ds-input-date.js +43 -0
  30. package/dist/angular/ds-input-time.d.ts +15 -0
  31. package/dist/angular/ds-input-time.js +43 -0
  32. package/dist/angular/ds-input.d.ts +1 -1
  33. package/dist/angular/ds-input.js +3 -3
  34. package/dist/angular/ds-select.d.ts +1 -1
  35. package/dist/angular/ds-select.js +3 -3
  36. package/dist/angular/ds-table.d.ts +7 -7
  37. package/dist/angular/ds-table.js +6 -6
  38. package/dist/angular/ds-time-picker.d.ts +15 -0
  39. package/dist/angular/ds-time-picker.js +43 -0
  40. package/dist/angular/index.d.ts +1 -1
  41. package/dist/angular/index.js +13 -7
  42. package/dist/angular/proxies.d.ts +13 -7
  43. package/dist/angular/proxies.js +13 -7
  44. package/dist/angular/text-value-accessor.d.ts +1 -1
  45. package/dist/angular/text-value-accessor.js +2 -2
  46. package/dist/components/ds-agent-activity.js +1 -1
  47. package/dist/components/ds-agent-questionnaire.js +1 -1
  48. package/dist/components/ds-agent-response.js +1 -1
  49. package/dist/components/ds-agent-source-list.js +1 -1
  50. package/dist/components/ds-agent-tool-call.js +1 -1
  51. package/dist/components/ds-attachment-list.js +1 -1
  52. package/dist/components/ds-avatar.js +1 -1
  53. package/dist/components/ds-badge.js +1 -1
  54. package/dist/components/ds-banner.js +1 -1
  55. package/dist/components/ds-bar-action.js +1 -1
  56. package/dist/components/ds-bar-nav.js +1 -1
  57. package/dist/components/ds-bar-page-title.js +1 -1
  58. package/dist/components/ds-bar-title.js +1 -1
  59. package/dist/components/ds-bar-workflow.js +1 -1
  60. package/dist/components/ds-breadcrumb.js +1 -1
  61. package/dist/components/ds-button-filled.js +1 -1
  62. package/dist/components/ds-button-inverted.d.ts +11 -0
  63. package/dist/components/ds-button-inverted.js +2 -0
  64. package/dist/components/ds-button-inverted.js.map +1 -0
  65. package/dist/components/ds-button-unfilled.js +1 -1
  66. package/dist/components/{ds-table-search.d.ts → ds-calendar.d.ts} +4 -4
  67. package/dist/components/ds-calendar.js +2 -0
  68. package/dist/components/ds-card-action-center.js +1 -1
  69. package/dist/components/ds-card-chart.js +1 -1
  70. package/dist/components/ds-card-navigation.js +1 -1
  71. package/dist/components/ds-card-navigation.js.map +1 -1
  72. package/dist/components/ds-card-overview.js +1 -1
  73. package/dist/components/ds-card-setting.js +1 -1
  74. package/dist/components/ds-card-settings-scope.js +1 -1
  75. package/dist/components/ds-card-settings-scope.js.map +1 -1
  76. package/dist/components/ds-chart-legend.js +1 -1
  77. package/dist/components/ds-chart.js +1 -1
  78. package/dist/components/ds-checkbox.js +1 -1
  79. package/dist/components/ds-chip.js +1 -1
  80. package/dist/components/ds-code-block.js +1 -1
  81. package/dist/components/ds-conversation-list-item.js +1 -1
  82. package/dist/components/ds-conversation-list-item.js.map +1 -1
  83. package/dist/components/ds-conversation-list-section.js +1 -1
  84. package/dist/components/ds-conversation-list.js +1 -1
  85. package/dist/components/ds-conversation-list.js.map +1 -1
  86. package/dist/components/ds-data-customize.d.ts +11 -0
  87. package/dist/components/ds-data-customize.js +2 -0
  88. package/dist/components/ds-data-customize.js.map +1 -0
  89. package/dist/components/{ds-table-group.d.ts → ds-data-filter.d.ts} +4 -4
  90. package/dist/components/ds-data-filter.js +2 -0
  91. package/dist/components/ds-data-filter.js.map +1 -0
  92. package/dist/components/{ds-table-sort.d.ts → ds-data-group.d.ts} +4 -4
  93. package/dist/components/ds-data-group.js +2 -0
  94. package/dist/components/ds-data-group.js.map +1 -0
  95. package/dist/components/{ds-table-saved-views.d.ts → ds-data-preferences.d.ts} +4 -4
  96. package/dist/components/ds-data-preferences.js +2 -0
  97. package/dist/components/ds-data-preferences.js.map +1 -0
  98. package/dist/components/ds-data-saved-views.d.ts +11 -0
  99. package/dist/components/ds-data-saved-views.js +2 -0
  100. package/dist/components/ds-data-saved-views.js.map +1 -0
  101. package/dist/components/ds-data-search.d.ts +11 -0
  102. package/dist/components/ds-data-search.js +2 -0
  103. package/dist/components/ds-data-search.js.map +1 -0
  104. package/dist/components/ds-data-sort.d.ts +11 -0
  105. package/dist/components/ds-data-sort.js +2 -0
  106. package/dist/components/ds-data-sort.js.map +1 -0
  107. package/dist/components/{ds-table-filter.d.ts → ds-data-toolbar.d.ts} +4 -4
  108. package/dist/components/ds-data-toolbar.js +2 -0
  109. package/dist/components/ds-data-toolbar.js.map +1 -0
  110. package/dist/components/ds-divider.js +1 -1
  111. package/dist/components/ds-empty-state.js +1 -1
  112. package/dist/components/ds-field.js +1 -1
  113. package/dist/components/ds-filter-menu.js +1 -1
  114. package/dist/components/ds-icon.js +1 -1
  115. package/dist/components/ds-input-date.d.ts +11 -0
  116. package/dist/components/ds-input-date.js +2 -0
  117. package/dist/components/ds-input-date.js.map +1 -0
  118. package/dist/components/ds-input-time.d.ts +11 -0
  119. package/dist/components/ds-input-time.js +2 -0
  120. package/dist/components/ds-input-time.js.map +1 -0
  121. package/dist/components/ds-input.js +1 -1
  122. package/dist/components/ds-markdown.js +1 -1
  123. package/dist/components/ds-menu.js +1 -1
  124. package/dist/components/ds-message-actions.js +1 -1
  125. package/dist/components/ds-message-bubble.js +1 -1
  126. package/dist/components/ds-message-bubble.js.map +1 -1
  127. package/dist/components/ds-message-composer.js +1 -1
  128. package/dist/components/ds-message-composer.js.map +1 -1
  129. package/dist/components/ds-message-scroller.js +1 -1
  130. package/dist/components/ds-message.js +1 -1
  131. package/dist/components/ds-mobile-bar-nav.js +1 -1
  132. package/dist/components/ds-mobile-header.js +1 -1
  133. package/dist/components/ds-mobile-section-switcher.js +1 -1
  134. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  135. package/dist/components/ds-modal.js +1 -1
  136. package/dist/components/ds-pagination.js +1 -1
  137. package/dist/components/ds-panel-nav.js +1 -1
  138. package/dist/components/ds-panel-sub-nav.js +1 -1
  139. package/dist/components/ds-panel-tool-header.js +1 -1
  140. package/dist/components/ds-panel-tool-search.js +1 -1
  141. package/dist/components/ds-panel-tools.js +1 -1
  142. package/dist/components/ds-paper-texture.js +1 -1
  143. package/dist/components/ds-radio.js +1 -1
  144. package/dist/components/ds-score.js +1 -1
  145. package/dist/components/ds-scroll-overlay.js +1 -1
  146. package/dist/components/ds-select.js +1 -1
  147. package/dist/components/ds-shell-app.js +1 -1
  148. package/dist/components/ds-shell-page.js +1 -1
  149. package/dist/components/ds-shell-tools.js +1 -1
  150. package/dist/components/ds-skeleton.js +1 -1
  151. package/dist/components/ds-slider.js +1 -1
  152. package/dist/components/ds-slider.js.map +1 -1
  153. package/dist/components/ds-swatch-picker.js +1 -1
  154. package/dist/components/ds-switch.js +1 -1
  155. package/dist/components/ds-tab-group.js +1 -1
  156. package/dist/components/ds-table.js +1 -1
  157. package/dist/components/ds-table.js.map +1 -1
  158. package/dist/components/ds-tag.js +1 -1
  159. package/dist/components/ds-text.js +1 -1
  160. package/dist/components/ds-textarea.js +1 -1
  161. package/dist/components/ds-textarea.js.map +1 -1
  162. package/dist/components/ds-time-picker.d.ts +11 -0
  163. package/dist/components/ds-time-picker.js +2 -0
  164. package/dist/components/ds-time-picker.js.map +1 -0
  165. package/dist/components/ds-toast.js +1 -1
  166. package/dist/components/ds-tooltip-chart.js +1 -1
  167. package/dist/components/ds-tooltip.js +1 -1
  168. package/dist/components/ds-typing-indicator.js +1 -1
  169. package/dist/components/index.d.ts +5 -5
  170. package/dist/components/p-0FYD2bev.js +2 -0
  171. package/dist/components/p-0FYD2bev.js.map +1 -0
  172. package/dist/components/p-0qY_HDId.js +2 -0
  173. package/dist/components/{p-D_u8WhlU.js.map → p-0qY_HDId.js.map} +1 -1
  174. package/dist/components/{p-BQsVI_vO.js → p-5URekSny.js} +2 -2
  175. package/dist/components/{p-eo_pmPqp.js → p-7V1AhetH.js} +2 -2
  176. package/dist/components/{p-yZRXPHDe.js → p-8yBdCXCn.js} +2 -2
  177. package/dist/components/p-BKZdqJQB.js +2 -0
  178. package/dist/components/p-BKZdqJQB.js.map +1 -0
  179. package/dist/components/p-BYrBU_U9.js +2 -0
  180. package/dist/components/p-BYrBU_U9.js.map +1 -0
  181. package/dist/components/{p-D44g2Kw1.js → p-BciTtTwx.js} +2 -2
  182. package/dist/components/p-BciTtTwx.js.map +1 -0
  183. package/dist/components/{p-CZOiTaNa.js → p-BeNa6tw5.js} +2 -2
  184. package/dist/components/{p-CZOiTaNa.js.map → p-BeNa6tw5.js.map} +1 -1
  185. package/dist/components/p-BgQMEHRa.js +2 -0
  186. package/dist/components/{p-CwqFJMvP.js.map → p-BgQMEHRa.js.map} +1 -1
  187. package/dist/components/{p-BQaO7cg_.js → p-BhJXmuRA.js} +2 -2
  188. package/dist/components/{p-n68x-ZKp.js → p-Bm7rqs3C.js} +2 -2
  189. package/dist/components/{p-DdspY23v.js → p-Bn8I7iw6.js} +2 -2
  190. package/dist/components/{p-BnWxbhFP.js → p-Bpd6YCo4.js} +2 -2
  191. package/dist/components/{p-B-9fdIWv.js → p-C-3YqeTb.js} +2 -2
  192. package/dist/components/{p-umAf0fBn.js → p-CD4DZPy_.js} +2 -2
  193. package/dist/components/p-CElUM-xU.js +2 -0
  194. package/dist/components/p-CElUM-xU.js.map +1 -0
  195. package/dist/components/{p-CuwopElg.js → p-CGidq1iC.js} +2 -2
  196. package/dist/components/p-CNxvnQ6A.js +2 -0
  197. package/dist/components/p-CNxvnQ6A.js.map +1 -0
  198. package/dist/components/{p-CI7VfYC3.js → p-CUcUHwI3.js} +2 -2
  199. package/dist/components/p-CYzFfFcH.js +2 -0
  200. package/dist/components/{p-BINSI_KF.js.map → p-CYzFfFcH.js.map} +1 -1
  201. package/dist/components/{p-Dhw_W8nk.js → p-Cc3ZUQlJ.js} +2 -2
  202. package/dist/components/p-Cc3ZUQlJ.js.map +1 -0
  203. package/dist/components/p-CdgOLWX9.js +2 -0
  204. package/dist/components/p-CdgOLWX9.js.map +1 -0
  205. package/dist/components/{p-BcdHgPi5.js → p-CeXf9-X3.js} +2 -2
  206. package/dist/components/{p-CSnsz3Eb.js → p-CiH4GG6r.js} +2 -2
  207. package/dist/components/{p-y06IxxoN.js → p-CiJ1WR11.js} +2 -2
  208. package/dist/components/p-CmexIVnE.js +2 -0
  209. package/dist/components/{p-N5SHSVo2.js.map → p-CmexIVnE.js.map} +1 -1
  210. package/dist/components/{p-BmFeeR4q.js → p-CqW2eyiF.js} +2 -2
  211. package/dist/components/{p-CzbsTZt7.js → p-Cxr0IQjC.js} +2 -2
  212. package/dist/components/{p-CqlBlv55.js → p-CzIpquvw.js} +2 -2
  213. package/dist/components/{p-DC69DgAR.js → p-D0y7Sja6.js} +2 -2
  214. package/dist/components/{p-Cwz9TPVS.js → p-D1vQGJzc.js} +2 -2
  215. package/dist/components/{p-Cwz9TPVS.js.map → p-D1vQGJzc.js.map} +1 -1
  216. package/dist/components/{p-C7CZ9pnP.js → p-D6Wl3dRO.js} +2 -2
  217. package/dist/components/{p-BPhbwXOv.js → p-D922f6Tb.js} +2 -2
  218. package/dist/components/{p-beRFLHbB.js → p-DHICPS4n.js} +2 -2
  219. package/dist/components/{p-omPm8_vx.js → p-DOAybCp0.js} +2 -2
  220. package/dist/components/{p-DEGNrPLe.js → p-DVINzOoK.js} +2 -2
  221. package/dist/components/{p-DEGNrPLe.js.map → p-DVINzOoK.js.map} +1 -1
  222. package/dist/components/p-DVOjjuXc.js +2 -0
  223. package/dist/components/p-DVOjjuXc.js.map +1 -0
  224. package/dist/components/p-Di5FH7eh.js +2 -0
  225. package/dist/components/p-Di5FH7eh.js.map +1 -0
  226. package/dist/components/p-DjkUFlDW.js +2 -0
  227. package/dist/components/p-DjkUFlDW.js.map +1 -0
  228. package/dist/components/{p-BnzsBNUY.js → p-Dn9QHL4O.js} +2 -2
  229. package/dist/components/{p-DGzn4k4h.js → p-Do2FJd1y.js} +2 -2
  230. package/dist/components/{p-DTDLlinw.js → p-DpoTwJAR.js} +2 -2
  231. package/dist/components/{p-Dk-8Ju0Q.js → p-Dpr2y6_S.js} +2 -2
  232. package/dist/components/{p-Dk-8Ju0Q.js.map → p-Dpr2y6_S.js.map} +1 -1
  233. package/dist/components/p-Dw9sE6Iw.js +2 -0
  234. package/dist/components/p-Dw9sE6Iw.js.map +1 -0
  235. package/dist/components/{p-CLGtPE0K.js → p-DwbcNDJF.js} +2 -2
  236. package/dist/components/p-Dzndkdx5.js +2 -0
  237. package/dist/components/{p-xHGqrz_p.js.map → p-Dzndkdx5.js.map} +1 -1
  238. package/dist/components/{p-C8ek-1SP.js → p-E5W27Fu_.js} +2 -2
  239. package/dist/components/{p-mpk_Mm8_.js → p-FIBCluwV.js} +2 -2
  240. package/dist/components/{p-DQQFN2sw.js → p-IEq_06J0.js} +2 -2
  241. package/dist/components/{p-DQQFN2sw.js.map → p-IEq_06J0.js.map} +1 -1
  242. package/dist/components/{p-CE540WZ7.js → p-MG4lcN0D.js} +2 -2
  243. package/dist/components/p-Nc76seSq.js +2 -0
  244. package/dist/components/p-Nc76seSq.js.map +1 -0
  245. package/dist/components/{p-DtLQIMsa.js → p-ZhP2tVmM.js} +2 -2
  246. package/dist/components/p-aD5cw_m2.js +2 -0
  247. package/dist/components/p-aD5cw_m2.js.map +1 -0
  248. package/dist/components/p-etifxiDc.js +2 -0
  249. package/dist/components/{p-beCz9OnD.js.map → p-etifxiDc.js.map} +1 -1
  250. package/dist/components/p-kDZ0sEII.js +2 -0
  251. package/dist/components/p-kDZ0sEII.js.map +1 -0
  252. package/dist/components/{p-BPlWEidl.js → p-ljbw3UMZ.js} +2 -2
  253. package/dist/components/{p-DZ58Sg5a.js → p-vfCu7XSc.js} +2 -2
  254. package/dist/components/p-vfCu7XSc.js.map +1 -0
  255. package/dist/components/{p-DFjIBS5B.js → p-xdmJCPCg.js} +2 -2
  256. package/dist/components/{p-CAxDdYjh.js → p-xtGGIZmU.js} +2 -2
  257. package/dist/docs/components.json +18102 -14568
  258. package/dist/lib/components/Icon/flag-icon-catalog.d.ts +2 -0
  259. package/dist/lib/components/Icon/icon-cache.d.ts +36 -4
  260. package/dist/lib/components/Icon/map-icon-catalog.d.ts +2 -0
  261. package/dist/lib/shell/index.js +2 -2
  262. package/dist/lib/shell/index.js.map +1 -1
  263. package/dist/lib/utils/button-render.d.ts +1 -1
  264. package/dist/lib/utils/clock-time.d.ts +22 -0
  265. package/dist/lib/utils/date-filter-value.d.ts +4 -0
  266. package/dist/lib/utils/index.d.ts +3 -1
  267. package/dist/lib/utils/index.js +201 -5
  268. package/dist/lib/utils/index.js.map +4 -4
  269. package/dist/mcp-data/registry/agent-activity.json +2 -2
  270. package/dist/mcp-data/registry/agent-questionnaire.json +2 -2
  271. package/dist/mcp-data/registry/agent-response.json +1 -1
  272. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  273. package/dist/mcp-data/registry/agent-tool-call.json +2 -2
  274. package/dist/mcp-data/registry/attachment-list.json +1 -1
  275. package/dist/mcp-data/registry/avatar.json +1 -1
  276. package/dist/mcp-data/registry/badge.json +1 -1
  277. package/dist/mcp-data/registry/banner.json +1 -1
  278. package/dist/mcp-data/registry/bar-action.json +1 -1
  279. package/dist/mcp-data/registry/bar-nav.json +1 -1
  280. package/dist/mcp-data/registry/bar-page-title.json +1 -1
  281. package/dist/mcp-data/registry/bar-title.json +3 -3
  282. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  283. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  284. package/dist/mcp-data/registry/button-filled.json +1 -1
  285. package/dist/mcp-data/registry/button-inverted.json +580 -0
  286. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  287. package/dist/mcp-data/registry/calendar.json +273 -0
  288. package/dist/mcp-data/registry/card-action-center.json +1 -1
  289. package/dist/mcp-data/registry/card-chart.json +1 -1
  290. package/dist/mcp-data/registry/card-navigation.json +5 -3
  291. package/dist/mcp-data/registry/card-overview.json +1 -1
  292. package/dist/mcp-data/registry/card-setting.json +1 -1
  293. package/dist/mcp-data/registry/card-settings-scope.json +1 -1
  294. package/dist/mcp-data/registry/chart-legend.json +1 -1
  295. package/dist/mcp-data/registry/chart.json +1 -1
  296. package/dist/mcp-data/registry/checkbox.json +1 -1
  297. package/dist/mcp-data/registry/chip.json +1 -1
  298. package/dist/mcp-data/registry/code-block.json +1 -1
  299. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  300. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  301. package/dist/mcp-data/registry/conversation-list.json +10 -32
  302. package/dist/mcp-data/registry/data-customize.json +374 -0
  303. package/dist/mcp-data/registry/{table-filter.json → data-filter.json} +33 -33
  304. package/dist/mcp-data/registry/data-group.json +358 -0
  305. package/dist/mcp-data/registry/data-preferences.json +566 -0
  306. package/dist/mcp-data/registry/data-saved-views.json +433 -0
  307. package/dist/mcp-data/registry/data-search.json +367 -0
  308. package/dist/mcp-data/registry/data-sort.json +254 -0
  309. package/dist/mcp-data/registry/data-toolbar.json +181 -0
  310. package/dist/mcp-data/registry/divider.json +1 -1
  311. package/dist/mcp-data/registry/empty-state.json +1 -1
  312. package/dist/mcp-data/registry/field.json +20 -15
  313. package/dist/mcp-data/registry/filter-menu.json +7 -11
  314. package/dist/mcp-data/registry/icon.json +13 -7
  315. package/dist/mcp-data/registry/input-date.json +516 -0
  316. package/dist/mcp-data/registry/input-time.json +535 -0
  317. package/dist/mcp-data/registry/input.json +57 -9
  318. package/dist/mcp-data/registry/loader.json +1 -1
  319. package/dist/mcp-data/registry/markdown.json +1 -1
  320. package/dist/mcp-data/registry/menu.json +3 -3
  321. package/dist/mcp-data/registry/message-actions.json +1 -1
  322. package/dist/mcp-data/registry/message-bubble.json +1 -1
  323. package/dist/mcp-data/registry/message-composer.json +2 -2
  324. package/dist/mcp-data/registry/message-scroller.json +1 -1
  325. package/dist/mcp-data/registry/message.json +1 -1
  326. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  327. package/dist/mcp-data/registry/mobile-header.json +1 -1
  328. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  329. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  330. package/dist/mcp-data/registry/modal.json +1 -1
  331. package/dist/mcp-data/registry/pagination.json +1 -1
  332. package/dist/mcp-data/registry/panel-nav.json +1 -1
  333. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  334. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  335. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  336. package/dist/mcp-data/registry/panel-tools.json +3 -3
  337. package/dist/mcp-data/registry/paper-texture.json +1 -1
  338. package/dist/mcp-data/registry/radio.json +1 -1
  339. package/dist/mcp-data/registry/registry.json +5911 -4816
  340. package/dist/mcp-data/registry/score.json +1 -1
  341. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  342. package/dist/mcp-data/registry/select.json +64 -8
  343. package/dist/mcp-data/registry/shell-app.json +1 -1
  344. package/dist/mcp-data/registry/shell-page.json +1 -1
  345. package/dist/mcp-data/registry/shell-tools.json +1 -1
  346. package/dist/mcp-data/registry/skeleton.json +1 -1
  347. package/dist/mcp-data/registry/slider.json +1 -1
  348. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  349. package/dist/mcp-data/registry/switch.json +1 -1
  350. package/dist/mcp-data/registry/tab-group.json +1 -1
  351. package/dist/mcp-data/registry/table.json +71 -71
  352. package/dist/mcp-data/registry/tag.json +1 -1
  353. package/dist/mcp-data/registry/text.json +1 -1
  354. package/dist/mcp-data/registry/textarea.json +3 -3
  355. package/dist/mcp-data/registry/time-picker.json +259 -0
  356. package/dist/mcp-data/registry/toast.json +1 -1
  357. package/dist/mcp-data/registry/tooltip-chart.json +1 -1
  358. package/dist/mcp-data/registry/tooltip.json +1 -1
  359. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  360. package/dist/react/components.d.ts +13 -7
  361. package/dist/react/components.js +13 -7
  362. package/dist/react/ds-button-inverted.d.ts +13 -0
  363. package/dist/react/ds-button-inverted.js +15 -0
  364. package/dist/react/ds-calendar.d.ts +12 -0
  365. package/dist/react/ds-calendar.js +12 -0
  366. package/dist/react/ds-data-customize.d.ts +13 -0
  367. package/dist/react/ds-data-customize.js +15 -0
  368. package/dist/react/ds-data-filter.d.ts +18 -0
  369. package/dist/react/{ds-table-filter.js → ds-data-filter.js} +5 -5
  370. package/dist/react/ds-data-group.d.ts +14 -0
  371. package/dist/react/{ds-table-group.js → ds-data-group.js} +5 -5
  372. package/dist/react/ds-data-preferences.d.ts +21 -0
  373. package/dist/react/{ds-table-preferences.js → ds-data-preferences.js} +6 -6
  374. package/dist/react/ds-data-saved-views.d.ts +17 -0
  375. package/dist/react/{ds-table-saved-views.js → ds-data-saved-views.js} +5 -5
  376. package/dist/react/ds-data-search.d.ts +14 -0
  377. package/dist/react/{ds-table-search.js → ds-data-search.js} +5 -5
  378. package/dist/react/ds-data-sort.d.ts +12 -0
  379. package/dist/react/ds-data-sort.js +12 -0
  380. package/dist/react/{ds-table-toolbar.d.ts → ds-data-toolbar.d.ts} +3 -3
  381. package/dist/react/ds-data-toolbar.js +12 -0
  382. package/dist/react/ds-field.d.ts +1 -1
  383. package/dist/react/ds-input-date.d.ts +12 -0
  384. package/dist/react/ds-input-date.js +12 -0
  385. package/dist/react/ds-input-time.d.ts +12 -0
  386. package/dist/react/ds-input-time.js +12 -0
  387. package/dist/react/ds-table.d.ts +3 -3
  388. package/dist/react/ds-table.js +1 -1
  389. package/dist/react/ds-time-picker.d.ts +12 -0
  390. package/dist/react/ds-time-picker.js +12 -0
  391. package/dist/styles/table.css +11 -11
  392. package/dist/types/components/BarTitle/BarTitle.d.ts +1 -0
  393. package/dist/types/components/BarTitle/bar-title-action-chrome.d.ts +2 -0
  394. package/dist/types/components/ButtonInverted/ButtonInverted.d.ts +83 -0
  395. package/dist/types/components/ButtonInverted/index.d.ts +2 -0
  396. package/dist/types/components/Calendar/Calendar.d.ts +32 -0
  397. package/dist/types/components/Calendar/calendar-grid.d.ts +19 -0
  398. package/dist/types/components/ConversationList/ConversationList.d.ts +0 -7
  399. package/dist/types/components/DataCustomize/DataCustomize.d.ts +67 -0
  400. package/dist/types/components/{TableFilter/TableFilter.d.ts → DataFilter/DataFilter.d.ts} +2 -2
  401. package/dist/types/components/{TableGroup/TableGroup.d.ts → DataGroup/DataGroup.d.ts} +8 -8
  402. package/dist/types/components/{TablePreferences/TablePreferences.d.ts → DataPreferences/DataPreferences.d.ts} +29 -13
  403. package/dist/types/components/{TableSavedViews/TableSavedViews.d.ts → DataSavedViews/DataSavedViews.d.ts} +10 -10
  404. package/dist/types/components/DataSavedViews/data-saved-views-types.d.ts +24 -0
  405. package/dist/types/components/DataSavedViews/index.d.ts +2 -0
  406. package/dist/types/components/{TableSearch/TableSearch.d.ts → DataSearch/DataSearch.d.ts} +6 -6
  407. package/dist/types/components/{TableSearch/table-search-model.d.ts → DataSearch/data-search-model.d.ts} +6 -6
  408. package/dist/types/components/{TableSearch/table-search-types.d.ts → DataSearch/data-search-types.d.ts} +3 -3
  409. package/dist/types/components/{TableSort/TableSort.d.ts → DataSort/DataSort.d.ts} +7 -6
  410. package/dist/types/components/DataSort/data-sort-menu.d.ts +15 -0
  411. package/dist/types/components/{TableToolbar/TableToolbar.d.ts → DataToolbar/DataToolbar.d.ts} +3 -3
  412. package/dist/types/components/Field/Field.d.ts +7 -2
  413. package/dist/types/components/FilterMenu/FilterMenu.d.ts +0 -10
  414. package/dist/types/components/Icon/icon-cache.d.ts +36 -4
  415. package/dist/types/components/Icon/map-icon-catalog.d.ts +3 -0
  416. package/dist/types/components/Input/Input.d.ts +10 -0
  417. package/dist/types/components/InputDate/InputDate.d.ts +78 -0
  418. package/dist/types/components/InputTime/InputTime.d.ts +80 -0
  419. package/dist/types/components/PanelTools/PanelTools.d.ts +1 -1
  420. package/dist/types/components/Select/Select.d.ts +8 -1
  421. package/dist/types/components/Table/Table.d.ts +9 -9
  422. package/dist/types/components/Table/index.d.ts +1 -1
  423. package/dist/types/components/Table/table-action-menu.d.ts +1 -1
  424. package/dist/types/components/Table/table-body-renderer.d.ts +2 -2
  425. package/dist/types/components/Table/table-column-customizer.d.ts +9 -9
  426. package/dist/types/components/Table/table-group-load-controller.d.ts +2 -2
  427. package/dist/types/components/Table/table-model.d.ts +7 -7
  428. package/dist/types/components/Table/table-render-model.d.ts +3 -3
  429. package/dist/types/components/Table/table-types.d.ts +17 -36
  430. package/dist/types/components/Table/table-virtual-model.d.ts +2 -2
  431. package/dist/types/components/TimePicker/TimePicker.d.ts +33 -0
  432. package/dist/types/components.d.ts +5461 -4433
  433. package/dist/types/utils/button-render.d.ts +1 -1
  434. package/dist/types/utils/clock-time.d.ts +23 -0
  435. package/dist/types/utils/data-field.d.ts +38 -0
  436. package/dist/types/utils/date-filter-value.d.ts +4 -0
  437. package/dist/types/utils/index.d.ts +3 -1
  438. package/dist/types/utils/list-customizer.d.ts +38 -0
  439. package/dist/types/utils/table-caption-compact.d.ts +1 -1
  440. package/dist/vue/components.d.ts +13 -7
  441. package/dist/vue/components.js +13 -7
  442. package/dist/vue/ds-button-inverted.d.ts +3 -0
  443. package/dist/vue/ds-button-inverted.js +33 -0
  444. package/dist/vue/{ds-table-sort.d.ts → ds-calendar.d.ts} +1 -1
  445. package/dist/vue/ds-calendar.js +16 -0
  446. package/dist/vue/ds-conversation-list.js +1 -3
  447. package/dist/vue/ds-data-customize.d.ts +3 -0
  448. package/dist/vue/ds-data-customize.js +23 -0
  449. package/dist/vue/{ds-table-group.d.ts → ds-data-filter.d.ts} +1 -1
  450. package/dist/vue/{ds-table-filter.js → ds-data-filter.js} +2 -2
  451. package/dist/vue/{ds-table-filter.d.ts → ds-data-group.d.ts} +1 -1
  452. package/dist/vue/{ds-table-group.js → ds-data-group.js} +2 -2
  453. package/dist/vue/{ds-table-saved-views.d.ts → ds-data-preferences.d.ts} +1 -1
  454. package/dist/vue/{ds-table-preferences.js → ds-data-preferences.js} +10 -7
  455. package/dist/vue/ds-data-saved-views.d.ts +3 -0
  456. package/dist/vue/{ds-table-saved-views.js → ds-data-saved-views.js} +2 -2
  457. package/dist/vue/{ds-table-search.d.ts → ds-data-search.d.ts} +1 -1
  458. package/dist/vue/{ds-table-search.js → ds-data-search.js} +3 -3
  459. package/dist/vue/ds-data-sort.d.ts +3 -0
  460. package/dist/vue/{ds-table-sort.js → ds-data-sort.js} +3 -3
  461. package/dist/vue/ds-data-toolbar.d.ts +3 -0
  462. package/dist/vue/ds-data-toolbar.js +9 -0
  463. package/dist/vue/{ds-table-preferences.d.ts → ds-input-date.d.ts} +1 -1
  464. package/dist/vue/ds-input-date.js +31 -0
  465. package/dist/vue/ds-input-time.d.ts +3 -0
  466. package/dist/vue/ds-input-time.js +32 -0
  467. package/dist/vue/ds-input.js +2 -0
  468. package/dist/vue/ds-select.js +3 -0
  469. package/dist/vue/ds-table.js +4 -4
  470. package/dist/vue/ds-time-picker.d.ts +3 -0
  471. package/dist/vue/ds-time-picker.js +16 -0
  472. package/package.json +3 -3
  473. package/dist/angular/ds-table-filter.d.ts +0 -50
  474. package/dist/angular/ds-table-group.d.ts +0 -29
  475. package/dist/angular/ds-table-preferences.d.ts +0 -39
  476. package/dist/angular/ds-table-saved-views.d.ts +0 -49
  477. package/dist/angular/ds-table-search.d.ts +0 -20
  478. package/dist/angular/ds-table-sort.d.ts +0 -16
  479. package/dist/angular/ds-table-toolbar.d.ts +0 -12
  480. package/dist/components/ds-table-filter.js +0 -2
  481. package/dist/components/ds-table-filter.js.map +0 -1
  482. package/dist/components/ds-table-group.js +0 -2
  483. package/dist/components/ds-table-preferences.d.ts +0 -11
  484. package/dist/components/ds-table-preferences.js +0 -2
  485. package/dist/components/ds-table-preferences.js.map +0 -1
  486. package/dist/components/ds-table-saved-views.js +0 -2
  487. package/dist/components/ds-table-saved-views.js.map +0 -1
  488. package/dist/components/ds-table-search.js +0 -2
  489. package/dist/components/ds-table-search.js.map +0 -1
  490. package/dist/components/ds-table-sort.js +0 -2
  491. package/dist/components/ds-table-sort.js.map +0 -1
  492. package/dist/components/ds-table-toolbar.d.ts +0 -11
  493. package/dist/components/ds-table-toolbar.js +0 -2
  494. package/dist/components/ds-table-toolbar.js.map +0 -1
  495. package/dist/components/p-BINSI_KF.js +0 -2
  496. package/dist/components/p-BbfBvMRR.js +0 -2
  497. package/dist/components/p-BbfBvMRR.js.map +0 -1
  498. package/dist/components/p-C1_3CVma.js +0 -2
  499. package/dist/components/p-C1_3CVma.js.map +0 -1
  500. package/dist/components/p-CKarsuR2.js +0 -2
  501. package/dist/components/p-CKarsuR2.js.map +0 -1
  502. package/dist/components/p-Cea7rROU.js +0 -2
  503. package/dist/components/p-Cea7rROU.js.map +0 -1
  504. package/dist/components/p-Cmj04E5Q.js +0 -2
  505. package/dist/components/p-Cmj04E5Q.js.map +0 -1
  506. package/dist/components/p-Cq_Qpe_C.js +0 -2
  507. package/dist/components/p-Cq_Qpe_C.js.map +0 -1
  508. package/dist/components/p-CwqFJMvP.js +0 -2
  509. package/dist/components/p-D44g2Kw1.js.map +0 -1
  510. package/dist/components/p-DZ58Sg5a.js.map +0 -1
  511. package/dist/components/p-D_u8WhlU.js +0 -2
  512. package/dist/components/p-Dhw_W8nk.js.map +0 -1
  513. package/dist/components/p-FPZbS19l.js +0 -2
  514. package/dist/components/p-FPZbS19l.js.map +0 -1
  515. package/dist/components/p-KBrC9IG4.js +0 -2
  516. package/dist/components/p-KBrC9IG4.js.map +0 -1
  517. package/dist/components/p-N5SHSVo2.js +0 -2
  518. package/dist/components/p-QjkufCcn.js +0 -2
  519. package/dist/components/p-QjkufCcn.js.map +0 -1
  520. package/dist/components/p-UAIxh67Q.js +0 -2
  521. package/dist/components/p-UAIxh67Q.js.map +0 -1
  522. package/dist/components/p-beCz9OnD.js +0 -2
  523. package/dist/components/p-xHGqrz_p.js +0 -2
  524. package/dist/mcp-data/registry/table-group.json +0 -358
  525. package/dist/mcp-data/registry/table-preferences.json +0 -511
  526. package/dist/mcp-data/registry/table-saved-views.json +0 -431
  527. package/dist/mcp-data/registry/table-search.json +0 -366
  528. package/dist/mcp-data/registry/table-sort.json +0 -253
  529. package/dist/mcp-data/registry/table-toolbar.json +0 -180
  530. package/dist/react/ds-table-filter.d.ts +0 -18
  531. package/dist/react/ds-table-group.d.ts +0 -14
  532. package/dist/react/ds-table-preferences.d.ts +0 -21
  533. package/dist/react/ds-table-saved-views.d.ts +0 -17
  534. package/dist/react/ds-table-search.d.ts +0 -14
  535. package/dist/react/ds-table-sort.d.ts +0 -12
  536. package/dist/react/ds-table-sort.js +0 -12
  537. package/dist/react/ds-table-toolbar.js +0 -12
  538. package/dist/types/components/FilterMenu/filter-menu-calendar.d.ts +0 -13
  539. package/dist/types/components/TableSavedViews/index.d.ts +0 -2
  540. package/dist/types/components/TableSavedViews/table-saved-views-types.d.ts +0 -24
  541. package/dist/types/components/TableSort/table-sort-menu.d.ts +0 -15
  542. package/dist/vue/ds-table-toolbar.d.ts +0 -3
  543. package/dist/vue/ds-table-toolbar.js +0 -9
  544. /package/dist/components/{ds-table-group.js.map → ds-calendar.js.map} +0 -0
  545. /package/dist/components/{p-BQsVI_vO.js.map → p-5URekSny.js.map} +0 -0
  546. /package/dist/components/{p-eo_pmPqp.js.map → p-7V1AhetH.js.map} +0 -0
  547. /package/dist/components/{p-yZRXPHDe.js.map → p-8yBdCXCn.js.map} +0 -0
  548. /package/dist/components/{p-BQaO7cg_.js.map → p-BhJXmuRA.js.map} +0 -0
  549. /package/dist/components/{p-n68x-ZKp.js.map → p-Bm7rqs3C.js.map} +0 -0
  550. /package/dist/components/{p-DdspY23v.js.map → p-Bn8I7iw6.js.map} +0 -0
  551. /package/dist/components/{p-BnWxbhFP.js.map → p-Bpd6YCo4.js.map} +0 -0
  552. /package/dist/components/{p-B-9fdIWv.js.map → p-C-3YqeTb.js.map} +0 -0
  553. /package/dist/components/{p-umAf0fBn.js.map → p-CD4DZPy_.js.map} +0 -0
  554. /package/dist/components/{p-CuwopElg.js.map → p-CGidq1iC.js.map} +0 -0
  555. /package/dist/components/{p-CI7VfYC3.js.map → p-CUcUHwI3.js.map} +0 -0
  556. /package/dist/components/{p-BcdHgPi5.js.map → p-CeXf9-X3.js.map} +0 -0
  557. /package/dist/components/{p-CSnsz3Eb.js.map → p-CiH4GG6r.js.map} +0 -0
  558. /package/dist/components/{p-y06IxxoN.js.map → p-CiJ1WR11.js.map} +0 -0
  559. /package/dist/components/{p-BmFeeR4q.js.map → p-CqW2eyiF.js.map} +0 -0
  560. /package/dist/components/{p-CzbsTZt7.js.map → p-Cxr0IQjC.js.map} +0 -0
  561. /package/dist/components/{p-CqlBlv55.js.map → p-CzIpquvw.js.map} +0 -0
  562. /package/dist/components/{p-DC69DgAR.js.map → p-D0y7Sja6.js.map} +0 -0
  563. /package/dist/components/{p-C7CZ9pnP.js.map → p-D6Wl3dRO.js.map} +0 -0
  564. /package/dist/components/{p-BPhbwXOv.js.map → p-D922f6Tb.js.map} +0 -0
  565. /package/dist/components/{p-beRFLHbB.js.map → p-DHICPS4n.js.map} +0 -0
  566. /package/dist/components/{p-omPm8_vx.js.map → p-DOAybCp0.js.map} +0 -0
  567. /package/dist/components/{p-BnzsBNUY.js.map → p-Dn9QHL4O.js.map} +0 -0
  568. /package/dist/components/{p-DGzn4k4h.js.map → p-Do2FJd1y.js.map} +0 -0
  569. /package/dist/components/{p-DTDLlinw.js.map → p-DpoTwJAR.js.map} +0 -0
  570. /package/dist/components/{p-CLGtPE0K.js.map → p-DwbcNDJF.js.map} +0 -0
  571. /package/dist/components/{p-C8ek-1SP.js.map → p-E5W27Fu_.js.map} +0 -0
  572. /package/dist/components/{p-mpk_Mm8_.js.map → p-FIBCluwV.js.map} +0 -0
  573. /package/dist/components/{p-CE540WZ7.js.map → p-MG4lcN0D.js.map} +0 -0
  574. /package/dist/components/{p-DtLQIMsa.js.map → p-ZhP2tVmM.js.map} +0 -0
  575. /package/dist/components/{p-BPlWEidl.js.map → p-ljbw3UMZ.js.map} +0 -0
  576. /package/dist/components/{p-DFjIBS5B.js.map → p-xdmJCPCg.js.map} +0 -0
  577. /package/dist/components/{p-CAxDdYjh.js.map → p-xtGGIZmU.js.map} +0 -0
@@ -0,0 +1,273 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "calendar",
4
+ "title": "Calendar",
5
+ "description": "Month calendar grid for choosing one calendar date or an inclusive date range, reused by form date fields and filter range selection.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/calendar",
11
+ "source": "src/wc/components/Calendar/Calendar.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "experimental",
16
+ "summary": "Month calendar grid for choosing one calendar date or an inclusive date range, reused by form date fields and filter range selection.",
17
+ "useWhen": [
18
+ "A user picks one calendar day from a month grid.",
19
+ "A user builds an inclusive start and end date by choosing two days.",
20
+ "A date field or filter needs the shared month navigation, weekday headings, and selected-day treatment."
21
+ ],
22
+ "avoidWhen": [
23
+ "The user types a date without opening a calendar; the owning field keeps that editable value.",
24
+ "The user chooses a relative preset such as last 7 days rather than fixed calendar days.",
25
+ "The popup also has to host filter categories, search, or apply actions; that surface stays with FilterMenu."
26
+ ],
27
+ "alternatives": [
28
+ {
29
+ "when": "The date is a form field that can be typed or picked.",
30
+ "component": "component:ds-input-date",
31
+ "reason": "InputDate owns the editable field, form association, and the calendar popup."
32
+ },
33
+ {
34
+ "when": "The value is a clock time rather than a calendar date.",
35
+ "component": "component:ds-time-picker",
36
+ "reason": "TimePicker owns bounded hour, minute, and AM/PM lists with the same 32px tile geometry."
37
+ },
38
+ {
39
+ "when": "The user chooses relative presets or mixed filter families from one trigger.",
40
+ "component": "component:ds-filter-menu",
41
+ "reason": "FilterMenu owns relative date presets and hosts this calendar only for fixed ranges."
42
+ }
43
+ ],
44
+ "commonlyComposedWith": [
45
+ "component:ds-input-date",
46
+ "component:ds-filter-menu",
47
+ "component:ds-button-unfilled",
48
+ "component:ds-text"
49
+ ],
50
+ "accessibility": [
51
+ "The month grid is labelled with the visible month and year. Days are grid cells with an accessible date name.",
52
+ "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.",
53
+ "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.",
54
+ "Month navigation buttons are named Previous month and Next month. Inactive calendars disable day and month controls."
55
+ ],
56
+ "states": [
57
+ "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.",
58
+ "Today uses emphasized primary text without becoming selected on its own.",
59
+ "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.",
60
+ "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."
61
+ ],
62
+ "responsiveBehavior": [
63
+ "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."
64
+ ],
65
+ "frameworkCaveats": {
66
+ "customElements": [
67
+ "Listen for dsChange. Single mode emits YYYY-MM-DD. Range mode emits range:start/end using the shared date-filter string."
68
+ ],
69
+ "react": [
70
+ "Use DsCalendar, bind value, and handle onDsChange."
71
+ ]
72
+ },
73
+ "references": [
74
+ {
75
+ "label": "Storybook examples",
76
+ "path": "src/wc/components/Calendar/Calendar.stories.ts"
77
+ }
78
+ ]
79
+ },
80
+ "api": {
81
+ "props": {
82
+ "autoFocus": {
83
+ "type": "boolean",
84
+ "resolvedType": "boolean",
85
+ "attribute": "auto-focus",
86
+ "default": "false",
87
+ "required": false,
88
+ "mutable": false,
89
+ "description": "Move keyboard focus into the grid after the calendar is rendered."
90
+ },
91
+ "isInactive": {
92
+ "type": "boolean",
93
+ "resolvedType": "boolean",
94
+ "attribute": "is-inactive",
95
+ "default": "false",
96
+ "required": false,
97
+ "mutable": false
98
+ },
99
+ "max": {
100
+ "type": "string | undefined",
101
+ "resolvedType": "string | undefined",
102
+ "attribute": "max",
103
+ "required": false,
104
+ "mutable": false
105
+ },
106
+ "min": {
107
+ "type": "string | undefined",
108
+ "resolvedType": "string | undefined",
109
+ "attribute": "min",
110
+ "required": false,
111
+ "mutable": false
112
+ },
113
+ "selectionMode": {
114
+ "type": "CalendarSelectionMode",
115
+ "resolvedType": "\"range\" | \"single\"",
116
+ "attribute": "selection-mode",
117
+ "default": "'single'",
118
+ "required": false,
119
+ "mutable": false,
120
+ "description": "Single date emits YYYY-MM-DD. Range emits the shared `range:start/end` string."
121
+ },
122
+ "value": {
123
+ "type": "string",
124
+ "resolvedType": "string",
125
+ "attribute": "value",
126
+ "default": "''",
127
+ "required": false,
128
+ "mutable": false
129
+ }
130
+ },
131
+ "events": [
132
+ {
133
+ "name": "dsChange",
134
+ "detail": "string",
135
+ "bubbles": true,
136
+ "cancelable": true,
137
+ "composed": true
138
+ }
139
+ ],
140
+ "methods": [
141
+ {
142
+ "name": "setFocus",
143
+ "signature": "setFocus() => Promise<void>"
144
+ }
145
+ ],
146
+ "slots": []
147
+ },
148
+ "props": {
149
+ "autoFocus": {
150
+ "type": "boolean",
151
+ "resolvedType": "boolean",
152
+ "attribute": "auto-focus",
153
+ "default": "false",
154
+ "required": false,
155
+ "mutable": false,
156
+ "description": "Move keyboard focus into the grid after the calendar is rendered."
157
+ },
158
+ "isInactive": {
159
+ "type": "boolean",
160
+ "resolvedType": "boolean",
161
+ "attribute": "is-inactive",
162
+ "default": "false",
163
+ "required": false,
164
+ "mutable": false
165
+ },
166
+ "max": {
167
+ "type": "string | undefined",
168
+ "resolvedType": "string | undefined",
169
+ "attribute": "max",
170
+ "required": false,
171
+ "mutable": false
172
+ },
173
+ "min": {
174
+ "type": "string | undefined",
175
+ "resolvedType": "string | undefined",
176
+ "attribute": "min",
177
+ "required": false,
178
+ "mutable": false
179
+ },
180
+ "selectionMode": {
181
+ "type": "CalendarSelectionMode",
182
+ "resolvedType": "\"range\" | \"single\"",
183
+ "attribute": "selection-mode",
184
+ "default": "'single'",
185
+ "required": false,
186
+ "mutable": false,
187
+ "description": "Single date emits YYYY-MM-DD. Range emits the shared `range:start/end` string."
188
+ },
189
+ "value": {
190
+ "type": "string",
191
+ "resolvedType": "string",
192
+ "attribute": "value",
193
+ "default": "''",
194
+ "required": false,
195
+ "mutable": false
196
+ }
197
+ },
198
+ "events": [
199
+ {
200
+ "name": "dsChange",
201
+ "detail": "string",
202
+ "bubbles": true,
203
+ "cancelable": true,
204
+ "composed": true
205
+ }
206
+ ],
207
+ "methods": [
208
+ {
209
+ "name": "setFocus",
210
+ "signature": "setFocus() => Promise<void>"
211
+ }
212
+ ],
213
+ "slots": [],
214
+ "exports": {
215
+ "customElement": "ds-calendar",
216
+ "react": "DsCalendar",
217
+ "vue": "DsCalendar",
218
+ "angular": "DsCalendar"
219
+ },
220
+ "consumption": {
221
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
222
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
223
+ "customElements": {
224
+ "import": "import '@ds-mo/ui/dist/components/ds-calendar.js';",
225
+ "example": "<ds-calendar></ds-calendar>"
226
+ },
227
+ "react": {
228
+ "import": "import { DsCalendar } from '@ds-mo/ui/react';",
229
+ "example": "<DsCalendar />"
230
+ },
231
+ "vue": {
232
+ "import": "import { DsCalendar } from '@ds-mo/ui/vue';",
233
+ "example": "<DsCalendar />"
234
+ },
235
+ "angular": {
236
+ "import": "import { DsCalendar } from '@ds-mo/ui/angular/ds-calendar';",
237
+ "example": "<ds-calendar></ds-calendar>"
238
+ },
239
+ "peerDependencies": {
240
+ "required": [
241
+ "@ds-mo/tokens ^6.5.1",
242
+ "@ds-mo/icons ^8.1.0"
243
+ ],
244
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
245
+ }
246
+ }
247
+ },
248
+ "dependencies": [
249
+ "@ds-mo/ui",
250
+ "@ds-mo/tokens"
251
+ ],
252
+ "registryDependencies": [
253
+ "button-unfilled",
254
+ "text"
255
+ ],
256
+ "files": [
257
+ {
258
+ "path": "src/wc/components/Calendar/Calendar.css",
259
+ "content": "@import '../../utils/radius.css';\n@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n display: flex;\n min-height: 0;\n flex-direction: column;\n}\n\n.calendar {\n display: flex;\n min-height: 0;\n flex-direction: column;\n min-width: calc(\n (var(--dimension-size-400) * 7) + (var(--dimension-space-050) * 6) +\n (var(--dimension-space-100) * 2)\n );\n padding: var(--ds-calendar-padding, var(--dimension-space-100));\n}\n\n.calendar-heading {\n display: grid;\n grid-template-columns: var(--dimension-size-400) minmax(0, 1fr) var(--dimension-size-400);\n align-items: center;\n text-align: center;\n}\n\n.calendar-nav--previous {\n justify-self: start;\n}\n\n.calendar-nav--next {\n justify-self: end;\n}\n\n.calendar-weekdays,\n.calendar-grid__row {\n display: grid;\n grid-template-columns: repeat(7, minmax(0, 1fr));\n column-gap: var(--dimension-space-050);\n}\n\n.calendar-grid {\n display: flex;\n flex-direction: column;\n row-gap: var(--dimension-space-050);\n}\n\n.calendar-weekdays {\n align-items: center;\n min-height: var(--dimension-size-400);\n margin-block-start: var(--dimension-space-050);\n color: var(--color-foreground-secondary);\n text-align: center;\n}\n\n.calendar-day {\n appearance: none;\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 0;\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: var(--color-foreground-primary);\n cursor: default;\n}\n\n.calendar-day:disabled {\n cursor: not-allowed;\n}\n\n.calendar-day--outside {\n color: var(--color-foreground-tertiary);\n}\n\n.calendar-day--in-range {\n background: var(--color-background-faint-brand);\n color: var(--color-foreground-primary);\n}\n\n/* In-progress span uses the shared hover overlay; the first day keeps pressed via --surface-open. */\n.calendar-day.ds-interaction-fill.calendar-day--range-preview:not(:disabled)::after {\n background: var(--ds-interaction-hover);\n}\n\n.calendar-day.ds-interaction-fill.calendar-day--range-preview:active:not(:disabled)::after {\n background: var(--ds-interaction-pressed);\n}\n\n.calendar-day--today {\n color: var(--color-foreground-primary);\n}\n\n.calendar-day--range-edge {\n background: var(--color-background-bold-brand);\n color: var(--color-foreground-on-bold-background-primary);\n}\n\n@media (forced-colors: active) {\n .calendar-day--range-edge {\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n }\n}\n",
260
+ "type": "registry:ui"
261
+ },
262
+ {
263
+ "path": "src/wc/components/Calendar/Calendar.tsx",
264
+ "content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n Method,\n Prop,\n State,\n Watch,\n h,\n Host,\n} from '@stencil/core';\nimport {\n dateFilterRangeValue,\n isIsoCalendarDate,\n parseDateFilterValue,\n shiftIsoCalendarDate,\n} from '../../utils';\nimport {\n CALENDAR_WEEKDAYS,\n calendarDays,\n calendarMonth,\n calendarMonthLabel,\n calendarPaintedRange,\n calendarToday,\n shiftCalendarMonth,\n type CalendarDateRange,\n} from './calendar-grid';\n\nexport type CalendarSelectionMode = 'single' | 'range';\n\n@Component({\n tag: 'ds-calendar',\n styleUrl: 'Calendar.css',\n scoped: true,\n})\nexport class Calendar {\n @Element() el!: HTMLElement;\n\n /** Single date emits YYYY-MM-DD. Range emits the shared `range:start/end` string. */\n @Prop() selectionMode: CalendarSelectionMode = 'single';\n @Prop() value: string = '';\n @Prop() min: string | undefined;\n @Prop() max: string | undefined;\n @Prop() isInactive: boolean = false;\n /** Move keyboard focus into the grid after the calendar is rendered. */\n @Prop() autoFocus: boolean = false;\n\n @Event() dsChange!: EventEmitter<string>;\n\n @State() private month = calendarMonth(calendarToday());\n @State() private pendingStart = '';\n @State() private previewEnd = '';\n @State() private heldRange: CalendarDateRange | null = null;\n\n componentWillLoad() {\n this.month = calendarMonth(this.anchorDate());\n }\n\n componentDidLoad() {\n if (this.autoFocus) void this.setFocus();\n }\n\n @Watch('value')\n onValueChange() {\n this.month = calendarMonth(this.anchorDate());\n }\n\n @Method()\n async setFocus() {\n this.el.querySelector<HTMLElement>('.calendar-day[tabindex=\"0\"]')?.focus();\n }\n\n private anchorDate(): string {\n if (this.selectionMode === 'range') {\n const parsed = parseDateFilterValue(this.value);\n if (parsed?.kind === 'range') return parsed.start;\n return calendarToday();\n }\n return isIsoCalendarDate(this.value) ? this.value : calendarToday();\n }\n\n private isDisabled(day: string): boolean {\n if (this.isInactive) return true;\n if (this.min && isIsoCalendarDate(this.min) && day < this.min) return true;\n if (this.max && isIsoCalendarDate(this.max) && day > this.max) return true;\n return false;\n }\n\n private moveMonth = (offset: number) => {\n this.previewEnd = '';\n this.month = shiftCalendarMonth(this.month, offset);\n };\n\n private selectDate = (day: string) => {\n if (this.isDisabled(day)) return;\n this.previewEnd = '';\n if (this.selectionMode === 'single') {\n this.pendingStart = '';\n this.heldRange = null;\n this.dsChange.emit(day);\n return;\n }\n const pending = this.pendingStart;\n if (pending) {\n this.pendingStart = '';\n this.heldRange = null;\n this.dsChange.emit(dateFilterRangeValue(pending, day));\n return;\n }\n const current = parseDateFilterValue(this.value);\n this.heldRange = current?.kind === 'range' ? { start: current.start, end: current.end } : null;\n this.pendingStart = day;\n this.dsChange.emit(dateFilterRangeValue(day, day));\n };\n\n private previewRange = (day: string) => {\n if (!this.pendingStart || this.previewEnd === day) return;\n this.previewEnd = day;\n };\n\n private clearPreview = () => {\n if (!this.previewEnd) return;\n this.previewEnd = '';\n };\n\n private focusDate(day: string) {\n this.previewRange(day);\n const targetMonth = calendarMonth(day);\n if (this.month !== targetMonth) this.month = targetMonth;\n requestAnimationFrame(() => {\n this.el.querySelector<HTMLElement>(`[data-date-option=\"${day}\"]`)?.focus();\n });\n }\n\n private handleDayKeyDown = (event: KeyboardEvent, day: string) => {\n let offset: number | null = null;\n if (event.key === 'ArrowLeft') offset = -1;\n else if (event.key === 'ArrowRight') offset = 1;\n else if (event.key === 'ArrowUp') offset = -7;\n else if (event.key === 'ArrowDown') offset = 7;\n else if (event.key === 'Home') {\n offset = -new Date(`${day}T00:00:00Z`).getUTCDay();\n } else if (event.key === 'End') {\n offset = 6 - new Date(`${day}T00:00:00Z`).getUTCDay();\n } else if (event.key === 'PageUp' || event.key === 'PageDown') {\n const month = shiftCalendarMonth(calendarMonth(day), event.key === 'PageUp' ? -1 : 1);\n const candidate = `${month}-${day.slice(8, 10)}`;\n event.preventDefault();\n this.focusDate(isIsoCalendarDate(candidate) ? candidate : `${month}-01`);\n return;\n }\n if (offset === null) return;\n event.preventDefault();\n this.focusDate(shiftIsoCalendarDate(day, offset));\n };\n\n render() {\n const liveRange = this.selectionMode === 'range' ? parseDateFilterValue(this.value) : null;\n const liveRangeValue = liveRange?.kind === 'range' ? liveRange : null;\n const rangeValue = calendarPaintedRange(this.pendingStart, this.heldRange, liveRangeValue);\n const days = calendarDays(this.month);\n const weeks = Array.from({ length: 6 }, (_, index) => days.slice(index * 7, index * 7 + 7));\n const today = calendarToday();\n const previewStart =\n this.pendingStart && this.previewEnd ? [this.pendingStart, this.previewEnd].sort()[0] : null;\n const previewFinish =\n this.pendingStart && this.previewEnd ? [this.pendingStart, this.previewEnd].sort()[1] : null;\n const selectedSingle =\n this.selectionMode === 'single' && isIsoCalendarDate(this.value) ? this.value : '';\n const preferredFocus =\n this.pendingStart ||\n selectedSingle ||\n rangeValue?.end ||\n (this.month === today.slice(0, 7) ? today : '');\n const focusDate = days.some(day => day.value === preferredFocus)\n ? preferredFocus\n : (days.find(day => day.inMonth)?.value ?? days[0]?.value);\n\n return (\n <Host>\n <div class=\"calendar\">\n <div class=\"calendar-heading ds-control--md\">\n <ds-button-unfilled\n class=\"calendar-nav calendar-nav--previous\"\n variant=\"icon\"\n icon=\"ChevronLeft\"\n size=\"md\"\n hasBorder={false}\n isInactive={this.isInactive}\n ariaLabel=\"Previous month\"\n onDsClick={() => this.moveMonth(-1)}\n />\n <ds-text as=\"span\" variant=\"text-body-medium\" emphasis color=\"primary\">\n {calendarMonthLabel(this.month)}\n </ds-text>\n <ds-button-unfilled\n class=\"calendar-nav calendar-nav--next\"\n variant=\"icon\"\n icon=\"ChevronRight\"\n size=\"md\"\n hasBorder={false}\n isInactive={this.isInactive}\n ariaLabel=\"Next month\"\n onDsClick={() => this.moveMonth(1)}\n />\n </div>\n <div class=\"calendar-weekdays\" aria-hidden=\"true\">\n {CALENDAR_WEEKDAYS.map(day => (\n <ds-text as=\"span\" variant=\"text-body-small\" color=\"secondary\">\n {day}\n </ds-text>\n ))}\n </div>\n <div\n class=\"calendar-grid\"\n role=\"grid\"\n aria-label={calendarMonthLabel(this.month)}\n onMouseLeave={this.clearPreview}\n >\n {weeks.map((week, weekIndex) => (\n <div class=\"calendar-grid__row\" role=\"row\" key={`week-${weekIndex}`}>\n {week.map(day => {\n const selectedInRange = Boolean(\n liveRangeValue &&\n day.value >= liveRangeValue.start &&\n day.value <= liveRangeValue.end\n );\n const paintedInRange = Boolean(\n rangeValue && day.value >= rangeValue.start && day.value <= rangeValue.end\n );\n const pendingStartDay =\n this.selectionMode === 'range' &&\n Boolean(this.pendingStart) &&\n day.value === this.pendingStart;\n const previewInRange = Boolean(\n this.pendingStart &&\n previewStart &&\n previewFinish &&\n day.value >= previewStart &&\n day.value <= previewFinish &&\n day.value !== this.pendingStart\n );\n const inRange = this.selectionMode === 'range' && paintedInRange;\n const rangeEdge = Boolean(\n this.selectionMode === 'range' &&\n rangeValue &&\n (day.value === rangeValue.start || day.value === rangeValue.end)\n );\n const selected = this.selectionMode === 'single' && day.value === selectedSingle;\n const textColor = rangeEdge\n ? 'on-bold'\n : selected ||\n inRange ||\n pendingStartDay ||\n previewInRange ||\n day.value === today\n ? 'primary'\n : day.inMonth\n ? 'secondary'\n : 'tertiary';\n return (\n <button\n type=\"button\"\n role=\"gridcell\"\n data-date-option={day.value}\n class={{\n 'calendar-day': true,\n 'calendar-day--outside': !day.inMonth,\n 'calendar-day--today': day.value === today,\n 'calendar-day--in-range': inRange,\n 'calendar-day--range-preview': previewInRange,\n 'calendar-day--range-edge': rangeEdge,\n 'calendar-day--selected': selected,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--on-bold': rangeEdge,\n 'ds-interaction-fill--surface-open':\n pendingStartDay && !this.isDisabled(day.value),\n 'ds-interaction-fill--selected': selected && !this.isDisabled(day.value),\n }}\n disabled={this.isDisabled(day.value)}\n aria-label={day.label}\n aria-selected={selectedInRange || selected ? 'true' : 'false'}\n tabIndex={day.value === focusDate ? 0 : -1}\n onMouseEnter={() => this.previewRange(day.value)}\n onFocus={() => this.previewRange(day.value)}\n onClick={() => this.selectDate(day.value)}\n onKeyDown={event => this.handleDayKeyDown(event, day.value)}\n >\n <ds-text\n class=\"ds-interaction-fill__content\"\n as=\"span\"\n variant=\"text-body-medium\"\n color={textColor}\n emphasis={day.value === today}\n >\n {day.day}\n </ds-text>\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </div>\n </Host>\n );\n }\n}\n",
265
+ "type": "registry:ui"
266
+ },
267
+ {
268
+ "path": "src/wc/components/Calendar/calendar-grid.ts",
269
+ "content": "import { isIsoCalendarDate, shiftIsoCalendarDate } from '../../utils';\n\nexport interface CalendarDateRange {\n start: string;\n end: string;\n}\n\nexport interface CalendarDay {\n value: string;\n day: number;\n inMonth: boolean;\n label: string;\n}\n\nexport const CALENDAR_WEEKDAYS = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nconst MONTH_FORMATTER = new Intl.DateTimeFormat('en-US', {\n month: 'long',\n year: 'numeric',\n timeZone: 'UTC',\n});\nconst DATE_FORMATTER = new Intl.DateTimeFormat('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n timeZone: 'UTC',\n});\n\nexport function calendarToday(): string {\n const today = new Date();\n const year = today.getFullYear();\n const month = String(today.getMonth() + 1).padStart(2, '0');\n const day = String(today.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\nexport function calendarMonth(value: string): string {\n return isIsoCalendarDate(value) ? value.slice(0, 7) : calendarToday().slice(0, 7);\n}\n\nexport function shiftCalendarMonth(value: string, offset: number): string {\n const [year, month] = value.split('-').map(Number);\n const date = new Date(Date.UTC(year, month - 1 + offset, 1));\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`;\n}\n\nexport function calendarMonthLabel(value: string): string {\n const [year, month] = value.split('-').map(Number);\n return MONTH_FORMATTER.format(new Date(Date.UTC(year, month - 1, 1)));\n}\n\nexport function calendarDays(value: string): CalendarDay[] {\n const [year, month] = value.split('-').map(Number);\n const firstOfMonth = `${year}-${String(month).padStart(2, '0')}-01`;\n const firstWeekday = new Date(`${firstOfMonth}T00:00:00Z`).getUTCDay();\n const gridStart = shiftIsoCalendarDate(firstOfMonth, -firstWeekday);\n return Array.from({ length: 42 }, (_, index) => {\n const dateValue = shiftIsoCalendarDate(gridStart, index);\n const date = new Date(`${dateValue}T00:00:00Z`);\n return {\n value: dateValue,\n day: date.getUTCDate(),\n inMonth: dateValue.startsWith(`${value}-`),\n label: DATE_FORMATTER.format(date),\n };\n });\n}\n\n/** Keep the previous committed range visible while a replacement range is being chosen. */\nexport function calendarPaintedRange(\n pendingStart: string,\n heldRange: CalendarDateRange | null,\n valueRange: CalendarDateRange | null\n): CalendarDateRange | null {\n return pendingStart ? heldRange : valueRange;\n}\n",
270
+ "type": "registry:ui"
271
+ }
272
+ ]
273
+ }
@@ -176,7 +176,7 @@
176
176
  "peerDependencies": {
177
177
  "required": [
178
178
  "@ds-mo/tokens ^6.5.1",
179
- "@ds-mo/icons ^7.0.0"
179
+ "@ds-mo/icons ^8.1.0"
180
180
  ],
181
181
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
182
182
  }
@@ -214,7 +214,7 @@
214
214
  "peerDependencies": {
215
215
  "required": [
216
216
  "@ds-mo/tokens ^6.5.1",
217
- "@ds-mo/icons ^7.0.0"
217
+ "@ds-mo/icons ^8.1.0"
218
218
  ],
219
219
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
220
220
  }
@@ -51,10 +51,12 @@
51
51
  "The native link owns hover, pressed, and focus-visible states across the complete card in navigation-only mode.",
52
52
  "In content mode, the native link owns those interaction states only across the header while the body remains application-owned.",
53
53
  "An empty or unsafe href renders non-interactive card chrome without a false keyboard target.",
54
+ "Copy is always stacked, so a missing description keeps the heading at the start of the column instead of centering it in the header.",
54
55
  "The application owns destination loading, authorization, not-found, and recovery states after navigation."
55
56
  ],
56
57
  "responsiveBehavior": [
57
58
  "Choose sm, md, or lg from the parent layout; the surface never exceeds its parent width.",
59
+ "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.",
58
60
  "Supporting copy wraps while the chevron remains visible at the trailing edge.",
59
61
  "The parent owns wrapping, columns, stacking, and breakpoint changes between cards."
60
62
  ],
@@ -225,7 +227,7 @@
225
227
  "peerDependencies": {
226
228
  "required": [
227
229
  "@ds-mo/tokens ^6.5.1",
228
- "@ds-mo/icons ^7.0.0"
230
+ "@ds-mo/icons ^8.1.0"
229
231
  ],
230
232
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
231
233
  }
@@ -243,12 +245,12 @@
243
245
  "files": [
244
246
  {
245
247
  "path": "src/wc/components/CardNavigation/CardNavigation.css",
246
- "content": "@import '../../utils/radius.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n position: relative;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--_card-navigation-width);\n max-width: 100%;\n overflow: hidden;\n border: none;\n border-radius: var(--ds-radius-card);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-shadow-elevated-sm);\n}\n\n:host(.card-navigation--content) {\n min-height: var(--_card-navigation-min-height);\n}\n\n:host::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 4;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-sm);\n pointer-events: none;\n}\n\n.card-navigation__target {\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n}\n\n.card-navigation__header {\n flex: 0 0 auto;\n border-radius: inherit;\n}\n\n:host(.card-navigation--content) .card-navigation__header {\n border-radius: var(--ds-radius-card) var(--ds-radius-card) 0 0;\n --ds-interaction-divider-width: var(--dimension-stroke-width-012);\n --ds-interaction-divider-color: var(--color-border-tertiary);\n}\n\n.card-navigation__copy {\n min-height: var(--dimension-size-400);\n justify-content: center;\n}\n\nds-text.card-navigation__title,\nds-text.card-navigation__description {\n overflow-wrap: anywhere;\n}\n\n.card-navigation__chevron {\n justify-content: center;\n width: var(--dimension-size-400);\n color: var(--color-foreground-secondary);\n}\n\n.card-navigation__body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n background-color: var(--color-background-primary);\n border-radius: 0 0 var(--ds-radius-card) var(--ds-radius-card);\n}\n\n@media (forced-colors: active) {\n :host {\n box-shadow: none;\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n\n :host::after {\n box-shadow: none;\n }\n}\n",
248
+ "content": "@import '../../utils/radius.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n position: relative;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--_card-navigation-width);\n max-width: 100%;\n overflow: hidden;\n border: none;\n border-radius: var(--ds-radius-card);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-shadow-elevated-sm);\n}\n\n:host(.card-navigation--content) {\n min-height: var(--_card-navigation-min-height);\n}\n\n:host::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 4;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-sm);\n pointer-events: none;\n}\n\n.card-navigation__target {\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n}\n\n.card-navigation__header {\n flex: 0 0 auto;\n align-items: flex-start;\n border-radius: inherit;\n}\n\n:host(.card-navigation--content) .card-navigation__header {\n border-radius: var(--ds-radius-card) var(--ds-radius-card) 0 0;\n --ds-interaction-divider-width: var(--dimension-stroke-width-012);\n --ds-interaction-divider-color: var(--color-border-tertiary);\n}\n\n.card-navigation__copy {\n min-height: var(--dimension-size-400);\n justify-content: flex-start;\n}\n\nds-text.card-navigation__title,\nds-text.card-navigation__description {\n overflow-wrap: anywhere;\n}\n\n.card-navigation__chevron {\n align-self: center;\n justify-content: center;\n width: var(--dimension-size-400);\n color: var(--color-foreground-secondary);\n}\n\n.card-navigation__body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n background-color: var(--color-background-primary);\n border-radius: 0 0 var(--ds-radius-card) var(--ds-radius-card);\n}\n\n@media (forced-colors: active) {\n :host {\n box-shadow: none;\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n\n :host::after {\n box-shadow: none;\n }\n}\n",
247
249
  "type": "registry:ui"
248
250
  },
249
251
  {
250
252
  "path": "src/wc/components/CardNavigation/CardNavigation.tsx",
251
- "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport { resolveSafeUrl } from '../../utils';\n\nexport type CardNavigationWidth = 'sm' | 'md' | 'lg';\nexport type CardNavigationVariant = 'navigation-only' | 'content';\n\nexport interface CardNavigationDetail {\n href: string;\n originalEvent: MouseEvent;\n}\n\nconst CARD_WIDTH_VARS: Record<CardNavigationWidth, string> = {\n sm: 'var(--dimension-card-width-sm)',\n md: 'var(--dimension-card-width-md)',\n lg: 'var(--dimension-card-width-lg)',\n};\n\nconst CARD_HEIGHT_VARS: Record<CardNavigationWidth, string> = {\n sm: 'var(--dimension-card-height-sm)',\n md: 'var(--dimension-card-height-md)',\n lg: 'var(--dimension-card-height-lg)',\n};\n\n@Component({\n tag: 'ds-card-navigation',\n styleUrl: 'CardNavigation.css',\n scoped: true,\n})\nexport class CardNavigation {\n /** Destination for the card's native link. */\n @Prop() href!: string;\n\n /** Section or destination heading shown in the card header. */\n @Prop() heading!: string;\n\n /** Optional supporting copy shown below the heading. */\n @Prop() description: string | undefined;\n\n /**\n * `navigation-only` makes the complete card the link. `content` keeps the\n * header as the link and exposes a non-interactive body slot below it.\n */\n @Prop() variant: CardNavigationVariant = 'navigation-only';\n\n /** Card width token (`sm` / `md` / `lg`). */\n @Prop() cardWidth: CardNavigationWidth = 'md';\n\n /**\n * Emits before native navigation. Prevent this event to take over routing;\n * the component will then prevent the original link navigation.\n */\n @Event({ cancelable: true }) dsNavigate!: EventEmitter<CardNavigationDetail>;\n\n private handleNavigation(href: string, originalEvent: MouseEvent) {\n const navigateEvent = this.dsNavigate.emit({ href, originalEvent });\n if (navigateEvent.defaultPrevented) originalEvent.preventDefault();\n }\n\n private renderHeader(href: string | undefined) {\n const Target = href ? 'a' : 'div';\n const description = this.description?.trim();\n\n return (\n <Target\n class={{\n 'card-navigation__target': true,\n 'card-navigation__header': true,\n 'ds-chrome-header': true,\n 'ds-interaction-fill': !!href,\n 'ds-focus-ring-inset': !!href,\n }}\n href={href}\n onClick={href ? (event: MouseEvent) => this.handleNavigation(href, event) : undefined}\n >\n <div\n class={{\n 'card-navigation__copy': true,\n 'ds-chrome-header__copy': true,\n 'ds-chrome-header__copy--stacked': !!description,\n 'ds-control--md': true,\n 'ds-interaction-fill__content': true,\n }}\n >\n <ds-text\n class=\"card-navigation__title ds-chrome-header__heading\"\n variant=\"text-title-small\"\n emphasis\n color=\"primary\"\n as=\"h2\"\n >\n {this.heading}\n </ds-text>\n {description ? (\n <ds-text\n class=\"card-navigation__description ds-chrome-header__description\"\n variant=\"text-body-small\"\n color=\"secondary\"\n as=\"span\"\n >\n {description}\n </ds-text>\n ) : null}\n </div>\n <span class=\"card-navigation__chevron ds-chrome-header__trailing ds-interaction-fill__content\">\n <ds-icon name=\"ChevronRight\" size=\"md\" color=\"inherit\" aria-hidden=\"true\" />\n </span>\n </Target>\n );\n }\n\n render() {\n const href = resolveSafeUrl(this.href);\n const hasContent = this.variant === 'content';\n\n return (\n <Host\n class={{\n 'card-navigation': true,\n 'card-navigation--navigation-only': !hasContent,\n 'card-navigation--content': hasContent,\n }}\n style={{\n '--_card-navigation-width': CARD_WIDTH_VARS[this.cardWidth],\n '--_card-navigation-min-height': CARD_HEIGHT_VARS[this.cardWidth],\n }}\n >\n {this.renderHeader(href)}\n {hasContent ? (\n <div class=\"card-navigation__body\">\n <slot />\n </div>\n ) : null}\n </Host>\n );\n }\n}\n",
253
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport { resolveSafeUrl } from '../../utils';\n\nexport type CardNavigationWidth = 'sm' | 'md' | 'lg';\nexport type CardNavigationVariant = 'navigation-only' | 'content';\n\nexport interface CardNavigationDetail {\n href: string;\n originalEvent: MouseEvent;\n}\n\nconst CARD_WIDTH_VARS: Record<CardNavigationWidth, string> = {\n sm: 'var(--dimension-card-width-sm)',\n md: 'var(--dimension-card-width-md)',\n lg: 'var(--dimension-card-width-lg)',\n};\n\nconst CARD_HEIGHT_VARS: Record<CardNavigationWidth, string> = {\n sm: 'var(--dimension-card-height-sm)',\n md: 'var(--dimension-card-height-md)',\n lg: 'var(--dimension-card-height-lg)',\n};\n\n@Component({\n tag: 'ds-card-navigation',\n styleUrl: 'CardNavigation.css',\n scoped: true,\n})\nexport class CardNavigation {\n /** Destination for the card's native link. */\n @Prop() href!: string;\n\n /** Section or destination heading shown in the card header. */\n @Prop() heading!: string;\n\n /** Optional supporting copy shown below the heading. */\n @Prop() description: string | undefined;\n\n /**\n * `navigation-only` makes the complete card the link. `content` keeps the\n * header as the link and exposes a non-interactive body slot below it.\n */\n @Prop() variant: CardNavigationVariant = 'navigation-only';\n\n /** Card width token (`sm` / `md` / `lg`). */\n @Prop() cardWidth: CardNavigationWidth = 'md';\n\n /**\n * Emits before native navigation. Prevent this event to take over routing;\n * the component will then prevent the original link navigation.\n */\n @Event({ cancelable: true }) dsNavigate!: EventEmitter<CardNavigationDetail>;\n\n private handleNavigation(href: string, originalEvent: MouseEvent) {\n const navigateEvent = this.dsNavigate.emit({ href, originalEvent });\n if (navigateEvent.defaultPrevented) originalEvent.preventDefault();\n }\n\n private renderHeader(href: string | undefined) {\n const Target = href ? 'a' : 'div';\n const description = this.description?.trim();\n\n return (\n <Target\n class={{\n 'card-navigation__target': true,\n 'card-navigation__header': true,\n 'ds-chrome-header': true,\n 'ds-interaction-fill': !!href,\n 'ds-focus-ring-inset': !!href,\n }}\n href={href}\n onClick={href ? (event: MouseEvent) => this.handleNavigation(href, event) : undefined}\n >\n <div\n class={{\n 'card-navigation__copy': true,\n 'ds-chrome-header__copy': true,\n 'ds-chrome-header__copy--stacked': true,\n 'ds-control--md': true,\n 'ds-interaction-fill__content': true,\n }}\n >\n <ds-text\n class=\"card-navigation__title ds-chrome-header__heading\"\n variant=\"text-title-small\"\n emphasis\n color=\"primary\"\n as=\"h2\"\n >\n {this.heading}\n </ds-text>\n {description ? (\n <ds-text\n class=\"card-navigation__description ds-chrome-header__description\"\n variant=\"text-body-small\"\n color=\"secondary\"\n as=\"span\"\n >\n {description}\n </ds-text>\n ) : null}\n </div>\n <span class=\"card-navigation__chevron ds-chrome-header__trailing ds-interaction-fill__content\">\n <ds-icon name=\"ChevronRight\" size=\"md\" color=\"inherit\" aria-hidden=\"true\" />\n </span>\n </Target>\n );\n }\n\n render() {\n const href = resolveSafeUrl(this.href);\n const hasContent = this.variant === 'content';\n\n return (\n <Host\n class={{\n 'card-navigation': true,\n 'card-navigation--navigation-only': !hasContent,\n 'card-navigation--content': hasContent,\n }}\n style={{\n '--_card-navigation-width': CARD_WIDTH_VARS[this.cardWidth],\n '--_card-navigation-min-height': CARD_HEIGHT_VARS[this.cardWidth],\n }}\n >\n {this.renderHeader(href)}\n {hasContent ? (\n <div class=\"card-navigation__body\">\n <slot />\n </div>\n ) : null}\n </Host>\n );\n }\n}\n",
252
254
  "type": "registry:ui"
253
255
  }
254
256
  ]
@@ -352,7 +352,7 @@
352
352
  "peerDependencies": {
353
353
  "required": [
354
354
  "@ds-mo/tokens ^6.5.1",
355
- "@ds-mo/icons ^7.0.0"
355
+ "@ds-mo/icons ^8.1.0"
356
356
  ],
357
357
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
358
358
  }
@@ -255,7 +255,7 @@
255
255
  "peerDependencies": {
256
256
  "required": [
257
257
  "@ds-mo/tokens ^6.5.1",
258
- "@ds-mo/icons ^7.0.0"
258
+ "@ds-mo/icons ^8.1.0"
259
259
  ],
260
260
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
261
261
  }
@@ -304,7 +304,7 @@
304
304
  "peerDependencies": {
305
305
  "required": [
306
306
  "@ds-mo/tokens ^6.5.1",
307
- "@ds-mo/icons ^7.0.0"
307
+ "@ds-mo/icons ^8.1.0"
308
308
  ],
309
309
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
310
310
  }
@@ -273,7 +273,7 @@
273
273
  "peerDependencies": {
274
274
  "required": [
275
275
  "@ds-mo/tokens ^6.5.1",
276
- "@ds-mo/icons ^7.0.0"
276
+ "@ds-mo/icons ^8.1.0"
277
277
  ],
278
278
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
279
279
  }
@@ -235,7 +235,7 @@
235
235
  "peerDependencies": {
236
236
  "required": [
237
237
  "@ds-mo/tokens ^6.5.1",
238
- "@ds-mo/icons ^7.0.0"
238
+ "@ds-mo/icons ^8.1.0"
239
239
  ],
240
240
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
241
241
  }
@@ -358,7 +358,7 @@
358
358
  "peerDependencies": {
359
359
  "required": [
360
360
  "@ds-mo/tokens ^6.5.1",
361
- "@ds-mo/icons ^7.0.0"
361
+ "@ds-mo/icons ^8.1.0"
362
362
  ],
363
363
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
364
364
  }
@@ -289,7 +289,7 @@
289
289
  "peerDependencies": {
290
290
  "required": [
291
291
  "@ds-mo/tokens ^6.5.1",
292
- "@ds-mo/icons ^7.0.0"
292
+ "@ds-mo/icons ^8.1.0"
293
293
  ],
294
294
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
295
295
  }
@@ -134,7 +134,7 @@
134
134
  "peerDependencies": {
135
135
  "required": [
136
136
  "@ds-mo/tokens ^6.5.1",
137
- "@ds-mo/icons ^7.0.0"
137
+ "@ds-mo/icons ^8.1.0"
138
138
  ],
139
139
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
140
140
  }
@@ -259,7 +259,7 @@
259
259
  "peerDependencies": {
260
260
  "required": [
261
261
  "@ds-mo/tokens ^6.5.1",
262
- "@ds-mo/icons ^7.0.0"
262
+ "@ds-mo/icons ^8.1.0"
263
263
  ],
264
264
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
265
265
  }
@@ -116,7 +116,7 @@
116
116
  "peerDependencies": {
117
117
  "required": [
118
118
  "@ds-mo/tokens ^6.5.1",
119
- "@ds-mo/icons ^7.0.0"
119
+ "@ds-mo/icons ^8.1.0"
120
120
  ],
121
121
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
122
122
  }
@@ -23,8 +23,7 @@
23
23
  "commonlyComposedWith": [
24
24
  "component:ds-conversation-list-section",
25
25
  "component:ds-conversation-list-item",
26
- "component:ds-empty-state",
27
- "component:ds-scroll-overlay"
26
+ "component:ds-empty-state"
28
27
  ],
29
28
  "patterns": [
30
29
  "pattern:conversation"
@@ -34,14 +33,13 @@
34
33
  "Keep the empty message descriptive and every persistent action explicitly named."
35
34
  ],
36
35
  "states": [
37
- "The default floating action stays at the lower end corner.",
38
- "actionLayout footer stretches a long action between 8px side and bottom insets.",
39
- "Both action layouts share the always-active scroll-overlay fade controller, reserve measured end clearance, and begin fading 8px before the visible action.",
40
- "ConversationList paints its measured fade on a separate surface-aware layer so contextual row actions retain a real backdrop for blur; hovered, focused, and menu-open rows rise above that decorative fade.",
36
+ "The action stays at the lower end corner, inset 16px from both edges.",
37
+ "Slot an icon-only rounded button; the corner action is the single supported placement, so a full-width labelled action no longer has a layout to sit in.",
38
+ "Rows scroll beneath the action. The list reserves no end clearance and paints no fade, so it keeps its full height whether or not an action is slotted.",
41
39
  "The persistent action wrapper splits its md outer shadow from a top inset-highlight overlay so opaque filled actions keep the complete TokoMo elevation; slotted buttons disable optional resting borders and the press-scale modifier moves the button and elevated surface as one unit."
42
40
  ],
43
41
  "responsiveBehavior": [
44
- "The list fills its owner, scrolls independently, and keeps its persistent action above scrolling rows."
42
+ "The list fills its owner, scrolls independently, and floats its corner action above scrolling rows."
45
43
  ],
46
44
  "references": [
47
45
  {
@@ -51,32 +49,12 @@
51
49
  ]
52
50
  },
53
51
  "api": {
54
- "props": {
55
- "actionLayout": {
56
- "type": "ConversationListActionLayout",
57
- "resolvedType": "\"floating\" | \"footer\"",
58
- "attribute": "action-layout",
59
- "default": "'floating'",
60
- "required": false,
61
- "mutable": false,
62
- "description": "Corner icon action or full-width persistent footer action."
63
- }
64
- },
52
+ "props": {},
65
53
  "events": [],
66
54
  "methods": [],
67
55
  "slots": []
68
56
  },
69
- "props": {
70
- "actionLayout": {
71
- "type": "ConversationListActionLayout",
72
- "resolvedType": "\"floating\" | \"footer\"",
73
- "attribute": "action-layout",
74
- "default": "'floating'",
75
- "required": false,
76
- "mutable": false,
77
- "description": "Corner icon action or full-width persistent footer action."
78
- }
79
- },
57
+ "props": {},
80
58
  "events": [],
81
59
  "methods": [],
82
60
  "slots": [],
@@ -108,7 +86,7 @@
108
86
  "peerDependencies": {
109
87
  "required": [
110
88
  "@ds-mo/tokens ^6.5.1",
111
- "@ds-mo/icons ^7.0.0"
89
+ "@ds-mo/icons ^8.1.0"
112
90
  ],
113
91
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
114
92
  }
@@ -122,12 +100,12 @@
122
100
  "files": [
123
101
  {
124
102
  "path": "src/wc/components/ConversationList/ConversationList.css",
125
- "content": "@import '../../styles/control-elevation.css';\n\n:host {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.conversation-list {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n}\n\n.conversation-list__viewport {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n box-sizing: border-box;\n}\n\n.conversation-list__content {\n position: relative;\n min-height: 100%;\n padding: var(--dimension-space-100);\n padding-bottom: calc(var(--dimension-space-100) + var(--ds-scroll-overlay-block-size, 0px));\n box-sizing: border-box;\n}\n\n.conversation-list__fade {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n height: var(--ds-scroll-overlay-fade-block-size, 0);\n pointer-events: none;\n background-color: var(\n --ds-scroll-overlay-surface-color,\n var(--_shell-chrome-bg, var(--color-background-primary))\n );\n --ds-scroll-edge-fade-size: 100%;\n}\n\n.conversation-list__fade::before {\n content: '';\n position: absolute;\n inset: 0;\n background-image: var(--ds-scroll-overlay-surface-image, var(--ds-shell-gradient-image, none));\n background-position: var(--ds-scroll-overlay-surface-position, 0 0);\n background-attachment: fixed;\n background-size: var(--ds-scroll-overlay-surface-size, var(--ds-shell-gradient-size, auto));\n background-repeat: no-repeat;\n opacity: var(--ds-scroll-overlay-surface-image-opacity, var(--ds-shell-gradient-opacity, 1));\n}\n\n.conversation-list__empty {\n position: absolute;\n inset-block: 0 var(--ds-scroll-overlay-block-size, 0);\n inset-inline: 0;\n box-sizing: border-box;\n}\n\n/* The named slot itself keeps this wrapper from matching :empty. Only create\n its full-size hit area when assigned empty-state content is actually here. */\n.conversation-list__empty:not(:has([slot='empty'])) {\n display: none;\n}\n\n.conversation-list__actions {\n position: absolute;\n right: 0;\n bottom: 0;\n z-index: var(--dimension-z-index-floating);\n padding: 0 var(--dimension-space-200) var(--dimension-space-200) 0;\n}\n\n.conversation-list__actions--footer {\n left: 0;\n padding: 0 var(--dimension-space-100) var(--dimension-space-100);\n}\n\n.conversation-list__actions-surface {\n display: flex;\n border-radius: var(--dimension-radius-half);\n}\n\n.conversation-list__actions--footer .conversation-list__actions-surface {\n width: 100%;\n}\n\n.conversation-list__actions-surface:empty {\n display: none;\n}\n",
103
+ "content": "@import '../../styles/control-elevation.css';\n\n:host {\n display: block;\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.conversation-list {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n}\n\n.conversation-list__viewport {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n box-sizing: border-box;\n}\n\n.conversation-list__content {\n position: relative;\n min-height: 100%;\n padding: var(--dimension-space-100);\n box-sizing: border-box;\n}\n\n.conversation-list__empty {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n}\n\n/* The named slot itself keeps this wrapper from matching :empty. Only create\n its full-size hit area when assigned empty-state content is actually here. */\n.conversation-list__empty:not(:has([slot='empty'])) {\n display: none;\n}\n\n/* Corner action. Rows scroll beneath it — there is no reserved clearance and no\n fade, so the list keeps its full height whether or not an action is slotted. */\n.conversation-list__actions {\n position: absolute;\n right: 0;\n bottom: 0;\n z-index: var(--dimension-z-index-floating);\n padding: 0 var(--dimension-space-200) var(--dimension-space-200) 0;\n}\n\n.conversation-list__actions-surface {\n display: flex;\n border-radius: var(--dimension-radius-half);\n}\n\n.conversation-list__actions-surface:empty {\n display: none;\n}\n",
126
104
  "type": "registry:ui"
127
105
  },
128
106
  {
129
107
  "path": "src/wc/components/ConversationList/ConversationList.tsx",
130
- "content": "import { Component, Element, h, Host, Prop } from '@stencil/core';\nimport { ScrollOverlayController } from '../../utils/scroll-overlay-controller';\n\nexport type ConversationListActionLayout = 'floating' | 'footer';\n\n@Component({\n tag: 'ds-conversation-list',\n styleUrl: 'ConversationList.css',\n styleUrls: ['../../utils/scroll-edge-fade.css'],\n scoped: true,\n})\nexport class ConversationList {\n @Element() el!: HTMLElement;\n\n /** Corner icon action or full-width persistent footer action. */\n @Prop() actionLayout: ConversationListActionLayout = 'floating';\n\n private viewport?: HTMLElement;\n private content?: HTMLElement;\n private empty?: HTMLElement;\n private overlay?: HTMLElement;\n private scrollOverlayController?: ScrollOverlayController;\n private emptySlotObserver?: MutationObserver;\n\n componentDidLoad(): void {\n if (!this.viewport || !this.content || !this.overlay) return;\n this.scrollOverlayController = new ScrollOverlayController({\n host: this.el,\n viewport: this.viewport,\n content: this.content,\n overlay: this.overlay,\n overlayContentSelector: '[slot=\"actions\"]',\n });\n this.scrollOverlayController.connect();\n this.syncEmptyStateLayout();\n this.emptySlotObserver = new MutationObserver(this.syncEmptyStateLayout);\n this.emptySlotObserver.observe(this.el, { childList: true, subtree: true });\n }\n\n disconnectedCallback(): void {\n this.scrollOverlayController?.disconnect();\n this.emptySlotObserver?.disconnect();\n }\n\n private syncEmptyStateLayout = (): void => {\n const emptyState = this.el.querySelector<HTMLElement>('[slot=\"empty\"]');\n if (emptyState && !this.empty?.contains(emptyState)) {\n // Stencil's scoped-slot runtime does not relocate nodes appended after\n // hydration. Keep that dynamic fallback aligned with the CSS-owned\n // wrapper used by declarative slot content.\n emptyState.style.setProperty('position', 'absolute');\n emptyState.style.setProperty('inset-block-start', '0');\n emptyState.style.setProperty('inset-inline', '0');\n emptyState.style.setProperty('inset-block-end', 'var(--ds-scroll-overlay-block-size, 0)');\n emptyState.style.setProperty('height', 'auto');\n emptyState.style.setProperty('box-sizing', 'border-box');\n }\n this.scrollOverlayController?.sync();\n };\n\n render() {\n return (\n <Host>\n <div class=\"conversation-list\">\n <div\n class=\"conversation-list__viewport\"\n ref={element => {\n this.viewport = element;\n }}\n onScroll={() => this.scrollOverlayController?.sync()}\n >\n <div\n class=\"conversation-list__content\"\n ref={element => {\n this.content = element;\n }}\n >\n <slot />\n <div\n class=\"conversation-list__empty\"\n ref={element => {\n this.empty = element;\n }}\n >\n <slot name=\"empty\" />\n </div>\n </div>\n </div>\n <div\n class=\"conversation-list__fade scroll-edge-fade scroll-edge-fade--top\"\n aria-hidden=\"true\"\n />\n <div\n class={{\n 'conversation-list__actions': true,\n 'conversation-list__actions--footer': this.actionLayout === 'footer',\n }}\n ref={element => {\n this.overlay = element;\n }}\n >\n <div class=\"conversation-list__actions-surface ds-control-elevation ds-control-elevation--md ds-control-elevation--press-scale\">\n <slot name=\"actions\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n",
108
+ "content": "import { Component, Element, h, Host } from '@stencil/core';\n\n@Component({\n tag: 'ds-conversation-list',\n styleUrl: 'ConversationList.css',\n scoped: true,\n})\nexport class ConversationList {\n @Element() el!: HTMLElement;\n\n private empty?: HTMLElement;\n private emptySlotObserver?: MutationObserver;\n\n componentDidLoad(): void {\n this.syncEmptyStateLayout();\n this.emptySlotObserver = new MutationObserver(this.syncEmptyStateLayout);\n this.emptySlotObserver.observe(this.el, { childList: true, subtree: true });\n }\n\n disconnectedCallback(): void {\n this.emptySlotObserver?.disconnect();\n }\n\n private syncEmptyStateLayout = (): void => {\n const emptyState = this.el.querySelector<HTMLElement>('[slot=\"empty\"]');\n if (emptyState && !this.empty?.contains(emptyState)) {\n // Stencil's scoped-slot runtime does not relocate nodes appended after\n // hydration. Keep that dynamic fallback aligned with the CSS-owned\n // wrapper used by declarative slot content.\n emptyState.style.setProperty('position', 'absolute');\n emptyState.style.setProperty('inset-block-start', '0');\n emptyState.style.setProperty('inset-inline', '0');\n emptyState.style.setProperty('inset-block-end', '0');\n emptyState.style.setProperty('height', 'auto');\n emptyState.style.setProperty('box-sizing', 'border-box');\n }\n };\n\n render() {\n return (\n <Host>\n <div class=\"conversation-list\">\n <div class=\"conversation-list__viewport\">\n <div class=\"conversation-list__content\">\n <slot />\n <div\n class=\"conversation-list__empty\"\n ref={element => {\n this.empty = element;\n }}\n >\n <slot name=\"empty\" />\n </div>\n </div>\n </div>\n <div class=\"conversation-list__actions\">\n <div class=\"conversation-list__actions-surface ds-control-elevation ds-control-elevation--md ds-control-elevation--press-scale\">\n <slot name=\"actions\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n",
131
109
  "type": "registry:ui"
132
110
  }
133
111
  ]