@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
package/dist/agent.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "12.6.2",
4
+ "packageVersion": "12.8.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -1273,7 +1273,8 @@
1273
1273
  "The action is unfilled icon-only shell or navigation chrome.",
1274
1274
  "The element represents navigation rather than a command.",
1275
1275
  "The content is a persistent selected state rather than an action.",
1276
- "A semantic color would be decorative or merely match the surrounding product area."
1276
+ "A semantic color would be decorative or merely match the surrounding product area.",
1277
+ "The control is an overflow or more-options menu whose only content is an Ellipses glyph; that role is never filled."
1277
1278
  ],
1278
1279
  "alternatives": [
1279
1280
  {
@@ -1285,20 +1286,32 @@
1285
1286
  "when": "The user is choosing a destination in application navigation.",
1286
1287
  "component": "component:ds-panel-nav",
1287
1288
  "reason": "Navigation components own destination selection, active state, and navigation semantics."
1289
+ },
1290
+ {
1291
+ "when": "The control is the overflow or more-options menu for a row, card, or toolbar.",
1292
+ "component": "component:ds-button-unfilled",
1293
+ "reason": "An icon-only Ellipses trigger is chrome, and its glyph conveys the menu without a chevron; a filled button never carries that role."
1288
1294
  }
1289
1295
  ],
1290
1296
  "commonlyComposedWith": [
1291
1297
  "component:ds-modal",
1292
- "component:ds-field"
1298
+ "component:ds-field",
1299
+ "component:ds-menu"
1300
+ ],
1301
+ "patterns": [
1302
+ "pattern:menu-trigger"
1293
1303
  ],
1294
1304
  "accessibility": [
1295
1305
  "Provide an explicit accessible name for icon-only buttons.",
1306
+ "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.",
1307
+ "Use haspopup directly for a non-menu popup such as a dialog; that case gets no chevron.",
1296
1308
  "Use inactive state only when the action must remain visible but unavailable.",
1297
1309
  "Do not encode the action meaning through color alone.",
1298
1310
  "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.",
1299
1311
  "Use native submit behavior for form submission and handle the form submit event rather than submitting from the button click event."
1300
1312
  ],
1301
1313
  "states": [
1314
+ "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1302
1315
  "Use only one filled action per local decision area; render all secondary actions with ButtonUnfilled.",
1303
1316
  "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.",
1304
1317
  "Contrast serves both surface adaptation and hierarchy, but never permits a second filled action in the same decision area.",
@@ -1306,7 +1319,11 @@
1306
1319
  "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.",
1307
1320
  "Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, intent, or interaction semantics.",
1308
1321
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
1309
- "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width."
1322
+ "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
1323
+ "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.",
1324
+ "ButtonFilled has no active or selected state; a filled action is a command, not a toggle or a persistent selection.",
1325
+ "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.",
1326
+ "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."
1310
1327
  ],
1311
1328
  "responsiveBehavior": [
1312
1329
  "Use fill width only when the parent layout calls for a full-width action, commonly on narrow form layouts."
@@ -1343,10 +1360,26 @@
1343
1360
  "type": "ButtonFilledContrast",
1344
1361
  "required": false
1345
1362
  },
1363
+ "controls": {
1364
+ "type": "string | undefined",
1365
+ "required": false
1366
+ },
1367
+ "expanded": {
1368
+ "type": "boolean | undefined",
1369
+ "required": false
1370
+ },
1346
1371
  "hasBorder": {
1347
1372
  "type": "boolean",
1348
1373
  "required": false
1349
1374
  },
1375
+ "hasMenu": {
1376
+ "type": "boolean",
1377
+ "required": false
1378
+ },
1379
+ "haspopup": {
1380
+ "type": "ButtonFilledPopup | undefined",
1381
+ "required": false
1382
+ },
1350
1383
  "icon": {
1351
1384
  "type": "string",
1352
1385
  "required": false
@@ -1367,6 +1400,14 @@
1367
1400
  "type": "string",
1368
1401
  "required": false
1369
1402
  },
1403
+ "pressScale": {
1404
+ "type": "boolean",
1405
+ "required": false
1406
+ },
1407
+ "pressed": {
1408
+ "type": "boolean | undefined",
1409
+ "required": false
1410
+ },
1370
1411
  "rounded": {
1371
1412
  "type": "boolean",
1372
1413
  "required": false
@@ -1426,7 +1467,8 @@
1426
1467
  "useWhen": [
1427
1468
  "A secondary command accompanies the single filled primary action in a local decision area.",
1428
1469
  "A toolbar, tool rail, overflow area, or shell region needs a compact icon action.",
1429
- "A command represents a persistent toggle or mode whose active state remains meaningful after activation."
1470
+ "A command represents a persistent toggle or mode whose active state remains meaningful after activation.",
1471
+ "A row, card, or toolbar needs an overflow or more-options menu; this is the only component that carries that role."
1430
1472
  ],
1431
1473
  "avoidWhen": [
1432
1474
  "The command is the single primary action in a local decision area; use ButtonFilled instead.",
@@ -1461,6 +1503,9 @@
1461
1503
  ],
1462
1504
  "accessibility": [
1463
1505
  "Provide an explicit accessible name for every icon-only action.",
1506
+ "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.",
1507
+ "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.",
1508
+ "Use haspopup directly for a non-menu popup such as a listbox or dialog; those cases get no chevron.",
1464
1509
  "Use active state only for a persistent toggle or mode, and synchronize pressed semantics unless an owning composite exposes the selection state.",
1465
1510
  "Treat notification dots as supplemental unread or status information; never use a dot as the sole state, meaning, or accessible name.",
1466
1511
  "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.",
@@ -1468,13 +1513,18 @@
1468
1513
  "For form submission, use native submit behavior and handle the form submit event rather than submitting from the button click event."
1469
1514
  ],
1470
1515
  "states": [
1516
+ "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1471
1517
  "General content UI keeps the selected interaction fill and border for persistent active state.",
1472
1518
  "Shell, navigation, and tool-rail chrome uses foreground-only active state with no selected fill or border.",
1473
1519
  "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.",
1474
1520
  "Surface context must match the actual parent surface; translucent, inverted, media, and always-dark treatments are reserved for those surfaces.",
1475
1521
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
1476
1522
  "Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, or interaction semantics.",
1477
- "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width."
1523
+ "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.",
1524
+ "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
1525
+ "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.",
1526
+ "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.",
1527
+ "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."
1478
1528
  ],
1479
1529
  "responsiveBehavior": [
1480
1530
  "The consuming layout decides when an icon-label action becomes icon-only and must provide an explicit accessible name after changing variants.",
@@ -1533,6 +1583,10 @@
1533
1583
  "type": "boolean",
1534
1584
  "required": false
1535
1585
  },
1586
+ "hasMenu": {
1587
+ "type": "boolean",
1588
+ "required": false
1589
+ },
1536
1590
  "haspopup": {
1537
1591
  "type": "ButtonUnfilledPopup | undefined",
1538
1592
  "required": false
@@ -1557,6 +1611,10 @@
1557
1611
  "type": "string",
1558
1612
  "required": false
1559
1613
  },
1614
+ "pressScale": {
1615
+ "type": "boolean",
1616
+ "required": false
1617
+ },
1560
1618
  "pressed": {
1561
1619
  "type": "boolean | undefined",
1562
1620
  "required": false
@@ -1660,13 +1718,14 @@
1660
1718
  "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1661
1719
  ],
1662
1720
  "states": [
1721
+ "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.",
1663
1722
  "The chart region fills the remaining card body while an optional legend remains content-sized.",
1664
1723
  "The card disables local hover highlighting on a slotted ChartLegend because bar legends are static keys.",
1665
1724
  "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1666
1725
  "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1667
1726
  ],
1668
1727
  "responsiveBehavior": [
1669
- "The selected sm, md, or lg shell size controls the card dimensions while the bar chart shrinks within its chart region.",
1728
+ "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.",
1670
1729
  "The horizontal legend wraps complete entries when the available width is constrained.",
1671
1730
  "The parent dashboard owns card wrapping and breakpoint changes."
1672
1731
  ],
@@ -1771,6 +1830,7 @@
1771
1830
  "The application owns meaningful loading, empty, and error status copy when either content region is temporarily replaced or absent."
1772
1831
  ],
1773
1832
  "states": [
1833
+ "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.",
1774
1834
  "The chart region fills remaining card height while the legend remains content-sized.",
1775
1835
  "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.",
1776
1836
  "Hover synchronization changes highlight only; it never represents selection, filtering, or navigation.",
@@ -1778,6 +1838,7 @@
1778
1838
  ],
1779
1839
  "responsiveBehavior": [
1780
1840
  "Select the token-based card width appropriate to the parent grid; the matching minimum height preserves the chart region.",
1841
+ "The donut measures the chart region and changes radius within its shared size band while token thickness and typography remain fixed.",
1781
1842
  "The parent dashboard owns wrapping and column changes while the internal chart-over-legend arrangement remains stable."
1782
1843
  ],
1783
1844
  "frameworkCaveats": {
@@ -1882,13 +1943,14 @@
1882
1943
  "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1883
1944
  ],
1884
1945
  "states": [
1946
+ "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.",
1885
1947
  "The chart region fills the remaining card body while the legend remains content-sized.",
1886
1948
  "The card disables local hover highlighting on a slotted ChartLegend because the line chart is static.",
1887
1949
  "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1888
1950
  "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1889
1951
  ],
1890
1952
  "responsiveBehavior": [
1891
- "The selected sm, md, or lg shell size controls the card dimensions while the line chart shrinks within its chart region.",
1953
+ "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.",
1892
1954
  "The horizontal legend wraps complete entries when the available width is constrained.",
1893
1955
  "The parent dashboard owns card wrapping and breakpoint changes."
1894
1956
  ],
@@ -1947,6 +2009,153 @@
1947
2009
  "card-shell-data-viz"
1948
2010
  ]
1949
2011
  },
2012
+ {
2013
+ "id": "component:ds-card-overview",
2014
+ "tag": "ds-card-overview",
2015
+ "name": "card-overview",
2016
+ "title": "CardOverview",
2017
+ "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.",
2018
+ "intentStatus": "complete",
2019
+ "intent": {
2020
+ "audience": "general",
2021
+ "status": "experimental",
2022
+ "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.",
2023
+ "useWhen": [
2024
+ "A page opens with one headline figure that the surrounding measures explain.",
2025
+ "Every measure is compared against the same period, so one caption describes the comparison for all of them.",
2026
+ "The measures are read together at a glance rather than explored individually."
2027
+ ],
2028
+ "avoidWhen": [
2029
+ "There is no headline figure and the measures are unrelated; use the matching card surface for each one.",
2030
+ "A measure needs a chart, sparkline, or other visualization; the grid presents values and change only.",
2031
+ "The measures each require their own comparison period or their own filter control.",
2032
+ "The content is a settings section or a general read-only card."
2033
+ ],
2034
+ "alternatives": [
2035
+ {
2036
+ "when": "A measure needs a chart or other data visualization.",
2037
+ "component": "component:ds-card-shell-data-viz",
2038
+ "reason": "CardShellDataViz owns the data-visualization shell contract; the overview grid presents values and change only."
2039
+ },
2040
+ {
2041
+ "when": "The surface is a settings section with an edit workflow.",
2042
+ "component": "component:ds-card-setting",
2043
+ "reason": "CardSetting owns the controlled view and edit chrome."
2044
+ }
2045
+ ],
2046
+ "commonlyComposedWith": [
2047
+ "component:ds-select",
2048
+ "component:ds-button-unfilled",
2049
+ "component:ds-text",
2050
+ "component:ds-tooltip"
2051
+ ],
2052
+ "accessibility": [
2053
+ "The bar is a labelled region; set overviewLabel to name what is being summarised, such as Safety summary.",
2054
+ "Trend arrows are decorative and hidden from assistive technology, so the formatted change value must read correctly on its own.",
2055
+ "Colour never carries the trend meaning alone; the arrow direction and the value are both present.",
2056
+ "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.",
2057
+ "Set labelTooltip when a measure's label needs qualifying rather than shortening the label into something ambiguous.",
2058
+ "While loading, the region exposes a busy state and renders skeletons whose type metrics match the resolved content."
2059
+ ],
2060
+ "states": [
2061
+ "Score and measures are supplied as data; the component owns their type treatment so summary bars stay consistent across pages.",
2062
+ "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.",
2063
+ "Omit a trend when there is nothing to report; resolveMetricTrend returns null in that case so no zero change is rendered.",
2064
+ "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.",
2065
+ "Loading replaces the score and the measures with skeletons and does not alter the slotted period control.",
2066
+ "The period control is slotted rather than owned, because the choice of stepper, select, or date range varies by product surface."
2067
+ ],
2068
+ "responsiveBehavior": [
2069
+ "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.",
2070
+ "Set metricMinWidth to change the width a measure may shrink to before the grid drops a column.",
2071
+ "The score block hugs its content and never shrinks, so the headline figure holds its size while the grid absorbs the remaining width.",
2072
+ "The score moves above the body once the bar can no longer fit both side by side."
2073
+ ],
2074
+ "frameworkCaveats": {
2075
+ "customElements": [
2076
+ "Assign score and metrics as JavaScript properties; both are objects and cannot be expressed as HTML attributes.",
2077
+ "Place the period control in the filter slot; the component reserves space for it but never renders one."
2078
+ ],
2079
+ "react": [
2080
+ "Pass score and metrics as props and read the selected measure from the onDsMetricSelect event detail.",
2081
+ "Derive each trend with resolveMetricTrend so tone stays an explicit product decision."
2082
+ ],
2083
+ "angular": [
2084
+ "Bind [score] and [metrics] as properties and read the selected measure from $event.detail on (dsMetricSelect).",
2085
+ "Derive each trend with resolveMetricTrend so tone stays an explicit product decision."
2086
+ ]
2087
+ },
2088
+ "references": [
2089
+ {
2090
+ "label": "Storybook structural examples",
2091
+ "path": "src/wc/components/CardOverview/CardOverview.stories.ts"
2092
+ },
2093
+ {
2094
+ "label": "Trend resolution unit coverage",
2095
+ "path": "tests/metric-change.test.ts"
2096
+ }
2097
+ ]
2098
+ },
2099
+ "api": {
2100
+ "props": {
2101
+ "comparisonLabel": {
2102
+ "type": "string",
2103
+ "required": false
2104
+ },
2105
+ "isLoading": {
2106
+ "type": "boolean",
2107
+ "required": false
2108
+ },
2109
+ "metricMinWidth": {
2110
+ "type": "string",
2111
+ "required": false
2112
+ },
2113
+ "metrics": {
2114
+ "type": "OverviewMetric[]",
2115
+ "required": false
2116
+ },
2117
+ "overviewLabel": {
2118
+ "type": "string",
2119
+ "required": false
2120
+ },
2121
+ "periodLabel": {
2122
+ "type": "string",
2123
+ "required": false
2124
+ },
2125
+ "score": {
2126
+ "type": "OverviewScore | undefined",
2127
+ "required": false
2128
+ },
2129
+ "scoreErrorMessage": {
2130
+ "type": "string | undefined",
2131
+ "required": false
2132
+ }
2133
+ },
2134
+ "events": [
2135
+ {
2136
+ "name": "dsMetricSelect",
2137
+ "detail": "OverviewMetric"
2138
+ }
2139
+ ],
2140
+ "slots": []
2141
+ },
2142
+ "exports": {
2143
+ "customElement": "ds-card-overview",
2144
+ "react": "DsCardOverview",
2145
+ "angular": "DsCardOverview"
2146
+ },
2147
+ "dependencies": [
2148
+ "@ds-mo/ui",
2149
+ "@ds-mo/tokens",
2150
+ "@ds-mo/icons"
2151
+ ],
2152
+ "componentDependencies": [
2153
+ "icon",
2154
+ "skeleton",
2155
+ "text",
2156
+ "tooltip"
2157
+ ]
2158
+ },
1950
2159
  {
1951
2160
  "id": "component:ds-card-setting",
1952
2161
  "tag": "ds-card-setting",
@@ -2255,7 +2464,8 @@
2255
2464
  "Authored datum colors override the shared categorical palette."
2256
2465
  ],
2257
2466
  "responsiveBehavior": [
2258
- "The owner supplies dimensions and updates them with its layout; the chart does not measure its container.",
2467
+ "Width and height provide the standalone intrinsic viewport; container constraints are measured and reflow the plot across the available pixels.",
2468
+ "Responsive layout changes bar positions and plot extents without scaling SVG text, strokes, corner radii, or margins.",
2259
2469
  "Limit or pre-format long category labels so they remain legible at the chosen width.",
2260
2470
  "Time labels remain ordered, pre-formatted buckets with equal spacing rather than raw continuous timestamps."
2261
2471
  ],
@@ -2264,10 +2474,10 @@
2264
2474
  "Assign data as a JavaScript property; arrays are not supported as HTML attributes."
2265
2475
  ],
2266
2476
  "react": [
2267
- "Pass a stable data array and dimensions derived from the containing layout."
2477
+ "Pass a stable data array; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2268
2478
  ],
2269
2479
  "angular": [
2270
- "Bind data as a property and update dimensions from the containing layout."
2480
+ "Bind data as a property; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2271
2481
  ]
2272
2482
  },
2273
2483
  "references": [
@@ -2364,8 +2574,9 @@
2364
2574
  "Negative values are unsupported and render as zero; the owning product supplies loading, empty, and error states."
2365
2575
  ],
2366
2576
  "responsiveBehavior": [
2367
- "The SVG preserves its authored aspect ratio while shrinking to fit a narrower parent.",
2368
- "The parent supplies dimensions and chooses how many time buckets remain legible at each width.",
2577
+ "Width and height provide the standalone intrinsic viewport; constrained card regions are measured and reflow both axes to their rendered pixel dimensions.",
2578
+ "Responsive layout changes stack positions and plot extents without scaling SVG text, strokes, separators, corner radii, or margins.",
2579
+ "The parent chooses how many time buckets remain legible at each width.",
2369
2580
  "Pre-format category labels and reduce bucket count before rendering when horizontal space becomes constrained."
2370
2581
  ],
2371
2582
  "frameworkCaveats": {
@@ -2477,6 +2688,7 @@
2477
2688
  "responsiveBehavior": [
2478
2689
  "Prefer container-fill sizing inside data-viz cards and explicit sizing only in layouts that own a stable diameter.",
2479
2690
  "Fill sizing remains centered and constrained to the shared donut size band.",
2691
+ "Changing the measured diameter changes the ring radius without scaling its token-based thickness, typography, focus stroke, or corner treatment.",
2480
2692
  "The owner adapts category count and legend placement for available space."
2481
2693
  ],
2482
2694
  "frameworkCaveats": {
@@ -2759,7 +2971,8 @@
2759
2971
  "Authored series colors override the shared categorical palette."
2760
2972
  ],
2761
2973
  "responsiveBehavior": [
2762
- "The owner supplies intrinsic dimensions; the SVG preserves its aspect ratio while shrinking to fit a narrower parent.",
2974
+ "Width and height provide the standalone intrinsic viewport; constrained card regions are measured and reflow both axes to their rendered pixel dimensions.",
2975
+ "Responsive layout changes point positions and plot extents without scaling SVG text, line strokes, point markers, or margins.",
2763
2976
  "Category positions are always equally spaced, even when labels represent time.",
2764
2977
  "Reduce or pre-format dense labels before passing them; the chart renders authored labels without a continuous time scale."
2765
2978
  ],
@@ -2768,10 +2981,10 @@
2768
2981
  "Assign series and categories as JavaScript properties and keep every series aligned to the category count."
2769
2982
  ],
2770
2983
  "react": [
2771
- "Pass stable series and category arrays with dimensions derived from the containing layout."
2984
+ "Pass stable series and category arrays; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2772
2985
  ],
2773
2986
  "angular": [
2774
- "Bind series and categories as properties with dimensions derived from the containing layout."
2987
+ "Bind series and categories as properties; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2775
2988
  ]
2776
2989
  },
2777
2990
  "references": [
@@ -2823,12 +3036,12 @@
2823
3036
  "tag": "ds-checkbox",
2824
3037
  "name": "checkbox",
2825
3038
  "title": "Checkbox",
2826
- "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and three density states.",
3039
+ "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and four density states.",
2827
3040
  "intentStatus": "complete",
2828
3041
  "intent": {
2829
3042
  "audience": "general",
2830
3043
  "status": "stable",
2831
- "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and three density states.",
3044
+ "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and four density states.",
2832
3045
  "useWhen": [
2833
3046
  "A user may independently select zero or more choices.",
2834
3047
  "A form requires acknowledgment, consent, or an opt-in value before submission.",
@@ -2868,15 +3081,15 @@
2868
3081
  "Use presentation mode only inside a composite option that owns selection semantics, focus, and interaction."
2869
3082
  ],
2870
3083
  "states": [
2871
- "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.",
3084
+ "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.",
2872
3085
  "Activating an indeterminate checkbox clears the mixed state, toggles checked, and emits dsChange with the resulting boolean.",
2873
3086
  "The initial checked and indeterminate values are restored by native form reset; checked values submit under name and unchecked values submit nothing.",
2874
- "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.",
3087
+ "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.",
2875
3088
  "Presentation mode removes checkbox semantics, focus, interaction, label rendering, and form submission while preserving the visual state."
2876
3089
  ],
2877
3090
  "responsiveBehavior": [
2878
3091
  "Choose size from the density of the containing row; labels may wrap while the placement box stays fixed.",
2879
- "Use the md indicator centered by the shared 20px option icon zone in multi-select rows."
3092
+ "Use the same density as the shared option icon zone in multi-select rows."
2880
3093
  ],
2881
3094
  "frameworkCaveats": {
2882
3095
  "customElements": [
@@ -3204,7 +3417,7 @@
3204
3417
  "actionLayout footer stretches a long action between 8px side and bottom insets.",
3205
3418
  "Both action layouts share the always-active scroll-overlay fade controller, reserve measured end clearance, and begin fading 8px before the visible action.",
3206
3419
  "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.",
3207
- "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."
3420
+ "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."
3208
3421
  ],
3209
3422
  "responsiveBehavior": [
3210
3423
  "The list fills its owner, scrolls independently, and keeps its persistent action above scrolling rows."
@@ -3275,7 +3488,7 @@
3275
3488
  "Hover and press use the shared interaction hover and pressed overlays. Only the selected conversation uses the persistent active fill.",
3276
3489
  "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.",
3277
3490
  "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.",
3278
- "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."
3491
+ "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."
3279
3492
  ],
3280
3493
  "responsiveBehavior": [
3281
3494
  "Long titles and previews truncate without displacing trailing status."
@@ -3577,7 +3790,7 @@
3577
3790
  "Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
3578
3791
  "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.",
3579
3792
  "The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
3580
- "All content is centered. The owner supplies container size and surrounding padding; do not compose actions into or immediately alongside the current EmptyState pattern.",
3793
+ "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.",
3581
3794
  "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
3582
3795
  ],
3583
3796
  "responsiveBehavior": [
@@ -3599,6 +3812,10 @@
3599
3812
  {
3600
3813
  "label": "Storybook examples",
3601
3814
  "path": "src/wc/components/EmptyState/EmptyState.stories.ts"
3815
+ },
3816
+ {
3817
+ "label": "Shared layout recipe foundation",
3818
+ "path": "docs/layout-recipe-foundation.md"
3602
3819
  }
3603
3820
  ]
3604
3821
  },
@@ -3677,6 +3894,7 @@
3677
3894
  "Do not use placeholder text as the only label. Keep label text concise and put format or consequence guidance in description."
3678
3895
  ],
3679
3896
  "states": [
3897
+ "Label, control, description, and error content follow the shared 4px vertical field flow without changing the slotted control's width or semantics.",
3680
3898
  "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.",
3681
3899
  "A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
3682
3900
  "Field owns validation presentation but not validation timing; the form decides when to set error and errorMessage.",
@@ -3874,12 +4092,12 @@
3874
4092
  "tag": "ds-input",
3875
4093
  "name": "input",
3876
4094
  "title": "Input",
3877
- "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.",
4095
+ "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.",
3878
4096
  "intentStatus": "complete",
3879
4097
  "intent": {
3880
4098
  "audience": "general",
3881
4099
  "status": "stable",
3882
- "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.",
4100
+ "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.",
3883
4101
  "useWhen": [
3884
4102
  "A user must enter or edit one line of text, an email address, telephone number, URL, search query, or password.",
3885
4103
  "The value must participate in native, Angular, or React form state.",
@@ -3920,6 +4138,7 @@
3920
4138
  "Suffix content must not carry information that is otherwise absent from the field's visible label, value, or description."
3921
4139
  ],
3922
4140
  "states": [
4141
+ "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.",
3923
4142
  "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.",
3924
4143
  "Placeholder text is secondary at rest and quaternary while the editable field is focused because it becomes decorative once typing begins.",
3925
4144
  "Entered values use the parent surface's primary foreground; prefix icons, suffix content, and resting placeholder text use its secondary foreground.",
@@ -3931,7 +4150,7 @@
3931
4150
  ],
3932
4151
  "responsiveBehavior": [
3933
4152
  "Form fields normally fill their parent; use hug width only in a compact toolbar or filter layout with an explicit width constraint.",
3934
- "Choose density from the containing layout: md for ordinary forms, sm or xs only where the surrounding controls use the same compact recipe.",
4153
+ "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.",
3935
4154
  "The owner supplies layout constraints and decides when a compact field moves to its own row."
3936
4155
  ],
3937
4156
  "frameworkCaveats": {
@@ -4318,7 +4537,7 @@
4318
4537
  "Anchor the menu to the control that opens it and return focus to that control when the menu closes.",
4319
4538
  "Open with visible initial focus only when the trigger was activated from the keyboard.",
4320
4539
  "Keep disabled items discoverable only when their unavailable state is meaningful.",
4321
- "Switch rows use menuitemcheckbox semantics on the row; the nested ds-switch is an aria-hidden md presentation indicator.",
4540
+ "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.",
4322
4541
  "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.",
4323
4542
  "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.",
4324
4543
  "Use notification dots only as supplemental status and not as the sole indication of important information."
@@ -4329,7 +4548,8 @@
4329
4548
  "After dsSelect from a switch row, replace the items or sections array with updated switchValue data so the controlled indicator reflects the new state.",
4330
4549
  "For selectionMode single, keep exactly one item isSelected and replace the items or sections array after dsSelect; Menu never mutates consumer-owned selection data.",
4331
4550
  "Arrays, objects, and element anchors must be assigned as JavaScript properties.",
4332
- "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."
4551
+ "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.",
4552
+ "Ordinary rows, section headings, and supporting text consume the Menu size. At xs, both the primary label and supporting text use caption metrics."
4333
4553
  ],
4334
4554
  "responsiveBehavior": [
4335
4555
  "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.",
@@ -4419,6 +4639,10 @@
4419
4639
  "sideOffset": {
4420
4640
  "type": "number | string",
4421
4641
  "required": false
4642
+ },
4643
+ "size": {
4644
+ "type": "MenuSize",
4645
+ "required": false
4422
4646
  }
4423
4647
  },
4424
4648
  "events": [
@@ -4768,7 +4992,7 @@
4768
4992
  "Selection and transcript interaction release automatic following.",
4769
4993
  "Opening saved history, message jumps, and prepended history preserve deliberate position.",
4770
4994
  "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.",
4771
- "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.",
4995
+ "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.",
4772
4996
  "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."
4773
4997
  ],
4774
4998
  "responsiveBehavior": [
@@ -4860,7 +5084,7 @@
4860
5084
  "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."
4861
5085
  ],
4862
5086
  "responsiveBehavior": [
4863
- "Render only below the mobile breakpoint and preserve safe-area clearance.",
5087
+ "Render only below the mobile breakpoint; its secondary surface extends through the bottom safe-area inset when the application enables viewport-fit=cover.",
4864
5088
  "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.",
4865
5089
  "Bar chrome and its divider are not text-selectable and suppress the iOS touch callout."
4866
5090
  ],
@@ -5189,7 +5413,9 @@
5189
5413
  "Area, Help, and Account events express intent while the application owns navigation and product behavior."
5190
5414
  ],
5191
5415
  "responsiveBehavior": [
5192
- "The pane fills the mobile content stage while the bottom bar remains available."
5416
+ "The pane fills the mobile content stage while the bottom bar remains available.",
5417
+ "The sheet header and scrollable navigation body each use the shared 8px chrome inset; large destination controls retain their independent 40px density.",
5418
+ "Dashboard and Settings preserve their supplied visual groups with an 8px gap between destinations inside a section and a 32px gap between sections."
5193
5419
  ],
5194
5420
  "references": [
5195
5421
  {
@@ -6120,6 +6346,7 @@
6120
6346
  "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.",
6121
6347
  "If an active optional tool becomes unavailable, PanelTools closes the drawer, clears activeTool, and emits its deselection.",
6122
6348
  "Use isInactive only for a temporarily unavailable visible tool; omit tools the user is not authorized to access.",
6349
+ "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.",
6123
6350
  "The application owns slotted tool products and data while PanelTools owns rail ordering, drawer selection, open state, motion, and shell events.",
6124
6351
  "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.",
6125
6352
  "Entering and exiting fullscreen snaps without borrowing the drawer open or close animation.",
@@ -6259,12 +6486,12 @@
6259
6486
  "tag": "ds-radio",
6260
6487
  "name": "radio",
6261
6488
  "title": "Radio",
6262
- "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, three densities, per-option inactive state, and roving keyboard focus.",
6489
+ "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, four densities, per-option inactive state, and roving keyboard focus.",
6263
6490
  "intentStatus": "complete",
6264
6491
  "intent": {
6265
6492
  "audience": "general",
6266
6493
  "status": "stable",
6267
- "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, three densities, per-option inactive state, and roving keyboard focus.",
6494
+ "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, four densities, per-option inactive state, and roving keyboard focus.",
6268
6495
  "useWhen": [
6269
6496
  "A user must select exactly one visible option from a small set.",
6270
6497
  "All available choices should remain visible for comparison.",
@@ -6303,9 +6530,9 @@
6303
6530
  "Roving tabindex keeps one active option in the tab order, preferring the selected option."
6304
6531
  ],
6305
6532
  "states": [
6306
- "Unchecked circles use a tertiary-foreground inset stroke: 1.25px at md, 1px at sm, and 0.75px at xs.",
6307
- "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.",
6308
- "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.",
6533
+ "Unchecked circles use a tertiary-foreground inset stroke: 1.5px at lg, 1.25px at md, 1px at sm, and 0.75px at xs.",
6534
+ "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.",
6535
+ "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.",
6309
6536
  "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."
6310
6537
  ],
6311
6538
  "responsiveBehavior": [
@@ -6541,6 +6768,8 @@
6541
6768
  "Use errorMessage with error so the trigger is described by the rendered alert."
6542
6769
  ],
6543
6770
  "states": [
6771
+ "Select and SelectMulti share popup positioning, dismissal, focus, typeahead, and listbox traversal while retaining their distinct scalar and array selection contracts.",
6772
+ "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.",
6544
6773
  "Value is controlled through the mutable value property; dsChange reports user selection and clearing.",
6545
6774
  "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.",
6546
6775
  "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.",
@@ -6552,9 +6781,9 @@
6552
6781
  "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.",
6553
6782
  "Option labels and the selected trigger label stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
6554
6783
  "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.",
6555
- "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.",
6556
- "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.",
6557
- "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.",
6784
+ "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.",
6785
+ "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.",
6786
+ "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.",
6558
6787
  "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.",
6559
6788
  "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.",
6560
6789
  "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.",
@@ -6790,23 +7019,25 @@
6790
7019
  "The popup is a listbox with aria-multiselectable and every option exposes its independent aria-selected state.",
6791
7020
  "Disabled options expose aria-disabled and are skipped by keyboard navigation and typeahead.",
6792
7021
  "Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
6793
- "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.",
7022
+ "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.",
6794
7023
  "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.",
6795
7024
  "Use errorMessage with error so the trigger is described by the rendered alert."
6796
7025
  ],
6797
7026
  "states": [
7027
+ "Select and SelectMulti share popup positioning, dismissal, focus, typeahead, and listbox traversal while retaining their distinct scalar and array selection contracts.",
7028
+ "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.",
6798
7029
  "Values is a controlled JavaScript array; dsChange emits a new array after each user toggle.",
6799
7030
  "Required SelectMulti controls begin without an automatic selection and require the user to make an explicit choice.",
6800
7031
  "Selecting an option keeps the popup open so additional values can be toggled.",
6801
- "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.",
7032
+ "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.",
6802
7033
  "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.",
6803
7034
  "Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
6804
7035
  "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.",
6805
7036
  "Option labels stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
6806
7037
  "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.",
6807
- "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.",
7038
+ "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.",
6808
7039
  "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.",
6809
- "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.",
7040
+ "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.",
6810
7041
  "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.",
6811
7042
  "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.",
6812
7043
  "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.",
@@ -7068,6 +7299,7 @@
7068
7299
  "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
7069
7300
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
7070
7301
  "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.",
7302
+ "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.",
7071
7303
  "Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
7072
7304
  "Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
7073
7305
  "The bottom bar remains visible at all route and tool depths in the foundation release."
@@ -7421,7 +7653,8 @@
7421
7653
  "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.",
7422
7654
  "responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
7423
7655
  "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
7424
- "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.",
7656
+ "The default content inset is 32px in desktop mode and 16px in tablet and mobile modes, while preserving the larger bottom scroll space.",
7657
+ "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.",
7425
7658
  "Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
7426
7659
  "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling.",
7427
7660
  "BarWorkflow remains compact and is not assigned BarTitle's capacity or scroll variants."
@@ -7833,6 +8066,7 @@
7833
8066
  "Read-only sliders remain focusable and submittable; inactive or disabled sliders leave the tab order and form submission."
7834
8067
  ],
7835
8068
  "states": [
8069
+ "The label, slider control, value display, and supporting content follow the shared 4px vertical field flow.",
7836
8070
  "value is mutable: user pointer, keyboard, or assistive-technology input updates it and emits dsChange continuously.",
7837
8071
  "dsCommit emits once a pointer interaction completes or the native range input commits a keyboard or assistive-technology change.",
7838
8072
  "Assign a two-number array through the JavaScript value property to create a range; values are ordered, clamped, stepped, and prevented from crossing.",
@@ -8131,12 +8365,12 @@
8131
8365
  "tag": "ds-switch",
8132
8366
  "name": "switch",
8133
8367
  "title": "Switch",
8134
- "summary": "Compact on/off setting control for changes that take effect immediately, with three sizes and form-associated behavior.",
8368
+ "summary": "Compact on/off setting control for changes that take effect immediately, with four sizes and form-associated behavior.",
8135
8369
  "intentStatus": "complete",
8136
8370
  "intent": {
8137
8371
  "audience": "general",
8138
8372
  "status": "stable",
8139
- "summary": "Compact on/off setting control for changes that take effect immediately, with three sizes and form-associated behavior.",
8373
+ "summary": "Compact on/off setting control for changes that take effect immediately, with four sizes and form-associated behavior.",
8140
8374
  "useWhen": [
8141
8375
  "A binary setting takes effect immediately when the user turns it on or off.",
8142
8376
  "A settings, form, or menu row needs a compact on/off control.",
@@ -8179,7 +8413,7 @@
8179
8413
  "states": [
8180
8414
  "Activation updates checked immediately and emits dsChange with the new boolean value.",
8181
8415
  "The initial checked value is the form-reset baseline; unchecked switches submit nothing unless uncheckedValue is provided.",
8182
- "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.",
8416
+ "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.",
8183
8417
  "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.",
8184
8418
  "Presentation mode removes switch semantics, focus, interaction, and form submission while retaining the checked visual."
8185
8419
  ],
@@ -8980,7 +9214,7 @@
8980
9214
  },
8981
9215
  {
8982
9216
  "label": "Positioning unit coverage",
8983
- "path": "tests/tooltip-position.test.ts"
9217
+ "path": "tests/anchored-position.test.ts"
8984
9218
  }
8985
9219
  ]
8986
9220
  },
@@ -9087,6 +9321,8 @@
9087
9321
  "The owning chart mounts the callout when a local interaction starts and unmounts it when that interaction ends.",
9088
9322
  "Coordinate updates track within one mounted interaction session without restarting the show delay.",
9089
9323
  "Placement flips horizontally or vertically when the rendered callout approaches a viewport edge.",
9324
+ "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.",
9325
+ "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.",
9090
9326
  "Reduced motion preserves the final visible state without an opacity transition."
9091
9327
  ],
9092
9328
  "responsiveBehavior": [