@ds-mo/ui 12.6.2 → 12.8.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 (360) hide show
  1. package/README.md +44 -115
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +26 -11
  4. package/dist/agent.json +285 -49
  5. package/dist/angular/ds-button-filled.d.ts +1 -1
  6. package/dist/angular/ds-button-filled.js +3 -3
  7. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  8. package/dist/angular/ds-button-unfilled.js +3 -3
  9. package/dist/angular/ds-card-overview.d.ts +19 -0
  10. package/dist/angular/ds-card-overview.js +42 -0
  11. package/dist/angular/ds-menu.d.ts +1 -1
  12. package/dist/angular/ds-menu.js +3 -3
  13. package/dist/angular/index.d.ts +1 -1
  14. package/dist/angular/index.js +1 -0
  15. package/dist/angular/proxies.d.ts +1 -0
  16. package/dist/angular/proxies.js +1 -0
  17. package/dist/components/ds-agent-activity.js +1 -1
  18. package/dist/components/ds-agent-response.js +1 -1
  19. package/dist/components/ds-agent-source-list.js +1 -1
  20. package/dist/components/ds-agent-tool-call.js +1 -1
  21. package/dist/components/ds-attachment-list.js +1 -1
  22. package/dist/components/ds-badge.js +1 -1
  23. package/dist/components/ds-bar-nav.js +1 -1
  24. package/dist/components/ds-bar-nav.js.map +1 -1
  25. package/dist/components/ds-bar-title.js +1 -1
  26. package/dist/components/ds-bar-title.js.map +1 -1
  27. package/dist/components/ds-bar-workflow.js +1 -1
  28. package/dist/components/ds-bar-workflow.js.map +1 -1
  29. package/dist/components/ds-breadcrumb.js +1 -1
  30. package/dist/components/ds-button-filled.js +1 -1
  31. package/dist/components/ds-button-unfilled.js +1 -1
  32. package/dist/components/ds-card-data-viz-bar.js +1 -1
  33. package/dist/components/ds-card-data-viz-bar.js.map +1 -1
  34. package/dist/components/ds-card-data-viz-donut.js +1 -1
  35. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  36. package/dist/components/ds-card-data-viz-line.js +1 -1
  37. package/dist/components/ds-card-data-viz-line.js.map +1 -1
  38. package/dist/components/ds-card-overview.d.ts +11 -0
  39. package/dist/components/ds-card-overview.js +2 -0
  40. package/dist/components/ds-card-overview.js.map +1 -0
  41. package/dist/components/ds-card-setting.js +1 -1
  42. package/dist/components/ds-card-setting.js.map +1 -1
  43. package/dist/components/ds-card-shell-data-viz.js +1 -1
  44. package/dist/components/ds-chart-bar-stacked.js +1 -1
  45. package/dist/components/ds-chart-bar-stacked.js.map +1 -1
  46. package/dist/components/ds-chart-bar.js +1 -1
  47. package/dist/components/ds-chart-bar.js.map +1 -1
  48. package/dist/components/ds-chart-donut.js +1 -1
  49. package/dist/components/ds-chart-donut.js.map +1 -1
  50. package/dist/components/ds-chart-legend.js +1 -1
  51. package/dist/components/ds-chart-line.js +1 -1
  52. package/dist/components/ds-chart-line.js.map +1 -1
  53. package/dist/components/ds-checkbox.js +1 -1
  54. package/dist/components/ds-chip.js +1 -1
  55. package/dist/components/ds-code-block.js +1 -1
  56. package/dist/components/ds-conversation-list-item.js +1 -1
  57. package/dist/components/ds-conversation-list-item.js.map +1 -1
  58. package/dist/components/ds-conversation-list-section.js +1 -1
  59. package/dist/components/ds-conversation-list.js +1 -1
  60. package/dist/components/ds-conversation-list.js.map +1 -1
  61. package/dist/components/ds-divider.js +1 -1
  62. package/dist/components/ds-empty-state.js +1 -1
  63. package/dist/components/ds-field.js +1 -1
  64. package/dist/components/ds-field.js.map +1 -1
  65. package/dist/components/ds-input.js +1 -1
  66. package/dist/components/ds-input.js.map +1 -1
  67. package/dist/components/ds-markdown.js +1 -1
  68. package/dist/components/ds-menu.js +1 -1
  69. package/dist/components/ds-message-bubble.js +1 -1
  70. package/dist/components/ds-message-composer.js +1 -1
  71. package/dist/components/ds-message-composer.js.map +1 -1
  72. package/dist/components/ds-message-scroller.js +1 -1
  73. package/dist/components/ds-message-scroller.js.map +1 -1
  74. package/dist/components/ds-message.js +1 -1
  75. package/dist/components/ds-mobile-bar-nav.js +1 -1
  76. package/dist/components/ds-mobile-bar-nav.js.map +1 -1
  77. package/dist/components/ds-mobile-header.js +1 -1
  78. package/dist/components/ds-mobile-section-switcher.js +1 -1
  79. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  80. package/dist/components/ds-mobile-sheet-nav.js.map +1 -1
  81. package/dist/components/ds-modal.js +1 -1
  82. package/dist/components/ds-modal.js.map +1 -1
  83. package/dist/components/ds-panel-nav.js +1 -1
  84. package/dist/components/ds-panel-nav.js.map +1 -1
  85. package/dist/components/ds-panel-sub-nav.js +1 -1
  86. package/dist/components/ds-panel-tool-header.js +1 -1
  87. package/dist/components/ds-panel-tool-search.js +1 -1
  88. package/dist/components/ds-panel-tool-search.js.map +1 -1
  89. package/dist/components/ds-panel-tools.js +1 -1
  90. package/dist/components/ds-radio.js +1 -1
  91. package/dist/components/ds-radio.js.map +1 -1
  92. package/dist/components/ds-scroll-overlay.js +1 -1
  93. package/dist/components/ds-select-multi.js +1 -1
  94. package/dist/components/ds-select-multi.js.map +1 -1
  95. package/dist/components/ds-select.js +1 -1
  96. package/dist/components/ds-select.js.map +1 -1
  97. package/dist/components/ds-shell-app.js +1 -1
  98. package/dist/components/ds-shell-app.js.map +1 -1
  99. package/dist/components/ds-shell-gradient-picker.js +1 -1
  100. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  101. package/dist/components/ds-shell-page.js +1 -1
  102. package/dist/components/ds-shell-page.js.map +1 -1
  103. package/dist/components/ds-shell-tools.js +1 -1
  104. package/dist/components/ds-shell-tools.js.map +1 -1
  105. package/dist/components/ds-skeleton.js +1 -1
  106. package/dist/components/ds-skeleton.js.map +1 -1
  107. package/dist/components/ds-slider.js +1 -1
  108. package/dist/components/ds-slider.js.map +1 -1
  109. package/dist/components/ds-swatch-picker.js +1 -1
  110. package/dist/components/ds-switch.js +1 -1
  111. package/dist/components/ds-tab-group.js +1 -1
  112. package/dist/components/ds-tag.js +1 -1
  113. package/dist/components/ds-text.js +1 -1
  114. package/dist/components/ds-toast.js +1 -1
  115. package/dist/components/ds-toast.js.map +1 -1
  116. package/dist/components/ds-tooltip-data-viz.js +1 -1
  117. package/dist/components/ds-tooltip.js +1 -1
  118. package/dist/components/ds-typing-indicator.js +1 -1
  119. package/dist/components/p-2foAUsDN.js +2 -0
  120. package/dist/components/p-2foAUsDN.js.map +1 -0
  121. package/dist/components/{p-Ccj5Op6E.js → p-38PfdMkF.js} +2 -2
  122. package/dist/components/p-69lHhJiX.js +2 -0
  123. package/dist/components/p-69lHhJiX.js.map +1 -0
  124. package/dist/components/p-B6NvVdeO.js +2 -0
  125. package/dist/components/p-B6NvVdeO.js.map +1 -0
  126. package/dist/components/p-B6Vuayt6.js +2 -0
  127. package/dist/components/p-B6Vuayt6.js.map +1 -0
  128. package/dist/components/p-B6vE3ujd.js +2 -0
  129. package/dist/components/p-B6vE3ujd.js.map +1 -0
  130. package/dist/components/p-BBePKRHC.js +2 -0
  131. package/dist/components/p-BBePKRHC.js.map +1 -0
  132. package/dist/components/{p-CaRyxTMz.js → p-BFRMwl93.js} +2 -2
  133. package/dist/components/p-BKOlvCGS.js +2 -0
  134. package/dist/components/p-BKOlvCGS.js.map +1 -0
  135. package/dist/components/{p-C7bZ-jiU.js → p-BO5aqZcf.js} +2 -2
  136. package/dist/components/p-BX0BMhgz.js +2 -0
  137. package/dist/components/p-BX0BMhgz.js.map +1 -0
  138. package/dist/components/p-BXaieghV.js +2 -0
  139. package/dist/components/p-BXaieghV.js.map +1 -0
  140. package/dist/components/p-BlHzmszE.js +2 -0
  141. package/dist/components/{p-BkAMkjIR.js.map → p-BlHzmszE.js.map} +1 -1
  142. package/dist/components/p-By_s1wNN.js +2 -0
  143. package/dist/components/p-By_s1wNN.js.map +1 -0
  144. package/dist/components/p-C61yJkfr.js +2 -0
  145. package/dist/components/p-C61yJkfr.js.map +1 -0
  146. package/dist/components/{p-DXLWm4PF.js → p-CNgPwd11.js} +2 -2
  147. package/dist/components/p-CNjOyUQu.js +2 -0
  148. package/dist/components/p-CNjOyUQu.js.map +1 -0
  149. package/dist/components/{p-BwGnhInj.js → p-CPwpgUWT.js} +2 -2
  150. package/dist/components/p-CU2673IJ.js +2 -0
  151. package/dist/components/p-CU2673IJ.js.map +1 -0
  152. package/dist/components/{p-B9bxDfZV.js → p-CsX3ICz7.js} +2 -2
  153. package/dist/components/p-CuwopElg.js +2 -0
  154. package/dist/components/p-CuwopElg.js.map +1 -0
  155. package/dist/components/{p-D-xttdpn.js → p-D0e77tkd.js} +2 -2
  156. package/dist/components/p-D1bNvIpb.js +2 -0
  157. package/dist/components/p-D1bNvIpb.js.map +1 -0
  158. package/dist/components/{p-BwsGYxZx.js → p-D9u1_OEZ.js} +2 -2
  159. package/dist/components/{p-DQDpDYyF.js → p-DB9XJm2c.js} +2 -2
  160. package/dist/components/{p-CnHrJTD5.js → p-DIFUsoM-.js} +2 -2
  161. package/dist/components/p-DhKvqh5G.js +2 -0
  162. package/dist/components/p-DhKvqh5G.js.map +1 -0
  163. package/dist/components/p-DhLmoCe_.js +2 -0
  164. package/dist/components/p-DhLmoCe_.js.map +1 -0
  165. package/dist/components/p-DjbTFy2B.js +2 -0
  166. package/dist/components/p-DjbTFy2B.js.map +1 -0
  167. package/dist/components/{p-CWTih3Gc.js → p-DmAHufd5.js} +2 -2
  168. package/dist/components/p-DzM3SzPz.js +2 -0
  169. package/dist/components/p-DzM3SzPz.js.map +1 -0
  170. package/dist/components/{p-DqubRds2.js → p-G3qIxpQj.js} +2 -2
  171. package/dist/components/p-Re2kPrXm.js +2 -0
  172. package/dist/components/p-Re2kPrXm.js.map +1 -0
  173. package/dist/components/{p-DwX7UmLl.js → p-Utr23NC-.js} +2 -2
  174. package/dist/components/{p-DIoiApa-.js → p-Vdufoj7G.js} +2 -2
  175. package/dist/components/p-huw1oRbt.js +2 -0
  176. package/dist/components/p-huw1oRbt.js.map +1 -0
  177. package/dist/components/p-ukB-dPOK.js +2 -0
  178. package/dist/components/{p-BY0PzkUp.js.map → p-ukB-dPOK.js.map} +1 -1
  179. package/dist/components/p-yhj1lIPx.js +2 -0
  180. package/dist/docs/components.json +760 -87
  181. package/dist/lib/components/Menu/menu-position.d.ts +6 -6
  182. package/dist/lib/toast/toast-types.d.ts +3 -3
  183. package/dist/lib/utils/anchored-position.d.ts +34 -0
  184. package/dist/lib/utils/choice-popup-alignment.d.ts +2 -2
  185. package/dist/lib/utils/control-text.d.ts +3 -1
  186. package/dist/lib/utils/index.d.ts +3 -1
  187. package/dist/lib/utils/index.js +39 -0
  188. package/dist/lib/utils/index.js.map +3 -3
  189. package/dist/lib/utils/metric-change.d.ts +52 -0
  190. package/dist/lib/utils/token-defaults.d.ts +3 -0
  191. package/dist/mcp-data/registry/agent-activity.json +1 -1
  192. package/dist/mcp-data/registry/agent-response.json +1 -1
  193. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  194. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  195. package/dist/mcp-data/registry/attachment-list.json +1 -1
  196. package/dist/mcp-data/registry/avatar.json +1 -1
  197. package/dist/mcp-data/registry/badge.json +1 -1
  198. package/dist/mcp-data/registry/bar-nav.json +3 -3
  199. package/dist/mcp-data/registry/bar-title.json +3 -3
  200. package/dist/mcp-data/registry/bar-workflow.json +3 -3
  201. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  202. package/dist/mcp-data/registry/button-filled.json +125 -8
  203. package/dist/mcp-data/registry/button-unfilled.json +50 -5
  204. package/dist/mcp-data/registry/card-data-viz-bar.json +5 -4
  205. package/dist/mcp-data/registry/card-data-viz-donut.json +5 -3
  206. package/dist/mcp-data/registry/card-data-viz-line.json +5 -4
  207. package/dist/mcp-data/registry/card-overview.json +317 -0
  208. package/dist/mcp-data/registry/card-setting.json +3 -3
  209. package/dist/mcp-data/registry/card-shell-data-viz.json +3 -3
  210. package/dist/mcp-data/registry/chart-bar-stacked.json +14 -9
  211. package/dist/mcp-data/registry/chart-bar.json +15 -10
  212. package/dist/mcp-data/registry/chart-donut.json +3 -2
  213. package/dist/mcp-data/registry/chart-legend.json +1 -1
  214. package/dist/mcp-data/registry/chart-line.json +15 -10
  215. package/dist/mcp-data/registry/checkbox.json +10 -10
  216. package/dist/mcp-data/registry/chip.json +1 -1
  217. package/dist/mcp-data/registry/code-block.json +1 -1
  218. package/dist/mcp-data/registry/conversation-list-item.json +3 -3
  219. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  220. package/dist/mcp-data/registry/conversation-list.json +3 -3
  221. package/dist/mcp-data/registry/divider.json +1 -1
  222. package/dist/mcp-data/registry/empty-state.json +6 -2
  223. package/dist/mcp-data/registry/field.json +4 -3
  224. package/dist/mcp-data/registry/icon.json +1 -1
  225. package/dist/mcp-data/registry/input.json +9 -8
  226. package/dist/mcp-data/registry/loader.json +1 -1
  227. package/dist/mcp-data/registry/markdown.json +1 -1
  228. package/dist/mcp-data/registry/menu.json +24 -5
  229. package/dist/mcp-data/registry/message-bubble.json +1 -1
  230. package/dist/mcp-data/registry/message-composer.json +1 -1
  231. package/dist/mcp-data/registry/message-scroller.json +3 -3
  232. package/dist/mcp-data/registry/message.json +1 -1
  233. package/dist/mcp-data/registry/mobile-bar-nav.json +4 -4
  234. package/dist/mcp-data/registry/mobile-header.json +3 -3
  235. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  236. package/dist/mcp-data/registry/mobile-sheet-nav.json +6 -4
  237. package/dist/mcp-data/registry/modal.json +3 -3
  238. package/dist/mcp-data/registry/panel-nav.json +3 -3
  239. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  240. package/dist/mcp-data/registry/panel-tool-header.json +3 -3
  241. package/dist/mcp-data/registry/panel-tool-search.json +3 -3
  242. package/dist/mcp-data/registry/panel-tools.json +4 -3
  243. package/dist/mcp-data/registry/radio.json +10 -10
  244. package/dist/mcp-data/registry/registry.json +288 -49
  245. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  246. package/dist/mcp-data/registry/select-multi.json +10 -8
  247. package/dist/mcp-data/registry/select.json +10 -8
  248. package/dist/mcp-data/registry/shell-app.json +3 -2
  249. package/dist/mcp-data/registry/shell-gradient-picker.json +1 -1
  250. package/dist/mcp-data/registry/shell-gradient-swatch.json +1 -1
  251. package/dist/mcp-data/registry/shell-page.json +5 -4
  252. package/dist/mcp-data/registry/shell-tools.json +2 -2
  253. package/dist/mcp-data/registry/skeleton.json +3 -3
  254. package/dist/mcp-data/registry/slider.json +4 -3
  255. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  256. package/dist/mcp-data/registry/switch.json +8 -8
  257. package/dist/mcp-data/registry/tab-group.json +1 -1
  258. package/dist/mcp-data/registry/tag.json +1 -1
  259. package/dist/mcp-data/registry/text.json +1 -1
  260. package/dist/mcp-data/registry/toast.json +2 -2
  261. package/dist/mcp-data/registry/tooltip-data-viz.json +3 -1
  262. package/dist/mcp-data/registry/tooltip.json +3 -8
  263. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  264. package/dist/react/components.d.ts +1 -0
  265. package/dist/react/components.js +1 -0
  266. package/dist/react/ds-card-overview.d.ts +12 -0
  267. package/dist/react/ds-card-overview.js +12 -0
  268. package/dist/styles/control-elevation.css +38 -2
  269. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +33 -1
  270. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +20 -0
  271. package/dist/types/components/CardOverview/CardOverview.d.ts +59 -0
  272. package/dist/types/components/CardOverview/card-overview-types.d.ts +32 -0
  273. package/dist/types/components/CardOverview/index.d.ts +2 -0
  274. package/dist/types/components/ChartBar/ChartBar.d.ts +11 -0
  275. package/dist/types/components/ChartBarStacked/ChartBarStacked.d.ts +11 -0
  276. package/dist/types/components/ChartLine/ChartLine.d.ts +11 -0
  277. package/dist/types/components/Checkbox/Checkbox.d.ts +1 -1
  278. package/dist/types/components/Input/Input.d.ts +1 -1
  279. package/dist/types/components/Menu/Menu.d.ts +11 -5
  280. package/dist/types/components/Menu/menu-position.d.ts +6 -6
  281. package/dist/types/components/MobileSheetNav/MobileSheetNav.d.ts +0 -1
  282. package/dist/types/components/Radio/Radio.d.ts +1 -1
  283. package/dist/types/components/Select/Select.d.ts +6 -23
  284. package/dist/types/components/SelectMulti/SelectMulti.d.ts +5 -20
  285. package/dist/types/components/ShellPage/ShellPage.d.ts +1 -0
  286. package/dist/types/components/ShellTools/ShellTools.d.ts +1 -0
  287. package/dist/types/components/Switch/Switch.d.ts +1 -1
  288. package/dist/types/components/Tooltip/Tooltip.d.ts +1 -4
  289. package/dist/types/components.d.ts +225 -4
  290. package/dist/types/toast/toast-types.d.ts +3 -3
  291. package/dist/types/utils/anchored-position-controller.d.ts +96 -0
  292. package/dist/types/utils/anchored-position.d.ts +35 -0
  293. package/dist/types/utils/cartesian-chart-layout.d.ts +13 -0
  294. package/dist/types/utils/chart-viewport-controller.d.ts +21 -0
  295. package/dist/types/utils/choice-list-parts.d.ts +4 -0
  296. package/dist/types/utils/choice-popup-alignment.d.ts +2 -2
  297. package/dist/types/utils/control-press.d.ts +9 -0
  298. package/dist/types/utils/control-text.d.ts +3 -1
  299. package/dist/types/utils/index.d.ts +3 -1
  300. package/dist/types/utils/metric-change.d.ts +53 -0
  301. package/dist/types/utils/select-controller.d.ts +67 -0
  302. package/dist/types/utils/token-defaults.d.ts +3 -0
  303. package/package.json +3 -3
  304. package/dist/components/p-B8C_yfLQ.js +0 -2
  305. package/dist/components/p-B8C_yfLQ.js.map +0 -1
  306. package/dist/components/p-B9xVWER6.js +0 -2
  307. package/dist/components/p-B9xVWER6.js.map +0 -1
  308. package/dist/components/p-BLea0TrP.js +0 -2
  309. package/dist/components/p-BLea0TrP.js.map +0 -1
  310. package/dist/components/p-BY0PzkUp.js +0 -2
  311. package/dist/components/p-BbgPGF2a.js +0 -2
  312. package/dist/components/p-BbgPGF2a.js.map +0 -1
  313. package/dist/components/p-BhC1YyId.js +0 -2
  314. package/dist/components/p-BhC1YyId.js.map +0 -1
  315. package/dist/components/p-BkAMkjIR.js +0 -2
  316. package/dist/components/p-C2ym_Ich.js +0 -2
  317. package/dist/components/p-C_ewSXTT.js +0 -2
  318. package/dist/components/p-C_ewSXTT.js.map +0 -1
  319. package/dist/components/p-CiqnkENu.js +0 -2
  320. package/dist/components/p-CiqnkENu.js.map +0 -1
  321. package/dist/components/p-Cx-ywr1e.js +0 -2
  322. package/dist/components/p-Cx-ywr1e.js.map +0 -1
  323. package/dist/components/p-CydY-v7X.js +0 -2
  324. package/dist/components/p-CydY-v7X.js.map +0 -1
  325. package/dist/components/p-DPME1wUJ.js +0 -2
  326. package/dist/components/p-DPME1wUJ.js.map +0 -1
  327. package/dist/components/p-DSa0Hnd3.js +0 -2
  328. package/dist/components/p-DSa0Hnd3.js.map +0 -1
  329. package/dist/components/p-DUlqUNbE.js +0 -2
  330. package/dist/components/p-DUlqUNbE.js.map +0 -1
  331. package/dist/components/p-DWdRSOBV.js +0 -2
  332. package/dist/components/p-DWdRSOBV.js.map +0 -1
  333. package/dist/components/p-DYcC5-R9.js +0 -2
  334. package/dist/components/p-DYcC5-R9.js.map +0 -1
  335. package/dist/components/p-DbpfpeQT.js +0 -2
  336. package/dist/components/p-DbpfpeQT.js.map +0 -1
  337. package/dist/components/p-Dg3xLna0.js +0 -2
  338. package/dist/components/p-Dg3xLna0.js.map +0 -1
  339. package/dist/components/p-DuFm-ieS.js +0 -2
  340. package/dist/components/p-DuFm-ieS.js.map +0 -1
  341. package/dist/components/p-uQhuDEVt.js +0 -2
  342. package/dist/components/p-uQhuDEVt.js.map +0 -1
  343. package/dist/lib/utils/anchored-popup.d.ts +0 -23
  344. package/dist/types/components/Tooltip/tooltip-position.d.ts +0 -21
  345. package/dist/types/utils/anchored-popup.d.ts +0 -24
  346. /package/dist/components/{p-Ccj5Op6E.js.map → p-38PfdMkF.js.map} +0 -0
  347. /package/dist/components/{p-CaRyxTMz.js.map → p-BFRMwl93.js.map} +0 -0
  348. /package/dist/components/{p-C7bZ-jiU.js.map → p-BO5aqZcf.js.map} +0 -0
  349. /package/dist/components/{p-DXLWm4PF.js.map → p-CNgPwd11.js.map} +0 -0
  350. /package/dist/components/{p-BwGnhInj.js.map → p-CPwpgUWT.js.map} +0 -0
  351. /package/dist/components/{p-B9bxDfZV.js.map → p-CsX3ICz7.js.map} +0 -0
  352. /package/dist/components/{p-D-xttdpn.js.map → p-D0e77tkd.js.map} +0 -0
  353. /package/dist/components/{p-BwsGYxZx.js.map → p-D9u1_OEZ.js.map} +0 -0
  354. /package/dist/components/{p-DQDpDYyF.js.map → p-DB9XJm2c.js.map} +0 -0
  355. /package/dist/components/{p-CnHrJTD5.js.map → p-DIFUsoM-.js.map} +0 -0
  356. /package/dist/components/{p-CWTih3Gc.js.map → p-DmAHufd5.js.map} +0 -0
  357. /package/dist/components/{p-DqubRds2.js.map → p-G3qIxpQj.js.map} +0 -0
  358. /package/dist/components/{p-DwX7UmLl.js.map → p-Utr23NC-.js.map} +0 -0
  359. /package/dist/components/{p-DIoiApa-.js.map → p-Vdufoj7G.js.map} +0 -0
  360. /package/dist/components/{p-C2ym_Ich.js.map → p-yhj1lIPx.js.map} +0 -0
@@ -12,7 +12,7 @@
12
12
  "themeSetup": "Set data-theme=\"dark\" on <html> for dark mode. Light is default.",
13
13
  "peerDependencies": {
14
14
  "required": [
15
- "@ds-mo/tokens ^3.1.1",
15
+ "@ds-mo/tokens ^5.0.0",
16
16
  "@ds-mo/icons ^6.4.0"
17
17
  ],
18
18
  "optional": [],
@@ -1326,7 +1326,8 @@
1326
1326
  "The action is unfilled icon-only shell or navigation chrome.",
1327
1327
  "The element represents navigation rather than a command.",
1328
1328
  "The content is a persistent selected state rather than an action.",
1329
- "A semantic color would be decorative or merely match the surrounding product area."
1329
+ "A semantic color would be decorative or merely match the surrounding product area.",
1330
+ "The control is an overflow or more-options menu whose only content is an Ellipses glyph; that role is never filled."
1330
1331
  ],
1331
1332
  "alternatives": [
1332
1333
  {
@@ -1338,20 +1339,32 @@
1338
1339
  "when": "The user is choosing a destination in application navigation.",
1339
1340
  "component": "component:ds-panel-nav",
1340
1341
  "reason": "Navigation components own destination selection, active state, and navigation semantics."
1342
+ },
1343
+ {
1344
+ "when": "The control is the overflow or more-options menu for a row, card, or toolbar.",
1345
+ "component": "component:ds-button-unfilled",
1346
+ "reason": "An icon-only Ellipses trigger is chrome, and its glyph conveys the menu without a chevron; a filled button never carries that role."
1341
1347
  }
1342
1348
  ],
1343
1349
  "commonlyComposedWith": [
1344
1350
  "component:ds-modal",
1345
- "component:ds-field"
1351
+ "component:ds-field",
1352
+ "component:ds-menu"
1353
+ ],
1354
+ "patterns": [
1355
+ "pattern:menu-trigger"
1346
1356
  ],
1347
1357
  "accessibility": [
1348
1358
  "Provide an explicit accessible name for icon-only buttons.",
1359
+ "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.",
1360
+ "Use haspopup directly for a non-menu popup such as a dialog; that case gets no chevron.",
1349
1361
  "Use inactive state only when the action must remain visible but unavailable.",
1350
1362
  "Do not encode the action meaning through color alone.",
1351
1363
  "Loading keeps the action focused and named, exposes busy and disabled state, and blocks activation; announce broader operation progress from the owning workflow when users need confirmation.",
1352
1364
  "Use native submit behavior for form submission and handle the form submit event rather than submitting from the button click event."
1353
1365
  ],
1354
1366
  "states": [
1367
+ "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1355
1368
  "Use only one filled action per local decision area; render all secondary actions with ButtonUnfilled.",
1356
1369
  "Choose brand or neutral for general commands. Reserve positive, negative, warning, and caution for matching action consequences, and AI, guide, or walkthrough for actions that enter those feature experiences.",
1357
1370
  "Contrast serves both surface adaptation and hierarchy, but never permits a second filled action in the same decision area.",
@@ -1359,7 +1372,11 @@
1359
1372
  "Parent surface context changes only the optional inset border color. Contrast continues to own the button fill, foreground, hover, pressed, and focus treatments; never use surface context to change action hierarchy.",
1360
1373
  "Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, intent, or interaction semantics.",
1361
1374
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
1362
- "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width."
1375
+ "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
1376
+ "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.",
1377
+ "ButtonFilled has no active or selected state; a filled action is a command, not a toggle or a persistent selection.",
1378
+ "An open popup is a transient pressed state instead. While expanded is true the pressed wash is held for the popup's complete rendered lifecycle and survives hover, so the trigger reads as held open without introducing a selected treatment.",
1379
+ "hasMenu supports only the label and icon-label variants. The chevron is what communicates that a menu will open, so an icon-only filled menu button would leave the affordance unstated."
1363
1380
  ],
1364
1381
  "responsiveBehavior": [
1365
1382
  "Use fill width only when the parent layout calls for a full-width action, commonly on narrow form layouts."
@@ -1395,10 +1412,26 @@
1395
1412
  "type": "ButtonFilledContrast",
1396
1413
  "required": false
1397
1414
  },
1415
+ "controls": {
1416
+ "type": "string | undefined",
1417
+ "required": false
1418
+ },
1419
+ "expanded": {
1420
+ "type": "boolean | undefined",
1421
+ "required": false
1422
+ },
1398
1423
  "hasBorder": {
1399
1424
  "type": "boolean",
1400
1425
  "required": false
1401
1426
  },
1427
+ "hasMenu": {
1428
+ "type": "boolean",
1429
+ "required": false
1430
+ },
1431
+ "haspopup": {
1432
+ "type": "ButtonFilledPopup | undefined",
1433
+ "required": false
1434
+ },
1402
1435
  "icon": {
1403
1436
  "type": "string",
1404
1437
  "required": false
@@ -1419,6 +1452,14 @@
1419
1452
  "type": "string",
1420
1453
  "required": false
1421
1454
  },
1455
+ "pressScale": {
1456
+ "type": "boolean",
1457
+ "required": false
1458
+ },
1459
+ "pressed": {
1460
+ "type": "boolean | undefined",
1461
+ "required": false
1462
+ },
1422
1463
  "rounded": {
1423
1464
  "type": "boolean",
1424
1465
  "required": false
@@ -1482,7 +1523,8 @@
1482
1523
  "useWhen": [
1483
1524
  "A secondary command accompanies the single filled primary action in a local decision area.",
1484
1525
  "A toolbar, tool rail, overflow area, or shell region needs a compact icon action.",
1485
- "A command represents a persistent toggle or mode whose active state remains meaningful after activation."
1526
+ "A command represents a persistent toggle or mode whose active state remains meaningful after activation.",
1527
+ "A row, card, or toolbar needs an overflow or more-options menu; this is the only component that carries that role."
1486
1528
  ],
1487
1529
  "avoidWhen": [
1488
1530
  "The command is the single primary action in a local decision area; use ButtonFilled instead.",
@@ -1517,6 +1559,9 @@
1517
1559
  ],
1518
1560
  "accessibility": [
1519
1561
  "Provide an explicit accessible name for every icon-only action.",
1562
+ "Set hasMenu when the button triggers a Menu; it implies aria-haspopup of menu. Pass controls with the Menu id and expanded from the same open state given to Menu.",
1563
+ "Give an icon-only menu button an accessible name that states the role, such as More options, because no visible label or chevron carries it.",
1564
+ "Use haspopup directly for a non-menu popup such as a listbox or dialog; those cases get no chevron.",
1520
1565
  "Use active state only for a persistent toggle or mode, and synchronize pressed semantics unless an owning composite exposes the selection state.",
1521
1566
  "Treat notification dots as supplemental unread or status information; never use a dot as the sole state, meaning, or accessible name.",
1522
1567
  "Loading keeps the action focused and named, exposes busy and disabled state, and blocks activation; announce broader operation progress from the owning workflow when needed.",
@@ -1524,13 +1569,18 @@
1524
1569
  "For form submission, use native submit behavior and handle the form submit event rather than submitting from the button click event."
1525
1570
  ],
1526
1571
  "states": [
1572
+ "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1527
1573
  "General content UI keeps the selected interaction fill and border for persistent active state.",
1528
1574
  "Shell, navigation, and tool-rail chrome uses foreground-only active state with no selected fill or border.",
1529
1575
  "The omitted default surface treatment is for primary and secondary parent surfaces and uses the brand-active selected fill; pass faint explicitly on faint surfaces to use the neutral active fill.",
1530
1576
  "Surface context must match the actual parent surface; translucent, inverted, media, and always-dark treatments are reserved for those surfaces.",
1531
1577
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
1532
1578
  "Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, or interaction semantics.",
1533
- "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width."
1579
+ "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.",
1580
+ "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
1581
+ "hasMenu covers two distinct menu-button shapes and the variant selects between them. With label or icon-label the action has a menu, and a trailing chevron carries the affordance. With icon the button is a menu, meaning the overflow or more-options control, and no chevron is added.",
1582
+ "Because the icon-only shape has no chevron, its glyph must convey the menu on its own; use Ellipses. Never pair hasMenu with an icon-only glyph that does not read as a menu.",
1583
+ "An open popup is a transient pressed state rather than a selected one. While expanded is true the pressed wash is held for the popup's complete rendered lifecycle and survives hover, including when chrome opts out of selected fills with activeFill set to false."
1534
1584
  ],
1535
1585
  "responsiveBehavior": [
1536
1586
  "The consuming layout decides when an icon-label action becomes icon-only and must provide an explicit accessible name after changing variants.",
@@ -1588,6 +1638,10 @@
1588
1638
  "type": "boolean",
1589
1639
  "required": false
1590
1640
  },
1641
+ "hasMenu": {
1642
+ "type": "boolean",
1643
+ "required": false
1644
+ },
1591
1645
  "haspopup": {
1592
1646
  "type": "ButtonUnfilledPopup | undefined",
1593
1647
  "required": false
@@ -1612,6 +1666,10 @@
1612
1666
  "type": "string",
1613
1667
  "required": false
1614
1668
  },
1669
+ "pressScale": {
1670
+ "type": "boolean",
1671
+ "required": false
1672
+ },
1615
1673
  "pressed": {
1616
1674
  "type": "boolean | undefined",
1617
1675
  "required": false
@@ -1719,13 +1777,14 @@
1719
1777
  "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1720
1778
  ],
1721
1779
  "states": [
1780
+ "Bar, Line, and Donut cards share the same fill-chart and content-sized-legend body contract so dashboard card geometry remains aligned across chart types.",
1722
1781
  "The chart region fills the remaining card body while an optional legend remains content-sized.",
1723
1782
  "The card disables local hover highlighting on a slotted ChartLegend because bar legends are static keys.",
1724
1783
  "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1725
1784
  "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1726
1785
  ],
1727
1786
  "responsiveBehavior": [
1728
- "The selected sm, md, or lg shell size controls the card dimensions while the bar chart shrinks within its chart region.",
1787
+ "The selected sm, md, or lg shell size controls the card dimensions while the bar chart reflows to the chart region without visually scaling its primitives.",
1729
1788
  "The horizontal legend wraps complete entries when the available width is constrained.",
1730
1789
  "The parent dashboard owns card wrapping and breakpoint changes."
1731
1790
  ],
@@ -1833,6 +1892,7 @@
1833
1892
  "The application owns meaningful loading, empty, and error status copy when either content region is temporarily replaced or absent."
1834
1893
  ],
1835
1894
  "states": [
1895
+ "Bar, Line, and Donut cards share the same fill-chart and content-sized-legend body contract so dashboard card geometry remains aligned across chart types.",
1836
1896
  "The chart region fills remaining card height while the legend remains content-sized.",
1837
1897
  "Chart and legend regions render only when their corresponding slots contain content, allowing the owner to substitute loading, empty, or error presentations without dangling region padding.",
1838
1898
  "Hover synchronization changes highlight only; it never represents selection, filtering, or navigation.",
@@ -1840,6 +1900,7 @@
1840
1900
  ],
1841
1901
  "responsiveBehavior": [
1842
1902
  "Select the token-based card width appropriate to the parent grid; the matching minimum height preserves the chart region.",
1903
+ "The donut measures the chart region and changes radius within its shared size band while token thickness and typography remain fixed.",
1843
1904
  "The parent dashboard owns wrapping and column changes while the internal chart-over-legend arrangement remains stable."
1844
1905
  ],
1845
1906
  "frameworkCaveats": {
@@ -1947,13 +2008,14 @@
1947
2008
  "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1948
2009
  ],
1949
2010
  "states": [
2011
+ "Bar, Line, and Donut cards share the same fill-chart and content-sized-legend body contract so dashboard card geometry remains aligned across chart types.",
1950
2012
  "The chart region fills the remaining card body while the legend remains content-sized.",
1951
2013
  "The card disables local hover highlighting on a slotted ChartLegend because the line chart is static.",
1952
2014
  "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1953
2015
  "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1954
2016
  ],
1955
2017
  "responsiveBehavior": [
1956
- "The selected sm, md, or lg shell size controls the card dimensions while the line chart shrinks within its chart region.",
2018
+ "The selected sm, md, or lg shell size controls the card dimensions while the line chart reflows to the chart region without visually scaling its primitives.",
1957
2019
  "The horizontal legend wraps complete entries when the available width is constrained.",
1958
2020
  "The parent dashboard owns card wrapping and breakpoint changes."
1959
2021
  ],
@@ -2011,6 +2073,156 @@
2011
2073
  "card-shell-data-viz"
2012
2074
  ]
2013
2075
  },
2076
+ {
2077
+ "name": "card-overview",
2078
+ "title": "CardOverview",
2079
+ "description": "Page-level summary bar pairing one headline score with a reporting period, an application-owned period control, and a responsive grid of comparable measures.",
2080
+ "type": "registry:ui",
2081
+ "meta": {
2082
+ "library": "@ds-mo/ui",
2083
+ "distribution": "npm",
2084
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/card-overview",
2085
+ "source": "src/wc/components/CardOverview/CardOverview.tsx",
2086
+ "intentStatus": "complete",
2087
+ "intent": {
2088
+ "audience": "general",
2089
+ "status": "experimental",
2090
+ "summary": "Page-level summary bar pairing one headline score with a reporting period, an application-owned period control, and a responsive grid of comparable measures.",
2091
+ "useWhen": [
2092
+ "A page opens with one headline figure that the surrounding measures explain.",
2093
+ "Every measure is compared against the same period, so one caption describes the comparison for all of them.",
2094
+ "The measures are read together at a glance rather than explored individually."
2095
+ ],
2096
+ "avoidWhen": [
2097
+ "There is no headline figure and the measures are unrelated; use the matching card surface for each one.",
2098
+ "A measure needs a chart, sparkline, or other visualization; the grid presents values and change only.",
2099
+ "The measures each require their own comparison period or their own filter control.",
2100
+ "The content is a settings section or a general read-only card."
2101
+ ],
2102
+ "alternatives": [
2103
+ {
2104
+ "when": "A measure needs a chart or other data visualization.",
2105
+ "component": "component:ds-card-shell-data-viz",
2106
+ "reason": "CardShellDataViz owns the data-visualization shell contract; the overview grid presents values and change only."
2107
+ },
2108
+ {
2109
+ "when": "The surface is a settings section with an edit workflow.",
2110
+ "component": "component:ds-card-setting",
2111
+ "reason": "CardSetting owns the controlled view and edit chrome."
2112
+ }
2113
+ ],
2114
+ "commonlyComposedWith": [
2115
+ "component:ds-select",
2116
+ "component:ds-button-unfilled",
2117
+ "component:ds-text",
2118
+ "component:ds-tooltip"
2119
+ ],
2120
+ "accessibility": [
2121
+ "The bar is a labelled region; set overviewLabel to name what is being summarised, such as Safety summary.",
2122
+ "Trend arrows are decorative and hidden from assistive technology, so the formatted change value must read correctly on its own.",
2123
+ "Colour never carries the trend meaning alone; the arrow direction and the value are both present.",
2124
+ "Measures become selectable only when they are not inactive. Selectable measures form one roving tab stop, so the grid is a single stop and arrow keys move between measures.",
2125
+ "Set labelTooltip when a measure's label needs qualifying rather than shortening the label into something ambiguous.",
2126
+ "While loading, the region exposes a busy state and renders skeletons whose type metrics match the resolved content."
2127
+ ],
2128
+ "states": [
2129
+ "Score and measures are supplied as data; the component owns their type treatment so summary bars stay consistent across pages.",
2130
+ "Trend is supplied already resolved as a direction, a formatted value, and a tone. Whether a rise reads well is a product decision, so the component never infers tone from the numbers. Derive it with resolveMetricTrend.",
2131
+ "Omit a trend when there is nothing to report; resolveMetricTrend returns null in that case so no zero change is rendered.",
2132
+ "Omit score to render the bar without a headline figure. Set scoreErrorMessage to report that the figure could not be resolved while the measures remain readable.",
2133
+ "Loading replaces the score and the measures with skeletons and does not alter the slotted period control.",
2134
+ "The period control is slotted rather than owned, because the choice of stepper, select, or date range varies by product surface."
2135
+ ],
2136
+ "responsiveBehavior": [
2137
+ "The measure grid reflows to fewer columns and finally stacks, driven by the minimum measure width alone. There is no measurement and no horizontal scrolling.",
2138
+ "Set metricMinWidth to change the width a measure may shrink to before the grid drops a column.",
2139
+ "The score block hugs its content and never shrinks, so the headline figure holds its size while the grid absorbs the remaining width.",
2140
+ "The score moves above the body once the bar can no longer fit both side by side."
2141
+ ],
2142
+ "frameworkCaveats": {
2143
+ "customElements": [
2144
+ "Assign score and metrics as JavaScript properties; both are objects and cannot be expressed as HTML attributes.",
2145
+ "Place the period control in the filter slot; the component reserves space for it but never renders one."
2146
+ ],
2147
+ "react": [
2148
+ "Pass score and metrics as props and read the selected measure from the onDsMetricSelect event detail.",
2149
+ "Derive each trend with resolveMetricTrend so tone stays an explicit product decision."
2150
+ ],
2151
+ "angular": [
2152
+ "Bind [score] and [metrics] as properties and read the selected measure from $event.detail on (dsMetricSelect).",
2153
+ "Derive each trend with resolveMetricTrend so tone stays an explicit product decision."
2154
+ ]
2155
+ },
2156
+ "references": [
2157
+ {
2158
+ "label": "Storybook structural examples",
2159
+ "path": "src/wc/components/CardOverview/CardOverview.stories.ts"
2160
+ },
2161
+ {
2162
+ "label": "Trend resolution unit coverage",
2163
+ "path": "tests/metric-change.test.ts"
2164
+ }
2165
+ ]
2166
+ },
2167
+ "props": {
2168
+ "comparisonLabel": {
2169
+ "type": "string",
2170
+ "required": false
2171
+ },
2172
+ "isLoading": {
2173
+ "type": "boolean",
2174
+ "required": false
2175
+ },
2176
+ "metricMinWidth": {
2177
+ "type": "string",
2178
+ "required": false
2179
+ },
2180
+ "metrics": {
2181
+ "type": "OverviewMetric[]",
2182
+ "required": false
2183
+ },
2184
+ "overviewLabel": {
2185
+ "type": "string",
2186
+ "required": false
2187
+ },
2188
+ "periodLabel": {
2189
+ "type": "string",
2190
+ "required": false
2191
+ },
2192
+ "score": {
2193
+ "type": "OverviewScore | undefined",
2194
+ "required": false
2195
+ },
2196
+ "scoreErrorMessage": {
2197
+ "type": "string | undefined",
2198
+ "required": false
2199
+ }
2200
+ },
2201
+ "events": [
2202
+ {
2203
+ "name": "dsMetricSelect",
2204
+ "detail": "OverviewMetric"
2205
+ }
2206
+ ],
2207
+ "slots": [],
2208
+ "exports": {
2209
+ "customElement": "ds-card-overview",
2210
+ "react": "DsCardOverview",
2211
+ "angular": "DsCardOverview"
2212
+ }
2213
+ },
2214
+ "dependencies": [
2215
+ "@ds-mo/ui",
2216
+ "@ds-mo/tokens",
2217
+ "@ds-mo/icons"
2218
+ ],
2219
+ "registryDependencies": [
2220
+ "icon",
2221
+ "skeleton",
2222
+ "text",
2223
+ "tooltip"
2224
+ ]
2225
+ },
2014
2226
  {
2015
2227
  "name": "card-setting",
2016
2228
  "title": "CardSetting",
@@ -2329,7 +2541,8 @@
2329
2541
  "Authored datum colors override the shared categorical palette."
2330
2542
  ],
2331
2543
  "responsiveBehavior": [
2332
- "The owner supplies dimensions and updates them with its layout; the chart does not measure its container.",
2544
+ "Width and height provide the standalone intrinsic viewport; container constraints are measured and reflow the plot across the available pixels.",
2545
+ "Responsive layout changes bar positions and plot extents without scaling SVG text, strokes, corner radii, or margins.",
2333
2546
  "Limit or pre-format long category labels so they remain legible at the chosen width.",
2334
2547
  "Time labels remain ordered, pre-formatted buckets with equal spacing rather than raw continuous timestamps."
2335
2548
  ],
@@ -2338,10 +2551,10 @@
2338
2551
  "Assign data as a JavaScript property; arrays are not supported as HTML attributes."
2339
2552
  ],
2340
2553
  "react": [
2341
- "Pass a stable data array and dimensions derived from the containing layout."
2554
+ "Pass a stable data array; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2342
2555
  ],
2343
2556
  "angular": [
2344
- "Bind data as a property and update dimensions from the containing layout."
2557
+ "Bind data as a property; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2345
2558
  ]
2346
2559
  },
2347
2560
  "references": [
@@ -2441,8 +2654,9 @@
2441
2654
  "Negative values are unsupported and render as zero; the owning product supplies loading, empty, and error states."
2442
2655
  ],
2443
2656
  "responsiveBehavior": [
2444
- "The SVG preserves its authored aspect ratio while shrinking to fit a narrower parent.",
2445
- "The parent supplies dimensions and chooses how many time buckets remain legible at each width.",
2657
+ "Width and height provide the standalone intrinsic viewport; constrained card regions are measured and reflow both axes to their rendered pixel dimensions.",
2658
+ "Responsive layout changes stack positions and plot extents without scaling SVG text, strokes, separators, corner radii, or margins.",
2659
+ "The parent chooses how many time buckets remain legible at each width.",
2446
2660
  "Pre-format category labels and reduce bucket count before rendering when horizontal space becomes constrained."
2447
2661
  ],
2448
2662
  "frameworkCaveats": {
@@ -2557,6 +2771,7 @@
2557
2771
  "responsiveBehavior": [
2558
2772
  "Prefer container-fill sizing inside data-viz cards and explicit sizing only in layouts that own a stable diameter.",
2559
2773
  "Fill sizing remains centered and constrained to the shared donut size band.",
2774
+ "Changing the measured diameter changes the ring radius without scaling its token-based thickness, typography, focus stroke, or corner treatment.",
2560
2775
  "The owner adapts category count and legend placement for available space."
2561
2776
  ],
2562
2777
  "frameworkCaveats": {
@@ -2845,7 +3060,8 @@
2845
3060
  "Authored series colors override the shared categorical palette."
2846
3061
  ],
2847
3062
  "responsiveBehavior": [
2848
- "The owner supplies intrinsic dimensions; the SVG preserves its aspect ratio while shrinking to fit a narrower parent.",
3063
+ "Width and height provide the standalone intrinsic viewport; constrained card regions are measured and reflow both axes to their rendered pixel dimensions.",
3064
+ "Responsive layout changes point positions and plot extents without scaling SVG text, line strokes, point markers, or margins.",
2849
3065
  "Category positions are always equally spaced, even when labels represent time.",
2850
3066
  "Reduce or pre-format dense labels before passing them; the chart renders authored labels without a continuous time scale."
2851
3067
  ],
@@ -2854,10 +3070,10 @@
2854
3070
  "Assign series and categories as JavaScript properties and keep every series aligned to the category count."
2855
3071
  ],
2856
3072
  "react": [
2857
- "Pass stable series and category arrays with dimensions derived from the containing layout."
3073
+ "Pass stable series and category arrays; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2858
3074
  ],
2859
3075
  "angular": [
2860
- "Bind series and categories as properties with dimensions derived from the containing layout."
3076
+ "Bind series and categories as properties; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2861
3077
  ]
2862
3078
  },
2863
3079
  "references": [
@@ -2906,7 +3122,7 @@
2906
3122
  {
2907
3123
  "name": "checkbox",
2908
3124
  "title": "Checkbox",
2909
- "description": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and three density states.",
3125
+ "description": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and four density states.",
2910
3126
  "type": "registry:ui",
2911
3127
  "meta": {
2912
3128
  "library": "@ds-mo/ui",
@@ -2917,7 +3133,7 @@
2917
3133
  "intent": {
2918
3134
  "audience": "general",
2919
3135
  "status": "stable",
2920
- "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and three density states.",
3136
+ "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and four density states.",
2921
3137
  "useWhen": [
2922
3138
  "A user may independently select zero or more choices.",
2923
3139
  "A form requires acknowledgment, consent, or an opt-in value before submission.",
@@ -2957,15 +3173,15 @@
2957
3173
  "Use presentation mode only inside a composite option that owns selection semantics, focus, and interaction."
2958
3174
  ],
2959
3175
  "states": [
2960
- "Unchecked boxes use a tertiary-foreground inset stroke: 1.25px at md, 1px at sm, and 0.75px at xs. Selected and mixed boxes remove the border, use a brand fill, and draw a component-owned check or subtract mark at the same density-specific stroke width.",
3176
+ "Unchecked boxes use a tertiary-foreground inset stroke: 1.5px at lg, 1.25px at md, 1px at sm, and 0.75px at xs. Selected and mixed boxes remove the border, use a brand fill, and draw a component-owned check or subtract mark at the same density-specific stroke width.",
2961
3177
  "Activating an indeterminate checkbox clears the mixed state, toggles checked, and emits dsChange with the resulting boolean.",
2962
3178
  "The initial checked and indeterminate values are restored by native form reset; checked values submit under name and unchecked values submit nothing.",
2963
- "Sizes are md with a 16px box in a 20px placement, sm with a 12px box in a 16px placement, and xs with an 8px box in a 12px placement.",
3179
+ "Sizes are lg with a 20px box in a 24px placement, md with a 16px box in a 20px placement, sm with a 12px box in a 16px placement, and xs with an 8px box in a 12px placement.",
2964
3180
  "Presentation mode removes checkbox semantics, focus, interaction, label rendering, and form submission while preserving the visual state."
2965
3181
  ],
2966
3182
  "responsiveBehavior": [
2967
3183
  "Choose size from the density of the containing row; labels may wrap while the placement box stays fixed.",
2968
- "Use the md indicator centered by the shared 20px option icon zone in multi-select rows."
3184
+ "Use the same density as the shared option icon zone in multi-select rows."
2969
3185
  ],
2970
3186
  "frameworkCaveats": {
2971
3187
  "customElements": [
@@ -3302,7 +3518,7 @@
3302
3518
  "actionLayout footer stretches a long action between 8px side and bottom insets.",
3303
3519
  "Both action layouts share the always-active scroll-overlay fade controller, reserve measured end clearance, and begin fading 8px before the visible action.",
3304
3520
  "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.",
3305
- "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 controls must disable optional resting borders."
3521
+ "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."
3306
3522
  ],
3307
3523
  "responsiveBehavior": [
3308
3524
  "The list fills its owner, scrolls independently, and keeps its persistent action above scrolling rows."
@@ -3376,7 +3592,7 @@
3376
3592
  "Hover and press use the shared interaction hover and pressed overlays. Only the selected conversation uses the persistent active fill.",
3377
3593
  "The title uses body-medium, not title-small, and the body-small preview truncates after one line. Unread titles use emphasis with primary foreground; read titles use regular weight with secondary foreground.",
3378
3594
  "The actions slot overlays the row at an 8px right inset without changing title or preview measure, and paints above the row interaction wash while that wash remains active.",
3379
- "Contextual actions use the shared md control-elevation wrapper so their transparent backdrop blur is unchanged while the split inset highlight remains above the borderless slotted action."
3595
+ "Contextual actions use the shared md control-elevation wrapper so their transparent backdrop blur is unchanged while the split inset highlight remains above the borderless slotted action and the press-scale modifier moves the complete elevated surface."
3380
3596
  ],
3381
3597
  "responsiveBehavior": [
3382
3598
  "Long titles and previews truncate without displacing trailing status."
@@ -3687,7 +3903,7 @@
3687
3903
  "Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
3688
3904
  "The decorative icon renders at xl in the primary foreground with an 8px gap before the text group and only when a title is also provided.",
3689
3905
  "The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
3690
- "All content is centered. The owner supplies container size and surrounding padding; do not compose actions into or immediately alongside the current EmptyState pattern.",
3906
+ "All content is centered. The owner supplies container size and surrounding padding; repeated panel and master-detail owners should share one empty-region geometry instead of wrapping each EmptyState differently. Do not compose actions into or immediately alongside the current EmptyState pattern.",
3691
3907
  "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
3692
3908
  ],
3693
3909
  "responsiveBehavior": [
@@ -3709,6 +3925,10 @@
3709
3925
  {
3710
3926
  "label": "Storybook examples",
3711
3927
  "path": "src/wc/components/EmptyState/EmptyState.stories.ts"
3928
+ },
3929
+ {
3930
+ "label": "Shared layout recipe foundation",
3931
+ "path": "docs/layout-recipe-foundation.md"
3712
3932
  }
3713
3933
  ]
3714
3934
  },
@@ -3790,6 +4010,7 @@
3790
4010
  "Do not use placeholder text as the only label. Keep label text concise and put format or consequence guidance in description."
3791
4011
  ],
3792
4012
  "states": [
4013
+ "Label, control, description, and error content follow the shared 4px vertical field flow without changing the slotted control's width or semantics.",
3793
4014
  "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.",
3794
4015
  "A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
3795
4016
  "Field owns validation presentation but not validation timing; the form decides when to set error and errorMessage.",
@@ -3987,7 +4208,7 @@
3987
4208
  {
3988
4209
  "name": "input",
3989
4210
  "title": "Input",
3990
- "description": "Form-associated single-line text field for primary and secondary application backgrounds, with native text input behavior, three control densities, optional leading and trailing content, search clearing, and validation.",
4211
+ "description": "Form-associated single-line text field for primary and secondary application backgrounds, with native text input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
3991
4212
  "type": "registry:ui",
3992
4213
  "meta": {
3993
4214
  "library": "@ds-mo/ui",
@@ -3998,7 +4219,7 @@
3998
4219
  "intent": {
3999
4220
  "audience": "general",
4000
4221
  "status": "stable",
4001
- "summary": "Form-associated single-line text field for primary and secondary application backgrounds, with native text input behavior, three control densities, optional leading and trailing content, search clearing, and validation.",
4222
+ "summary": "Form-associated single-line text field for primary and secondary application backgrounds, with native text input behavior, four control densities, optional leading and trailing content, search clearing, and validation.",
4002
4223
  "useWhen": [
4003
4224
  "A user must enter or edit one line of text, an email address, telephone number, URL, search query, or password.",
4004
4225
  "The value must participate in native, Angular, or React form state.",
@@ -4039,6 +4260,7 @@
4039
4260
  "Suffix content must not carry information that is otherwise absent from the field's visible label, value, or description."
4040
4261
  ],
4041
4262
  "states": [
4263
+ "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.",
4042
4264
  "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.",
4043
4265
  "Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins.",
4044
4266
  "Entered values use the parent surface's primary foreground; prefix icons, suffix content, and resting placeholder text use its secondary foreground.",
@@ -4050,7 +4272,7 @@
4050
4272
  ],
4051
4273
  "responsiveBehavior": [
4052
4274
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
4053
- "Choose density from the containing layout: md for ordinary forms, sm or xs only where the surrounding controls use the same compact recipe.",
4275
+ "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.",
4054
4276
  "The owner supplies layout constraints and decides when a compact field moves to its own row."
4055
4277
  ],
4056
4278
  "frameworkCaveats": {
@@ -4446,7 +4668,7 @@
4446
4668
  "Anchor the menu to the control that opens it and return focus to that control when the menu closes.",
4447
4669
  "Open with visible initial focus only when the trigger was activated from the keyboard.",
4448
4670
  "Keep disabled items discoverable only when their unavailable state is meaningful.",
4449
- "Switch rows use menuitemcheckbox semantics on the row; the nested ds-switch is an aria-hidden md presentation indicator.",
4671
+ "Switch rows use menuitemcheckbox semantics on the row; the nested ds-switch is an aria-hidden presentation indicator at the same density as the menu.",
4450
4672
  "Single-selection menus use menuitemradio semantics and aria-checked on each row, but render no nested radio control; selected interaction fill and primary foreground provide the visual state.",
4451
4673
  "A swatch-picker section changes the popup to a non-modal dialog so its radio group and ordinary preference buttons keep valid nested semantics; Tab moves between its controls, then leaves and closes at the popup boundary.",
4452
4674
  "Use notification dots only as supplemental status and not as the sole indication of important information."
@@ -4457,7 +4679,8 @@
4457
4679
  "After dsSelect from a switch row, replace the items or sections array with updated switchValue data so the controlled indicator reflects the new state.",
4458
4680
  "For selectionMode single, keep exactly one item isSelected and replace the items or sections array after dsSelect; Menu never mutates consumer-owned selection data.",
4459
4681
  "Arrays, objects, and element anchors must be assigned as JavaScript properties.",
4460
- "Use a swatch-picker section for a small curated visual preference and apply dsSwatchSelect immediately without closing the popup; the legacy gradient-picker section and dsGradientSelect remain compatibility-only."
4682
+ "Use a swatch-picker section for a small curated visual preference and apply dsSwatchSelect immediately without closing the popup; the legacy gradient-picker section and dsGradientSelect remain compatibility-only.",
4683
+ "Ordinary rows, section headings, and supporting text consume the Menu size. At xs, both the primary label and supporting text use caption metrics."
4461
4684
  ],
4462
4685
  "responsiveBehavior": [
4463
4686
  "Keep the default choice-cell anchor alignment so the first or last interactive row edge aligns with its trigger, matching Select; use popup-frame only for deliberate custom frame geometry.",
@@ -4546,6 +4769,10 @@
4546
4769
  "sideOffset": {
4547
4770
  "type": "number | string",
4548
4771
  "required": false
4772
+ },
4773
+ "size": {
4774
+ "type": "MenuSize",
4775
+ "required": false
4549
4776
  }
4550
4777
  },
4551
4778
  "events": [
@@ -4908,7 +5135,7 @@
4908
5135
  "Selection and transcript interaction release automatic following.",
4909
5136
  "Opening saved history, message jumps, and prepended history preserve deliberate position.",
4910
5137
  "The scroll-to-latest action is absent at the live edge, appears only after the reader moves away, and disappears again after returning to the newest message.",
4911
- "Scroll to latest uses the shared md control-elevation wrapper with a pointer-transparent top highlight, preserving its transparent backdrop blur and borderless unfilled action.",
5138
+ "Scroll to latest uses the shared md control-elevation wrapper with a pointer-transparent top highlight, preserving its transparent backdrop blur and borderless unfilled action while the press-scale modifier moves the complete elevated surface.",
4912
5139
  "Place a composer container with 8px padding on every side in the overlay slot so messages scroll behind it; the shared scroll-overlay controller tracks every composer growth step, reserves matching transcript clearance, begins the fade 8px before the visible composer, and keeps scroll-to-latest above it."
4913
5140
  ],
4914
5141
  "responsiveBehavior": [
@@ -5003,7 +5230,7 @@
5003
5230
  "Direct touch paints the pressed overlay immediately, keeps a quick tap visible for one short frame, and clears it after release or cancellation without relying on Safari's latch-prone active state."
5004
5231
  ],
5005
5232
  "responsiveBehavior": [
5006
- "Render only below the mobile breakpoint and preserve safe-area clearance.",
5233
+ "Render only below the mobile breakpoint; its secondary surface extends through the bottom safe-area inset when the application enables viewport-fit=cover.",
5007
5234
  "The secondary-background bar keeps an 8px outer inset; its two icon-only groups anchor to opposite edges while retaining fixed 40px targets and a divider between Menu and current area.",
5008
5235
  "Bar chrome and its divider are not text-selectable and suppress the iOS touch callout."
5009
5236
  ],
@@ -5341,7 +5568,9 @@
5341
5568
  "Area, Help, and Account events express intent while the application owns navigation and product behavior."
5342
5569
  ],
5343
5570
  "responsiveBehavior": [
5344
- "The pane fills the mobile content stage while the bottom bar remains available."
5571
+ "The pane fills the mobile content stage while the bottom bar remains available.",
5572
+ "The sheet header and scrollable navigation body each use the shared 8px chrome inset; large destination controls retain their independent 40px density.",
5573
+ "Dashboard and Settings preserve their supplied visual groups with an 8px gap between destinations inside a section and a 32px gap between sections."
5345
5574
  ],
5346
5575
  "references": [
5347
5576
  {
@@ -6290,6 +6519,7 @@
6290
6519
  "Tools with search compose ds-panel-tool-search immediately below the shared header. Its 48px row always contains the md search control and must not be reduced to sm or xs.",
6291
6520
  "If an active optional tool becomes unavailable, PanelTools closes the drawer, clears activeTool, and emits its deselection.",
6292
6521
  "Use isInactive only for a temporarily unavailable visible tool; omit tools the user is not authorized to access.",
6522
+ "Rail actions disable physical press scaling so notification-dot halos remain aligned to the shell gradient; hover and pressed washes continue to paint above the dot and halo.",
6293
6523
  "The application owns slotted tool products and data while PanelTools owns rail ordering, drawer selection, open state, motion, and shell events.",
6294
6524
  "Opening and closing clip an already-rendered fixed-width surface. Header and tool content remain fully opaque and retained during width motion; transition completion is accepted only at the measured terminal clip width, after which the closed surface becomes inert and paint-skipped.",
6295
6525
  "Entering and exiting fullscreen snaps without borrowing the drawer open or close animation.",
@@ -6426,7 +6656,7 @@
6426
6656
  {
6427
6657
  "name": "radio",
6428
6658
  "title": "Radio",
6429
- "description": "Form-associated one-of-many radio selection set with vertical or horizontal layout, three densities, per-option inactive state, and roving keyboard focus.",
6659
+ "description": "Form-associated one-of-many radio selection set with vertical or horizontal layout, four densities, per-option inactive state, and roving keyboard focus.",
6430
6660
  "type": "registry:ui",
6431
6661
  "meta": {
6432
6662
  "library": "@ds-mo/ui",
@@ -6437,7 +6667,7 @@
6437
6667
  "intent": {
6438
6668
  "audience": "general",
6439
6669
  "status": "stable",
6440
- "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, three densities, per-option inactive state, and roving keyboard focus.",
6670
+ "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, four densities, per-option inactive state, and roving keyboard focus.",
6441
6671
  "useWhen": [
6442
6672
  "A user must select exactly one visible option from a small set.",
6443
6673
  "All available choices should remain visible for comparison.",
@@ -6476,9 +6706,9 @@
6476
6706
  "Roving tabindex keeps one active option in the tab order, preferring the selected option."
6477
6707
  ],
6478
6708
  "states": [
6479
- "Unchecked circles use a tertiary-foreground inset stroke: 1.25px at md, 1px at sm, and 0.75px at xs.",
6480
- "Selected circles remove the border, use a brand fill, and draw a centered on-bold foreground dot sized 8px at md, 6px at sm, and 4px at xs.",
6481
- "Sizes are md with a 16px circle in a 20px placement, sm with a 12px circle in a 16px placement, and xs with an 8px circle in a 12px placement.",
6709
+ "Unchecked circles use a tertiary-foreground inset stroke: 1.5px at lg, 1.25px at md, 1px at sm, and 0.75px at xs.",
6710
+ "Selected circles remove the border, use a brand fill, and draw a centered on-bold foreground dot sized 10px at lg, 8px at md, 6px at sm, and 4px at xs.",
6711
+ "Sizes are lg with a 20px circle in a 24px placement, md with a 16px circle in a 20px placement, sm with a 12px circle in a 16px placement, and xs with an 8px circle in a 12px placement.",
6482
6712
  "The initial value is restored by native form reset; the selected value submits under name and a required set is invalid until one active option is selected."
6483
6713
  ],
6484
6714
  "responsiveBehavior": [
@@ -6720,6 +6950,8 @@
6720
6950
  "Use errorMessage with error so the trigger is described by the rendered alert."
6721
6951
  ],
6722
6952
  "states": [
6953
+ "Select and SelectMulti share popup positioning, dismissal, focus, typeahead, and listbox traversal while retaining their distinct scalar and array selection contracts.",
6954
+ "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.",
6723
6955
  "Value is controlled through the mutable value property; dsChange reports user selection and clearing.",
6724
6956
  "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.",
6725
6957
  "When allowClear is enabled, the clear affordance appears only after a value exists. Clearing is valid for optional and required fields; a required field becomes invalid until the user selects again.",
@@ -6731,9 +6963,9 @@
6731
6963
  "When any option supplies subtext, every row uses the same subtext structure and missing values render an em dash. Subtext should disambiguate or add decision-helpful information.",
6732
6964
  "Option labels and the selected trigger label stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
6733
6965
  "The optional prefix icon and chevron always use the parent surface's secondary foreground color, including when a selected value promotes the label to primary.",
6734
- "The shared popup search control stays md at every trigger size, using body-medium text, a 20px icon, and the same internal spacing as a borderless Select 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.",
6735
- "When search contains text, the shared control shows a rounded sm icon-only ButtonUnfilled with the CrossCircle icon and no border. It clears the local term, stays hidden for an empty term, and returns focus to search.",
6736
- "The shared clear footer mirrors the search region's sizing: menu-item padding surrounds an md-height borderless row, and the Clear label uses the same row and label insets as option text. The outer footer owns a 1px top divider.",
6966
+ "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.",
6967
+ "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.",
6968
+ "The shared clear footer mirrors the owning density: menu-item padding surrounds a borderless density row, and the Clear label uses the same row and label insets as option text. The outer footer owns a 1px top divider.",
6737
6969
  "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.",
6738
6970
  "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.",
6739
6971
  "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.",
@@ -6972,23 +7204,25 @@
6972
7204
  "The popup is a listbox with aria-multiselectable and every option exposes its independent aria-selected state.",
6973
7205
  "Disabled options expose aria-disabled and are skipped by keyboard navigation and typeahead.",
6974
7206
  "Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
6975
- "Each row uses a medium-size presentation-only ds-checkbox indicator; multi-select option rows never add a prefix icon alongside it, and the option remains the sole selection semantic and interaction target.",
7207
+ "Each row uses a presentation-only ds-checkbox indicator at the same density as the row; multi-select option rows never add a prefix icon alongside it, and the option remains the sole selection semantic and interaction target.",
6976
7208
  "The trigger keeps its field label visible and appends the current selected count; an explicit aria-label or aria-labelledby remains the authoritative accessible name when supplied.",
6977
7209
  "Use errorMessage with error so the trigger is described by the rendered alert."
6978
7210
  ],
6979
7211
  "states": [
7212
+ "Select and SelectMulti share popup positioning, dismissal, focus, typeahead, and listbox traversal while retaining their distinct scalar and array selection contracts.",
7213
+ "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.",
6980
7214
  "Values is a controlled JavaScript array; dsChange emits a new array after each user toggle.",
6981
7215
  "Required SelectMulti controls begin without an automatic selection and require the user to make an explicit choice.",
6982
7216
  "Selecting an option keeps the popup open so additional values can be toggled.",
6983
- "The trigger label stays left-aligned at every width; every option row uses the same leading medium Checkbox indicator. The default control size is md in both forms and filter bars.",
7217
+ "The trigger label stays left-aligned at every width; every option row uses the same leading Checkbox indicator at its density. The default control size is md in both forms and filter bars.",
6984
7218
  "The selected count always follows the persistent label as plain text separated by a centered dot, including for one selection, and counts every selected value even when search or grouping hides it. Never replace the count with selected option names.",
6985
7219
  "Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
6986
7220
  "When any option supplies subtext, every row uses the same subtext structure and missing values render an em dash. Subtext should disambiguate or add decision-helpful information.",
6987
7221
  "Option labels stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
6988
7222
  "The optional prefix icon and chevron always use the parent surface's secondary foreground color, including when selection promotes the label and count to primary.",
6989
- "The shared popup search control stays md at every trigger size, using body-medium text, a 20px icon, and the same internal spacing as a borderless Select 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.",
7223
+ "The shared popup search control follows the SelectMulti 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.",
6990
7224
  "When search contains text, the shared control shows a rounded sm icon-only ButtonUnfilled with the Cross icon and no border. It clears the local term, stays hidden for an empty term, and returns focus to search.",
6991
- "The shared summary-and-clear footer mirrors the search region's sizing: menu-item padding surrounds an md-height borderless row, and both texts use the same row and label insets as option text. The outer footer owns a 1px top divider.",
7225
+ "The shared summary-and-clear footer mirrors the owning density: menu-item padding surrounds a borderless density row, and both texts use the same row and label insets as option text. The outer footer owns a 1px top divider.",
6992
7226
  "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.",
6993
7227
  "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.",
6994
7228
  "When allowClear is enabled, clear-all appears only after at least one value exists. Clearing is valid for optional and required fields; a required field becomes invalid until the user selects again.",
@@ -7253,6 +7487,7 @@
7253
7487
  "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
7254
7488
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
7255
7489
  "On mobile, ShellApp hides and inerts PanelNav and BarNav, uses a solid primary stage, and composes routed ShellPage MobileHeader presentations, MobileSheetNav, ShellTools, and the persistent five-item MobileBarNav.",
7490
+ "When the application enables viewport-fit=cover, ShellApp reserves the shared top safe-area inset once for the complete mobile stage; nested routed, sheet, and tool headers must not add a second top inset.",
7256
7491
  "Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
7257
7492
  "Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
7258
7493
  "The bottom bar remains visible at all route and tool depths in the foundation release."
@@ -7615,7 +7850,8 @@
7615
7850
  "A ShellPage-managed BarTitle remains concealed until headerCapacity is available and its rendered variant matches the resolved presentation, preventing a default-variant flash during route activation.",
7616
7851
  "responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
7617
7852
  "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
7618
- "On roomy pages, the expanded header scrolls upward until its title and action row reaches the compact row position, then snaps variants without moving that shared visual anchor.",
7853
+ "The default content inset is 32px in desktop mode and 16px in tablet and mobile modes, while preserving the larger bottom scroll space.",
7854
+ "On roomy pages, the expanded header scrolls upward until its title and action row reaches the compact row position, while its bottom divider progressively extends from the expanded inset to edge-to-edge; it then snaps variants without moving that shared visual anchor.",
7619
7855
  "Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
7620
7856
  "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling.",
7621
7857
  "BarWorkflow remains compact and is not assigned BarTitle's capacity or scroll variants."
@@ -8036,6 +8272,7 @@
8036
8272
  "Read-only sliders remain focusable and submittable; inactive or disabled sliders leave the tab order and form submission."
8037
8273
  ],
8038
8274
  "states": [
8275
+ "The label, slider control, value display, and supporting content follow the shared 4px vertical field flow.",
8039
8276
  "value is mutable: user pointer, keyboard, or assistive-technology input updates it and emits dsChange continuously.",
8040
8277
  "dsCommit emits once a pointer interaction completes or the native range input commits a keyboard or assistive-technology change.",
8041
8278
  "Assign a two-number array through the JavaScript value property to create a range; values are ordered, clamped, stepped, and prevented from crossing.",
@@ -8334,7 +8571,7 @@
8334
8571
  {
8335
8572
  "name": "switch",
8336
8573
  "title": "Switch",
8337
- "description": "Compact on/off setting control for changes that take effect immediately, with three sizes and form-associated behavior.",
8574
+ "description": "Compact on/off setting control for changes that take effect immediately, with four sizes and form-associated behavior.",
8338
8575
  "type": "registry:ui",
8339
8576
  "meta": {
8340
8577
  "library": "@ds-mo/ui",
@@ -8345,7 +8582,7 @@
8345
8582
  "intent": {
8346
8583
  "audience": "general",
8347
8584
  "status": "stable",
8348
- "summary": "Compact on/off setting control for changes that take effect immediately, with three sizes and form-associated behavior.",
8585
+ "summary": "Compact on/off setting control for changes that take effect immediately, with four sizes and form-associated behavior.",
8349
8586
  "useWhen": [
8350
8587
  "A binary setting takes effect immediately when the user turns it on or off.",
8351
8588
  "A settings, form, or menu row needs a compact on/off control.",
@@ -8388,7 +8625,7 @@
8388
8625
  "states": [
8389
8626
  "Activation updates checked immediately and emits dsChange with the new boolean value.",
8390
8627
  "The initial checked value is the form-reset baseline; unchecked switches submit nothing unless uncheckedValue is provided.",
8391
- "Sizes are md 32×20 with a 12px thumb and 4px body inset, sm 24×16 with a 10px thumb and 3px inset, and xs 20×12 with an 8px thumb and 2px inset.",
8628
+ "Sizes are lg 40×24 with a 16px thumb and 4px body inset, md 32×20 with a 12px thumb and 4px inset, sm 24×16 with a 10px thumb and 3px inset, and xs 20×12 with an 8px thumb and 2px inset.",
8392
8629
  "Unchecked uses a transparent track with a density-specific tertiary-foreground inset stroke and a solid tertiary-foreground thumb without a border. Checked uses a brand track and primary-background thumb with no strokes.",
8393
8630
  "Presentation mode removes switch semantics, focus, interaction, and form submission while retaining the checked visual."
8394
8631
  ],
@@ -9204,7 +9441,7 @@
9204
9441
  },
9205
9442
  {
9206
9443
  "label": "Positioning unit coverage",
9207
- "path": "tests/tooltip-position.test.ts"
9444
+ "path": "tests/anchored-position.test.ts"
9208
9445
  }
9209
9446
  ]
9210
9447
  },
@@ -9314,6 +9551,8 @@
9314
9551
  "The owning chart mounts the callout when a local interaction starts and unmounts it when that interaction ends.",
9315
9552
  "Coordinate updates track within one mounted interaction session without restarting the show delay.",
9316
9553
  "Placement flips horizontally or vertically when the rendered callout approaches a viewport edge.",
9554
+ "Placement is chosen as a quadrant rather than computed as coordinates: the component measures its own rendered rect and flips its side and align props, which CSS consumes. It therefore does not use the shared anchored-position utilities, which resolve an anchor element into x and y.",
9555
+ "This separation is deliberate. The callout follows the pointer instead of an element, so it has no anchor rect to resolve; adopting the shared geometry would mean rewriting its CSS to consume coordinates for no behavioral gain.",
9317
9556
  "Reduced motion preserves the final visible state without an opacity transition."
9318
9557
  ],
9319
9558
  "responsiveBehavior": [