@ds-mo/ui 12.9.0 → 13.1.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 (470) hide show
  1. package/README.md +1 -0
  2. package/dist/.package-ready.json +1 -0
  3. package/dist/agent-patterns.json +124 -135
  4. package/dist/agent.json +249 -1108
  5. package/dist/angular/ds-bar-nav.d.ts +1 -1
  6. package/dist/angular/ds-bar-nav.js +3 -3
  7. package/dist/angular/ds-button-filled.d.ts +1 -1
  8. package/dist/angular/ds-button-filled.js +3 -3
  9. package/dist/angular/ds-card-data-viz.d.ts +18 -0
  10. package/dist/angular/{ds-card-data-viz-donut.js → ds-card-data-viz.js} +12 -12
  11. package/dist/angular/ds-card-overview.d.ts +1 -1
  12. package/dist/angular/ds-card-overview.js +3 -3
  13. package/dist/angular/ds-chart-bar.d.ts +1 -1
  14. package/dist/angular/ds-chart-bar.js +3 -3
  15. package/dist/angular/ds-menu.d.ts +1 -7
  16. package/dist/angular/ds-menu.js +2 -5
  17. package/dist/angular/ds-mobile-header.d.ts +1 -1
  18. package/dist/angular/ds-mobile-header.js +3 -3
  19. package/dist/angular/ds-mobile-section-switcher.d.ts +1 -1
  20. package/dist/angular/ds-mobile-section-switcher.js +3 -3
  21. package/dist/angular/ds-panel-tools.d.ts +1 -1
  22. package/dist/angular/ds-panel-tools.js +3 -3
  23. package/dist/angular/ds-select.d.ts +5 -4
  24. package/dist/angular/ds-select.js +3 -3
  25. package/dist/angular/ds-shell-app.d.ts +90 -1
  26. package/dist/angular/ds-shell-app.js +44 -4
  27. package/dist/angular/ds-shell-tools.d.ts +1 -1
  28. package/dist/angular/ds-shell-tools.js +3 -3
  29. package/dist/angular/index.d.ts +1 -1
  30. package/dist/angular/index.js +1 -8
  31. package/dist/angular/proxies.d.ts +1 -8
  32. package/dist/angular/proxies.js +1 -8
  33. package/dist/components/ds-agent-activity.js +1 -1
  34. package/dist/components/ds-agent-response.js +1 -1
  35. package/dist/components/ds-agent-source-list.js +1 -1
  36. package/dist/components/ds-agent-tool-call.js +1 -1
  37. package/dist/components/ds-attachment-list.js +1 -1
  38. package/dist/components/ds-badge.js +1 -1
  39. package/dist/components/ds-bar-nav.js +1 -1
  40. package/dist/components/ds-bar-nav.js.map +1 -1
  41. package/dist/components/ds-bar-title.js +1 -1
  42. package/dist/components/ds-bar-title.js.map +1 -1
  43. package/dist/components/ds-bar-workflow.js +1 -1
  44. package/dist/components/ds-breadcrumb.js +1 -1
  45. package/dist/components/ds-button-filled.js +1 -1
  46. package/dist/components/ds-button-unfilled.js +1 -1
  47. package/dist/components/{ds-select-multi.d.ts → ds-card-data-viz.d.ts} +4 -4
  48. package/dist/components/ds-card-data-viz.js +2 -0
  49. package/dist/components/ds-card-data-viz.js.map +1 -0
  50. package/dist/components/ds-card-overview.js +1 -1
  51. package/dist/components/ds-card-overview.js.map +1 -1
  52. package/dist/components/ds-card-setting.js +1 -1
  53. package/dist/components/ds-chart-bar.js +1 -1
  54. package/dist/components/ds-chart-bar.js.map +1 -1
  55. package/dist/components/ds-chart-donut.js +1 -1
  56. package/dist/components/ds-chart-donut.js.map +1 -1
  57. package/dist/components/ds-chart-legend.js +1 -1
  58. package/dist/components/ds-chart-legend.js.map +1 -1
  59. package/dist/components/ds-chart-line.js +1 -1
  60. package/dist/components/ds-chart-line.js.map +1 -1
  61. package/dist/components/ds-checkbox.js +1 -1
  62. package/dist/components/ds-chip.js +1 -1
  63. package/dist/components/ds-chip.js.map +1 -1
  64. package/dist/components/ds-code-block.js +1 -1
  65. package/dist/components/ds-conversation-list-item.js +1 -1
  66. package/dist/components/ds-conversation-list-item.js.map +1 -1
  67. package/dist/components/ds-conversation-list-section.js +1 -1
  68. package/dist/components/ds-conversation-list.js +1 -1
  69. package/dist/components/ds-divider.js +1 -1
  70. package/dist/components/ds-empty-state.js +1 -1
  71. package/dist/components/ds-field.js +1 -1
  72. package/dist/components/ds-input.js +1 -1
  73. package/dist/components/ds-input.js.map +1 -1
  74. package/dist/components/ds-markdown.js +1 -1
  75. package/dist/components/ds-menu.js +1 -1
  76. package/dist/components/ds-message-bubble.js +1 -1
  77. package/dist/components/ds-message-composer.js +1 -1
  78. package/dist/components/ds-message-composer.js.map +1 -1
  79. package/dist/components/ds-message-scroller.js +1 -1
  80. package/dist/components/ds-message.js +1 -1
  81. package/dist/components/ds-mobile-bar-nav.js +1 -1
  82. package/dist/components/ds-mobile-bar-nav.js.map +1 -1
  83. package/dist/components/ds-mobile-header.js +1 -1
  84. package/dist/components/ds-mobile-section-switcher.js +1 -1
  85. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  86. package/dist/components/ds-mobile-sheet-nav.js.map +1 -1
  87. package/dist/components/ds-modal.js +1 -1
  88. package/dist/components/ds-panel-nav.js +1 -1
  89. package/dist/components/ds-panel-nav.js.map +1 -1
  90. package/dist/components/ds-panel-sub-nav.js +1 -1
  91. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  92. package/dist/components/ds-panel-tool-header.js +1 -1
  93. package/dist/components/ds-panel-tool-search.js +1 -1
  94. package/dist/components/ds-panel-tools.js +1 -1
  95. package/dist/components/ds-radio.js +1 -1
  96. package/dist/components/ds-radio.js.map +1 -1
  97. package/dist/components/ds-scroll-overlay.js +1 -1
  98. package/dist/components/ds-select.js +1 -1
  99. package/dist/components/ds-select.js.map +1 -1
  100. package/dist/components/ds-shell-app.js +1 -1
  101. package/dist/components/ds-shell-app.js.map +1 -1
  102. package/dist/components/ds-shell-page.js +1 -1
  103. package/dist/components/ds-shell-page.js.map +1 -1
  104. package/dist/components/ds-shell-tools.js +1 -1
  105. package/dist/components/ds-shell-tools.js.map +1 -1
  106. package/dist/components/ds-skeleton.js +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-tag.js.map +1 -1
  114. package/dist/components/ds-text.js +1 -1
  115. package/dist/components/ds-toast.js +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-CgEYdMee.js → p-6qXDqCj_.js} +2 -2
  120. package/dist/components/{p-Cr3tEx7o.js → p-Ay1AX7Ql.js} +2 -2
  121. package/dist/components/p-B-qDb_Zo.js +2 -0
  122. package/dist/components/p-B-qDb_Zo.js.map +1 -0
  123. package/dist/components/{p-BOCfICln.js → p-B1XW4VSn.js} +2 -2
  124. package/dist/components/p-B9p6w-_T.js +2 -0
  125. package/dist/components/p-B9p6w-_T.js.map +1 -0
  126. package/dist/components/p-BBFEhNzM.js +2 -0
  127. package/dist/components/p-BBFEhNzM.js.map +1 -0
  128. package/dist/components/p-BGUK8-Qm.js +2 -0
  129. package/dist/components/p-BGUK8-Qm.js.map +1 -0
  130. package/dist/components/p-BO4cj3iX.js +2 -0
  131. package/dist/components/{p-DCvA3Dc9.js.map → p-BO4cj3iX.js.map} +1 -1
  132. package/dist/components/{p-BKOlvCGS.js → p-BUZXuod2.js} +2 -2
  133. package/dist/components/p-BYWkksDO.js +2 -0
  134. package/dist/components/p-BYWkksDO.js.map +1 -0
  135. package/dist/components/p-BbMJTilO.js +2 -0
  136. package/dist/components/p-BbMJTilO.js.map +1 -0
  137. package/dist/components/{p-BO5aqZcf.js → p-BcTYhmku.js} +2 -2
  138. package/dist/components/p-BnQXAbif.js +2 -0
  139. package/dist/components/p-BnQXAbif.js.map +1 -0
  140. package/dist/components/p-BnbbnuVC.js +2 -0
  141. package/dist/components/p-BnbbnuVC.js.map +1 -0
  142. package/dist/components/{p-BDKtu6Wb.js → p-BroVnDzE.js} +2 -2
  143. package/dist/components/{p-CIiBpjCn.js → p-BsoqsbBh.js} +2 -2
  144. package/dist/components/p-BybqPD8K.js +2 -0
  145. package/dist/components/p-BybqPD8K.js.map +1 -0
  146. package/dist/components/{p-CCzG5xDD.js → p-C-aCzwhA.js} +2 -2
  147. package/dist/components/p-C-aCzwhA.js.map +1 -0
  148. package/dist/components/p-C-kzknkR.js +2 -0
  149. package/dist/components/p-C-kzknkR.js.map +1 -0
  150. package/dist/components/p-C-vRkDyn.js +2 -0
  151. package/dist/components/p-C-vRkDyn.js.map +1 -0
  152. package/dist/components/p-C4uYvyq6.js +2 -0
  153. package/dist/components/p-C4uYvyq6.js.map +1 -0
  154. package/dist/components/{p-C8HU4W8q.js → p-CBazaRlE.js} +2 -2
  155. package/dist/components/p-CH9yArA1.js +2 -0
  156. package/dist/components/p-CH9yArA1.js.map +1 -0
  157. package/dist/components/p-CHpNyAo1.js +2 -0
  158. package/dist/components/{p-CChcuL04.js.map → p-CHpNyAo1.js.map} +1 -1
  159. package/dist/components/{p-BhV5e6vF.js → p-CHuh71-U.js} +2 -2
  160. package/dist/components/p-CJDTh9Tg.js +2 -0
  161. package/dist/components/p-CJDTh9Tg.js.map +1 -0
  162. package/dist/components/p-CJbLY1tu.js +2 -0
  163. package/dist/components/p-CJbLY1tu.js.map +1 -0
  164. package/dist/components/p-CreGah0j.js +2 -0
  165. package/dist/components/p-Cvxm1OZB.js +2 -0
  166. package/dist/components/p-Cvxm1OZB.js.map +1 -0
  167. package/dist/components/p-D2xWcVv6.js +2 -0
  168. package/dist/components/p-D2xWcVv6.js.map +1 -0
  169. package/dist/components/p-DAW6G8Sl.js +2 -0
  170. package/dist/components/p-DAW6G8Sl.js.map +1 -0
  171. package/dist/components/p-DEaszb15.js +2 -0
  172. package/dist/components/p-DEaszb15.js.map +1 -0
  173. package/dist/components/{p-BgGP65Nn.js → p-DOUk4KoT.js} +1 -1
  174. package/dist/components/p-DOUk4KoT.js.map +1 -0
  175. package/dist/components/p-DbQr7Kwr.js +2 -0
  176. package/dist/components/p-DbQr7Kwr.js.map +1 -0
  177. package/dist/components/{p-Cuih680v.js → p-Df17mJqI.js} +2 -2
  178. package/dist/components/p-DhEdICfD.js +2 -0
  179. package/dist/components/p-DhEdICfD.js.map +1 -0
  180. package/dist/components/p-bxoryr-3.js +2 -0
  181. package/dist/components/p-bxoryr-3.js.map +1 -0
  182. package/dist/components/p-eAfNzlMa.js +2 -0
  183. package/dist/components/p-eAfNzlMa.js.map +1 -0
  184. package/dist/components/p-gZni7A2L.js +2 -0
  185. package/dist/components/p-gZni7A2L.js.map +1 -0
  186. package/dist/components/{p-YR1XeuZf.js → p-ohsLFap_.js} +2 -2
  187. package/dist/components/{p-DjbTFy2B.js → p-ymtdhOU5.js} +1 -1
  188. package/dist/components/p-ymtdhOU5.js.map +1 -0
  189. package/dist/docs/components.json +929 -2371
  190. package/dist/framework/angular.d.ts +0 -1
  191. package/dist/framework/angular.js +0 -1
  192. package/dist/lib/components/BarTitle/bar-title-types.d.ts +28 -0
  193. package/dist/lib/components/Breadcrumb/breadcrumb-types.d.ts +16 -0
  194. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +83 -0
  195. package/dist/lib/components/MobileHeader/mobile-header-types.d.ts +4 -0
  196. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +21 -7
  197. package/dist/lib/components/ShellApp/shell-app-types.d.ts +91 -0
  198. package/dist/lib/shell/index.d.ts +5 -13
  199. package/dist/lib/shell/index.js +87 -358
  200. package/dist/lib/shell/index.js.map +3 -3
  201. package/dist/lib/shell/shell-responsive.d.ts +2 -1
  202. package/dist/lib/utils/button-render.d.ts +17 -0
  203. package/dist/lib/utils/button-types.d.ts +10 -0
  204. package/dist/lib/utils/choice-list.d.ts +25 -0
  205. package/dist/lib/utils/control-press.d.ts +8 -0
  206. package/dist/lib/utils/form-association.d.ts +22 -0
  207. package/dist/lib/utils/index.d.ts +4 -0
  208. package/dist/lib/utils/index.js +63 -0
  209. package/dist/lib/utils/index.js.map +3 -3
  210. package/dist/lib/utils/required-validity.d.ts +1 -1
  211. package/dist/lib/utils/safe-url.d.ts +11 -0
  212. package/dist/mcp/cli.js +38 -10
  213. package/dist/mcp-data/registry/agent-activity.json +1 -1
  214. package/dist/mcp-data/registry/agent-response.json +1 -1
  215. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  216. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  217. package/dist/mcp-data/registry/attachment-list.json +2 -2
  218. package/dist/mcp-data/registry/avatar.json +1 -1
  219. package/dist/mcp-data/registry/badge.json +1 -1
  220. package/dist/mcp-data/registry/bar-nav.json +4 -22
  221. package/dist/mcp-data/registry/bar-title.json +1 -1
  222. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  223. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  224. package/dist/mcp-data/registry/button-filled.json +5 -20
  225. package/dist/mcp-data/registry/button-unfilled.json +15 -12
  226. package/dist/mcp-data/registry/card-data-viz.json +241 -0
  227. package/dist/mcp-data/registry/card-overview.json +39 -11
  228. package/dist/mcp-data/registry/card-setting.json +3 -3
  229. package/dist/mcp-data/registry/chart-bar.json +67 -19
  230. package/dist/mcp-data/registry/chart-donut.json +8 -8
  231. package/dist/mcp-data/registry/chart-legend.json +9 -11
  232. package/dist/mcp-data/registry/chart-line.json +2 -3
  233. package/dist/mcp-data/registry/checkbox.json +3 -3
  234. package/dist/mcp-data/registry/chip.json +1 -1
  235. package/dist/mcp-data/registry/code-block.json +1 -1
  236. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  237. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  238. package/dist/mcp-data/registry/conversation-list.json +1 -1
  239. package/dist/mcp-data/registry/divider.json +1 -1
  240. package/dist/mcp-data/registry/empty-state.json +1 -1
  241. package/dist/mcp-data/registry/field.json +3 -4
  242. package/dist/mcp-data/registry/icon.json +1 -1
  243. package/dist/mcp-data/registry/input.json +2 -2
  244. package/dist/mcp-data/registry/loader.json +1 -1
  245. package/dist/mcp-data/registry/markdown.json +2 -2
  246. package/dist/mcp-data/registry/menu.json +11 -22
  247. package/dist/mcp-data/registry/message-bubble.json +1 -1
  248. package/dist/mcp-data/registry/message-composer.json +1 -1
  249. package/dist/mcp-data/registry/message-scroller.json +1 -1
  250. package/dist/mcp-data/registry/message.json +1 -1
  251. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  252. package/dist/mcp-data/registry/mobile-header.json +2 -38
  253. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -20
  254. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  255. package/dist/mcp-data/registry/modal.json +1 -1
  256. package/dist/mcp-data/registry/panel-nav.json +3 -3
  257. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  258. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  259. package/dist/mcp-data/registry/panel-tool-search.json +2 -2
  260. package/dist/mcp-data/registry/panel-tools.json +20 -56
  261. package/dist/mcp-data/registry/radio.json +2 -2
  262. package/dist/mcp-data/registry/registry.json +295 -1175
  263. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  264. package/dist/mcp-data/registry/select.json +60 -26
  265. package/dist/mcp-data/registry/shell-app.json +346 -21
  266. package/dist/mcp-data/registry/shell-page.json +2 -2
  267. package/dist/mcp-data/registry/shell-tools.json +13 -44
  268. package/dist/mcp-data/registry/skeleton.json +1 -1
  269. package/dist/mcp-data/registry/slider.json +2 -2
  270. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  271. package/dist/mcp-data/registry/switch.json +2 -2
  272. package/dist/mcp-data/registry/tab-group.json +1 -1
  273. package/dist/mcp-data/registry/tag.json +1 -1
  274. package/dist/mcp-data/registry/text.json +1 -1
  275. package/dist/mcp-data/registry/toast.json +1 -1
  276. package/dist/mcp-data/registry/tooltip-data-viz.json +1 -1
  277. package/dist/mcp-data/registry/tooltip.json +1 -1
  278. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  279. package/dist/react/components.d.ts +1 -8
  280. package/dist/react/components.js +1 -8
  281. package/dist/react/ds-card-data-viz.d.ts +12 -0
  282. package/dist/react/ds-card-data-viz.js +12 -0
  283. package/dist/react/ds-menu.d.ts +1 -2
  284. package/dist/react/ds-menu.js +0 -1
  285. package/dist/react/ds-select.d.ts +2 -2
  286. package/dist/react/ds-shell-app.d.ts +24 -1
  287. package/dist/react/ds-shell-app.js +16 -1
  288. package/dist/types/components/AgentSourceList/AgentSourceList.d.ts +0 -1
  289. package/dist/types/components/BarNav/BarNav.d.ts +0 -2
  290. package/dist/types/components/BarNav/bar-nav-utils.d.ts +2 -4
  291. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +5 -11
  292. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +13 -10
  293. package/dist/types/components/CardDataViz/CardDataViz.d.ts +32 -0
  294. package/dist/types/components/CardDataViz/index.d.ts +2 -0
  295. package/dist/types/components/CardOverview/CardOverview.d.ts +17 -0
  296. package/dist/types/components/CardOverview/card-overview-controller.d.ts +16 -0
  297. package/dist/types/components/ChartBar/ChartBar.d.ts +12 -1
  298. package/dist/types/components/ChartBar/index.d.ts +2 -1
  299. package/dist/types/components/Menu/Menu.d.ts +0 -4
  300. package/dist/types/components/Menu/menu-sections.d.ts +4 -0
  301. package/dist/types/components/Menu/menu-types.d.ts +2 -11
  302. package/dist/types/components/MobileHeader/MobileHeader.d.ts +0 -5
  303. package/dist/types/components/MobileSectionSwitcher/MobileSectionSwitcher.d.ts +0 -2
  304. package/dist/types/components/PanelTools/PanelTools.d.ts +0 -4
  305. package/dist/types/components/PanelTools/index.d.ts +1 -1
  306. package/dist/types/components/PanelTools/panel-tools-types.d.ts +21 -7
  307. package/dist/types/components/PanelTools/panel-tools-utils.d.ts +1 -1
  308. package/dist/types/components/Select/Select.d.ts +12 -4
  309. package/dist/types/components/Select/index.d.ts +1 -1
  310. package/dist/types/components/ShellApp/ShellApp.d.ts +98 -0
  311. package/dist/types/components/ShellApp/shell-app-types.d.ts +92 -0
  312. package/dist/types/components/ShellPage/ShellPage.d.ts +5 -0
  313. package/dist/types/components/ShellTools/ShellTools.d.ts +2 -2
  314. package/dist/types/components.d.ts +210 -889
  315. package/dist/types/shell/index.d.ts +5 -13
  316. package/dist/types/shell/shell-responsive.d.ts +2 -1
  317. package/dist/types/utils/button-render.d.ts +18 -0
  318. package/dist/types/utils/button-story-foundation.d.ts +9 -0
  319. package/dist/types/utils/button-types.d.ts +11 -0
  320. package/dist/types/utils/form-association.d.ts +23 -0
  321. package/dist/types/utils/index.d.ts +4 -0
  322. package/dist/types/utils/required-validity.d.ts +1 -1
  323. package/dist/types/utils/safe-url.d.ts +12 -0
  324. package/dist/types/utils/select-controller.d.ts +1 -1
  325. package/package.json +18 -10
  326. package/dist/.build-stamp +0 -1
  327. package/dist/angular/ds-card-data-viz-bar.d.ts +0 -18
  328. package/dist/angular/ds-card-data-viz-bar.js +0 -42
  329. package/dist/angular/ds-card-data-viz-donut.d.ts +0 -18
  330. package/dist/angular/ds-card-data-viz-line.d.ts +0 -18
  331. package/dist/angular/ds-card-data-viz-line.js +0 -42
  332. package/dist/angular/ds-card-shell-data-viz.d.ts +0 -12
  333. package/dist/angular/ds-card-shell-data-viz.js +0 -38
  334. package/dist/angular/ds-chart-bar-stacked.d.ts +0 -12
  335. package/dist/angular/ds-chart-bar-stacked.js +0 -38
  336. package/dist/angular/ds-select-multi.d.ts +0 -28
  337. package/dist/angular/ds-select-multi.js +0 -49
  338. package/dist/angular/ds-shell-gradient-picker.d.ts +0 -16
  339. package/dist/angular/ds-shell-gradient-picker.js +0 -42
  340. package/dist/angular/ds-shell-gradient-swatch.d.ts +0 -16
  341. package/dist/angular/ds-shell-gradient-swatch.js +0 -42
  342. package/dist/components/ds-card-data-viz-bar.d.ts +0 -11
  343. package/dist/components/ds-card-data-viz-bar.js +0 -2
  344. package/dist/components/ds-card-data-viz-bar.js.map +0 -1
  345. package/dist/components/ds-card-data-viz-donut.d.ts +0 -11
  346. package/dist/components/ds-card-data-viz-donut.js +0 -2
  347. package/dist/components/ds-card-data-viz-donut.js.map +0 -1
  348. package/dist/components/ds-card-data-viz-line.d.ts +0 -11
  349. package/dist/components/ds-card-data-viz-line.js +0 -2
  350. package/dist/components/ds-card-data-viz-line.js.map +0 -1
  351. package/dist/components/ds-card-shell-data-viz.d.ts +0 -11
  352. package/dist/components/ds-card-shell-data-viz.js +0 -2
  353. package/dist/components/ds-card-shell-data-viz.js.map +0 -1
  354. package/dist/components/ds-chart-bar-stacked.d.ts +0 -11
  355. package/dist/components/ds-chart-bar-stacked.js +0 -2
  356. package/dist/components/ds-chart-bar-stacked.js.map +0 -1
  357. package/dist/components/ds-select-multi.js +0 -2
  358. package/dist/components/ds-select-multi.js.map +0 -1
  359. package/dist/components/ds-shell-gradient-picker.d.ts +0 -11
  360. package/dist/components/ds-shell-gradient-picker.js +0 -2
  361. package/dist/components/ds-shell-gradient-picker.js.map +0 -1
  362. package/dist/components/ds-shell-gradient-swatch.d.ts +0 -11
  363. package/dist/components/ds-shell-gradient-swatch.js +0 -2
  364. package/dist/components/ds-shell-gradient-swatch.js.map +0 -1
  365. package/dist/components/p-2foAUsDN.js +0 -2
  366. package/dist/components/p-2foAUsDN.js.map +0 -1
  367. package/dist/components/p-8GK7B7K4.js +0 -2
  368. package/dist/components/p-8GK7B7K4.js.map +0 -1
  369. package/dist/components/p-B5tMlca-.js +0 -2
  370. package/dist/components/p-B5tMlca-.js.map +0 -1
  371. package/dist/components/p-B88n0pO3.js +0 -2
  372. package/dist/components/p-B88n0pO3.js.map +0 -1
  373. package/dist/components/p-BBePKRHC.js +0 -2
  374. package/dist/components/p-BBePKRHC.js.map +0 -1
  375. package/dist/components/p-BOQnc-M4.js +0 -2
  376. package/dist/components/p-BOQnc-M4.js.map +0 -1
  377. package/dist/components/p-BgGP65Nn.js.map +0 -1
  378. package/dist/components/p-BrusnEYP.js +0 -2
  379. package/dist/components/p-BrusnEYP.js.map +0 -1
  380. package/dist/components/p-C61yJkfr.js +0 -2
  381. package/dist/components/p-C61yJkfr.js.map +0 -1
  382. package/dist/components/p-CChcuL04.js +0 -2
  383. package/dist/components/p-CCzG5xDD.js.map +0 -1
  384. package/dist/components/p-CGVXbXv9.js +0 -2
  385. package/dist/components/p-CGVXbXv9.js.map +0 -1
  386. package/dist/components/p-CH3w-P2H.js +0 -2
  387. package/dist/components/p-CH3w-P2H.js.map +0 -1
  388. package/dist/components/p-Cuqxh-Tq.js +0 -2
  389. package/dist/components/p-Cuqxh-Tq.js.map +0 -1
  390. package/dist/components/p-D1HFMTdC.js +0 -2
  391. package/dist/components/p-D1HFMTdC.js.map +0 -1
  392. package/dist/components/p-D2x17ei-.js +0 -2
  393. package/dist/components/p-D2x17ei-.js.map +0 -1
  394. package/dist/components/p-DCvA3Dc9.js +0 -2
  395. package/dist/components/p-DLZm_-sU.js +0 -2
  396. package/dist/components/p-DLZm_-sU.js.map +0 -1
  397. package/dist/components/p-DRnIuCiT.js +0 -2
  398. package/dist/components/p-DjKkSqrG.js +0 -2
  399. package/dist/components/p-DjKkSqrG.js.map +0 -1
  400. package/dist/components/p-DjbTFy2B.js.map +0 -1
  401. package/dist/components/p-DlscFn2m.js +0 -2
  402. package/dist/components/p-DlscFn2m.js.map +0 -1
  403. package/dist/components/p-DxkEC0hR.js +0 -2
  404. package/dist/components/p-DxkEC0hR.js.map +0 -1
  405. package/dist/components/p-Re2kPrXm.js +0 -2
  406. package/dist/components/p-Re2kPrXm.js.map +0 -1
  407. package/dist/components/p-XMZCaXs7.js +0 -2
  408. package/dist/components/p-XMZCaXs7.js.map +0 -1
  409. package/dist/components/p-dyUp3Adm.js +0 -2
  410. package/dist/components/p-dyUp3Adm.js.map +0 -1
  411. package/dist/components/p-nkYN0Bub.js +0 -2
  412. package/dist/components/p-nkYN0Bub.js.map +0 -1
  413. package/dist/framework/select-multi-value-accessor.d.ts +0 -9
  414. package/dist/framework/select-multi-value-accessor.js +0 -40
  415. package/dist/lib/shell/badge-gradient-ring.d.ts +0 -27
  416. package/dist/lib/shell/chrome-transition.d.ts +0 -32
  417. package/dist/lib/shell/shell-chrome-metrics.d.ts +0 -11
  418. package/dist/lib/shell/shell-gradient.d.ts +0 -41
  419. package/dist/lib/shell/shell-view-transition.d.ts +0 -23
  420. package/dist/mcp-data/registry/card-data-viz-bar.json +0 -213
  421. package/dist/mcp-data/registry/card-data-viz-donut.json +0 -214
  422. package/dist/mcp-data/registry/card-data-viz-line.json +0 -207
  423. package/dist/mcp-data/registry/card-shell-data-viz.json +0 -180
  424. package/dist/mcp-data/registry/chart-bar-stacked.json +0 -230
  425. package/dist/mcp-data/registry/select-multi.json +0 -758
  426. package/dist/mcp-data/registry/shell-gradient-picker.json +0 -195
  427. package/dist/mcp-data/registry/shell-gradient-swatch.json +0 -215
  428. package/dist/react/ds-card-data-viz-bar.d.ts +0 -12
  429. package/dist/react/ds-card-data-viz-bar.js +0 -12
  430. package/dist/react/ds-card-data-viz-donut.d.ts +0 -12
  431. package/dist/react/ds-card-data-viz-donut.js +0 -12
  432. package/dist/react/ds-card-data-viz-line.d.ts +0 -12
  433. package/dist/react/ds-card-data-viz-line.js +0 -12
  434. package/dist/react/ds-card-shell-data-viz.d.ts +0 -9
  435. package/dist/react/ds-card-shell-data-viz.js +0 -12
  436. package/dist/react/ds-chart-bar-stacked.d.ts +0 -9
  437. package/dist/react/ds-chart-bar-stacked.js +0 -12
  438. package/dist/react/ds-select-multi.d.ts +0 -14
  439. package/dist/react/ds-select-multi.js +0 -16
  440. package/dist/react/ds-shell-gradient-picker.d.ts +0 -12
  441. package/dist/react/ds-shell-gradient-picker.js +0 -12
  442. package/dist/react/ds-shell-gradient-swatch.d.ts +0 -12
  443. package/dist/react/ds-shell-gradient-swatch.js +0 -12
  444. package/dist/types/components/CardDataVizBar/CardDataVizBar.d.ts +0 -24
  445. package/dist/types/components/CardDataVizBar/index.d.ts +0 -2
  446. package/dist/types/components/CardDataVizDonut/CardDataVizDonut.d.ts +0 -28
  447. package/dist/types/components/CardDataVizDonut/index.d.ts +0 -2
  448. package/dist/types/components/CardDataVizLine/CardDataVizLine.d.ts +0 -24
  449. package/dist/types/components/CardDataVizLine/index.d.ts +0 -2
  450. package/dist/types/components/CardShellDataViz/CardShellDataViz.d.ts +0 -13
  451. package/dist/types/components/CardShellDataViz/index.d.ts +0 -2
  452. package/dist/types/components/ChartBarStacked/ChartBarStacked.d.ts +0 -26
  453. package/dist/types/components/ChartBarStacked/index.d.ts +0 -3
  454. package/dist/types/components/SelectMulti/SelectMulti.d.ts +0 -121
  455. package/dist/types/components/SelectMulti/index.d.ts +0 -2
  456. package/dist/types/components/ShellGradientPicker/ShellGradientPicker.d.ts +0 -12
  457. package/dist/types/components/ShellGradientSwatch/ShellGradientSwatch.d.ts +0 -15
  458. package/dist/types/components/ShellGradientSwatch/shell-gradient-swatch-types.d.ts +0 -4
  459. /package/dist/components/{p-CgEYdMee.js.map → p-6qXDqCj_.js.map} +0 -0
  460. /package/dist/components/{p-Cr3tEx7o.js.map → p-Ay1AX7Ql.js.map} +0 -0
  461. /package/dist/components/{p-BOCfICln.js.map → p-B1XW4VSn.js.map} +0 -0
  462. /package/dist/components/{p-BKOlvCGS.js.map → p-BUZXuod2.js.map} +0 -0
  463. /package/dist/components/{p-BO5aqZcf.js.map → p-BcTYhmku.js.map} +0 -0
  464. /package/dist/components/{p-BDKtu6Wb.js.map → p-BroVnDzE.js.map} +0 -0
  465. /package/dist/components/{p-CIiBpjCn.js.map → p-BsoqsbBh.js.map} +0 -0
  466. /package/dist/components/{p-C8HU4W8q.js.map → p-CBazaRlE.js.map} +0 -0
  467. /package/dist/components/{p-BhV5e6vF.js.map → p-CHuh71-U.js.map} +0 -0
  468. /package/dist/components/{p-DRnIuCiT.js.map → p-CreGah0j.js.map} +0 -0
  469. /package/dist/components/{p-Cuih680v.js.map → p-Df17mJqI.js.map} +0 -0
  470. /package/dist/components/{p-YR1XeuZf.js.map → p-ohsLFap_.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.9.0",
4
+ "packageVersion": "13.1.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -687,7 +687,7 @@
687
687
  ],
688
688
  "frameworkCaveats": {
689
689
  "customElements": [
690
- "Assign tabs as a JavaScript property for structured data; tabs-json is the string fallback.",
690
+ "Assign tabs as a JavaScript property and replace the array reference when the collection changes.",
691
691
  "Update tabs, heading, basePath, currentUrl, and navStyle from the same resolved route state."
692
692
  ],
693
693
  "react": [
@@ -739,10 +739,6 @@
739
739
  "type": "BarNavTab[]",
740
740
  "required": false
741
741
  },
742
- "tabsJson": {
743
- "type": "string",
744
- "required": false
745
- },
746
742
  "value": {
747
743
  "type": "string",
748
744
  "required": false
@@ -1321,7 +1317,7 @@
1321
1317
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
1322
1318
  "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
1323
1319
  "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.",
1320
+ "ButtonFilled has no active, pressed, or selected state; a filled action is a command, not a toggle or a persistent selection.",
1325
1321
  "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
1322
  "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."
1327
1323
  ],
@@ -1404,10 +1400,6 @@
1404
1400
  "type": "boolean",
1405
1401
  "required": false
1406
1402
  },
1407
- "pressed": {
1408
- "type": "boolean | undefined",
1409
- "required": false
1410
- },
1411
1403
  "rounded": {
1412
1404
  "type": "boolean",
1413
1405
  "required": false
@@ -1448,6 +1440,7 @@
1448
1440
  "@ds-mo/icons"
1449
1441
  ],
1450
1442
  "componentDependencies": [
1443
+ "badge",
1451
1444
  "icon",
1452
1445
  "loader",
1453
1446
  "text"
@@ -1506,7 +1499,7 @@
1506
1499
  "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
1500
  "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
1501
  "Use haspopup directly for a non-menu popup such as a listbox or dialog; those cases get no chevron.",
1509
- "Use active state only for a persistent toggle or mode, and synchronize pressed semantics unless an owning composite exposes the selection state.",
1502
+ "Use pressed only for a genuine toggle button; it supplies aria-pressed and dsChange intent. Use isActive only for owner-controlled visual emphasis inside a composite whose selection semantics live on the owner.",
1510
1503
  "Treat notification dots as supplemental unread or status information; never use a dot as the sole state, meaning, or accessible name.",
1511
1504
  "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.",
1512
1505
  "Use inactive state only when an unavailable action must remain visible.",
@@ -1514,8 +1507,9 @@
1514
1507
  ],
1515
1508
  "states": [
1516
1509
  "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1517
- "General content UI keeps the selected interaction fill and border for persistent active state.",
1518
- "Shell, navigation, and tool-rail chrome uses foreground-only active state with no selected fill or border.",
1510
+ "A true pressed toggle and owner-controlled isActive emphasis share the selected visual treatment, but only pressed supplies toggle semantics and dsChange.",
1511
+ "General content UI keeps the selected interaction fill and border for pressed or active emphasis.",
1512
+ "Shell, navigation, and tool-rail composites use isActive with foreground-only emphasis and no selected fill or border.",
1519
1513
  "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.",
1520
1514
  "Surface context must match the actual parent surface; translucent, inverted, media, and always-dark treatments are reserved for those surfaces.",
1521
1515
  "Loading prevents duplicate activation without applying inactive opacity or removing the current keyboard focus.",
@@ -1536,10 +1530,10 @@
1536
1530
  "Roving-focus composites own the button's tab-stop placement and selection semantics."
1537
1531
  ],
1538
1532
  "react": [
1539
- "Keep active, pressed, and async state synchronized from the owning toolbar or workflow."
1533
+ "Use pressed for controlled toggles and isActive for composite-owned emphasis; keep async state synchronized from the owner."
1540
1534
  ],
1541
1535
  "angular": [
1542
- "Keep active, pressed, and async state synchronized from the owning toolbar or workflow."
1536
+ "Use pressed for controlled toggles and isActive for composite-owned emphasis; keep async state synchronized from the owner."
1543
1537
  ]
1544
1538
  },
1545
1539
  "references": [
@@ -1670,203 +1664,79 @@
1670
1664
  ]
1671
1665
  },
1672
1666
  {
1673
- "id": "component:ds-card-data-viz-bar",
1674
- "tag": "ds-card-data-viz-bar",
1675
- "name": "card-data-viz-bar",
1676
- "title": "CardDataVizBar",
1677
- "summary": "Canonical bar-chart dashboard card with shared data-viz chrome, a filter action, a fill chart region, and an optional static legend.",
1667
+ "id": "component:ds-card-data-viz",
1668
+ "tag": "ds-card-data-viz",
1669
+ "name": "card-data-viz",
1670
+ "title": "CardDataViz",
1671
+ "summary": "Standard data-visualization card chrome with variant-owned chart and legend composition.",
1678
1672
  "intentStatus": "complete",
1679
1673
  "intent": {
1680
1674
  "audience": "specialized",
1681
1675
  "status": "experimental",
1682
- "summary": "Canonical bar-chart dashboard card with shared data-viz chrome, a filter action, a fill chart region, and an optional static legend.",
1676
+ "summary": "Standard data-visualization card chrome with variant-owned chart and legend composition.",
1683
1677
  "useWhen": [
1684
- "A dashboard widget needs a regular, stacked, or percentage bar chart in the standard data-viz card.",
1685
- "A stacked bar chart needs a visible static series key beneath the chart."
1678
+ "A chart, legend, metric visualization, or custom data-viz composition needs standard card chrome.",
1679
+ "Bar and line legends should remain static, or a donut and legend should cross-highlight without redundant donut tooltips.",
1680
+ "A data-viz card needs a visible heading, optional filter action, and application-owned chart data."
1686
1681
  ],
1687
1682
  "avoidWhen": [
1688
- "The visualization needs selectable legend rows or chart-to-legend hover synchronization.",
1689
- "The product needs supporting metrics or an alternate chart layout beyond the chart and optional legend."
1683
+ "The card contains editable settings; use CardSetting.",
1684
+ "The surface contains ordinary non-visualization content.",
1685
+ "The application needs to replace the card chrome rather than compose its chart and actions."
1690
1686
  ],
1691
1687
  "alternatives": [
1692
1688
  {
1693
- "when": "The bar chart needs a custom layout without card chrome.",
1694
- "component": "component:ds-chart-bar",
1695
- "reason": "Compose ChartBar directly in the product-owned layout."
1696
- },
1697
- {
1698
- "when": "The visualization communicates change as continuous lines.",
1699
- "component": "component:ds-card-data-viz-line",
1700
- "reason": "CardDataVizLine owns the canonical line-chart card layout."
1701
- },
1702
- {
1703
- "when": "The visualization communicates parts of one total with synchronized slice emphasis.",
1704
- "component": "component:ds-card-data-viz-donut",
1705
- "reason": "CardDataVizDonut owns the donut layout and bidirectional hover synchronization."
1689
+ "when": "The surface contains editable settings.",
1690
+ "component": "component:ds-card-setting",
1691
+ "reason": "CardSetting owns the controlled settings-section workflow."
1706
1692
  }
1707
1693
  ],
1708
1694
  "commonlyComposedWith": [
1709
- "component:ds-card-shell-data-viz",
1710
1695
  "component:ds-chart-bar",
1711
- "component:ds-chart-bar-stacked",
1712
- "component:ds-chart-legend",
1713
- "component:ds-button-unfilled"
1714
- ],
1715
- "accessibility": [
1716
- "Provide a concise heading that identifies the measure and meaningful visible labels for every legend entry.",
1717
- "Keep essential series and value context available textually rather than relying on bar color alone.",
1718
- "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1719
- ],
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.",
1722
- "The chart region fills the remaining card body while an optional legend remains content-sized.",
1723
- "The card disables local hover highlighting on a slotted ChartLegend because bar legends are static keys.",
1724
- "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1725
- "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1726
- ],
1727
- "responsiveBehavior": [
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.",
1729
- "The horizontal legend wraps complete entries when the available width is constrained.",
1730
- "The parent dashboard owns card wrapping and breakpoint changes."
1731
- ],
1732
- "frameworkCaveats": {
1733
- "customElements": [
1734
- "Assign data or series and categories as JavaScript properties, then place the bar chart and optional legend in their named slots."
1735
- ],
1736
- "react": [
1737
- "Keep filter and dataset state in the owner; pass the chart and optional legend with chart and legend slot attributes."
1738
- ],
1739
- "angular": [
1740
- "Keep filter and dataset state in the owner; project the chart and optional legend into the chart and legend slots."
1741
- ]
1742
- },
1743
- "references": [
1744
- {
1745
- "label": "Storybook examples",
1746
- "path": "src/wc/components/CardDataVizBar/CardDataVizBar.stories.ts"
1747
- }
1748
- ]
1749
- },
1750
- "api": {
1751
- "props": {
1752
- "cardWidth": {
1753
- "type": "CardDataVizBarWidth",
1754
- "required": false
1755
- },
1756
- "filterLabel": {
1757
- "type": "string",
1758
- "required": false
1759
- },
1760
- "heading": {
1761
- "type": "string",
1762
- "required": true
1763
- }
1764
- },
1765
- "events": [
1766
- {
1767
- "name": "dsFilterClick",
1768
- "detail": "void"
1769
- }
1770
- ],
1771
- "slots": []
1772
- },
1773
- "exports": {
1774
- "customElement": "ds-card-data-viz-bar",
1775
- "react": "DsCardDataVizBar",
1776
- "angular": "DsCardDataVizBar"
1777
- },
1778
- "dependencies": [
1779
- "@ds-mo/ui",
1780
- "@ds-mo/tokens"
1781
- ],
1782
- "componentDependencies": [
1783
- "button-unfilled",
1784
- "card-shell-data-viz"
1785
- ]
1786
- },
1787
- {
1788
- "id": "component:ds-card-data-viz-donut",
1789
- "tag": "ds-card-data-viz-donut",
1790
- "name": "card-data-viz-donut",
1791
- "title": "CardDataVizDonut",
1792
- "summary": "Canonical donut-plus-legend dashboard card with shared data-viz chrome, a filter action, fill chart region, content-sized legend, and built-in hover synchronization.",
1793
- "intentStatus": "complete",
1794
- "intent": {
1795
- "audience": "specialized",
1796
- "status": "experimental",
1797
- "summary": "Canonical donut-plus-legend dashboard card with shared data-viz chrome, a filter action, fill chart region, content-sized legend, and built-in hover synchronization.",
1798
- "useWhen": [
1799
- "A dashboard widget needs the standard donut and visible legend composition in one data-viz card.",
1800
- "Chart slices and legend rows should cross-highlight without application hover wiring.",
1801
- "The card needs the shared header filter action while the application owns filter state and menu content."
1802
- ],
1803
- "avoidWhen": [
1804
- "The visualization is a bar, line, metric, or custom chart; compose CardShellDataViz directly.",
1805
- "The product needs a custom legend treatment such as chips, external stat callouts, or selectable filters.",
1806
- "The surface is a settings section or generic content card."
1807
- ],
1808
- "alternatives": [
1809
- {
1810
- "when": "The visualization needs shared data-viz chrome without the canonical donut layout.",
1811
- "component": "component:ds-card-shell-data-viz",
1812
- "reason": "CardShellDataViz owns only the header, actions, width, and body boundary."
1813
- },
1814
- {
1815
- "when": "A donut and legend need a custom layout without card chrome.",
1816
- "component": "component:ds-chart-donut",
1817
- "reason": "Compose the chart and ChartLegend directly and own their layout and hover synchronization."
1818
- }
1819
- ],
1820
- "commonlyComposedWith": [
1821
- "component:ds-card-shell-data-viz",
1822
1696
  "component:ds-chart-donut",
1697
+ "component:ds-chart-line",
1823
1698
  "component:ds-chart-legend",
1824
- "component:ds-empty-state",
1825
- "component:ds-skeleton"
1699
+ "component:ds-button-unfilled"
1826
1700
  ],
1827
1701
  "accessibility": [
1828
- "Provide a concise card heading and a localized filter label for the icon-only header action.",
1829
- "Keep essential values available through the chart and visible legend rather than encoding meaning through slice color alone.",
1830
- "The application owns meaningful loading, empty, and error status copy when either content region is temporarily replaced or absent."
1702
+ "Provide a concise visible heading; the component renders it as a section heading.",
1703
+ "Slotted actions must provide accessible names and controlled-state semantics.",
1704
+ "Charts retain their own image names and data summaries.",
1705
+ "A visible donut legend owns persistent labels and values, so donut mode suppresses the redundant slice tooltip."
1831
1706
  ],
1832
1707
  "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.",
1834
- "The chart region fills remaining card height while the legend remains content-sized.",
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.",
1836
- "Hover synchronization changes highlight only; it never represents selection, filtering, or navigation.",
1837
- "The filter action emits intent while the parent owns popup content, applied constraints, and data updates."
1708
+ "Custom mode provides flexible body chrome and does not mutate chart or legend interaction.",
1709
+ "Bar and line modes keep a slotted legend static by disabling hover emphasis.",
1710
+ "Donut mode synchronizes active labels between chart and legend and shows chart tooltips only when no legend is present.",
1711
+ "showFilter adds the standard filter action and emits dsFilterClick without owning filter state."
1838
1712
  ],
1839
1713
  "responsiveBehavior": [
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.",
1842
- "The parent dashboard owns wrapping and column changes while the internal chart-over-legend arrangement remains stable."
1714
+ "The sm, md, or lg width sets a matching token-based minimum height and remains constrained by its parent.",
1715
+ "The body allocates remaining height to the chart while legends retain content height.",
1716
+ "Parent layouts own wrapping, stacking, and breakpoint-dependent card width."
1843
1717
  ],
1844
1718
  "frameworkCaveats": {
1845
1719
  "customElements": [
1846
- "Assign chart data and legend items as JavaScript properties and place the components in the chart and legend slots."
1720
+ "Set variant to bar, line, or donut when the component should manage legend interaction; slot chart, legend, actions, and supporting content by name."
1847
1721
  ],
1848
1722
  "react": [
1849
- "Keep filter and dataset state in the owner; the card handles hover synchronization for the canonical slotted pair."
1723
+ "Keep chart data in React and pass chart, legend, and action elements through named slots."
1850
1724
  ],
1851
1725
  "angular": [
1852
- "Keep filter and dataset state in the owner; the card handles hover synchronization for the canonical slotted pair."
1726
+ "Keep chart data in Angular and project chart, legend, and action elements through named slots."
1853
1727
  ]
1854
1728
  },
1855
1729
  "references": [
1856
1730
  {
1857
1731
  "label": "Storybook examples",
1858
- "path": "src/wc/components/CardDataVizDonut/CardDataVizDonut.stories.ts"
1859
- },
1860
- {
1861
- "label": "Dashboard review examples",
1862
- "path": "src/wc/stories/DataViz/OverviewReview.stories.ts"
1732
+ "path": "src/wc/components/CardDataViz/CardDataViz.stories.ts"
1863
1733
  }
1864
1734
  ]
1865
1735
  },
1866
1736
  "api": {
1867
1737
  "props": {
1868
1738
  "cardWidth": {
1869
- "type": "CardDataVizDonutWidth",
1739
+ "type": "CardDataVizWidth",
1870
1740
  "required": false
1871
1741
  },
1872
1742
  "filterLabel": {
@@ -1876,115 +1746,14 @@
1876
1746
  "heading": {
1877
1747
  "type": "string",
1878
1748
  "required": true
1879
- }
1880
- },
1881
- "events": [
1882
- {
1883
- "name": "dsFilterClick",
1884
- "detail": "void"
1885
- }
1886
- ],
1887
- "slots": []
1888
- },
1889
- "exports": {
1890
- "customElement": "ds-card-data-viz-donut",
1891
- "react": "DsCardDataVizDonut",
1892
- "angular": "DsCardDataVizDonut"
1893
- },
1894
- "dependencies": [
1895
- "@ds-mo/ui",
1896
- "@ds-mo/tokens"
1897
- ],
1898
- "componentDependencies": [
1899
- "button-unfilled",
1900
- "card-shell-data-viz"
1901
- ]
1902
- },
1903
- {
1904
- "id": "component:ds-card-data-viz-line",
1905
- "tag": "ds-card-data-viz-line",
1906
- "name": "card-data-viz-line",
1907
- "title": "CardDataVizLine",
1908
- "summary": "Canonical line-chart dashboard card with shared data-viz chrome, a filter action, fill chart region, and a static horizontal legend.",
1909
- "intentStatus": "complete",
1910
- "intent": {
1911
- "audience": "specialized",
1912
- "status": "experimental",
1913
- "summary": "Canonical line-chart dashboard card with shared data-viz chrome, a filter action, fill chart region, and a static horizontal legend.",
1914
- "useWhen": [
1915
- "A dashboard widget needs the standard line chart and visible series key in one data-viz card.",
1916
- "The legend identifies static line series and should not highlight or dim rows on hover."
1917
- ],
1918
- "avoidWhen": [
1919
- "The visualization needs chart-to-legend hover synchronization or selectable series controls.",
1920
- "The product needs a custom legend treatment, supporting metrics, or an alternate chart layout."
1921
- ],
1922
- "alternatives": [
1923
- {
1924
- "when": "The line chart and legend need a custom layout without card chrome.",
1925
- "component": "component:ds-chart-line",
1926
- "reason": "Compose ChartLine and a static ChartLegend directly in the product-owned layout."
1927
1749
  },
1928
- {
1929
- "when": "The visualization communicates parts of a total with synchronized slice emphasis.",
1930
- "component": "component:ds-card-data-viz-donut",
1931
- "reason": "CardDataVizDonut owns the donut layout and bidirectional hover synchronization."
1932
- }
1933
- ],
1934
- "commonlyComposedWith": [
1935
- "component:ds-card-shell-data-viz",
1936
- "component:ds-chart-line",
1937
- "component:ds-chart-legend",
1938
- "component:ds-button-unfilled"
1939
- ],
1940
- "accessibility": [
1941
- "Provide a concise heading that identifies the trend and meaningful visible labels for every legend entry.",
1942
- "Keep essential series and value context available textually rather than relying on line color alone.",
1943
- "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1944
- ],
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.",
1947
- "The chart region fills the remaining card body while the legend remains content-sized.",
1948
- "The card disables local hover highlighting on a slotted ChartLegend because the line chart is static.",
1949
- "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1950
- "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1951
- ],
1952
- "responsiveBehavior": [
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.",
1954
- "The horizontal legend wraps complete entries when the available width is constrained.",
1955
- "The parent dashboard owns card wrapping and breakpoint changes."
1956
- ],
1957
- "frameworkCaveats": {
1958
- "customElements": [
1959
- "Assign series, categories, and legend items as JavaScript properties, then place the chart and legend in their named slots."
1960
- ],
1961
- "react": [
1962
- "Keep filter and dataset state in the owner; pass the chart and legend with chart and legend slot attributes."
1963
- ],
1964
- "angular": [
1965
- "Keep filter and dataset state in the owner; project the chart and legend into the chart and legend slots."
1966
- ]
1967
- },
1968
- "references": [
1969
- {
1970
- "label": "Storybook examples",
1971
- "path": "src/wc/components/CardDataVizLine/CardDataVizLine.stories.ts"
1972
- }
1973
- ]
1974
- },
1975
- "api": {
1976
- "props": {
1977
- "cardWidth": {
1978
- "type": "CardDataVizLineWidth",
1750
+ "showFilter": {
1751
+ "type": "boolean",
1979
1752
  "required": false
1980
1753
  },
1981
- "filterLabel": {
1982
- "type": "string",
1754
+ "variant": {
1755
+ "type": "CardDataVizVariant",
1983
1756
  "required": false
1984
- },
1985
- "heading": {
1986
- "type": "string",
1987
- "required": true
1988
1757
  }
1989
1758
  },
1990
1759
  "events": [
@@ -1996,9 +1765,9 @@
1996
1765
  "slots": []
1997
1766
  },
1998
1767
  "exports": {
1999
- "customElement": "ds-card-data-viz-line",
2000
- "react": "DsCardDataVizLine",
2001
- "angular": "DsCardDataVizLine"
1768
+ "customElement": "ds-card-data-viz",
1769
+ "react": "DsCardDataViz",
1770
+ "angular": "DsCardDataViz"
2002
1771
  },
2003
1772
  "dependencies": [
2004
1773
  "@ds-mo/ui",
@@ -2006,7 +1775,7 @@
2006
1775
  ],
2007
1776
  "componentDependencies": [
2008
1777
  "button-unfilled",
2009
- "card-shell-data-viz"
1778
+ "text"
2010
1779
  ]
2011
1780
  },
2012
1781
  {
@@ -2014,12 +1783,12 @@
2014
1783
  "tag": "ds-card-overview",
2015
1784
  "name": "card-overview",
2016
1785
  "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.",
1786
+ "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 elevated scroll-collapse surface and compact 48px presentation.",
2018
1787
  "intentStatus": "complete",
2019
1788
  "intent": {
2020
1789
  "audience": "general",
2021
1790
  "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.",
1791
+ "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 elevated scroll-collapse surface and compact 48px presentation.",
2023
1792
  "useWhen": [
2024
1793
  "A page opens with one headline figure that the surrounding measures explain.",
2025
1794
  "Every measure is compared against the same period, so one caption describes the comparison for all of them.",
@@ -2034,8 +1803,8 @@
2034
1803
  "alternatives": [
2035
1804
  {
2036
1805
  "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."
1806
+ "component": "component:ds-card-data-viz",
1807
+ "reason": "CardDataViz owns the data-visualization card contract; the overview grid presents values and change only."
2039
1808
  },
2040
1809
  {
2041
1810
  "when": "The surface is a settings section with an edit workflow.",
@@ -2065,6 +1834,7 @@
2065
1834
  "Loading replaces the score and the measures with skeletons and does not alter the slotted period control.",
2066
1835
  "At most six measures are shown. Keep larger collections outside the summary bar rather than turning it into a dense dashboard.",
2067
1836
  "The period control is slotted rather than owned, because the choice of stepper, select, or date range varies by product surface.",
1837
+ "During a page-controlled scroll collapse, the component preserves its expanded flow height while the elevated visual surface shrinks toward 48px and the full content translates upward inside an internal clip. The elevation remains fitted to the visible surface instead of being clipped with the content.",
2068
1838
  "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
1839
  ],
2070
1840
  "responsiveBehavior": [
@@ -2076,20 +1846,24 @@
2076
1846
  "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
1847
  "Every measure occupies a full-width row in the stacked state.",
2078
1848
  "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."
1849
+ "CardOverview does not observe scroll, choose sticky offsets, or switch its own presentation. The page owner supplies collapse progress, keeps the card sticky at the appropriate shell inset, and swaps to compact at the 48px endpoint.",
1850
+ "Leave scroll collapse inactive on page modes that do not support sticky compact summary chrome."
2080
1851
  ],
2081
1852
  "frameworkCaveats": {
2082
1853
  "customElements": [
2083
1854
  "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."
1855
+ "Place the period control in the filter slot; the component reserves space for it but never renders one.",
1856
+ "When driving scroll collapse, update scrollCollapseProgress from page-owned geometry and swap to a separate compact presentation at the endpoint."
2085
1857
  ],
2086
1858
  "react": [
2087
1859
  "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."
1860
+ "Derive each trend with resolveMetricTrend so tone stays an explicit product decision.",
1861
+ "Keep sticky geometry and scrollCollapseProgress in the page owner; CardOverview only renders the visual collapse."
2089
1862
  ],
2090
1863
  "angular": [
2091
1864
  "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."
1865
+ "Derive each trend with resolveMetricTrend so tone stays an explicit product decision.",
1866
+ "Keep sticky geometry and [scrollCollapseProgress] in the page owner; CardOverview only renders the visual collapse."
2093
1867
  ]
2094
1868
  },
2095
1869
  "references": [
@@ -2141,6 +1915,10 @@
2141
1915
  "type": "string | undefined",
2142
1916
  "required": false
2143
1917
  },
1918
+ "scrollCollapseProgress": {
1919
+ "type": "number",
1920
+ "required": false
1921
+ },
2144
1922
  "variant": {
2145
1923
  "type": "CardOverviewVariant",
2146
1924
  "required": false
@@ -2197,8 +1975,8 @@
2197
1975
  "alternatives": [
2198
1976
  {
2199
1977
  "when": "The surface contains a chart or specialized data-visualization composition.",
2200
- "component": "component:ds-card-shell-data-viz",
2201
- "reason": "CardShellDataViz owns the independently evolving data-visualization shell contract."
1978
+ "component": "component:ds-card-data-viz",
1979
+ "reason": "CardDataViz owns the independently evolving data-visualization card contract."
2202
1980
  },
2203
1981
  {
2204
1982
  "when": "The task must block the interface for one focused decision or short workflow.",
@@ -2315,141 +2093,30 @@
2315
2093
  "text"
2316
2094
  ]
2317
2095
  },
2318
- {
2319
- "id": "component:ds-card-shell-data-viz",
2320
- "tag": "ds-card-shell-data-viz",
2321
- "name": "card-shell-data-viz",
2322
- "title": "CardShellDataViz",
2323
- "summary": "Dedicated header, action, sizing, and body chrome for data-visualization cards whose layouts evolve independently from settings sections.",
2324
- "intentStatus": "complete",
2325
- "intent": {
2326
- "audience": "specialized",
2327
- "status": "experimental",
2328
- "summary": "Dedicated header, action, sizing, and body chrome for data-visualization cards whose layouts evolve independently from settings sections.",
2329
- "useWhen": [
2330
- "A card contains a chart, data-visualization legend, metric visualization, or a specialized data-viz composition.",
2331
- "A data-visualization card needs a heading and optional header actions while retaining a flexible body for its composing component.",
2332
- "Several chart-specific cards need one shell boundary that can evolve without changing settings sections."
2333
- ],
2334
- "avoidWhen": [
2335
- "The card contains settings or editable form content; use the settings card composition.",
2336
- "The surface is ordinary content without data visualization; use a product-owned layout rather than data-viz card chrome.",
2337
- "The shell would own chart-specific layout, hover synchronization, legends, or empty-state policy; keep those in the composing data-viz card."
2338
- ],
2339
- "alternatives": [
2340
- {
2341
- "when": "The surface contains editable settings rather than data visualization.",
2342
- "component": "component:ds-card-setting",
2343
- "reason": "CardSetting owns the persistent controlled settings-section workflow."
2344
- },
2345
- {
2346
- "when": "The composition is the standard donut chart plus synchronized legend.",
2347
- "component": "component:ds-card-data-viz-donut",
2348
- "reason": "CardDataVizDonut composes this shell with donut-specific regions and hover synchronization."
2349
- },
2350
- {
2351
- "when": "The composition is the standard line chart plus static horizontal legend.",
2352
- "component": "component:ds-card-data-viz-line",
2353
- "reason": "CardDataVizLine composes this shell with line-specific regions and disables decorative legend hover."
2354
- }
2355
- ],
2356
- "commonlyComposedWith": [
2357
- "component:ds-chart-bar",
2358
- "component:ds-chart-bar-stacked",
2359
- "component:ds-chart-donut",
2360
- "component:ds-chart-line",
2361
- "component:ds-chart-legend",
2362
- "component:ds-card-data-viz-line",
2363
- "component:ds-button-unfilled"
2364
- ],
2365
- "accessibility": [
2366
- "Provide a concise visible heading that identifies the visualization; the shell renders it as a section heading.",
2367
- "Header actions must provide their own accessible names and communicate any controlled state or popup relationship.",
2368
- "The shell does not add landmark or chart semantics; composing charts retain their own accessible names and descriptions.",
2369
- "Do not duplicate chart data in the heading. Provide an accessible summary through the chart or adjacent composition when visual encoding alone is insufficient."
2370
- ],
2371
- "states": [
2372
- "The shell owns default data-visualization surface chrome only; loading, empty, error, selected, and interactive states belong to the composing card or chart.",
2373
- "The actions slot collapses when empty so headings retain the available header width."
2374
- ],
2375
- "responsiveBehavior": [
2376
- "The selected sm, md, or lg width sets the matching token-based minimum height while max-width prevents overflow from a narrower parent.",
2377
- "The parent layout chooses card width, wrapping, stacking, and breakpoint changes; the shell does not switch sizes automatically.",
2378
- "The body is a flexible column so specialized data-viz cards can allocate remaining height between charts, legends, and supporting content."
2379
- ],
2380
- "frameworkCaveats": {
2381
- "customElements": [
2382
- "Place header controls in the actions slot and data-visualization composition in the default slot."
2383
- ],
2384
- "react": [
2385
- "Pass header controls with slot=\"actions\" and keep chart state in the composing React component."
2386
- ],
2387
- "angular": [
2388
- "Project header controls with slot=\"actions\" and keep chart state in the composing Angular component."
2389
- ]
2390
- },
2391
- "references": [
2392
- {
2393
- "label": "Storybook examples",
2394
- "path": "src/wc/components/CardShellDataViz/CardShellDataViz.stories.ts"
2395
- }
2396
- ]
2397
- },
2398
- "api": {
2399
- "props": {
2400
- "cardWidth": {
2401
- "type": "CardShellDataVizWidth",
2402
- "required": false
2403
- },
2404
- "heading": {
2405
- "type": "string",
2406
- "required": true
2407
- }
2408
- },
2409
- "events": [],
2410
- "slots": []
2411
- },
2412
- "exports": {
2413
- "customElement": "ds-card-shell-data-viz",
2414
- "react": "DsCardShellDataViz",
2415
- "angular": "DsCardShellDataViz"
2416
- },
2417
- "dependencies": [
2418
- "@ds-mo/ui",
2419
- "@ds-mo/tokens"
2420
- ],
2421
- "componentDependencies": [
2422
- "text"
2423
- ]
2424
- },
2425
2096
  {
2426
2097
  "id": "component:ds-chart-bar",
2427
2098
  "tag": "ds-chart-bar",
2428
2099
  "name": "chart-bar",
2429
2100
  "title": "ChartBar",
2430
- "summary": "Single-series bar chart for comparing discrete categories or evenly spaced time buckets on a band-scaled axis.",
2101
+ "summary": "Bar chart for single-series magnitude, additive stacked totals, or normalized 0–100% composition across categories.",
2431
2102
  "intentStatus": "complete",
2432
2103
  "intent": {
2433
2104
  "audience": "specialized",
2434
2105
  "status": "experimental",
2435
- "summary": "Single-series bar chart for comparing discrete categories or evenly spaced time buckets on a band-scaled axis.",
2106
+ "summary": "Bar chart for single-series magnitude, additive stacked totals, or normalized 0–100% composition across categories.",
2436
2107
  "useWhen": [
2437
2108
  "Users need to compare one numeric measure across a small set of categories.",
2438
2109
  "Values are grouped into ordered time buckets such as hours, days, weeks, or months and equal visual spacing is appropriate.",
2439
- "A data-viz card needs a compact magnitude comparison rather than a continuous trend."
2110
+ "A data-viz card needs a compact magnitude comparison rather than a continuous trend.",
2111
+ "Several consistent series contribute to each category total or its normalized composition."
2440
2112
  ],
2441
2113
  "avoidWhen": [
2442
2114
  "Timestamp positions must reflect irregular elapsed time; pre-bucket the data or use a future continuous time-scale chart.",
2443
- "The visualization needs stacked, grouped, or multi-series bars.",
2115
+ "The visualization needs grouped bars or precise comparison of each individual series across categories.",
2444
2116
  "The interaction requires selection, drill-down, brushing, or zoom.",
2445
2117
  "The data communicates a part-to-whole relationship."
2446
2118
  ],
2447
2119
  "alternatives": [
2448
- {
2449
- "when": "Each category contains several additive series or needs normalized composition.",
2450
- "component": "component:ds-chart-bar-stacked",
2451
- "reason": "ChartBarStacked compares raw stacked totals or normalized 0–100% composition."
2452
- },
2453
2120
  {
2454
2121
  "when": "Users need to follow one or more trends across ordered categories.",
2455
2122
  "component": "component:ds-chart-line",
@@ -2462,8 +2129,8 @@
2462
2129
  }
2463
2130
  ],
2464
2131
  "commonlyComposedWith": [
2465
- "component:ds-chart-bar-stacked",
2466
- "component:ds-card-shell-data-viz",
2132
+ "component:ds-chart-legend",
2133
+ "component:ds-card-data-viz",
2467
2134
  "component:ds-tooltip-data-viz"
2468
2135
  ],
2469
2136
  "accessibility": [
@@ -2472,7 +2139,9 @@
2472
2139
  "A future interactive tooltip must supplement rather than replace the chart's accessible value representation."
2473
2140
  ],
2474
2141
  "states": [
2475
- "The chart is currently a static single-series rendering without hover, selection, loading, or empty-state policy.",
2142
+ "The chart is static without hover, selection, loading, or empty-state policy.",
2143
+ "Single mode reads data. Stacked and percentage modes read aligned series and categories.",
2144
+ "Stacked mode preserves raw totals; percentage mode normalizes every non-empty category to 100%.",
2476
2145
  "An empty dataset renders no bars; the owning card or product supplies meaningful empty-state messaging.",
2477
2146
  "Bars use 2px top corner radii while the lower corners touching the zero axis remain square.",
2478
2147
  "Use one consistent bar color across time buckets when every bar is the same measure at a different interval; categorical color changes are for genuinely distinct categories.",
@@ -2486,13 +2155,13 @@
2486
2155
  ],
2487
2156
  "frameworkCaveats": {
2488
2157
  "customElements": [
2489
- "Assign data as a JavaScript property; arrays are not supported as HTML attributes."
2158
+ "Assign data, series, and categories as JavaScript properties; arrays are not supported as HTML attributes."
2490
2159
  ],
2491
2160
  "react": [
2492
- "Pass a stable data array; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2161
+ "Pass stable data or series/category arrays; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2493
2162
  ],
2494
2163
  "angular": [
2495
- "Bind data as a property; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2164
+ "Bind data or series/categories as properties; width and height provide standalone intrinsic dimensions while constrained containers reflow automatically."
2496
2165
  ]
2497
2166
  },
2498
2167
  "references": [
@@ -2504,6 +2173,10 @@
2504
2173
  },
2505
2174
  "api": {
2506
2175
  "props": {
2176
+ "categories": {
2177
+ "type": "string[]",
2178
+ "required": false
2179
+ },
2507
2180
  "data": {
2508
2181
  "type": "ChartDatum[]",
2509
2182
  "required": false
@@ -2512,6 +2185,14 @@
2512
2185
  "type": "number",
2513
2186
  "required": false
2514
2187
  },
2188
+ "series": {
2189
+ "type": "ChartSeries[]",
2190
+ "required": false
2191
+ },
2192
+ "variant": {
2193
+ "type": "ChartBarVariant",
2194
+ "required": false
2195
+ },
2515
2196
  "width": {
2516
2197
  "type": "number",
2517
2198
  "required": false
@@ -2532,134 +2213,16 @@
2532
2213
  "componentDependencies": []
2533
2214
  },
2534
2215
  {
2535
- "id": "component:ds-chart-bar-stacked",
2536
- "tag": "ds-chart-bar-stacked",
2537
- "name": "chart-bar-stacked",
2538
- "title": "ChartBarStacked",
2539
- "summary": "Multi-series stacked bar chart for comparing raw totals or normalized 0–100% composition across ordered categories and time buckets.",
2216
+ "id": "component:ds-chart-donut",
2217
+ "tag": "ds-chart-donut",
2218
+ "name": "chart-donut",
2219
+ "title": "ChartDonut",
2220
+ "summary": "Part-to-whole donut chart with a center aggregate, responsive fill sizing, local slice tooltip feedback, and externally controlled legend highlighting.",
2540
2221
  "intentStatus": "complete",
2541
2222
  "intent": {
2542
2223
  "audience": "specialized",
2543
2224
  "status": "experimental",
2544
- "summary": "Multi-series stacked bar chart for comparing raw totals or normalized 0–100% composition across ordered categories and time buckets.",
2545
- "useWhen": [
2546
- "Users need to compare both a category total and the contribution of several consistent series.",
2547
- "A time series needs to show how its composition changes across equal time buckets.",
2548
- "Every category should normalize to 100% so proportional composition can be compared independently of total magnitude."
2549
- ],
2550
- "avoidWhen": [
2551
- "Users need to compare individual series values precisely across categories; use grouped bars or separate charts.",
2552
- "The visualization has only one measure per category; use ChartBar.",
2553
- "The primary task is following continuous trends; use ChartLine.",
2554
- "Series contain negative values or do not align with the shared category list."
2555
- ],
2556
- "alternatives": [
2557
- {
2558
- "when": "Each category contains one independent value.",
2559
- "component": "component:ds-chart-bar",
2560
- "reason": "ChartBar provides the simpler single-series magnitude comparison."
2561
- },
2562
- {
2563
- "when": "Users need to follow one or more trends rather than compare stack composition.",
2564
- "component": "component:ds-chart-line",
2565
- "reason": "ChartLine preserves each series as a continuous path across the ordered axis."
2566
- },
2567
- {
2568
- "when": "One category's parts-to-whole composition is the focus.",
2569
- "component": "component:ds-chart-donut",
2570
- "reason": "ChartDonut provides the dedicated single-total composition treatment."
2571
- }
2572
- ],
2573
- "commonlyComposedWith": [
2574
- "component:ds-chart-legend",
2575
- "component:ds-card-shell-data-viz",
2576
- "component:ds-tooltip-data-viz"
2577
- ],
2578
- "accessibility": [
2579
- "Provide a visible legend or adjacent textual summary that names every series; do not rely on segment color alone.",
2580
- "The chart image name includes each category and series value, using normalized percentages in percentage mode.",
2581
- "Use an adjacent data table when exact cross-category comparisons are necessary to complete the task."
2582
- ],
2583
- "states": [
2584
- "Stacked mode preserves raw magnitudes and scales the y-axis to the largest category total.",
2585
- "Percentage mode normalizes each non-empty category independently and renders a fixed 0%, 25%, 50%, 75%, and 100% axis.",
2586
- "Series render bottom-to-top in authored order; keep that order and color mapping stable across categories.",
2587
- "Stacked mode gives only the top visible segment 2px top corners. Percentage mode keeps every corner square because the normalized stack touches both axis edges.",
2588
- "Adjacent segments are separated by a non-scaling 1px gap; the stack's outer edges do not receive that separator.",
2589
- "Negative values are unsupported and render as zero; the owning product supplies loading, empty, and error states."
2590
- ],
2591
- "responsiveBehavior": [
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.",
2595
- "Pre-format category labels and reduce bucket count before rendering when horizontal space becomes constrained."
2596
- ],
2597
- "frameworkCaveats": {
2598
- "customElements": [
2599
- "Assign series and categories as JavaScript properties and keep every series aligned to the category count."
2600
- ],
2601
- "react": [
2602
- "Pass stable series and category arrays; choose percentage variant only when each category represents a meaningful whole."
2603
- ],
2604
- "angular": [
2605
- "Bind series and categories as properties; choose percentage variant only when each category represents a meaningful whole."
2606
- ]
2607
- },
2608
- "references": [
2609
- {
2610
- "label": "Storybook examples",
2611
- "path": "src/wc/components/ChartBarStacked/ChartBarStacked.stories.ts"
2612
- }
2613
- ]
2614
- },
2615
- "api": {
2616
- "props": {
2617
- "categories": {
2618
- "type": "string[]",
2619
- "required": false
2620
- },
2621
- "height": {
2622
- "type": "number",
2623
- "required": false
2624
- },
2625
- "series": {
2626
- "type": "ChartSeries[]",
2627
- "required": false
2628
- },
2629
- "variant": {
2630
- "type": "ChartBarStackedVariant",
2631
- "required": false
2632
- },
2633
- "width": {
2634
- "type": "number",
2635
- "required": false
2636
- }
2637
- },
2638
- "events": [],
2639
- "slots": []
2640
- },
2641
- "exports": {
2642
- "customElement": "ds-chart-bar-stacked",
2643
- "react": "DsChartBarStacked",
2644
- "angular": "DsChartBarStacked"
2645
- },
2646
- "dependencies": [
2647
- "@ds-mo/ui",
2648
- "@ds-mo/tokens"
2649
- ],
2650
- "componentDependencies": []
2651
- },
2652
- {
2653
- "id": "component:ds-chart-donut",
2654
- "tag": "ds-chart-donut",
2655
- "name": "chart-donut",
2656
- "title": "ChartDonut",
2657
- "summary": "Part-to-whole donut chart with a center aggregate, responsive fill sizing, local slice tooltip feedback, and externally controlled legend highlighting.",
2658
- "intentStatus": "complete",
2659
- "intent": {
2660
- "audience": "specialized",
2661
- "status": "experimental",
2662
- "summary": "Part-to-whole donut chart with a center aggregate, responsive fill sizing, local slice tooltip feedback, and externally controlled legend highlighting.",
2225
+ "summary": "Part-to-whole donut chart with a center aggregate, responsive fill sizing, local slice tooltip feedback, and externally controlled legend highlighting.",
2663
2226
  "useWhen": [
2664
2227
  "Users need to understand a small part-to-whole breakdown with a prominent total or status in the center.",
2665
2228
  "A standalone donut needs pointer and keyboard-focus value feedback through a chart-owned data-viz tooltip.",
@@ -2673,8 +2236,8 @@
2673
2236
  "alternatives": [
2674
2237
  {
2675
2238
  "when": "The product needs the canonical card, filter action, visible legend, and built-in hover synchronization.",
2676
- "component": "component:ds-card-data-viz-donut",
2677
- "reason": "The dedicated card owns that complete composition and suppresses redundant slice tooltips."
2239
+ "component": "component:ds-card-data-viz",
2240
+ "reason": "The donut card variant owns that complete composition and suppresses redundant slice tooltips."
2678
2241
  },
2679
2242
  {
2680
2243
  "when": "Users need to compare independent category magnitudes.",
@@ -2685,7 +2248,7 @@
2685
2248
  "commonlyComposedWith": [
2686
2249
  "component:ds-chart-legend",
2687
2250
  "component:ds-tooltip-data-viz",
2688
- "component:ds-card-data-viz-donut"
2251
+ "component:ds-card-data-viz"
2689
2252
  ],
2690
2253
  "accessibility": [
2691
2254
  "Every non-empty slice remains keyboard focusable and exposes its label and value without depending on the visual tooltip.",
@@ -2695,7 +2258,7 @@
2695
2258
  ],
2696
2259
  "states": [
2697
2260
  "Genuine local pointer or keyboard focus may show a chart-owned tooltip; externally synchronized highlight never opens it.",
2698
- "When a visible legend already owns label and value detail, suppress the redundant donut tooltip. CardDataVizDonut does this automatically.",
2261
+ "When a visible legend already owns label and value detail, suppress the redundant donut tooltip. CardDataViz donut mode does this automatically.",
2699
2262
  "Local hover and external highlight remain separate while both may dim non-matching slices.",
2700
2263
  "Zero or negative totals render a neutral empty ring without interactive slices.",
2701
2264
  "Center value and caption truncate when they exceed the safe inner-circle measure."
@@ -2708,7 +2271,7 @@
2708
2271
  ],
2709
2272
  "frameworkCaveats": {
2710
2273
  "customElements": [
2711
- "Assign data as a JavaScript property and wire slice-hover detail to a sibling legend only when not using CardDataVizDonut."
2274
+ "Assign data as a JavaScript property and wire slice-hover detail to a sibling legend only when not using CardDataViz donut mode."
2712
2275
  ],
2713
2276
  "react": [
2714
2277
  "Keep synchronized highlight controlled by the composition and disable slice tooltips when a sibling legend continuously shows the same details."
@@ -2821,22 +2384,20 @@
2821
2384
  },
2822
2385
  {
2823
2386
  "when": "The donut belongs in the canonical dashboard card.",
2824
- "component": "component:ds-card-data-viz-donut",
2825
- "reason": "The dedicated card places the legend and handles bidirectional highlight synchronization."
2387
+ "component": "component:ds-card-data-viz",
2388
+ "reason": "The donut variant places the legend and handles bidirectional highlight synchronization."
2826
2389
  },
2827
2390
  {
2828
2391
  "when": "A static line chart and series key belong in the canonical dashboard card.",
2829
- "component": "component:ds-card-data-viz-line",
2830
- "reason": "The dedicated card places the horizontal legend and disables decorative local hover highlighting."
2392
+ "component": "component:ds-card-data-viz",
2393
+ "reason": "The line variant places the horizontal legend and disables decorative local hover highlighting."
2831
2394
  }
2832
2395
  ],
2833
2396
  "commonlyComposedWith": [
2834
2397
  "component:ds-chart-donut",
2835
- "component:ds-chart-bar-stacked",
2398
+ "component:ds-chart-bar",
2836
2399
  "component:ds-chart-line",
2837
- "component:ds-card-data-viz-donut",
2838
- "component:ds-card-data-viz-line",
2839
- "component:ds-card-shell-data-viz"
2400
+ "component:ds-card-data-viz"
2840
2401
  ],
2841
2402
  "accessibility": [
2842
2403
  "Rows remain non-interactive unless the item supplies an actual link destination.",
@@ -2970,8 +2531,7 @@
2970
2531
  ],
2971
2532
  "commonlyComposedWith": [
2972
2533
  "component:ds-chart-legend",
2973
- "component:ds-card-data-viz-line",
2974
- "component:ds-card-shell-data-viz",
2534
+ "component:ds-card-data-viz",
2975
2535
  "component:ds-tooltip-data-viz"
2976
2536
  ],
2977
2537
  "accessibility": [
@@ -3086,7 +2646,7 @@
3086
2646
  ],
3087
2647
  "commonlyComposedWith": [
3088
2648
  "component:ds-field",
3089
- "component:ds-select-multi",
2649
+ "component:ds-select",
3090
2650
  "component:ds-text"
3091
2651
  ],
3092
2652
  "accessibility": [
@@ -3879,7 +3439,7 @@
3879
3439
  "status": "stable",
3880
3440
  "summary": "Accessible form-field composition that gives one Input or Select a persistent label, optional guidance, shared error presentation, stable IDs, and observable interaction state.",
3881
3441
  "useWhen": [
3882
- "An Input, Select, or SelectMulti needs a persistent visible label in a form.",
3442
+ "An Input or Select needs a persistent visible label in a form.",
3883
3443
  "Help text or an error message must be programmatically associated with one control.",
3884
3444
  "A form layout needs one consistent label-control-message rhythm."
3885
3445
  ],
@@ -3898,7 +3458,6 @@
3898
3458
  "commonlyComposedWith": [
3899
3459
  "component:ds-input",
3900
3460
  "component:ds-select",
3901
- "component:ds-select-multi",
3902
3461
  "component:ds-text"
3903
3462
  ],
3904
3463
  "accessibility": [
@@ -3925,7 +3484,7 @@
3925
3484
  "Assign child component values and option arrays through their normal JavaScript properties."
3926
3485
  ],
3927
3486
  "react": [
3928
- "Compose one DsInput, DsSelect, or DsSelectMulti child and control validation timing in the form owner."
3487
+ "Compose one DsInput or DsSelect child and control validation timing in the form owner."
3929
3488
  ],
3930
3489
  "angular": [
3931
3490
  "Compose the generated Field adapter around the control adapter and its matching Angular value accessor."
@@ -4530,8 +4089,8 @@
4530
4089
  },
4531
4090
  {
4532
4091
  "when": "Several form values may be selected.",
4533
- "component": "component:ds-select-multi",
4534
- "reason": "SelectMulti provides multi-select listbox semantics, array value ownership, and count presentation."
4092
+ "component": "component:ds-select",
4093
+ "reason": "Select multiple provides multi-select listbox semantics, array value ownership, and count presentation."
4535
4094
  },
4536
4095
  {
4537
4096
  "when": "The interaction needs substantial content, confirmation, or a form.",
@@ -4563,7 +4122,7 @@
4563
4122
  "After dsSelect from a switch row, replace the items or sections array with updated switchValue data so the controlled indicator reflects the new state.",
4564
4123
  "For selectionMode single, keep exactly one item isSelected and replace the items or sections array after dsSelect; Menu never mutates consumer-owned selection data.",
4565
4124
  "Arrays, objects, and element anchors must be assigned as JavaScript properties.",
4566
- "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.",
4125
+ "Use a swatch-picker section for a small curated visual preference and apply dsSwatchSelect immediately without closing the popup.",
4567
4126
  "Ordinary rows, section headings, and supporting text consume the Menu size. At xs, both the primary label and supporting text use caption metrics."
4568
4127
  ],
4569
4128
  "responsiveBehavior": [
@@ -4669,10 +4228,6 @@
4669
4228
  "name": "dsClose",
4670
4229
  "detail": "void"
4671
4230
  },
4672
- {
4673
- "name": "dsGradientSelect",
4674
- "detail": "ShellGradientPreset"
4675
- },
4676
4231
  {
4677
4232
  "name": "dsSelect",
4678
4233
  "detail": "MenuItemData"
@@ -5252,10 +4807,6 @@
5252
4807
  "type": "string",
5253
4808
  "required": false
5254
4809
  },
5255
- "sectionsJson": {
5256
- "type": "string",
5257
- "required": false
5258
- },
5259
4810
  "subsections": {
5260
4811
  "type": "TabItem[]",
5261
4812
  "required": false
@@ -5264,10 +4815,6 @@
5264
4815
  "type": "string",
5265
4816
  "required": false
5266
4817
  },
5267
- "subsectionsJson": {
5268
- "type": "string",
5269
- "required": false
5270
- },
5271
4818
  "subvalue": {
5272
4819
  "type": "string",
5273
4820
  "required": false
@@ -5362,10 +4909,6 @@
5362
4909
  "type": "TabItem[]",
5363
4910
  "required": false
5364
4911
  },
5365
- "sectionsJson": {
5366
- "type": "string",
5367
- "required": false
5368
- },
5369
4912
  "value": {
5370
4913
  "type": "string",
5371
4914
  "required": false
@@ -5740,7 +5283,7 @@
5740
5283
  "At 1200px and wider, default to expanded, allow the user to expand or collapse, and restore the locally persisted desktop preference when available.",
5741
5284
  "From 768px through 1199px, present PanelNav permanently collapsed and do not allow user expansion.",
5742
5285
  "Below 768px, the consuming application replaces PanelNav with a dedicated mobile navigation component; PanelNav does not own mobile navigation.",
5743
- "ShellApp permanently owns responsive composition: it determines shell mode, enforces tablet collapse, and replaces PanelNav with future mobile navigation below 768px.",
5286
+ "Managed ShellApp permanently owns responsive composition: it determines shell mode, enforces tablet collapse, and presents MobileSheetNav below 768px.",
5744
5287
  "When the viewport is below breakpoint, PanelNav locks collapsed, disables its header toggle affordance, and preserves the persisted desktop collapse preference.",
5745
5288
  "Collapsed presentation must preserve destination ordering, active state, notification status, and accessible names."
5746
5289
  ],
@@ -6163,7 +5706,7 @@
6163
5706
  "The product needs a compact filter menu next to search while keeping its filter choices and matching policy application-owned."
6164
5707
  ],
6165
5708
  "avoidWhen": [
6166
- "The search belongs inside a Select or SelectMulti popup; use that component's searchable behavior.",
5709
+ "The search belongs inside a Select popup; use that component's searchable behavior in either cardinality mode.",
6167
5710
  "A form needs a labelled standalone field; compose ds-input inside ds-field instead."
6168
5711
  ],
6169
5712
  "commonlyComposedWith": [
@@ -6293,22 +5836,22 @@
6293
5836
  "tag": "ds-panel-tools",
6294
5837
  "name": "panel-tools",
6295
5838
  "title": "PanelTools",
6296
- "summary": "Required ShellApp utility rail and persistent drawer host for the fixed set of global Search, Agents, Messages, Stacks, Activity, and Help products.",
5839
+ "summary": "Desktop and tablet utility rail-and-drawer primitive for explicitly defined application-wide tools, normally assembled by managed ShellApp through ShellTools.",
6297
5840
  "intentStatus": "complete",
6298
5841
  "intent": {
6299
5842
  "audience": "specialized",
6300
5843
  "status": "stable",
6301
- "summary": "Required ShellApp utility rail and persistent drawer host for the fixed set of global Search, Agents, Messages, Stacks, Activity, and Help products.",
5844
+ "summary": "Desktop and tablet utility rail-and-drawer primitive for explicitly defined application-wide tools, normally assembled by managed ShellApp through ShellTools.",
6302
5845
  "useWhen": [
6303
- "Composing the required global tools region inside the application's single ShellApp.",
5846
+ "An advanced slotted ShellApp needs the desktop and tablet global-tools primitive directly.",
6304
5847
  "Users need to move between application-wide utilities without losing each tool's in-progress state.",
6305
5848
  "Search, AI conversations, user messages, review stacks, notifications, or help content must remain available alongside route content."
6306
5849
  ],
6307
5850
  "avoidWhen": [
6308
5851
  "The action is specific to the current page or selected content rather than globally available across the application.",
6309
5852
  "The item navigates to a primary or secondary route; use PanelNav or BarNav instead.",
6310
- "A consumer wants to add arbitrary tools, reorder fixed tools, or repurpose a semantic tool id.",
6311
- "Building the mobile tools experience; future mobile ShellApp composition uses a different bottom-bar and panel pattern.",
5853
+ "Tool definitions lack stable ids, visible labels, explicit rail placement, or application-owned view content.",
5854
+ "Building the mobile tools experience; use ShellTools or managed ShellApp.",
6312
5855
  "PanelTools would be mounted outside the application's single ShellApp."
6313
5856
  ],
6314
5857
  "alternatives": [
@@ -6338,16 +5881,16 @@
6338
5881
  ],
6339
5882
  "accessibility": [
6340
5883
  "Provide localized accessible labels for the rail, shortcut group, and every rendered tool.",
6341
- "Keep Search first in the rail header and Help last in the rail footer so keyboard and visual order remain predictable.",
5884
+ "Use the canonical default recipe when the product needs Search first and Help last; custom recipes must preserve a deliberate keyboard and visual order.",
6342
5885
  "Keep focus on the selected rail action when opening a drawer and allow normal Tab navigation into its content.",
6343
5886
  "Do not trigger global shortcuts while focus is in an editable control.",
6344
5887
  "Use notification dots only as supplemental unread or new-content status and never as the sole status indication.",
6345
5888
  "Explain temporarily inactive tools through an accessible label or adjacent product guidance; omit unauthorized tools entirely."
6346
5889
  ],
6347
5890
  "states": [
6348
- "Search and Help are required; optional Agents, Messages, Stacks, and Activity tools are filtered by the application for authorization and entitlement.",
6349
- "Use only the fixed semantic tool ids and canonical order: Search, Agents, Messages, Stacks, Activity, Help; do not reorder, duplicate, or repurpose them.",
6350
- "Search is application-wide; Agents is user-to-AI chat; Messages is user-to-user chat; Stacks is a specialized inbox of grouped application events for review; Activity is the notification center; Help is drawer content that may link to external resources.",
5891
+ "Every tool has a stable explicit id and accessible label. The application filters definitions for authorization and entitlement.",
5892
+ "Tool order, header or footer rail placement, shortcut, and mobile grouping come from explicit item metadata rather than id-based layout assumptions.",
5893
+ "PANEL_TOOLS_DEFAULT_ITEMS is the canonical Lab recipe: Search pinned first, Help pinned last, current shortcuts, and Messages, Stacks, and Activity grouped under mobile Inbox.",
6351
5894
  "Only one drawer is open at a time; selecting another tool switches directly and selecting the active tool closes to rail-only mode.",
6352
5895
  "The drawer starts closed, remains open across ordinary route changes, and retains every mounted tool's independent conversation, query, scroll, and work state.",
6353
5896
  "When storageKey is set, persist only the last active tool in this browser and still restore the drawer closed after reload.",
@@ -6370,19 +5913,19 @@
6370
5913
  "responsiveBehavior": [
6371
5914
  "The open drawer reduces main-content width and uses --dimension-panel-width-xs (300px) on every supported desktop and tablet viewport.",
6372
5915
  "ShellApp owns the fixed drawer-width variable; consumers must not hardcode alternate drawer widths.",
6373
- "Below 768px, do not reuse desktop PanelTools: future ShellApp mobile composition uses a bottom bar for Search, Agents, Notifications, and Stacks, while Help moves into mobile primary navigation.",
5916
+ "Below 768px, do not reuse PanelTools directly; ShellTools and managed ShellApp present the same persistent tool owners through mobile chrome.",
6374
5917
  "Keep named-slot content mounted while tools switch or the drawer closes so users can return to in-progress global work.",
6375
5918
  "Conversation products may use fullscreenHeaderMode split for a 300px history rail beside a flexible detail pane, each with its own canonical header; the application owns that internal split layout.",
6376
5919
  "Use fixed drawer widths for now; do not add user resizing or width persistence."
6377
5920
  ],
6378
5921
  "frameworkCaveats": {
6379
5922
  "customElements": [
6380
- "Assign items as a JavaScript property for structured data; items-json is the string fallback.",
5923
+ "Assign items and headers as JavaScript properties and replace their references when collections change.",
6381
5924
  "Assign headers as a JavaScript property and replace its object identity whenever an active tool changes title, depth, or actions.",
6382
5925
  "Keep PanelTools mounted at ShellApp scope across route changes and provide each product through its matching named slot."
6383
5926
  ],
6384
5927
  "react": [
6385
- "Pass the fixed item collection through the generated React wrapper and keep named-slot product content mounted at ShellApp scope.",
5928
+ "Pass a stable explicitly ordered item collection through the generated React wrapper and keep named-slot product content mounted at ShellApp scope.",
6386
5929
  "Use storageKey only for same-browser last-tool continuity; do not persist the open drawer."
6387
5930
  ],
6388
5931
  "angular": [
@@ -6420,18 +5963,10 @@
6420
5963
  "type": "PanelToolsHeaders",
6421
5964
  "required": false
6422
5965
  },
6423
- "headersJson": {
6424
- "type": "string",
6425
- "required": false
6426
- },
6427
5966
  "items": {
6428
5967
  "type": "PanelToolsItem[]",
6429
5968
  "required": false
6430
5969
  },
6431
- "itemsJson": {
6432
- "type": "string",
6433
- "required": false
6434
- },
6435
5970
  "open": {
6436
5971
  "type": "boolean",
6437
5972
  "required": false
@@ -6733,29 +6268,24 @@
6733
6268
  "tag": "ds-select",
6734
6269
  "name": "select",
6735
6270
  "title": "Select",
6736
- "summary": "Form-associated single-value select with listbox semantics, local search, rich flat options, grouped sections, loading, clearing, and surface-aware trigger chrome.",
6271
+ "summary": "Form-associated select for one value or several independent values through the multiple mode, with listbox semantics, local search, grouped sections, loading, clearing, and surface-aware trigger chrome.",
6737
6272
  "intentStatus": "complete",
6738
6273
  "intent": {
6739
6274
  "audience": "general",
6740
6275
  "status": "stable",
6741
- "summary": "Form-associated single-value select with listbox semantics, local search, rich flat options, grouped sections, loading, clearing, and surface-aware trigger chrome.",
6276
+ "summary": "Form-associated select for one value or several independent values through the multiple mode, with listbox semantics, local search, grouped sections, loading, clearing, and surface-aware trigger chrome.",
6742
6277
  "useWhen": [
6743
6278
  "The user must choose one value from a finite set.",
6279
+ "The user may choose several independent values when multiple is enabled.",
6744
6280
  "The option set benefits from local search, subtext, prefix icons, grouping, or disabled choices.",
6745
6281
  "The choice set has more than roughly 20 options, comes from a user-managed listing, or represents a large domain such as addresses where search materially improves retrieval.",
6746
6282
  "The selected value must participate in native, Angular, or React form state."
6747
6283
  ],
6748
6284
  "avoidWhen": [
6749
- "Several values may be selected at once.",
6750
6285
  "The rows perform commands rather than choosing a form value.",
6751
6286
  "The choices form a hierarchy with expandable parents."
6752
6287
  ],
6753
6288
  "alternatives": [
6754
- {
6755
- "when": "Several independent values may be selected.",
6756
- "component": "component:ds-select-multi",
6757
- "reason": "SelectMulti owns array values, multi-selection semantics, and count presentation."
6758
- },
6759
6289
  {
6760
6290
  "when": "The popup contains commands or state-changing actions.",
6761
6291
  "component": "component:ds-menu",
@@ -6776,6 +6306,7 @@
6776
6306
  "accessibility": [
6777
6307
  "In forms, provide a persistent visible external field label; placeholder text is guidance and must not be the field's only label. In a compact filter bar, the trigger's visible text may supply the accessible name.",
6778
6308
  "The trigger uses combobox semantics and the popup uses listbox and option semantics; do not replace them with menu roles.",
6309
+ "Multiple mode adds aria-multiselectable, exposes independent aria-selected state, and uses presentation-only checkbox indicators while each option remains the sole interaction target.",
6779
6310
  "Disabled options remain visible, expose aria-disabled, and are skipped by keyboard navigation and typeahead.",
6780
6311
  "Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
6781
6312
  "Selected options rely on active fill and foreground treatment without a redundant trailing check icon.",
@@ -6783,13 +6314,14 @@
6783
6314
  "Use errorMessage with error so the trigger is described by the rendered alert."
6784
6315
  ],
6785
6316
  "states": [
6786
- "Select and SelectMulti share popup positioning, dismissal, focus, typeahead, and listbox traversal while retaining their distinct scalar and array selection contracts.",
6317
+ "The multiple property changes cardinality without changing the component family: scalar mode selects and closes, while multiple mode toggles array values and keeps the popup open.",
6787
6318
  "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.",
6788
- "Value is controlled through the mutable value property; dsChange reports user selection and clearing.",
6319
+ "Value is controlled through the mutable value property as a string in scalar mode or a string array in multiple mode; dsChange reports the matching shape.",
6320
+ "Multiple mode keeps the persistent placeholder label visible, appends the selected count, and submits one repeated form entry per selected value.",
6789
6321
  "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.",
6790
6322
  "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.",
6791
- "Clearing emits dsChange with an empty string and dsClear, keeps the popup open, and restores useful focus.",
6792
- "Loading keeps the trigger visible, replaces its prefix icon, marks the control busy, and makes selection interaction temporarily unavailable without presenting the control as inactive.",
6323
+ "Clearing emits dsChange with an empty string or empty array according to mode plus dsClear, keeps the popup open, and restores useful focus.",
6324
+ "Loading keeps the trigger visible, replaces its prefix icon, marks the control busy, and makes selection interaction temporarily unavailable without presenting the control as inactive. When the popup is open, its single loader is centered vertically and horizontally within the loading region.",
6793
6325
  "The trigger label stays left-aligned at every width. The default size is md in both forms and filter bars; smaller sizes require an explicit density need.",
6794
6326
  "Use option icons only when they help users differentiate choices. Icons render only when every option in the complete list provides one; mixed icon data falls back to the text-only row layout.",
6795
6327
  "Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
@@ -6814,10 +6346,10 @@
6814
6346
  ],
6815
6347
  "frameworkCaveats": {
6816
6348
  "customElements": [
6817
- "Assign options and sections through JavaScript properties because arrays and objects cannot be represented safely as attributes."
6349
+ "Assign options, sections, and multiple-mode array values through JavaScript properties because arrays and objects cannot be represented safely as attributes."
6818
6350
  ],
6819
6351
  "react": [
6820
- "Pass options or sections as wrapper props and handle onDsChange, onDsClear, and onDsOpenChange."
6352
+ "Pass options or sections as wrapper props, set multiple for array values, and handle onDsChange, onDsClear, and onDsOpenChange."
6821
6353
  ],
6822
6354
  "angular": [
6823
6355
  "Import DsSelect and SelectValueAccessor when integrating with Angular Forms; bind options and sections as properties."
@@ -6900,6 +6432,10 @@
6900
6432
  "type": "string",
6901
6433
  "required": false
6902
6434
  },
6435
+ "multiple": {
6436
+ "type": "boolean",
6437
+ "required": false
6438
+ },
6903
6439
  "name": {
6904
6440
  "type": "string | undefined",
6905
6441
  "required": false
@@ -6940,12 +6476,16 @@
6940
6476
  "type": "SelectSection[]",
6941
6477
  "required": false
6942
6478
  },
6479
+ "selectedLabel": {
6480
+ "type": "string",
6481
+ "required": false
6482
+ },
6943
6483
  "size": {
6944
6484
  "type": "SelectSize",
6945
6485
  "required": false
6946
6486
  },
6947
6487
  "value": {
6948
- "type": "string",
6488
+ "type": "SelectValue",
6949
6489
  "required": false
6950
6490
  },
6951
6491
  "width": {
@@ -6956,7 +6496,7 @@
6956
6496
  "events": [
6957
6497
  {
6958
6498
  "name": "dsChange",
6959
- "detail": "string"
6499
+ "detail": "SelectValue"
6960
6500
  },
6961
6501
  {
6962
6502
  "name": "dsClear",
@@ -6979,268 +6519,6 @@
6979
6519
  "@ds-mo/tokens",
6980
6520
  "@ds-mo/icons"
6981
6521
  ],
6982
- "componentDependencies": [
6983
- "button-unfilled",
6984
- "empty-state",
6985
- "icon",
6986
- "loader",
6987
- "text",
6988
- "tooltip"
6989
- ]
6990
- },
6991
- {
6992
- "id": "component:ds-select-multi",
6993
- "tag": "ds-select-multi",
6994
- "name": "select-multi",
6995
- "title": "SelectMulti",
6996
- "summary": "Form-associated multi-value select with a persistent trigger label, inline selected count, local search, rich flat options, grouped sections, loading, and clear-all behavior.",
6997
- "intentStatus": "complete",
6998
- "intent": {
6999
- "audience": "general",
7000
- "status": "stable",
7001
- "summary": "Form-associated multi-value select with a persistent trigger label, inline selected count, local search, rich flat options, grouped sections, loading, and clear-all behavior.",
7002
- "useWhen": [
7003
- "The user may choose several independent values from one finite set.",
7004
- "A compact trigger should summarize selection with the field label and a count.",
7005
- "The option set benefits from local search, subtext, grouping, or disabled choices.",
7006
- "The choice set has more than roughly 20 options, comes from a user-managed listing, or represents a large domain where search materially improves retrieval."
7007
- ],
7008
- "avoidWhen": [
7009
- "Exactly one value may be selected.",
7010
- "Selected values must remain individually removable as persistent tags outside the popup.",
7011
- "The choices form a hierarchy with cascading parent selection.",
7012
- "The customer task benefits more from keeping every choice and checkbox directly visible; choose between SelectMulti and a visible checkbox list from the use-case context rather than a fixed option-count threshold."
7013
- ],
7014
- "alternatives": [
7015
- {
7016
- "when": "Exactly one value may be selected.",
7017
- "component": "component:ds-select",
7018
- "reason": "Select owns scalar form value and single-select listbox behavior."
7019
- },
7020
- {
7021
- "when": "The popup contains actions rather than values.",
7022
- "component": "component:ds-menu",
7023
- "reason": "Menu uses command semantics and closes according to action-menu expectations."
7024
- }
7025
- ],
7026
- "commonlyComposedWith": [
7027
- "component:ds-text",
7028
- "component:ds-checkbox",
7029
- "component:ds-empty-state",
7030
- "component:ds-loader"
7031
- ],
7032
- "accessibility": [
7033
- "In forms, provide a persistent visible external field label. In a compact filter bar, the trigger's visible persistent label and count may supply the accessible name.",
7034
- "The popup is a listbox with aria-multiselectable and every option exposes its independent aria-selected state.",
7035
- "Disabled options expose aria-disabled and are skipped by keyboard navigation and typeahead.",
7036
- "Keyboard navigation keeps the aria-activedescendant option scrolled into the visible listbox viewport.",
7037
- "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.",
7038
- "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.",
7039
- "Use errorMessage with error so the trigger is described by the rendered alert."
7040
- ],
7041
- "states": [
7042
- "Select and SelectMulti share popup positioning, dismissal, focus, typeahead, and listbox traversal while retaining their distinct scalar and array selection contracts.",
7043
- "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.",
7044
- "Values is a controlled JavaScript array; dsChange emits a new array after each user toggle.",
7045
- "Required SelectMulti controls begin without an automatic selection and require the user to make an explicit choice.",
7046
- "Selecting an option keeps the popup open so additional values can be toggled.",
7047
- "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.",
7048
- "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.",
7049
- "Create sections only for categories that are meaningful to customers, not merely to break a long list into arbitrary chunks.",
7050
- "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.",
7051
- "Option labels stay on one line and truncate when constrained. Option subtext may wrap to at most two lines.",
7052
- "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.",
7053
- "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.",
7054
- "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.",
7055
- "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.",
7056
- "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.",
7057
- "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.",
7058
- "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.",
7059
- "Clear-all emits an empty dsChange and dsClear while preserving useful popup or search focus.",
7060
- "Loading keeps the trigger visible, marks the control busy, and makes selection interaction temporarily unavailable without presenting the control as inactive.",
7061
- "SelectMulti has no maximum-selection behavior; every available non-inactive option may be selected.",
7062
- "Validation timing belongs to the form owner and may be immediate or deferred until blur or submit; the component exposes validity and error presentation without imposing that policy.",
7063
- "The error trigger uses a 1.5px bold-negative inset stroke so invalid state remains distinguishable from the normal 1px border without changing control geometry.",
7064
- "An initially empty option set is not an expected SelectMulti use case. The no-results state describes a search with no matches, not a source with no choices.",
7065
- "Native form submission emits one entry per selected value under the component name.",
7066
- "Use options for a flat list or sections for grouped choices. Multi-select option contracts intentionally exclude icons because the leading checkbox owns that row zone; hierarchical parent selection is deferred."
7067
- ],
7068
- "responsiveBehavior": [
7069
- "Use width fill for form fields and width hug for compact filter bars; the persistent trigger label avoids variable-width selected labels.",
7070
- "The popup matches the trigger minimum width, may grow for content, and clamps to the viewport.",
7071
- "Long option collections scroll inside the popup; virtualization and remote search are not part of this version."
7072
- ],
7073
- "frameworkCaveats": {
7074
- "customElements": [
7075
- "Assign values, options, and sections through JavaScript properties; array values cannot be represented safely as attributes."
7076
- ],
7077
- "react": [
7078
- "Pass values, options, and sections as wrapper props and handle onDsChange, onDsClear, and onDsOpenChange."
7079
- ],
7080
- "angular": [
7081
- "Import DsSelectMulti and SelectMultiValueAccessor when integrating with Angular Forms."
7082
- ]
7083
- },
7084
- "references": [
7085
- {
7086
- "label": "Storybook examples",
7087
- "path": "src/wc/components/SelectMulti/SelectMulti.stories.ts"
7088
- },
7089
- {
7090
- "label": "Selection patterns",
7091
- "path": "src/docs/SelectionPatterns.mdx"
7092
- }
7093
- ]
7094
- },
7095
- "api": {
7096
- "props": {
7097
- "activeFill": {
7098
- "type": "boolean",
7099
- "required": false
7100
- },
7101
- "allowClear": {
7102
- "type": "boolean",
7103
- "required": false
7104
- },
7105
- "ariaDescribedby": {
7106
- "type": "string | undefined",
7107
- "required": false
7108
- },
7109
- "ariaLabel": {
7110
- "type": "string | null",
7111
- "required": false
7112
- },
7113
- "ariaLabelledby": {
7114
- "type": "string | undefined",
7115
- "required": false
7116
- },
7117
- "background": {
7118
- "type": "SelectMultiBackground | undefined",
7119
- "required": false
7120
- },
7121
- "clearLabel": {
7122
- "type": "string",
7123
- "required": false
7124
- },
7125
- "disabled": {
7126
- "type": "boolean",
7127
- "required": false
7128
- },
7129
- "error": {
7130
- "type": "boolean",
7131
- "required": false
7132
- },
7133
- "errorMessage": {
7134
- "type": "string | undefined",
7135
- "required": false
7136
- },
7137
- "hasBorder": {
7138
- "type": "boolean",
7139
- "required": false
7140
- },
7141
- "icon": {
7142
- "type": "string | undefined",
7143
- "required": false
7144
- },
7145
- "inputId": {
7146
- "type": "string | undefined",
7147
- "required": false
7148
- },
7149
- "isInactive": {
7150
- "type": "boolean",
7151
- "required": false
7152
- },
7153
- "isLoading": {
7154
- "type": "boolean",
7155
- "required": false
7156
- },
7157
- "loadingLabel": {
7158
- "type": "string",
7159
- "required": false
7160
- },
7161
- "name": {
7162
- "type": "string | undefined",
7163
- "required": false
7164
- },
7165
- "noResultsText": {
7166
- "type": "string",
7167
- "required": false
7168
- },
7169
- "open": {
7170
- "type": "boolean",
7171
- "required": false
7172
- },
7173
- "options": {
7174
- "type": "SelectMultiOption[]",
7175
- "required": false
7176
- },
7177
- "placeholder": {
7178
- "type": "string",
7179
- "required": false
7180
- },
7181
- "required": {
7182
- "type": "boolean",
7183
- "required": false
7184
- },
7185
- "requiredMessage": {
7186
- "type": "string",
7187
- "required": false
7188
- },
7189
- "searchPlaceholder": {
7190
- "type": "string",
7191
- "required": false
7192
- },
7193
- "searchable": {
7194
- "type": "boolean",
7195
- "required": false
7196
- },
7197
- "sections": {
7198
- "type": "SelectMultiSection[]",
7199
- "required": false
7200
- },
7201
- "selectedLabel": {
7202
- "type": "string",
7203
- "required": false
7204
- },
7205
- "size": {
7206
- "type": "SelectMultiSize",
7207
- "required": false
7208
- },
7209
- "values": {
7210
- "type": "string[]",
7211
- "required": false
7212
- },
7213
- "width": {
7214
- "type": "SelectMultiWidth",
7215
- "required": false
7216
- }
7217
- },
7218
- "events": [
7219
- {
7220
- "name": "dsChange",
7221
- "detail": "string[]"
7222
- },
7223
- {
7224
- "name": "dsClear",
7225
- "detail": "void"
7226
- },
7227
- {
7228
- "name": "dsOpenChange",
7229
- "detail": "boolean"
7230
- }
7231
- ],
7232
- "slots": []
7233
- },
7234
- "exports": {
7235
- "customElement": "ds-select-multi",
7236
- "react": "DsSelectMulti",
7237
- "angular": "DsSelectMulti"
7238
- },
7239
- "dependencies": [
7240
- "@ds-mo/ui",
7241
- "@ds-mo/tokens",
7242
- "@ds-mo/icons"
7243
- ],
7244
6522
  "componentDependencies": [
7245
6523
  "button-unfilled",
7246
6524
  "checkbox",
@@ -7256,15 +6534,15 @@
7256
6534
  "tag": "ds-shell-app",
7257
6535
  "name": "shell-app",
7258
6536
  "title": "ShellApp",
7259
- "summary": "The single required workspace root for standard authenticated application pages, coordinating primary and secondary navigation, tools chrome, responsive composition, content geometry, shared styling, and shell behavior.",
6537
+ "summary": "The standard managed workspace root for authenticated applications, assembling responsive navigation, page chrome, global tools, and stable application-owned content from typed data.",
7260
6538
  "intentStatus": "complete",
7261
6539
  "intent": {
7262
6540
  "audience": "specialized",
7263
6541
  "status": "stable",
7264
- "summary": "The single required workspace root for standard authenticated application pages, coordinating primary and secondary navigation, tools chrome, responsive composition, content geometry, shared styling, and shell behavior.",
6542
+ "summary": "The standard managed workspace root for authenticated applications, assembling responsive navigation, page chrome, global tools, and stable application-owned content from typed data.",
7265
6543
  "useWhen": [
7266
6544
  "Building any standard authenticated product or workspace page with CompoMo.",
7267
- "PanelNav, BarNav, ShellTools, mobile navigation, page content, shared chrome, responsive behavior, and shell shortcuts must be composed as one application frame.",
6545
+ "Navigation, page chrome, global tools, responsive behavior, and shell shortcuts must be composed as one application frame without parallel desktop and mobile owners.",
7268
6546
  "Future application templates need the supported base-page composition boundary."
7269
6547
  ],
7270
6548
  "avoidWhen": [
@@ -7288,32 +6566,34 @@
7288
6566
  "pattern:shell-page"
7289
6567
  ],
7290
6568
  "accessibility": [
7291
- "Keep primary destinations in PanelNav and secondary route sections in BarNav.",
6569
+ "Supply primary destinations through navigation and secondary route sections through pageChrome so managed ShellApp preserves their correct semantics.",
7292
6570
  "Ensure the default content region contains the page's single main landmark.",
7293
- "Keep PanelNav, BarNav, and PanelTools-compatible chrome available in desktop and tablet compositions and the persistent mobile bar available below 768px.",
6571
+ "Keep the managed desktop/tablet and mobile presentations available without conditionally recreating routed or tool content.",
7294
6572
  "Do not override browser keyboard chords when enabling shell shortcuts.",
7295
6573
  "Require Search and Help as the minimum PanelTools actions and provide accessible labels for every tool.",
7296
6574
  "Preserve focus and accessible names across navigation, collapse, overflow, and responsive presentation changes."
7297
6575
  ],
7298
6576
  "states": [
7299
6577
  "Render exactly one ShellApp as the workspace root and never nest it.",
7300
- "PanelNav, BarNav, and ShellTools are the responsive shell regions; ShellTools contains at least Search and Help even when no additional product tools apply.",
6578
+ "Managed composition is the standard. Supply navigation, pageChrome, and tools objects plus named tool-view and default page-content slots.",
7301
6579
  "The application router owns the current route, authorization filtering, Dashboard or Settings context, destination collections, section collections, and localized content labels.",
7302
- "ShellApp propagates navStyle and resolved responsive mode and coordinates layout, gradient alignment, transitions, metrics, shortcuts, and mobile-stage visibility.",
7303
- "The application controls mobileDestination and mobileSheetNavOpen and keeps router state independent from global tool-surface changes.",
6580
+ "ShellApp renders the lower-level desktop, tablet, and mobile chrome, coordinates layout, gradient alignment, transitions, shortcuts, global surfaces, Inbox state, focus restoration, and mobile-stage visibility.",
6581
+ "The application router owns authorization, current URLs, history, and route execution; ShellApp forwards navigation and page intent events without routing.",
6582
+ "The application supplies each routed content owner and tool view once. ShellApp changes visibility, inert state, and presentation without recreating those nodes.",
6583
+ "Use composition=slotted only for advanced application architectures that intentionally own all lower-level chrome wiring.",
7304
6584
  "Set gradientPreset to the single resolved global chrome preference: neutral by default, none for solid chrome, or cool, neutral, warm, and fresh for token-based washes.",
7305
6585
  "The application owns gradient preference persistence, cross-tab synchronization, and server or account precedence; ShellApp owns rendering the resolved preset across authenticated routes.",
7306
6586
  "Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
7307
- "Update PanelNav groups, BarNav tabs and heading, navStyle, basePath, and currentUrl atomically from one resolved route state.",
7308
- "BarNav remains present: it shows route-section tabs when available and the active PanelNav destination label as heading otherwise.",
7309
- "Render one ShellPage as the default-slot child for each standard routed page; ShellApp owns the content scroller while ShellPage owns page header stickiness and content inset.",
6587
+ "Replace navigation and pageChrome together from one completed route state.",
6588
+ "When pageChrome.showBack marks a detail depth, mobile chrome keeps the page heading as its identity and presents only local subsections; peer route tabs remain in desktop BarNav rather than replacing the detail heading.",
6589
+ "Managed ShellApp keeps BarNav and ShellPage presentations present and owns page header stickiness and the content scroller.",
7310
6590
  "The application filters unauthorized destinations, sections, and tools before passing them into shell components."
7311
6591
  ],
7312
6592
  "responsiveBehavior": [
7313
6593
  "ShellApp owns the fixed system breakpoints and resolves desktop at 1200px and wider, tablet from 768px through 1199px, and mobile below 768px.",
7314
6594
  "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
7315
6595
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
7316
- "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.",
6596
+ "On mobile, ShellApp hides and inerts desktop chrome, uses a solid primary stage, and composes MobileHeader, MobileSheetNav, ShellTools, and the persistent MobileBarNav around the same application-owned content.",
7317
6597
  "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.",
7318
6598
  "Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
7319
6599
  "Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
@@ -7321,15 +6601,15 @@
7321
6601
  ],
7322
6602
  "frameworkCaveats": {
7323
6603
  "customElements": [
7324
- "Assign complex navigation and tool collections as JavaScript properties on the slotted components.",
6604
+ "Assign navigation, pageChrome, and tools as JavaScript properties on the managed ShellApp.",
7325
6605
  "Stamp route-derived nav-style before components connect when deterministic first paint is required."
7326
6606
  ],
7327
6607
  "react": [
7328
- "Use generated wrappers and preserve native slot names for desktop navigation, responsive tools, mobile navigation, and main content.",
6608
+ "Use the generated ShellApp wrapper, structured object props, named tool-view slots, and stable routed children.",
7329
6609
  "Resolve all shell inputs from one router state before rendering the composition."
7330
6610
  ],
7331
6611
  "angular": [
7332
- "Use generated standalone adapters and preserve slot attributes in templates.",
6612
+ "Use the generated standalone ShellApp adapter, bind structured object props, and preserve named tool-view slots.",
7333
6613
  "Bind complex inputs as properties and update navigation inputs atomically from one resolved router state.",
7334
6614
  "Bind both nav-style attributes and properties when deterministic first paint is required."
7335
6615
  ]
@@ -7355,6 +6635,10 @@
7355
6635
  },
7356
6636
  "api": {
7357
6637
  "props": {
6638
+ "composition": {
6639
+ "type": "ShellAppComposition",
6640
+ "required": false
6641
+ },
7358
6642
  "gradientPreset": {
7359
6643
  "type": "ShellGradientPreset",
7360
6644
  "required": false
@@ -7371,240 +6655,104 @@
7371
6655
  "type": "NavChromeStyle",
7372
6656
  "required": false
7373
6657
  },
6658
+ "navigation": {
6659
+ "type": "ShellNavigationConfig",
6660
+ "required": false
6661
+ },
6662
+ "pageChrome": {
6663
+ "type": "ShellPageChromeConfig",
6664
+ "required": false
6665
+ },
7374
6666
  "shortcutsEnabled": {
7375
6667
  "type": "boolean",
7376
6668
  "required": false
6669
+ },
6670
+ "tools": {
6671
+ "type": "ShellToolsConfig",
6672
+ "required": false
7377
6673
  }
7378
6674
  },
7379
6675
  "events": [
7380
6676
  {
7381
- "name": "dsResponsiveModeChange",
7382
- "detail": "{ mode: ShellResponsiveMode }"
7383
- }
7384
- ],
7385
- "slots": []
7386
- },
7387
- "exports": {
7388
- "customElement": "ds-shell-app",
7389
- "react": "DsShellApp",
7390
- "angular": "DsShellApp"
7391
- },
7392
- "dependencies": [
7393
- "@ds-mo/ui",
7394
- "@ds-mo/tokens"
7395
- ],
7396
- "componentDependencies": []
7397
- },
7398
- {
7399
- "id": "component:ds-shell-gradient-picker",
7400
- "tag": "ds-shell-gradient-picker",
7401
- "name": "shell-gradient-picker",
7402
- "title": "ShellGradientPicker",
7403
- "summary": "Deprecated compatibility wrapper that maps the fixed ShellApp wash presets into SwatchPicker.",
7404
- "intentStatus": "complete",
7405
- "intent": {
7406
- "audience": "specialized",
7407
- "status": "deprecated",
7408
- "replacedBy": "component:ds-swatch-picker",
7409
- "replacementReason": "SwatchPicker now owns the same accessible interaction with a generic option model that supports both flat colors and gradients.",
7410
- "summary": "Deprecated compatibility wrapper that maps the fixed ShellApp wash presets into SwatchPicker.",
7411
- "useWhen": [
7412
- "Adding the Appearance or Theme section to the application's user or account menu.",
7413
- "Users must choose the global ShellApp chrome treatment from none, cool, neutral, warm, or fresh."
7414
- ],
7415
- "avoidWhen": [
7416
- "Choosing semantic intent, page background, chart, content, or brand colors.",
7417
- "Building an arbitrary gradient editor or allowing custom gradient values.",
7418
- "A picker already exists for the application; provide exactly one canonical preference location.",
7419
- "Rendering an individual swatch outside the complete picker."
7420
- ],
7421
- "alternatives": [
6677
+ "name": "dsBreadcrumbSelect",
6678
+ "detail": "BreadcrumbSelectDetail"
6679
+ },
7422
6680
  {
7423
- "when": "The user is selecting the application light, dark, or system color mode.",
7424
- "component": "component:ds-menu",
7425
- "reason": "Color mode is a separate appearance preference and should use ordinary menu selection rows."
7426
- }
7427
- ],
7428
- "commonlyComposedWith": [
7429
- "component:ds-shell-app",
7430
- "component:ds-menu"
7431
- ],
7432
- "patterns": [
7433
- "pattern:application-shell"
7434
- ],
7435
- "accessibility": [
7436
- "Provide a localized groupLabel that describes the shell appearance choice.",
7437
- "Treat the presets as one radio group with one Tab stop; Arrow keys, Home, and End move and select within the group.",
7438
- "Keep the visible compact swatches and their accessible preset names; do not rely on color alone for assistive technology."
7439
- ],
7440
- "states": [
7441
- "Neutral is the default preset; none renders solid shell chrome without a wash.",
7442
- "Cool, neutral, warm, and fresh use design tokens and automatically adapt to the active light or dark color theme.",
7443
- "Apply dsChange immediately to ShellApp.gradientPreset and keep the containing account menu open.",
7444
- "The application owns local persistence, cross-tab synchronization, and server or account preference precedence; the picker owns only selection UI and events.",
7445
- "Treat the fixed preset union as the only supported values and do not construct custom gradients."
7446
- ],
7447
- "responsiveBehavior": [
7448
- "Keep the compact picker in the user or account appearance menu on supported desktop and tablet shell compositions.",
7449
- "The future mobile account surface may present the same preference differently."
7450
- ],
7451
- "frameworkCaveats": {
7452
- "customElements": [
7453
- "Listen for dsChange, resolve application preference precedence, and assign the result to the single ShellApp gradientPreset property."
7454
- ],
7455
- "react": [
7456
- "Use the generated wrapper and handle onDsChange without closing the containing account menu."
7457
- ],
7458
- "angular": [
7459
- "Bind value to the resolved preference and handle dsChange to update application state."
7460
- ]
7461
- },
7462
- "references": [
6681
+ "name": "dsBrowseContextChange",
6682
+ "detail": "NavChromeStyle"
6683
+ },
7463
6684
  {
7464
- "label": "Replacement stories",
7465
- "path": "src/wc/components/SwatchPicker/SwatchPicker.stories.ts"
6685
+ "name": "dsHeaderAction",
6686
+ "detail": "{ tool: PanelToolsToolId; id: string }"
7466
6687
  },
7467
6688
  {
7468
- "label": "ShellApp gradient contract",
7469
- "path": "src/wc/components/ShellApp/ShellApp.mdx"
6689
+ "name": "dsHeaderBack",
6690
+ "detail": "{ tool: PanelToolsToolId }"
7470
6691
  },
7471
6692
  {
7472
- "label": "Application shell composition",
7473
- "path": "agent/patterns/application-shell/pattern.agent.json"
7474
- }
7475
- ]
7476
- },
7477
- "api": {
7478
- "props": {
7479
- "groupLabel": {
7480
- "type": "string",
7481
- "required": false
6693
+ "name": "dsNavFooterAction",
6694
+ "detail": "void"
7482
6695
  },
7483
- "value": {
7484
- "type": "ShellGradientPreset",
7485
- "required": false
7486
- }
7487
- },
7488
- "events": [
7489
6696
  {
7490
- "name": "dsChange",
7491
- "detail": "ShellGradientPreset"
7492
- }
7493
- ],
7494
- "slots": []
7495
- },
7496
- "exports": {
7497
- "customElement": "ds-shell-gradient-picker",
7498
- "react": "DsShellGradientPicker",
7499
- "angular": "DsShellGradientPicker"
7500
- },
7501
- "dependencies": [
7502
- "@ds-mo/ui",
7503
- "@ds-mo/tokens"
7504
- ],
7505
- "componentDependencies": [
7506
- "swatch-picker"
7507
- ]
7508
- },
7509
- {
7510
- "id": "component:ds-shell-gradient-swatch",
7511
- "tag": "ds-shell-gradient-swatch",
7512
- "name": "shell-gradient-swatch",
7513
- "title": "ShellGradientSwatch",
7514
- "summary": "Deprecated internal compatibility component for one legacy ShellApp gradient swatch.",
7515
- "intentStatus": "complete",
7516
- "intent": {
7517
- "audience": "internal",
7518
- "status": "deprecated",
7519
- "replacedBy": "component:ds-swatch-picker",
7520
- "replacementReason": "SwatchPicker renders its option buttons internally so an individually published radio swatch is no longer needed.",
7521
- "summary": "Deprecated internal compatibility component for one legacy ShellApp gradient swatch.",
7522
- "useWhen": [
7523
- "Maintaining or extending ShellGradientPicker inside CompoMo."
7524
- ],
7525
- "avoidWhen": [
7526
- "Building application UI directly; use ShellGradientPicker instead.",
7527
- "Selecting semantic, brand, chart, page, or arbitrary gradient colors.",
7528
- "Creating a partial or custom set of shell gradient choices."
7529
- ],
7530
- "alternatives": [
6697
+ "name": "dsNavSelect",
6698
+ "detail": "string"
6699
+ },
7531
6700
  {
7532
- "when": "An application needs the supported global shell appearance control.",
7533
- "component": "component:ds-swatch-picker",
7534
- "reason": "SwatchPicker provides the complete radio-group semantics, keyboard behavior, generic previews, and selection event."
7535
- }
7536
- ],
7537
- "commonlyComposedWith": [
7538
- "component:ds-swatch-picker"
7539
- ],
7540
- "accessibility": [
7541
- "Keep radio semantics, aria-checked state, and a preset-specific accessible name on the internal button.",
7542
- "Let ShellGradientPicker manage the roving tab stop and group keyboard navigation.",
7543
- "Do not expose an unlabeled color-only choice."
7544
- ],
7545
- "states": [
7546
- "Preset determines the token-based preview; selected determines radio state and selected visuals.",
7547
- "The selected swatch owns the radio group's single tab stop while ShellGradientPicker coordinates selection and focus movement.",
7548
- "isInactive disables interaction but does not remove the accessible name."
7549
- ],
7550
- "responsiveBehavior": [
7551
- "Preserve the fixed compact swatch geometry and let ShellGradientPicker own layout."
7552
- ],
7553
- "frameworkCaveats": {
7554
- "customElements": [
7555
- "Do not instantiate this internal primitive in consuming applications."
7556
- ],
7557
- "react": [
7558
- "Use DsShellGradientPicker rather than the generated swatch wrapper."
7559
- ],
7560
- "angular": [
7561
- "Use DsShellGradientPicker rather than importing DsShellGradientSwatch."
7562
- ]
7563
- },
7564
- "references": [
6701
+ "name": "dsNavUserAction",
6702
+ "detail": "PanelNavUserActionDetail"
6703
+ },
7565
6704
  {
7566
- "label": "Parent picker",
7567
- "path": "src/wc/components/ShellGradientPicker/ShellGradientPicker.tsx"
7568
- }
7569
- ]
7570
- },
7571
- "api": {
7572
- "props": {
7573
- "ariaLabel": {
7574
- "type": "string | null",
7575
- "required": false
6705
+ "name": "dsPageAction",
6706
+ "detail": "string"
7576
6707
  },
7577
- "isInactive": {
7578
- "type": "boolean",
7579
- "required": false
6708
+ {
6709
+ "name": "dsPageBack",
6710
+ "detail": "MouseEvent"
7580
6711
  },
7581
- "preset": {
7582
- "type": "ShellGradientPreset",
7583
- "required": false
6712
+ {
6713
+ "name": "dsPresentationChange",
6714
+ "detail": "{ presentation: 'drawer' | 'fullscreen' }"
7584
6715
  },
7585
- "selected": {
7586
- "type": "boolean",
7587
- "required": false
7588
- }
7589
- },
7590
- "events": [
7591
6716
  {
7592
- "name": "dsSelect",
7593
- "detail": "ShellGradientPreset"
6717
+ "name": "dsResponsiveModeChange",
6718
+ "detail": "{ mode: ShellResponsiveMode }"
6719
+ },
6720
+ {
6721
+ "name": "dsSubsectionChange",
6722
+ "detail": "string"
6723
+ },
6724
+ {
6725
+ "name": "dsTabChange",
6726
+ "detail": "string"
6727
+ },
6728
+ {
6729
+ "name": "dsToolChange",
6730
+ "detail": "{ id: PanelToolsToolId; selected: boolean }"
7594
6731
  }
7595
6732
  ],
7596
6733
  "slots": []
7597
6734
  },
7598
6735
  "exports": {
7599
- "customElement": "ds-shell-gradient-swatch",
7600
- "react": "DsShellGradientSwatch",
7601
- "angular": "DsShellGradientSwatch"
6736
+ "customElement": "ds-shell-app",
6737
+ "react": "DsShellApp",
6738
+ "angular": "DsShellApp"
7602
6739
  },
7603
6740
  "dependencies": [
7604
6741
  "@ds-mo/ui",
7605
6742
  "@ds-mo/tokens"
7606
6743
  ],
7607
- "componentDependencies": []
6744
+ "componentDependencies": [
6745
+ "bar-nav",
6746
+ "bar-title",
6747
+ "button-unfilled",
6748
+ "mobile-bar-nav",
6749
+ "mobile-header",
6750
+ "mobile-sheet-nav",
6751
+ "panel-nav",
6752
+ "shell-page",
6753
+ "shell-tools",
6754
+ "tooltip"
6755
+ ]
7608
6756
  },
7609
6757
  {
7610
6758
  "id": "component:ds-shell-page",
@@ -7741,14 +6889,14 @@
7741
6889
  "tag": "ds-shell-tools",
7742
6890
  "name": "shell-tools",
7743
6891
  "title": "ShellTools",
7744
- "summary": "Responsive persistent host for shell tools, adapting PanelTools rail and drawer chrome to full-stage mobile Search, Agents, and Inbox surfaces.",
6892
+ "summary": "Responsive persistent host for explicitly defined global tools, adapting PanelTools desktop/tablet chrome to configured mobile destinations and groups.",
7745
6893
  "intentStatus": "complete",
7746
6894
  "intent": {
7747
6895
  "audience": "specialized",
7748
- "status": "experimental",
7749
- "summary": "Responsive persistent host for shell tools, adapting PanelTools rail and drawer chrome to full-stage mobile Search, Agents, and Inbox surfaces.",
6896
+ "status": "stable",
6897
+ "summary": "Responsive persistent host for explicitly defined global tools, adapting PanelTools desktop/tablet chrome to configured mobile destinations and groups.",
7750
6898
  "useWhen": [
7751
- "A ShellApp must preserve the same Search, Agents, Messages, Stacks, Activity, and Help product owners across desktop, tablet, and mobile."
6899
+ "A ShellApp must preserve the same product-owned global tool views across desktop, tablet, and mobile."
7752
6900
  ],
7753
6901
  "avoidWhen": [
7754
6902
  "The tools exist only in desktop and tablet chrome; PanelTools remains supported for that case.",
@@ -7758,7 +6906,7 @@
7758
6906
  {
7759
6907
  "when": "Only legacy rail and drawer behavior is required.",
7760
6908
  "component": "component:ds-panel-tools",
7761
- "reason": "PanelTools remains the backward-compatible desktop and tablet primitive."
6909
+ "reason": "PanelTools is the direct desktop and tablet rail-and-drawer primitive."
7762
6910
  }
7763
6911
  ],
7764
6912
  "commonlyComposedWith": [
@@ -7778,7 +6926,8 @@
7778
6926
  ],
7779
6927
  "states": [
7780
6928
  "The application owns open and activeTool and replaces headers when tool depth changes.",
7781
- "Messages, Stacks, and Activity map to one mobile Inbox destination while retaining the actual active tool id.",
6929
+ "Items with mobileDestination inbox map to one mobile Inbox destination while retaining the actual active tool id; the canonical recipe groups Messages, Stacks, and Activity.",
6930
+ "Stable tool ids own named slots; label, order, rail placement, shortcut, and mobile destination are explicit item data.",
7782
6931
  "Switching responsive mode must not recreate application-owned slotted product elements."
7783
6932
  ],
7784
6933
  "responsiveBehavior": [
@@ -7821,10 +6970,6 @@
7821
6970
  "type": "PanelToolsHeaders",
7822
6971
  "required": false
7823
6972
  },
7824
- "headersJson": {
7825
- "type": "string",
7826
- "required": false
7827
- },
7828
6973
  "inboxLabel": {
7829
6974
  "type": "string",
7830
6975
  "required": false
@@ -7837,10 +6982,6 @@
7837
6982
  "type": "PanelToolsItem[]",
7838
6983
  "required": false
7839
6984
  },
7840
- "itemsJson": {
7841
- "type": "string",
7842
- "required": false
7843
- },
7844
6985
  "open": {
7845
6986
  "type": "boolean",
7846
6987
  "required": false