@ds-mo/ui 12.7.0 → 12.9.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 (313) hide show
  1. package/dist/.build-stamp +1 -1
  2. package/dist/agent-patterns.json +22 -9
  3. package/dist/agent.json +246 -19
  4. package/dist/angular/ds-button-filled.d.ts +1 -1
  5. package/dist/angular/ds-button-filled.js +3 -3
  6. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  7. package/dist/angular/ds-button-unfilled.js +3 -3
  8. package/dist/angular/ds-card-overview.d.ts +19 -0
  9. package/dist/angular/ds-card-overview.js +42 -0
  10. package/dist/angular/index.d.ts +1 -1
  11. package/dist/angular/index.js +1 -0
  12. package/dist/angular/proxies.d.ts +1 -0
  13. package/dist/angular/proxies.js +1 -0
  14. package/dist/components/ds-agent-activity.js +1 -1
  15. package/dist/components/ds-agent-response.js +1 -1
  16. package/dist/components/ds-agent-source-list.js +1 -1
  17. package/dist/components/ds-agent-tool-call.js +1 -1
  18. package/dist/components/ds-attachment-list.js +1 -1
  19. package/dist/components/ds-badge.js +1 -1
  20. package/dist/components/ds-bar-nav.js +1 -1
  21. package/dist/components/ds-bar-title.js +1 -1
  22. package/dist/components/ds-bar-title.js.map +1 -1
  23. package/dist/components/ds-bar-workflow.js +1 -1
  24. package/dist/components/ds-breadcrumb.js +1 -1
  25. package/dist/components/ds-button-filled.js +1 -1
  26. package/dist/components/ds-button-unfilled.js +1 -1
  27. package/dist/components/ds-card-data-viz-bar.js +1 -1
  28. package/dist/components/ds-card-data-viz-bar.js.map +1 -1
  29. package/dist/components/ds-card-data-viz-donut.js +1 -1
  30. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  31. package/dist/components/ds-card-data-viz-line.js +1 -1
  32. package/dist/components/ds-card-data-viz-line.js.map +1 -1
  33. package/dist/components/ds-card-overview.d.ts +11 -0
  34. package/dist/components/ds-card-overview.js +2 -0
  35. package/dist/components/ds-card-overview.js.map +1 -0
  36. package/dist/components/ds-card-setting.js +1 -1
  37. package/dist/components/ds-card-shell-data-viz.js +1 -1
  38. package/dist/components/ds-chart-bar-stacked.js +1 -1
  39. package/dist/components/ds-chart-bar-stacked.js.map +1 -1
  40. package/dist/components/ds-chart-bar.js +1 -1
  41. package/dist/components/ds-chart-bar.js.map +1 -1
  42. package/dist/components/ds-chart-donut.js +1 -1
  43. package/dist/components/ds-chart-donut.js.map +1 -1
  44. package/dist/components/ds-chart-legend.js +1 -1
  45. package/dist/components/ds-chart-line.js +1 -1
  46. package/dist/components/ds-chart-line.js.map +1 -1
  47. package/dist/components/ds-checkbox.js +1 -1
  48. package/dist/components/ds-chip.js +1 -1
  49. package/dist/components/ds-code-block.js +1 -1
  50. package/dist/components/ds-conversation-list-item.js +1 -1
  51. package/dist/components/ds-conversation-list-item.js.map +1 -1
  52. package/dist/components/ds-conversation-list-section.js +1 -1
  53. package/dist/components/ds-conversation-list.js +1 -1
  54. package/dist/components/ds-conversation-list.js.map +1 -1
  55. package/dist/components/ds-divider.js +1 -1
  56. package/dist/components/ds-empty-state.js +1 -1
  57. package/dist/components/ds-field.js +1 -1
  58. package/dist/components/ds-input.js +1 -1
  59. package/dist/components/ds-markdown.js +1 -1
  60. package/dist/components/ds-menu.js +1 -1
  61. package/dist/components/ds-message-bubble.js +1 -1
  62. package/dist/components/ds-message-composer.js +1 -1
  63. package/dist/components/ds-message-scroller.js +1 -1
  64. package/dist/components/ds-message-scroller.js.map +1 -1
  65. package/dist/components/ds-message.js +1 -1
  66. package/dist/components/ds-mobile-bar-nav.js +1 -1
  67. package/dist/components/ds-mobile-header.js +1 -1
  68. package/dist/components/ds-mobile-section-switcher.js +1 -1
  69. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  70. package/dist/components/ds-modal.js +1 -1
  71. package/dist/components/ds-modal.js.map +1 -1
  72. package/dist/components/ds-panel-nav.js +1 -1
  73. package/dist/components/ds-panel-nav.js.map +1 -1
  74. package/dist/components/ds-panel-sub-nav.js +1 -1
  75. package/dist/components/ds-panel-tool-header.js +1 -1
  76. package/dist/components/ds-panel-tool-search.js +1 -1
  77. package/dist/components/ds-panel-tools.js +1 -1
  78. package/dist/components/ds-radio.js +1 -1
  79. package/dist/components/ds-scroll-overlay.js +1 -1
  80. package/dist/components/ds-scroll-overlay.js.map +1 -1
  81. package/dist/components/ds-select-multi.js +1 -1
  82. package/dist/components/ds-select-multi.js.map +1 -1
  83. package/dist/components/ds-select.js +1 -1
  84. package/dist/components/ds-select.js.map +1 -1
  85. package/dist/components/ds-shell-app.js +1 -1
  86. package/dist/components/ds-shell-gradient-picker.js +1 -1
  87. package/dist/components/ds-shell-gradient-picker.js.map +1 -1
  88. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  89. package/dist/components/ds-shell-page.js +1 -1
  90. package/dist/components/ds-shell-page.js.map +1 -1
  91. package/dist/components/ds-shell-tools.js +1 -1
  92. package/dist/components/ds-skeleton.js +1 -1
  93. package/dist/components/ds-skeleton.js.map +1 -1
  94. package/dist/components/ds-slider.js +1 -1
  95. package/dist/components/ds-slider.js.map +1 -1
  96. package/dist/components/ds-swatch-picker.js +1 -1
  97. package/dist/components/ds-switch.js +1 -1
  98. package/dist/components/ds-tab-group.js +1 -1
  99. package/dist/components/ds-tag.js +1 -1
  100. package/dist/components/ds-text.js +1 -1
  101. package/dist/components/ds-toast.js +1 -1
  102. package/dist/components/ds-toast.js.map +1 -1
  103. package/dist/components/ds-tooltip-data-viz.js +1 -1
  104. package/dist/components/ds-tooltip.js +1 -1
  105. package/dist/components/ds-typing-indicator.js +1 -1
  106. package/dist/components/p-2foAUsDN.js +2 -0
  107. package/dist/components/p-2foAUsDN.js.map +1 -0
  108. package/dist/components/{p-BuiZcSga.js → p-8GK7B7K4.js} +2 -2
  109. package/dist/components/p-8GK7B7K4.js.map +1 -0
  110. package/dist/components/p-B5tMlca-.js +2 -0
  111. package/dist/components/p-B5tMlca-.js.map +1 -0
  112. package/dist/components/p-B6Vuayt6.js +2 -0
  113. package/dist/components/p-B6Vuayt6.js.map +1 -0
  114. package/dist/components/{p-B-9A0e_0.js → p-B88n0pO3.js} +2 -2
  115. package/dist/components/p-BBePKRHC.js +2 -0
  116. package/dist/components/p-BBePKRHC.js.map +1 -0
  117. package/dist/components/p-BBxcMVqk.js +2 -0
  118. package/dist/components/p-BBxcMVqk.js.map +1 -0
  119. package/dist/components/p-BDKtu6Wb.js +2 -0
  120. package/dist/components/{p-Bl001G0Y.js.map → p-BDKtu6Wb.js.map} +1 -1
  121. package/dist/components/p-BKOlvCGS.js +2 -0
  122. package/dist/components/p-BKOlvCGS.js.map +1 -0
  123. package/dist/components/{p-C7bZ-jiU.js → p-BO5aqZcf.js} +2 -2
  124. package/dist/components/{p-guQ7hv6W.js → p-BOCfICln.js} +2 -2
  125. package/dist/components/p-BX0BMhgz.js +2 -0
  126. package/dist/components/p-BX0BMhgz.js.map +1 -0
  127. package/dist/components/p-BhV5e6vF.js +2 -0
  128. package/dist/components/{p-1darPzys.js.map → p-BhV5e6vF.js.map} +1 -1
  129. package/dist/components/p-C8HU4W8q.js +2 -0
  130. package/dist/components/{p-pgxlkvUy.js.map → p-C8HU4W8q.js.map} +1 -1
  131. package/dist/components/{p-CvyTZ4Mg.js → p-CChcuL04.js} +2 -2
  132. package/dist/components/{p-Crsn82rz.js → p-CCzG5xDD.js} +2 -2
  133. package/dist/components/p-CGVXbXv9.js +2 -0
  134. package/dist/components/p-CGVXbXv9.js.map +1 -0
  135. package/dist/components/{p-BT5hgg5i.js → p-CIiBpjCn.js} +2 -2
  136. package/dist/components/{p-B_5nxOeB.js → p-CgEYdMee.js} +2 -2
  137. package/dist/components/{p-k0Hmj1KV.js → p-Cr3tEx7o.js} +2 -2
  138. package/dist/components/p-Cr3tEx7o.js.map +1 -0
  139. package/dist/components/{p-5-QAFB4j.js → p-Cuih680v.js} +2 -2
  140. package/dist/components/{p-C_9ZH0A3.js → p-Cuqxh-Tq.js} +2 -2
  141. package/dist/components/{p--eKXTylf.js → p-DCvA3Dc9.js} +2 -2
  142. package/dist/components/{p-DNFd4Ao-.js → p-DLZm_-sU.js} +2 -2
  143. package/dist/components/{p-C9h13YnX.js → p-DRnIuCiT.js} +2 -2
  144. package/dist/components/p-DhKvqh5G.js +2 -0
  145. package/dist/components/p-DhKvqh5G.js.map +1 -0
  146. package/dist/components/p-DjKkSqrG.js +2 -0
  147. package/dist/components/p-DjKkSqrG.js.map +1 -0
  148. package/dist/components/{p-CUAYsK44.js → p-DlscFn2m.js} +2 -2
  149. package/dist/components/{p-BcfC6phQ.js → p-DxkEC0hR.js} +2 -2
  150. package/dist/components/p-DxkEC0hR.js.map +1 -0
  151. package/dist/components/{p-C6xC48hG.js → p-Re2kPrXm.js} +2 -2
  152. package/dist/components/{p-DIa73GJP.js → p-XMZCaXs7.js} +2 -2
  153. package/dist/components/p-YR1XeuZf.js +2 -0
  154. package/dist/components/p-YR1XeuZf.js.map +1 -0
  155. package/dist/components/{p-CqWV4Hl_.js → p-dyUp3Adm.js} +2 -2
  156. package/dist/components/{p-CnAkobDW.js → p-nkYN0Bub.js} +2 -2
  157. package/dist/components/p-yhj1lIPx.js +2 -0
  158. package/dist/docs/components.json +847 -167
  159. package/dist/lib/components/Menu/menu-position.d.ts +6 -6
  160. package/dist/lib/toast/toast-types.d.ts +3 -3
  161. package/dist/lib/utils/anchored-position.d.ts +34 -0
  162. package/dist/lib/utils/choice-popup-alignment.d.ts +2 -2
  163. package/dist/lib/utils/index.d.ts +2 -0
  164. package/dist/lib/utils/index.js +31 -0
  165. package/dist/lib/utils/index.js.map +3 -3
  166. package/dist/lib/utils/metric-change.d.ts +52 -0
  167. package/dist/lib/utils/token-defaults.d.ts +3 -0
  168. package/dist/mcp-data/registry/agent-activity.json +1 -1
  169. package/dist/mcp-data/registry/agent-response.json +1 -1
  170. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  171. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  172. package/dist/mcp-data/registry/attachment-list.json +1 -1
  173. package/dist/mcp-data/registry/avatar.json +1 -1
  174. package/dist/mcp-data/registry/badge.json +1 -1
  175. package/dist/mcp-data/registry/bar-nav.json +1 -1
  176. package/dist/mcp-data/registry/bar-title.json +2 -2
  177. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  178. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  179. package/dist/mcp-data/registry/button-filled.json +122 -6
  180. package/dist/mcp-data/registry/button-unfilled.json +49 -5
  181. package/dist/mcp-data/registry/card-data-viz-bar.json +2 -2
  182. package/dist/mcp-data/registry/card-data-viz-donut.json +2 -1
  183. package/dist/mcp-data/registry/card-data-viz-line.json +2 -2
  184. package/dist/mcp-data/registry/card-overview.json +360 -0
  185. package/dist/mcp-data/registry/card-setting.json +1 -1
  186. package/dist/mcp-data/registry/card-shell-data-viz.json +1 -1
  187. package/dist/mcp-data/registry/chart-bar-stacked.json +14 -9
  188. package/dist/mcp-data/registry/chart-bar.json +15 -10
  189. package/dist/mcp-data/registry/chart-donut.json +3 -2
  190. package/dist/mcp-data/registry/chart-legend.json +1 -1
  191. package/dist/mcp-data/registry/chart-line.json +15 -10
  192. package/dist/mcp-data/registry/checkbox.json +1 -1
  193. package/dist/mcp-data/registry/chip.json +1 -1
  194. package/dist/mcp-data/registry/code-block.json +1 -1
  195. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  196. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  197. package/dist/mcp-data/registry/conversation-list.json +1 -1
  198. package/dist/mcp-data/registry/divider.json +1 -1
  199. package/dist/mcp-data/registry/empty-state.json +1 -1
  200. package/dist/mcp-data/registry/field.json +1 -1
  201. package/dist/mcp-data/registry/icon.json +1 -1
  202. package/dist/mcp-data/registry/input.json +1 -1
  203. package/dist/mcp-data/registry/loader.json +1 -1
  204. package/dist/mcp-data/registry/markdown.json +1 -1
  205. package/dist/mcp-data/registry/menu.json +3 -3
  206. package/dist/mcp-data/registry/message-bubble.json +1 -1
  207. package/dist/mcp-data/registry/message-composer.json +1 -1
  208. package/dist/mcp-data/registry/message-scroller.json +1 -1
  209. package/dist/mcp-data/registry/message.json +1 -1
  210. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  211. package/dist/mcp-data/registry/mobile-header.json +1 -1
  212. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  213. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  214. package/dist/mcp-data/registry/modal.json +1 -1
  215. package/dist/mcp-data/registry/panel-nav.json +1 -1
  216. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  217. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  218. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  219. package/dist/mcp-data/registry/panel-tools.json +3 -2
  220. package/dist/mcp-data/registry/radio.json +1 -1
  221. package/dist/mcp-data/registry/registry.json +249 -19
  222. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  223. package/dist/mcp-data/registry/select-multi.json +2 -2
  224. package/dist/mcp-data/registry/select.json +2 -2
  225. package/dist/mcp-data/registry/shell-app.json +1 -1
  226. package/dist/mcp-data/registry/shell-gradient-picker.json +1 -1
  227. package/dist/mcp-data/registry/shell-gradient-swatch.json +1 -1
  228. package/dist/mcp-data/registry/shell-page.json +5 -4
  229. package/dist/mcp-data/registry/shell-tools.json +1 -1
  230. package/dist/mcp-data/registry/skeleton.json +1 -1
  231. package/dist/mcp-data/registry/slider.json +1 -1
  232. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  233. package/dist/mcp-data/registry/switch.json +1 -1
  234. package/dist/mcp-data/registry/tab-group.json +1 -1
  235. package/dist/mcp-data/registry/tag.json +1 -1
  236. package/dist/mcp-data/registry/text.json +3 -3
  237. package/dist/mcp-data/registry/toast.json +2 -2
  238. package/dist/mcp-data/registry/tooltip-data-viz.json +3 -1
  239. package/dist/mcp-data/registry/tooltip.json +3 -8
  240. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  241. package/dist/react/components.d.ts +1 -0
  242. package/dist/react/components.js +1 -0
  243. package/dist/react/ds-card-overview.d.ts +12 -0
  244. package/dist/react/ds-card-overview.js +12 -0
  245. package/dist/styles/control-elevation.css +11 -0
  246. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +32 -0
  247. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +20 -0
  248. package/dist/types/components/CardOverview/CardOverview.d.ts +64 -0
  249. package/dist/types/components/CardOverview/card-overview-types.d.ts +34 -0
  250. package/dist/types/components/CardOverview/index.d.ts +2 -0
  251. package/dist/types/components/ChartBar/ChartBar.d.ts +11 -0
  252. package/dist/types/components/ChartBarStacked/ChartBarStacked.d.ts +11 -0
  253. package/dist/types/components/ChartLine/ChartLine.d.ts +11 -0
  254. package/dist/types/components/Menu/Menu.d.ts +7 -5
  255. package/dist/types/components/Menu/menu-position.d.ts +6 -6
  256. package/dist/types/components/ShellPage/ShellPage.d.ts +1 -0
  257. package/dist/types/components/Tooltip/Tooltip.d.ts +1 -4
  258. package/dist/types/components.d.ts +234 -2
  259. package/dist/types/toast/toast-types.d.ts +3 -3
  260. package/dist/types/utils/anchored-position-controller.d.ts +105 -0
  261. package/dist/types/utils/anchored-position.d.ts +35 -0
  262. package/dist/types/utils/cartesian-chart-layout.d.ts +13 -0
  263. package/dist/types/utils/chart-viewport-controller.d.ts +21 -0
  264. package/dist/types/utils/choice-popup-alignment.d.ts +2 -2
  265. package/dist/types/utils/index.d.ts +2 -0
  266. package/dist/types/utils/metric-change.d.ts +53 -0
  267. package/dist/types/utils/select-controller.d.ts +3 -3
  268. package/dist/types/utils/token-defaults.d.ts +3 -0
  269. package/package.json +3 -3
  270. package/dist/components/p-1darPzys.js +0 -2
  271. package/dist/components/p-B8C_yfLQ.js +0 -2
  272. package/dist/components/p-B8C_yfLQ.js.map +0 -1
  273. package/dist/components/p-BcfC6phQ.js.map +0 -1
  274. package/dist/components/p-Bl001G0Y.js +0 -2
  275. package/dist/components/p-BuiZcSga.js.map +0 -1
  276. package/dist/components/p-Bv9frkvW.js +0 -2
  277. package/dist/components/p-Bv9frkvW.js.map +0 -1
  278. package/dist/components/p-C0-K8vnW.js +0 -2
  279. package/dist/components/p-C0-K8vnW.js.map +0 -1
  280. package/dist/components/p-C2ym_Ich.js +0 -2
  281. package/dist/components/p-C_ewSXTT.js +0 -2
  282. package/dist/components/p-C_ewSXTT.js.map +0 -1
  283. package/dist/components/p-Ca9-fnFl.js +0 -2
  284. package/dist/components/p-Ca9-fnFl.js.map +0 -1
  285. package/dist/components/p-CydY-v7X.js +0 -2
  286. package/dist/components/p-CydY-v7X.js.map +0 -1
  287. package/dist/components/p-De7NquTI.js +0 -2
  288. package/dist/components/p-De7NquTI.js.map +0 -1
  289. package/dist/components/p-Dg3xLna0.js +0 -2
  290. package/dist/components/p-Dg3xLna0.js.map +0 -1
  291. package/dist/components/p-k0Hmj1KV.js.map +0 -1
  292. package/dist/components/p-pgxlkvUy.js +0 -2
  293. package/dist/lib/utils/anchored-popup.d.ts +0 -23
  294. package/dist/types/components/Tooltip/tooltip-position.d.ts +0 -21
  295. package/dist/types/utils/anchored-popup.d.ts +0 -24
  296. /package/dist/components/{p-B-9A0e_0.js.map → p-B88n0pO3.js.map} +0 -0
  297. /package/dist/components/{p-C7bZ-jiU.js.map → p-BO5aqZcf.js.map} +0 -0
  298. /package/dist/components/{p-guQ7hv6W.js.map → p-BOCfICln.js.map} +0 -0
  299. /package/dist/components/{p-CvyTZ4Mg.js.map → p-CChcuL04.js.map} +0 -0
  300. /package/dist/components/{p-Crsn82rz.js.map → p-CCzG5xDD.js.map} +0 -0
  301. /package/dist/components/{p-BT5hgg5i.js.map → p-CIiBpjCn.js.map} +0 -0
  302. /package/dist/components/{p-B_5nxOeB.js.map → p-CgEYdMee.js.map} +0 -0
  303. /package/dist/components/{p-5-QAFB4j.js.map → p-Cuih680v.js.map} +0 -0
  304. /package/dist/components/{p-C_9ZH0A3.js.map → p-Cuqxh-Tq.js.map} +0 -0
  305. /package/dist/components/{p--eKXTylf.js.map → p-DCvA3Dc9.js.map} +0 -0
  306. /package/dist/components/{p-DNFd4Ao-.js.map → p-DLZm_-sU.js.map} +0 -0
  307. /package/dist/components/{p-C9h13YnX.js.map → p-DRnIuCiT.js.map} +0 -0
  308. /package/dist/components/{p-CUAYsK44.js.map → p-DlscFn2m.js.map} +0 -0
  309. /package/dist/components/{p-C6xC48hG.js.map → p-Re2kPrXm.js.map} +0 -0
  310. /package/dist/components/{p-DIa73GJP.js.map → p-XMZCaXs7.js.map} +0 -0
  311. /package/dist/components/{p-CqWV4Hl_.js.map → p-dyUp3Adm.js.map} +0 -0
  312. /package/dist/components/{p-CnAkobDW.js.map → p-nkYN0Bub.js.map} +0 -0
  313. /package/dist/components/{p-C2ym_Ich.js.map → p-yhj1lIPx.js.map} +0 -0
package/dist/.build-stamp CHANGED
@@ -1 +1 @@
1
- 1785106690096
1
+ 1785378569056
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "12.7.0",
4
+ "packageVersion": "12.9.0",
5
5
  "kind": "patterns",
6
6
  "entries": [
7
7
  {
@@ -354,10 +354,11 @@
354
354
  {
355
355
  "id": "pattern:menu-trigger",
356
356
  "status": "stable",
357
- "summary": "Connect a ButtonUnfilled trigger to an anchored Menu for a compact command or view-selection popup without application-authored positioning.",
357
+ "summary": "Connect a button trigger to an anchored Menu for a compact command or view-selection popup without application-authored positioning.",
358
358
  "useWhen": [
359
359
  "A button should reveal a short contextual collection of commands.",
360
- "A compact button should show the current view or mode and let the user choose another one from a menu."
360
+ "A compact button should show the current view or mode and let the user choose another one from a menu.",
361
+ "A row, card, or toolbar needs an overflow or more-options menu."
361
362
  ],
362
363
  "avoidWhen": [
363
364
  "The choice is a submitted form value with a field label or validation; use Select.",
@@ -368,24 +369,36 @@
368
369
  "components": [
369
370
  {
370
371
  "component": "component:ds-button-unfilled",
371
- "role": "Provides the visible trigger, popup relationship attributes, and focus target.",
372
+ "role": "Provides the visible trigger, popup relationship attributes, and focus target. Carries both shapes, and is the only component that carries the icon-only overflow role.",
372
373
  "required": true
373
374
  },
374
375
  {
375
376
  "component": "component:ds-menu",
376
377
  "role": "Owns anchored placement, menu semantics, keyboard navigation, viewport clamping, selection, and close behavior.",
377
378
  "required": true
379
+ },
380
+ {
381
+ "component": "component:ds-button-filled",
382
+ "role": "Substitutes for the trigger when the menu belongs to the single primary action in a local decision area, using the label or icon-label shape only.",
383
+ "required": false
378
384
  }
379
385
  ],
380
386
  "stateOwnership": [
381
387
  "The application owns the selected command or view value and derives the trigger label and each item's isSelected state from it.",
382
- "The application synchronizes one open boolean to ButtonUnfilled.expanded and Menu.open.",
388
+ "The application synchronizes one open boolean to the trigger's expanded prop and Menu.open.",
389
+ "An open popup is a transient pressed state, not a selected one. The trigger holds its pressed wash for the popup's rendered lifecycle from expanded alone, so never also set isActive to represent an open menu.",
383
390
  "Menu owns popup placement and keyboard navigation; the application never calculates popup coordinates or applies positional CSS.",
384
391
  "On dsSelect, update the selected value, close the Menu, and restore focus to the trigger.",
385
392
  "On dsClose, synchronize the application open state to false."
386
393
  ],
387
394
  "accessibility": [
388
- "Set ButtonUnfilled.haspopup to menu, controls to the Menu id, and expanded from the same open state passed to Menu.",
395
+ "A button either has a menu or is a menu, and the trigger's variant selects between the two shapes.",
396
+ "Has a menu: a label or icon-label action that opens a menu. Set hasMenu, which implies aria-haspopup of menu and renders the trailing chevron that communicates the popup. Both button primitives support this shape.",
397
+ "Is a menu: an icon-only overflow or more-options control. Set hasMenu, which adds no chevron, so the glyph must convey the menu alone; use Ellipses. Only ButtonUnfilled carries this shape, because the role is chrome rather than a primary action.",
398
+ "Never pair hasMenu with an icon-only glyph that does not read as a menu on its own; there is no chevron to fall back on.",
399
+ "Set controls to the Menu id and expanded from the same open state passed to Menu.",
400
+ "Give an icon-only trigger an accessible name that states the role, such as More options, because no visible label or chevron carries it.",
401
+ "Use haspopup directly instead of hasMenu for a non-menu popup such as a listbox or dialog; those cases get no chevron.",
389
402
  "Give Menu a concise menuLabel describing the available commands or views.",
390
403
  "Set Menu.initialFocusVisible only when the trigger MouseEvent detail is zero, indicating keyboard activation.",
391
404
  "Keep visible selected styling synchronized with the application's selected value; Menu exposes the selected command through aria-current.",
@@ -408,7 +421,7 @@
408
421
  {
409
422
  "path": "view-menu.html",
410
423
  "language": "html",
411
- "content": "<ds-button-unfilled\n id=\"view-menu-trigger\"\n label=\"View · Overview\"\n haspopup=\"menu\"\n controls=\"view-menu\"\n></ds-button-unfilled>\n<ds-menu\n id=\"view-menu\"\n anchor-id=\"view-menu-trigger\"\n menu-label=\"Choose view\"\n></ds-menu>"
424
+ "content": "<ds-button-unfilled\n id=\"view-menu-trigger\"\n label=\"View · Overview\"\n has-menu\n controls=\"view-menu\"\n></ds-button-unfilled>\n<ds-menu\n id=\"view-menu\"\n anchor-id=\"view-menu-trigger\"\n menu-label=\"Choose view\"\n></ds-menu>\n\n<!-- Overflow shape: the Ellipses glyph conveys the menu, so no chevron is added. -->\n<ds-button-unfilled\n id=\"row-menu-trigger\"\n variant=\"icon\"\n icon=\"Ellipses\"\n aria-label=\"More options\"\n has-menu\n controls=\"row-menu\"\n></ds-button-unfilled>\n<ds-menu\n id=\"row-menu\"\n anchor-id=\"row-menu-trigger\"\n menu-label=\"More options\"\n align=\"end\"\n></ds-menu>"
412
425
  },
413
426
  {
414
427
  "path": "view-menu.ts",
@@ -438,7 +451,7 @@
438
451
  {
439
452
  "path": "ViewMenu.tsx",
440
453
  "language": "tsx",
441
- "content": "import { useState } from 'react'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled, DsMenu } from '@ds-mo/ui/react'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nexport function ViewMenu() {\n const [selectedValue, setSelectedValue] = useState('overview')\n const [open, setOpen] = useState(false)\n const [initialFocusVisible, setInitialFocusVisible] = useState(false)\n const selected = choices.find(item => item.value === selectedValue) ?? choices[0]\n const items = choices.map(item => ({ ...item, isSelected: item.value === selectedValue }))\n\n function focusTrigger() {\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n }\n\n return (\n <>\n <DsButtonUnfilled\n id=\"view-menu-trigger\"\n label={`View · ${selected.label}`}\n haspopup=\"menu\"\n controls=\"view-menu\"\n expanded={open}\n onDsClick={event => {\n setInitialFocusVisible(event.detail.detail === 0)\n setOpen(current => !current)\n }}\n />\n <DsMenu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n items={items}\n open={open}\n initialFocusVisible={initialFocusVisible}\n onDsClose={() => setOpen(false)}\n onDsSelect={event => {\n setSelectedValue(event.detail.value ?? selectedValue)\n setOpen(false)\n focusTrigger()\n }}\n />\n </>\n )\n}"
454
+ "content": "import { useState } from 'react'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled, DsMenu } from '@ds-mo/ui/react'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nexport function ViewMenu() {\n const [selectedValue, setSelectedValue] = useState('overview')\n const [open, setOpen] = useState(false)\n const [initialFocusVisible, setInitialFocusVisible] = useState(false)\n const selected = choices.find(item => item.value === selectedValue) ?? choices[0]\n const items = choices.map(item => ({ ...item, isSelected: item.value === selectedValue }))\n\n function focusTrigger() {\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n }\n\n return (\n <>\n <DsButtonUnfilled\n id=\"view-menu-trigger\"\n label={`View · ${selected.label}`}\n hasMenu\n controls=\"view-menu\"\n expanded={open}\n onDsClick={event => {\n setInitialFocusVisible(event.detail.detail === 0)\n setOpen(current => !current)\n }}\n />\n <DsMenu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n items={items}\n open={open}\n initialFocusVisible={initialFocusVisible}\n onDsClose={() => setOpen(false)}\n onDsSelect={event => {\n setSelectedValue(event.detail.value ?? selectedValue)\n setOpen(false)\n focusTrigger()\n }}\n />\n </>\n )\n}"
442
455
  }
443
456
  ],
444
457
  "notes": [
@@ -463,7 +476,7 @@
463
476
  {
464
477
  "path": "view-menu.component.html",
465
478
  "language": "html",
466
- "content": "<ds-button-unfilled\n id=\"view-menu-trigger\"\n [label]=\"'View · ' + selectedLabel\"\n haspopup=\"menu\"\n controls=\"view-menu\"\n [expanded]=\"open\"\n (dsClick)=\"toggleMenu($event)\"\n></ds-button-unfilled>\n<ds-menu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n [items]=\"menuItems\"\n [open]=\"open\"\n [initialFocusVisible]=\"initialFocusVisible\"\n (dsClose)=\"open = false\"\n (dsSelect)=\"selectView($event)\"\n></ds-menu>"
479
+ "content": "<ds-button-unfilled\n id=\"view-menu-trigger\"\n [label]=\"'View · ' + selectedLabel\"\n has-menu\n controls=\"view-menu\"\n [expanded]=\"open\"\n (dsClick)=\"toggleMenu($event)\"\n></ds-button-unfilled>\n<ds-menu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n [items]=\"menuItems\"\n [open]=\"open\"\n [initialFocusVisible]=\"initialFocusVisible\"\n (dsClose)=\"open = false\"\n (dsSelect)=\"selectView($event)\"\n></ds-menu>"
467
480
  },
468
481
  {
469
482
  "path": "view-menu.component.ts",
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.7.0",
4
+ "packageVersion": "12.9.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,14 +1286,25 @@
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.",
@@ -1307,7 +1319,11 @@
1307
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.",
1308
1320
  "Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, intent, or interaction semantics.",
1309
1321
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
1310
- "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."
1311
1327
  ],
1312
1328
  "responsiveBehavior": [
1313
1329
  "Use fill width only when the parent layout calls for a full-width action, commonly on narrow form layouts."
@@ -1344,10 +1360,26 @@
1344
1360
  "type": "ButtonFilledContrast",
1345
1361
  "required": false
1346
1362
  },
1363
+ "controls": {
1364
+ "type": "string | undefined",
1365
+ "required": false
1366
+ },
1367
+ "expanded": {
1368
+ "type": "boolean | undefined",
1369
+ "required": false
1370
+ },
1347
1371
  "hasBorder": {
1348
1372
  "type": "boolean",
1349
1373
  "required": false
1350
1374
  },
1375
+ "hasMenu": {
1376
+ "type": "boolean",
1377
+ "required": false
1378
+ },
1379
+ "haspopup": {
1380
+ "type": "ButtonFilledPopup | undefined",
1381
+ "required": false
1382
+ },
1351
1383
  "icon": {
1352
1384
  "type": "string",
1353
1385
  "required": false
@@ -1368,6 +1400,14 @@
1368
1400
  "type": "string",
1369
1401
  "required": false
1370
1402
  },
1403
+ "pressScale": {
1404
+ "type": "boolean",
1405
+ "required": false
1406
+ },
1407
+ "pressed": {
1408
+ "type": "boolean | undefined",
1409
+ "required": false
1410
+ },
1371
1411
  "rounded": {
1372
1412
  "type": "boolean",
1373
1413
  "required": false
@@ -1427,7 +1467,8 @@
1427
1467
  "useWhen": [
1428
1468
  "A secondary command accompanies the single filled primary action in a local decision area.",
1429
1469
  "A toolbar, tool rail, overflow area, or shell region needs a compact icon action.",
1430
- "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."
1431
1472
  ],
1432
1473
  "avoidWhen": [
1433
1474
  "The command is the single primary action in a local decision area; use ButtonFilled instead.",
@@ -1462,6 +1503,9 @@
1462
1503
  ],
1463
1504
  "accessibility": [
1464
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.",
1465
1509
  "Use active state only for a persistent toggle or mode, and synchronize pressed semantics unless an owning composite exposes the selection state.",
1466
1510
  "Treat notification dots as supplemental unread or status information; never use a dot as the sole state, meaning, or accessible name.",
1467
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.",
@@ -1476,7 +1520,11 @@
1476
1520
  "Surface context must match the actual parent surface; translucent, inverted, media, and always-dark treatments are reserved for those surfaces.",
1477
1521
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
1478
1522
  "Rounded changes only the control radius to the half-radius treatment; it does not change hierarchy, size, variant, or interaction semantics.",
1479
- "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."
1480
1528
  ],
1481
1529
  "responsiveBehavior": [
1482
1530
  "The consuming layout decides when an icon-label action becomes icon-only and must provide an explicit accessible name after changing variants.",
@@ -1535,6 +1583,10 @@
1535
1583
  "type": "boolean",
1536
1584
  "required": false
1537
1585
  },
1586
+ "hasMenu": {
1587
+ "type": "boolean",
1588
+ "required": false
1589
+ },
1538
1590
  "haspopup": {
1539
1591
  "type": "ButtonUnfilledPopup | undefined",
1540
1592
  "required": false
@@ -1559,6 +1611,10 @@
1559
1611
  "type": "string",
1560
1612
  "required": false
1561
1613
  },
1614
+ "pressScale": {
1615
+ "type": "boolean",
1616
+ "required": false
1617
+ },
1562
1618
  "pressed": {
1563
1619
  "type": "boolean | undefined",
1564
1620
  "required": false
@@ -1669,7 +1725,7 @@
1669
1725
  "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1670
1726
  ],
1671
1727
  "responsiveBehavior": [
1672
- "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.",
1673
1729
  "The horizontal legend wraps complete entries when the available width is constrained.",
1674
1730
  "The parent dashboard owns card wrapping and breakpoint changes."
1675
1731
  ],
@@ -1782,6 +1838,7 @@
1782
1838
  ],
1783
1839
  "responsiveBehavior": [
1784
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.",
1785
1842
  "The parent dashboard owns wrapping and column changes while the internal chart-over-legend arrangement remains stable."
1786
1843
  ],
1787
1844
  "frameworkCaveats": {
@@ -1893,7 +1950,7 @@
1893
1950
  "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1894
1951
  ],
1895
1952
  "responsiveBehavior": [
1896
- "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.",
1897
1954
  "The horizontal legend wraps complete entries when the available width is constrained.",
1898
1955
  "The parent dashboard owns card wrapping and breakpoint changes."
1899
1956
  ],
@@ -1952,6 +2009,168 @@
1952
2009
  "card-shell-data-viz"
1953
2010
  ]
1954
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 card pairing one headline score with a reporting period, an application-owned period control, and a responsive grid of comparable measures, with an optional compact 48px presentation.",
2018
+ "intentStatus": "complete",
2019
+ "intent": {
2020
+ "audience": "general",
2021
+ "status": "experimental",
2022
+ "summary": "Page-level summary card pairing one headline score with a reporting period, an application-owned period control, and a responsive grid of comparable measures, with an optional compact 48px presentation.",
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
+ "At most six measures are shown. Keep larger collections outside the summary bar rather than turning it into a dense dashboard.",
2067
+ "The period control is slotted rather than owned, because the choice of stepper, select, or date range varies by product surface.",
2068
+ "compact is exactly 48px high and keeps only the score label, score value, trend, reporting copy, and slotted period control. It omits the score band, measures, and footer."
2069
+ ],
2070
+ "responsiveBehavior": [
2071
+ "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.",
2072
+ "Every occupied grid track has the same width. When a final row is incomplete, its measures keep the same width as the row above and the unused tracks remain empty.",
2073
+ "Set metricMinWidth to change the width a measure may shrink to before the grid drops a column.",
2074
+ "The score block hugs its content and never shrinks, so the headline figure holds its size while the grid absorbs the remaining width.",
2075
+ "Once the card reaches its narrow stacked state, one summary block holds the score label, score, trend, score band, reporting period, and the application-owned period control above the single-column measures.",
2076
+ "In that stacked summary, the score and trend share one line at the start, while the score band is hidden to preserve space. The period control stays at the upper end, while the current period and comparison sit on separate right-aligned lines beside the score.",
2077
+ "Every measure occupies a full-width row in the stacked state.",
2078
+ "Set layout to stacked when the owning page shell enters a responsive mode before the card's own container reaches its narrow threshold.",
2079
+ "CardOverview does not observe scroll or choose its own presentation. The page owner may use compact as sticky summary chrome on supported breakpoints."
2080
+ ],
2081
+ "frameworkCaveats": {
2082
+ "customElements": [
2083
+ "Assign score and metrics as JavaScript properties; both are objects and cannot be expressed as HTML attributes.",
2084
+ "Place the period control in the filter slot; the component reserves space for it but never renders one."
2085
+ ],
2086
+ "react": [
2087
+ "Pass score and metrics as props and read the selected measure from the onDsMetricSelect event detail.",
2088
+ "Derive each trend with resolveMetricTrend so tone stays an explicit product decision."
2089
+ ],
2090
+ "angular": [
2091
+ "Bind [score] and [metrics] as properties and read the selected measure from $event.detail on (dsMetricSelect).",
2092
+ "Derive each trend with resolveMetricTrend so tone stays an explicit product decision."
2093
+ ]
2094
+ },
2095
+ "references": [
2096
+ {
2097
+ "label": "Storybook structural examples",
2098
+ "path": "src/wc/components/CardOverview/CardOverview.stories.ts"
2099
+ },
2100
+ {
2101
+ "label": "Trend resolution unit coverage",
2102
+ "path": "tests/metric-change.test.ts"
2103
+ }
2104
+ ]
2105
+ },
2106
+ "api": {
2107
+ "props": {
2108
+ "comparisonLabel": {
2109
+ "type": "string",
2110
+ "required": false
2111
+ },
2112
+ "isLoading": {
2113
+ "type": "boolean",
2114
+ "required": false
2115
+ },
2116
+ "layout": {
2117
+ "type": "CardOverviewLayout",
2118
+ "required": false
2119
+ },
2120
+ "metricMinWidth": {
2121
+ "type": "string",
2122
+ "required": false
2123
+ },
2124
+ "metrics": {
2125
+ "type": "OverviewMetric[]",
2126
+ "required": false
2127
+ },
2128
+ "overviewLabel": {
2129
+ "type": "string",
2130
+ "required": false
2131
+ },
2132
+ "periodLabel": {
2133
+ "type": "string",
2134
+ "required": false
2135
+ },
2136
+ "score": {
2137
+ "type": "OverviewScore | undefined",
2138
+ "required": false
2139
+ },
2140
+ "scoreErrorMessage": {
2141
+ "type": "string | undefined",
2142
+ "required": false
2143
+ },
2144
+ "variant": {
2145
+ "type": "CardOverviewVariant",
2146
+ "required": false
2147
+ }
2148
+ },
2149
+ "events": [
2150
+ {
2151
+ "name": "dsMetricSelect",
2152
+ "detail": "OverviewMetric"
2153
+ }
2154
+ ],
2155
+ "slots": []
2156
+ },
2157
+ "exports": {
2158
+ "customElement": "ds-card-overview",
2159
+ "react": "DsCardOverview",
2160
+ "angular": "DsCardOverview"
2161
+ },
2162
+ "dependencies": [
2163
+ "@ds-mo/ui",
2164
+ "@ds-mo/tokens",
2165
+ "@ds-mo/icons"
2166
+ ],
2167
+ "componentDependencies": [
2168
+ "icon",
2169
+ "skeleton",
2170
+ "text",
2171
+ "tooltip"
2172
+ ]
2173
+ },
1955
2174
  {
1956
2175
  "id": "component:ds-card-setting",
1957
2176
  "tag": "ds-card-setting",
@@ -2260,7 +2479,8 @@
2260
2479
  "Authored datum colors override the shared categorical palette."
2261
2480
  ],
2262
2481
  "responsiveBehavior": [
2263
- "The owner supplies dimensions and updates them with its layout; the chart does not measure its container.",
2482
+ "Width and height provide the standalone intrinsic viewport; container constraints are measured and reflow the plot across the available pixels.",
2483
+ "Responsive layout changes bar positions and plot extents without scaling SVG text, strokes, corner radii, or margins.",
2264
2484
  "Limit or pre-format long category labels so they remain legible at the chosen width.",
2265
2485
  "Time labels remain ordered, pre-formatted buckets with equal spacing rather than raw continuous timestamps."
2266
2486
  ],
@@ -2269,10 +2489,10 @@
2269
2489
  "Assign data as a JavaScript property; arrays are not supported as HTML attributes."
2270
2490
  ],
2271
2491
  "react": [
2272
- "Pass a stable data array and dimensions derived from the containing layout."
2492
+ "Pass a stable data array; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2273
2493
  ],
2274
2494
  "angular": [
2275
- "Bind data as a property and update dimensions from the containing layout."
2495
+ "Bind data as a property; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2276
2496
  ]
2277
2497
  },
2278
2498
  "references": [
@@ -2369,8 +2589,9 @@
2369
2589
  "Negative values are unsupported and render as zero; the owning product supplies loading, empty, and error states."
2370
2590
  ],
2371
2591
  "responsiveBehavior": [
2372
- "The SVG preserves its authored aspect ratio while shrinking to fit a narrower parent.",
2373
- "The parent supplies dimensions and chooses how many time buckets remain legible at each width.",
2592
+ "Width and height provide the standalone intrinsic viewport; constrained card regions are measured and reflow both axes to their rendered pixel dimensions.",
2593
+ "Responsive layout changes stack positions and plot extents without scaling SVG text, strokes, separators, corner radii, or margins.",
2594
+ "The parent chooses how many time buckets remain legible at each width.",
2374
2595
  "Pre-format category labels and reduce bucket count before rendering when horizontal space becomes constrained."
2375
2596
  ],
2376
2597
  "frameworkCaveats": {
@@ -2482,6 +2703,7 @@
2482
2703
  "responsiveBehavior": [
2483
2704
  "Prefer container-fill sizing inside data-viz cards and explicit sizing only in layouts that own a stable diameter.",
2484
2705
  "Fill sizing remains centered and constrained to the shared donut size band.",
2706
+ "Changing the measured diameter changes the ring radius without scaling its token-based thickness, typography, focus stroke, or corner treatment.",
2485
2707
  "The owner adapts category count and legend placement for available space."
2486
2708
  ],
2487
2709
  "frameworkCaveats": {
@@ -2764,7 +2986,8 @@
2764
2986
  "Authored series colors override the shared categorical palette."
2765
2987
  ],
2766
2988
  "responsiveBehavior": [
2767
- "The owner supplies intrinsic dimensions; the SVG preserves its aspect ratio while shrinking to fit a narrower parent.",
2989
+ "Width and height provide the standalone intrinsic viewport; constrained card regions are measured and reflow both axes to their rendered pixel dimensions.",
2990
+ "Responsive layout changes point positions and plot extents without scaling SVG text, line strokes, point markers, or margins.",
2768
2991
  "Category positions are always equally spaced, even when labels represent time.",
2769
2992
  "Reduce or pre-format dense labels before passing them; the chart renders authored labels without a continuous time scale."
2770
2993
  ],
@@ -2773,10 +2996,10 @@
2773
2996
  "Assign series and categories as JavaScript properties and keep every series aligned to the category count."
2774
2997
  ],
2775
2998
  "react": [
2776
- "Pass stable series and category arrays with dimensions derived from the containing layout."
2999
+ "Pass stable series and category arrays; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2777
3000
  ],
2778
3001
  "angular": [
2779
- "Bind series and categories as properties with dimensions derived from the containing layout."
3002
+ "Bind series and categories as properties; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2780
3003
  ]
2781
3004
  },
2782
3005
  "references": [
@@ -6138,6 +6361,7 @@
6138
6361
  "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.",
6139
6362
  "If an active optional tool becomes unavailable, PanelTools closes the drawer, clears activeTool, and emits its deselection.",
6140
6363
  "Use isInactive only for a temporarily unavailable visible tool; omit tools the user is not authorized to access.",
6364
+ "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.",
6141
6365
  "The application owns slotted tool products and data while PanelTools owns rail ordering, drawer selection, open state, motion, and shell events.",
6142
6366
  "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.",
6143
6367
  "Entering and exiting fullscreen snaps without borrowing the drawer open or close animation.",
@@ -7444,7 +7668,8 @@
7444
7668
  "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.",
7445
7669
  "responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
7446
7670
  "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
7447
- "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.",
7671
+ "The default content inset is 32px in desktop mode and 16px in tablet and mobile modes, while preserving the larger bottom scroll space.",
7672
+ "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.",
7448
7673
  "Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
7449
7674
  "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling.",
7450
7675
  "BarWorkflow remains compact and is not assigned BarTitle's capacity or scroll variants."
@@ -8652,7 +8877,7 @@
8652
8877
  "states": [
8653
8878
  "A variant is atomic: font size, line height, weight, and letter spacing stay together and are not overridden by consumers.",
8654
8879
  "Emphasis selects the supported stronger recipe for local hierarchy; it does not independently mean selected or active.",
8655
- "Omitted color inherits currentColor. Explicit semantic aliases or CSS-variable references are used only when Text has an independent color role.",
8880
+ "Omitted color inherits currentColor without imposing a host color declaration, so an owning component may apply its semantic foreground directly without depending on stylesheet order. Explicit semantic aliases or CSS-variable references are used when Text has an independent color role.",
8656
8881
  "Prefer the owning control's isInactive or native disabled state over manually selecting tertiary or quaternary so visual treatment and inactive semantics remain synchronized.",
8657
8882
  "Line truncation and wrapping require an owner-supplied width constraint and content-aware composition decision.",
8658
8883
  "Solid underline is the default link affordance; brand-blue links may omit it at rest. Dotted underline communicates hidden or supplemental interaction such as a tooltip. Decoration does not make Text interactive by itself.",
@@ -9004,7 +9229,7 @@
9004
9229
  },
9005
9230
  {
9006
9231
  "label": "Positioning unit coverage",
9007
- "path": "tests/tooltip-position.test.ts"
9232
+ "path": "tests/anchored-position.test.ts"
9008
9233
  }
9009
9234
  ]
9010
9235
  },
@@ -9111,6 +9336,8 @@
9111
9336
  "The owning chart mounts the callout when a local interaction starts and unmounts it when that interaction ends.",
9112
9337
  "Coordinate updates track within one mounted interaction session without restarting the show delay.",
9113
9338
  "Placement flips horizontally or vertically when the rendered callout approaches a viewport edge.",
9339
+ "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.",
9340
+ "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.",
9114
9341
  "Reduced motion preserves the final visible state without an opacity transition."
9115
9342
  ],
9116
9343
  "responsiveBehavior": [
@@ -8,7 +8,7 @@ export declare class DsButtonFilled {
8
8
  dsClick: EventEmitter<DsButtonFilledCustomEvent<MouseEvent>>;
9
9
  constructor(c: ChangeDetectorRef, r: ElementRef, z: NgZone);
10
10
  static ɵfac: i0.ɵɵFactoryDeclaration<DsButtonFilled, never>;
11
- static ɵcmp: i0.ɵɵComponentDeclaration<DsButtonFilled, "ds-button-filled", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "background": { "alias": "background"; "required": false; }; "contrast": { "alias": "contrast"; "required": false; }; "hasBorder": { "alias": "hasBorder"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "intent": { "alias": "intent"; "required": false; }; "isInactive": { "alias": "isInactive"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "label": { "alias": "label"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; "size": { "alias": "size"; "required": false; }; "type": { "alias": "type"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "width": { "alias": "width"; "required": false; }; }, { "dsClick": "dsClick"; }, never, ["*"], true, never>;
11
+ static ɵcmp: i0.ɵɵComponentDeclaration<DsButtonFilled, "ds-button-filled", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "background": { "alias": "background"; "required": false; }; "contrast": { "alias": "contrast"; "required": false; }; "controls": { "alias": "controls"; "required": false; }; "expanded": { "alias": "expanded"; "required": false; }; "hasBorder": { "alias": "hasBorder"; "required": false; }; "hasMenu": { "alias": "hasMenu"; "required": false; }; "haspopup": { "alias": "haspopup"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "intent": { "alias": "intent"; "required": false; }; "isInactive": { "alias": "isInactive"; "required": false; }; "isLoading": { "alias": "isLoading"; "required": false; }; "label": { "alias": "label"; "required": false; }; "pressScale": { "alias": "pressScale"; "required": false; }; "pressed": { "alias": "pressed"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; "size": { "alias": "size"; "required": false; }; "type": { "alias": "type"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "width": { "alias": "width"; "required": false; }; }, { "dsClick": "dsClick"; }, never, ["*"], true, never>;
12
12
  }
13
13
  export declare interface DsButtonFilled extends Components.DsButtonFilled {
14
14
  dsClick: EventEmitter<DsButtonFilledCustomEvent<MouseEvent>>;
@@ -18,12 +18,12 @@ let DsButtonFilled = class DsButtonFilled {
18
18
  this.el = r.nativeElement;
19
19
  }
20
20
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DsButtonFilled, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
21
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.7", type: DsButtonFilled, isStandalone: true, selector: "ds-button-filled", inputs: { ariaLabel: "ariaLabel", background: "background", contrast: "contrast", hasBorder: "hasBorder", icon: "icon", intent: "intent", isInactive: "isInactive", isLoading: "isLoading", label: "label", rounded: "rounded", size: "size", type: "type", variant: "variant", width: "width" }, outputs: { dsClick: "dsClick" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
21
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.7", type: DsButtonFilled, isStandalone: true, selector: "ds-button-filled", inputs: { ariaLabel: "ariaLabel", background: "background", contrast: "contrast", controls: "controls", expanded: "expanded", hasBorder: "hasBorder", hasMenu: "hasMenu", haspopup: "haspopup", icon: "icon", intent: "intent", isInactive: "isInactive", isLoading: "isLoading", label: "label", pressScale: "pressScale", pressed: "pressed", rounded: "rounded", size: "size", type: "type", variant: "variant", width: "width" }, outputs: { dsClick: "dsClick" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
22
22
  };
23
23
  DsButtonFilled = __decorate([
24
24
  ProxyCmp({
25
25
  defineCustomElementFn: defineDsButtonFilled,
26
- inputs: ['ariaLabel', 'background', 'contrast', 'hasBorder', 'icon', 'intent', 'isInactive', 'isLoading', 'label', 'rounded', 'size', 'type', 'variant', 'width'],
26
+ inputs: ['ariaLabel', 'background', 'contrast', 'controls', 'expanded', 'hasBorder', 'hasMenu', 'haspopup', 'icon', 'intent', 'isInactive', 'isLoading', 'label', 'pressScale', 'pressed', 'rounded', 'size', 'type', 'variant', 'width'],
27
27
  methods: ['setFocus']
28
28
  })
29
29
  ], DsButtonFilled);
@@ -35,7 +35,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
35
35
  changeDetection: ChangeDetectionStrategy.OnPush,
36
36
  template: '<ng-content></ng-content>',
37
37
  // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
38
- inputs: ['ariaLabel', 'background', 'contrast', 'hasBorder', 'icon', 'intent', 'isInactive', 'isLoading', 'label', 'rounded', 'size', 'type', 'variant', 'width'],
38
+ inputs: ['ariaLabel', 'background', 'contrast', 'controls', 'expanded', 'hasBorder', 'hasMenu', 'haspopup', 'icon', 'intent', 'isInactive', 'isLoading', 'label', 'pressScale', 'pressed', 'rounded', 'size', 'type', 'variant', 'width'],
39
39
  outputs: ['dsClick'],
40
40
  }]
41
41
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { dsClick: [{