@ds-mo/ui 12.1.0 → 12.3.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 (287) hide show
  1. package/README.md +26 -3
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +8 -7
  4. package/dist/agent.json +837 -66
  5. package/dist/angular/ds-avatar.d.ts +1 -1
  6. package/dist/angular/ds-avatar.js +3 -3
  7. package/dist/angular/ds-bar-title.d.ts +7 -1
  8. package/dist/angular/ds-bar-title.js +7 -4
  9. package/dist/angular/ds-bar-workflow.d.ts +28 -0
  10. package/dist/angular/ds-bar-workflow.js +48 -0
  11. package/dist/angular/ds-breadcrumb.d.ts +19 -0
  12. package/dist/angular/ds-breadcrumb.js +42 -0
  13. package/dist/angular/ds-card-data-viz-bar.d.ts +18 -0
  14. package/dist/angular/ds-card-data-viz-bar.js +42 -0
  15. package/dist/angular/ds-card-data-viz-line.d.ts +18 -0
  16. package/dist/angular/ds-card-data-viz-line.js +42 -0
  17. package/dist/angular/ds-chart-bar-stacked.d.ts +12 -0
  18. package/dist/angular/ds-chart-bar-stacked.js +38 -0
  19. package/dist/angular/ds-chart-legend.d.ts +1 -1
  20. package/dist/angular/ds-chart-legend.js +3 -3
  21. package/dist/angular/ds-conversation-list.d.ts +1 -1
  22. package/dist/angular/ds-conversation-list.js +4 -3
  23. package/dist/angular/ds-scroll-overlay.d.ts +19 -0
  24. package/dist/angular/ds-scroll-overlay.js +43 -0
  25. package/dist/angular/ds-shell-page.d.ts +1 -1
  26. package/dist/angular/ds-shell-page.js +3 -3
  27. package/dist/angular/index.d.ts +1 -1
  28. package/dist/angular/index.js +6 -0
  29. package/dist/angular/proxies.d.ts +6 -0
  30. package/dist/angular/proxies.js +6 -0
  31. package/dist/components/ds-agent-activity.js +1 -1
  32. package/dist/components/ds-agent-response.js +1 -1
  33. package/dist/components/ds-agent-source-list.js +1 -1
  34. package/dist/components/ds-agent-tool-call.js +1 -1
  35. package/dist/components/ds-attachment-list.js +1 -1
  36. package/dist/components/ds-avatar.js +1 -1
  37. package/dist/components/ds-avatar.js.map +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.d.ts +11 -0
  44. package/dist/components/ds-bar-workflow.js +2 -0
  45. package/dist/components/ds-bar-workflow.js.map +1 -0
  46. package/dist/components/ds-breadcrumb.d.ts +11 -0
  47. package/dist/components/ds-breadcrumb.js +2 -0
  48. package/dist/components/ds-breadcrumb.js.map +1 -0
  49. package/dist/components/ds-button-filled.js +1 -1
  50. package/dist/components/ds-button-unfilled.js +1 -1
  51. package/dist/components/ds-card-data-viz-bar.d.ts +11 -0
  52. package/dist/components/ds-card-data-viz-bar.js +2 -0
  53. package/dist/components/ds-card-data-viz-bar.js.map +1 -0
  54. package/dist/components/ds-card-data-viz-donut.js +1 -1
  55. package/dist/components/ds-card-data-viz-line.d.ts +11 -0
  56. package/dist/components/ds-card-data-viz-line.js +2 -0
  57. package/dist/components/ds-card-data-viz-line.js.map +1 -0
  58. package/dist/components/ds-card-setting.js +1 -1
  59. package/dist/components/ds-card-shell-data-viz.js +1 -1
  60. package/dist/components/ds-chart-bar-stacked.d.ts +11 -0
  61. package/dist/components/ds-chart-bar-stacked.js +2 -0
  62. package/dist/components/ds-chart-bar-stacked.js.map +1 -0
  63. package/dist/components/ds-chart-bar.js +1 -1
  64. package/dist/components/ds-chart-bar.js.map +1 -1
  65. package/dist/components/ds-chart-donut.js +1 -1
  66. package/dist/components/ds-chart-legend.js +1 -1
  67. package/dist/components/ds-chart-legend.js.map +1 -1
  68. package/dist/components/ds-chart-line.js +1 -1
  69. package/dist/components/ds-chart-line.js.map +1 -1
  70. package/dist/components/ds-checkbox.js +1 -1
  71. package/dist/components/ds-chip.js +1 -1
  72. package/dist/components/ds-chip.js.map +1 -1
  73. package/dist/components/ds-code-block.js +1 -1
  74. package/dist/components/ds-conversation-list-item.js +1 -1
  75. package/dist/components/ds-conversation-list-item.js.map +1 -1
  76. package/dist/components/ds-conversation-list-section.js +1 -1
  77. package/dist/components/ds-conversation-list-section.js.map +1 -1
  78. package/dist/components/ds-conversation-list.js +1 -1
  79. package/dist/components/ds-conversation-list.js.map +1 -1
  80. package/dist/components/ds-divider.js +1 -1
  81. package/dist/components/ds-empty-state.js +1 -1
  82. package/dist/components/ds-field.js +1 -1
  83. package/dist/components/ds-input.js +1 -1
  84. package/dist/components/ds-input.js.map +1 -1
  85. package/dist/components/ds-markdown.js +1 -1
  86. package/dist/components/ds-menu.js +1 -1
  87. package/dist/components/ds-message-bubble.js +1 -1
  88. package/dist/components/ds-message-bubble.js.map +1 -1
  89. package/dist/components/ds-message-composer.js +1 -1
  90. package/dist/components/ds-message-scroller.js +1 -1
  91. package/dist/components/ds-message-scroller.js.map +1 -1
  92. package/dist/components/ds-message.js +1 -1
  93. package/dist/components/ds-modal.js +1 -1
  94. package/dist/components/ds-panel-nav.js +1 -1
  95. package/dist/components/ds-panel-sub-nav.js +1 -1
  96. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  97. package/dist/components/ds-panel-tool-header.js +1 -1
  98. package/dist/components/ds-panel-tool-search.js +1 -1
  99. package/dist/components/ds-panel-tools.js +1 -1
  100. package/dist/components/ds-radio.js +1 -1
  101. package/dist/components/ds-radio.js.map +1 -1
  102. package/dist/components/ds-scroll-overlay.d.ts +11 -0
  103. package/dist/components/ds-scroll-overlay.js +2 -0
  104. package/dist/components/ds-scroll-overlay.js.map +1 -0
  105. package/dist/components/ds-select-multi.js +1 -1
  106. package/dist/components/ds-select-multi.js.map +1 -1
  107. package/dist/components/ds-select.js +1 -1
  108. package/dist/components/ds-select.js.map +1 -1
  109. package/dist/components/ds-shell-app.js +1 -1
  110. package/dist/components/ds-shell-gradient-picker.js +1 -1
  111. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  112. package/dist/components/ds-shell-gradient-swatch.js.map +1 -1
  113. package/dist/components/ds-shell-page.js +1 -1
  114. package/dist/components/ds-shell-page.js.map +1 -1
  115. package/dist/components/ds-skeleton.js +1 -1
  116. package/dist/components/ds-slider.js +1 -1
  117. package/dist/components/ds-slider.js.map +1 -1
  118. package/dist/components/ds-swatch-picker.js +1 -1
  119. package/dist/components/ds-switch.js +1 -1
  120. package/dist/components/ds-tab-group.js +1 -1
  121. package/dist/components/ds-tab-group.js.map +1 -1
  122. package/dist/components/ds-tag.js +1 -1
  123. package/dist/components/ds-tag.js.map +1 -1
  124. package/dist/components/ds-text.js +1 -1
  125. package/dist/components/ds-toast.js +1 -1
  126. package/dist/components/ds-tooltip-data-viz.js +1 -1
  127. package/dist/components/ds-tooltip.js +1 -1
  128. package/dist/components/ds-typing-indicator.js +1 -1
  129. package/dist/components/ds-typing-indicator.js.map +1 -1
  130. package/dist/components/{p-B9jvSGid.js → p-9dQQSgwT.js} +2 -2
  131. package/dist/components/p-B3rbhRAk.js +2 -0
  132. package/dist/components/p-B3rbhRAk.js.map +1 -0
  133. package/dist/components/{p-BWUTr_XN.js → p-BJMRBHKW.js} +2 -2
  134. package/dist/components/p-BJMRBHKW.js.map +1 -0
  135. package/dist/components/p-BVV_rlIP.js +2 -0
  136. package/dist/components/p-BVV_rlIP.js.map +1 -0
  137. package/dist/components/p-BhxwpOH8.js +2 -0
  138. package/dist/components/{p-DpyTrZa2.js.map → p-BhxwpOH8.js.map} +1 -1
  139. package/dist/components/p-Bi_bxbih.js +2 -0
  140. package/dist/components/{p-Dqwcw1-m.js.map → p-Bi_bxbih.js.map} +1 -1
  141. package/dist/components/p-BtEjlcB9.js +2 -0
  142. package/dist/components/{p-DABj3qTX.js.map → p-BtEjlcB9.js.map} +1 -1
  143. package/dist/components/{p-Bs6SS34m.js → p-BwGnhInj.js} +2 -2
  144. package/dist/components/p-BwGnhInj.js.map +1 -0
  145. package/dist/components/p-C0NPJ0h2.js +2 -0
  146. package/dist/components/p-C0NPJ0h2.js.map +1 -0
  147. package/dist/components/{p-BkwBtZs3.js → p-C7bZ-jiU.js} +2 -2
  148. package/dist/components/p-CH3w-P2H.js +2 -0
  149. package/dist/components/p-CH3w-P2H.js.map +1 -0
  150. package/dist/components/{p-DxeHimqk.js → p-CH6cNXXF.js} +2 -2
  151. package/dist/components/p-CWlh7HAg.js +2 -0
  152. package/dist/components/p-CWlh7HAg.js.map +1 -0
  153. package/dist/components/p-CY19gMiz.js +2 -0
  154. package/dist/components/p-CY19gMiz.js.map +1 -0
  155. package/dist/components/p-C_ewSXTT.js +2 -0
  156. package/dist/components/p-C_ewSXTT.js.map +1 -0
  157. package/dist/components/{p-tDXHTAJh.js → p-Ce52yVXF.js} +2 -2
  158. package/dist/components/p-CoYFJD-w.js +2 -0
  159. package/dist/components/{p-webARv8d.js.map → p-CoYFJD-w.js.map} +1 -1
  160. package/dist/components/{p-BzsITTZa.js → p-Cuw2Lo2g.js} +2 -2
  161. package/dist/components/p-CydY-v7X.js +2 -0
  162. package/dist/components/p-CydY-v7X.js.map +1 -0
  163. package/dist/components/{p-LFGbdi7Y.js → p-D-xttdpn.js} +2 -2
  164. package/dist/components/{p-DfIch2Dk.js → p-D3DYxbC5.js} +2 -2
  165. package/dist/components/{p-CR7yMitN.js → p-DC7yOUQx.js} +2 -2
  166. package/dist/components/{p-liMPkhUP.js → p-DSa0Hnd3.js} +2 -2
  167. package/dist/components/p-DXewjzkM.js +2 -0
  168. package/dist/components/p-DXewjzkM.js.map +1 -0
  169. package/dist/components/p-DYqReipj.js +2 -0
  170. package/dist/components/{p-Dy_sZ-dI.js.map → p-DYqReipj.js.map} +1 -1
  171. package/dist/components/p-DbpfpeQT.js +2 -0
  172. package/dist/components/p-DbpfpeQT.js.map +1 -0
  173. package/dist/components/{p-DszI94sZ.js → p-DjPZxzIG.js} +2 -2
  174. package/dist/components/{p-DszI94sZ.js.map → p-DjPZxzIG.js.map} +1 -1
  175. package/dist/components/{p-CTV_QWC5.js → p-J6xK6Ihq.js} +2 -2
  176. package/dist/components/{p-Dfxnxx7L.js → p-jCWtxthA.js} +2 -2
  177. package/dist/docs/components.json +2137 -743
  178. package/dist/lib/utils/anchored-popup.d.ts +5 -1
  179. package/dist/lib/utils/index.js +3 -1
  180. package/dist/lib/utils/index.js.map +2 -2
  181. package/dist/mcp/cli.js +142 -18
  182. package/dist/mcp-data/registry/agent-response.json +9 -4
  183. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  184. package/dist/mcp-data/registry/avatar.json +26 -7
  185. package/dist/mcp-data/registry/bar-title.json +76 -37
  186. package/dist/mcp-data/registry/bar-workflow.json +368 -0
  187. package/dist/mcp-data/registry/breadcrumb.json +205 -0
  188. package/dist/mcp-data/registry/button-filled.json +1 -1
  189. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  190. package/dist/mcp-data/registry/card-data-viz-bar.json +212 -0
  191. package/dist/mcp-data/registry/card-data-viz-line.json +206 -0
  192. package/dist/mcp-data/registry/card-shell-data-viz.json +7 -0
  193. package/dist/mcp-data/registry/chart-bar-stacked.json +225 -0
  194. package/dist/mcp-data/registry/chart-bar.json +9 -2
  195. package/dist/mcp-data/registry/chart-legend.json +29 -3
  196. package/dist/mcp-data/registry/chart-line.json +4 -2
  197. package/dist/mcp-data/registry/checkbox.json +1 -1
  198. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  199. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  200. package/dist/mcp-data/registry/conversation-list.json +36 -9
  201. package/dist/mcp-data/registry/markdown.json +15 -10
  202. package/dist/mcp-data/registry/menu.json +9 -7
  203. package/dist/mcp-data/registry/message-scroller.json +6 -4
  204. package/dist/mcp-data/registry/message.json +3 -2
  205. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  206. package/dist/mcp-data/registry/registry.json +863 -74
  207. package/dist/mcp-data/registry/scroll-overlay.json +183 -0
  208. package/dist/mcp-data/registry/shell-gradient-swatch.json +1 -1
  209. package/dist/mcp-data/registry/shell-page.json +40 -19
  210. package/dist/mcp-data/registry/slider.json +1 -1
  211. package/dist/mcp-data/registry/switch.json +1 -1
  212. package/dist/mcp-data/registry/tab-group.json +1 -1
  213. package/dist/mcp-data/registry/text.json +1 -1
  214. package/dist/mcp-data/registry/typing-indicator.json +7 -7
  215. package/dist/react/components.d.ts +6 -0
  216. package/dist/react/components.js +6 -0
  217. package/dist/react/ds-bar-title.d.ts +2 -1
  218. package/dist/react/ds-bar-title.js +1 -0
  219. package/dist/react/ds-bar-workflow.d.ts +14 -0
  220. package/dist/react/ds-bar-workflow.js +16 -0
  221. package/dist/react/ds-breadcrumb.d.ts +12 -0
  222. package/dist/react/ds-breadcrumb.js +12 -0
  223. package/dist/react/ds-card-data-viz-bar.d.ts +12 -0
  224. package/dist/react/ds-card-data-viz-bar.js +12 -0
  225. package/dist/react/ds-card-data-viz-line.d.ts +12 -0
  226. package/dist/react/ds-card-data-viz-line.js +12 -0
  227. package/dist/react/ds-chart-bar-stacked.d.ts +9 -0
  228. package/dist/react/ds-chart-bar-stacked.js +12 -0
  229. package/dist/react/ds-scroll-overlay.d.ts +12 -0
  230. package/dist/react/ds-scroll-overlay.js +12 -0
  231. package/dist/styles/prose.css +215 -0
  232. package/dist/types/components/Avatar/Avatar.d.ts +4 -1
  233. package/dist/types/components/BarTitle/BarTitle.d.ts +14 -5
  234. package/dist/types/components/BarTitle/bar-title-types.d.ts +0 -1
  235. package/dist/types/components/BarWorkflow/BarWorkflow.d.ts +37 -0
  236. package/dist/types/components/BarWorkflow/bar-workflow-types.d.ts +12 -0
  237. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +31 -0
  238. package/dist/types/components/Breadcrumb/breadcrumb-types.d.ts +17 -0
  239. package/dist/types/components/CardDataVizBar/CardDataVizBar.d.ts +24 -0
  240. package/dist/types/components/CardDataVizBar/index.d.ts +2 -0
  241. package/dist/types/components/CardDataVizLine/CardDataVizLine.d.ts +24 -0
  242. package/dist/types/components/CardDataVizLine/index.d.ts +2 -0
  243. package/dist/types/components/ChartBarStacked/ChartBarStacked.d.ts +15 -0
  244. package/dist/types/components/ChartBarStacked/index.d.ts +3 -0
  245. package/dist/types/components/ChartLegend/ChartLegend.d.ts +3 -0
  246. package/dist/types/components/ConversationList/ConversationList.d.ts +12 -0
  247. package/dist/types/components/Menu/Menu.d.ts +1 -2
  248. package/dist/types/components/MessageScroller/MessageScroller.d.ts +1 -6
  249. package/dist/types/components/ScrollOverlay/ScrollOverlay.d.ts +28 -0
  250. package/dist/types/components/ShellPage/ShellPage.d.ts +19 -7
  251. package/dist/types/components/ShellPage/shell-page-responsive.d.ts +0 -8
  252. package/dist/types/components/TypingIndicator/TypingIndicator.d.ts +1 -1
  253. package/dist/types/components.d.ts +572 -26
  254. package/dist/types/stories/isolated-overlay-docs.d.ts +13 -0
  255. package/dist/types/utils/anchored-popup.d.ts +5 -1
  256. package/dist/types/utils/scroll-overlay-controller.d.ts +35 -0
  257. package/package.json +4 -3
  258. package/dist/components/p-BWUTr_XN.js.map +0 -1
  259. package/dist/components/p-BfEjWe8U.js +0 -2
  260. package/dist/components/p-BfEjWe8U.js.map +0 -1
  261. package/dist/components/p-Bs6SS34m.js.map +0 -1
  262. package/dist/components/p-C3Zfn7hz.js +0 -2
  263. package/dist/components/p-C3Zfn7hz.js.map +0 -1
  264. package/dist/components/p-CUik7PCi.js +0 -2
  265. package/dist/components/p-CUik7PCi.js.map +0 -1
  266. package/dist/components/p-CzBnvtcz.js +0 -2
  267. package/dist/components/p-CzBnvtcz.js.map +0 -1
  268. package/dist/components/p-DABj3qTX.js +0 -2
  269. package/dist/components/p-DpyTrZa2.js +0 -2
  270. package/dist/components/p-Dqwcw1-m.js +0 -2
  271. package/dist/components/p-Dy3Skua8.js +0 -2
  272. package/dist/components/p-Dy3Skua8.js.map +0 -1
  273. package/dist/components/p-Dy_sZ-dI.js +0 -2
  274. package/dist/components/p-l6PmnW_P.js +0 -2
  275. package/dist/components/p-l6PmnW_P.js.map +0 -1
  276. package/dist/components/p-webARv8d.js +0 -2
  277. /package/dist/components/{p-B9jvSGid.js.map → p-9dQQSgwT.js.map} +0 -0
  278. /package/dist/components/{p-BkwBtZs3.js.map → p-C7bZ-jiU.js.map} +0 -0
  279. /package/dist/components/{p-DxeHimqk.js.map → p-CH6cNXXF.js.map} +0 -0
  280. /package/dist/components/{p-tDXHTAJh.js.map → p-Ce52yVXF.js.map} +0 -0
  281. /package/dist/components/{p-BzsITTZa.js.map → p-Cuw2Lo2g.js.map} +0 -0
  282. /package/dist/components/{p-LFGbdi7Y.js.map → p-D-xttdpn.js.map} +0 -0
  283. /package/dist/components/{p-DfIch2Dk.js.map → p-D3DYxbC5.js.map} +0 -0
  284. /package/dist/components/{p-CR7yMitN.js.map → p-DC7yOUQx.js.map} +0 -0
  285. /package/dist/components/{p-liMPkhUP.js.map → p-DSa0Hnd3.js.map} +0 -0
  286. /package/dist/components/{p-CTV_QWC5.js.map → p-J6xK6Ihq.js.map} +0 -0
  287. /package/dist/components/{p-Dfxnxx7L.js.map → p-jCWtxthA.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.1.0",
4
+ "packageVersion": "12.3.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -113,15 +113,20 @@
113
113
  ],
114
114
  "states": [
115
115
  "The owner replaces immutable part arrays as scripted or live output changes.",
116
- "AgentResponse renders directly in Message without borrowing a plain MessageBubble surface."
116
+ "AgentResponse renders directly in Message without borrowing a plain MessageBubble surface.",
117
+ "Markdown parts use the optional safe renderer; prose CSS owns only semantic-tree styling and never response ordering or streaming state."
117
118
  ],
118
119
  "responsiveBehavior": [
119
- "Rich content uses the available transcript width while respecting readable measure and overflow constraints."
120
+ "Rich content uses the available transcript width while respecting readable measure and local overflow constraints."
120
121
  ],
121
122
  "references": [
122
123
  {
123
- "label": "Storybook examples",
124
- "path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
124
+ "label": "Representative streamed response",
125
+ "path": "src/wc/components/AgentResponse/AgentResponse.stories.ts"
126
+ },
127
+ {
128
+ "label": "Prose distribution decision",
129
+ "path": "docs/prose-foundation.md"
125
130
  }
126
131
  ]
127
132
  },
@@ -414,7 +419,7 @@
414
419
  "status": "experimental",
415
420
  "summary": "Compact icon avatar for visually identifying a person, group, channel, or conversation type.",
416
421
  "useWhen": [
417
- "A list or message composition needs a consistent 32px circular identity marker represented by an icon."
422
+ "A list or message composition needs a consistent circular identity marker represented by an icon at md, sm, or xs control density."
418
423
  ],
419
424
  "avoidWhen": [
420
425
  "The identity has a supplied photograph, initials, presence state, or editable profile behavior; those variants are not part of this primitive."
@@ -425,10 +430,11 @@
425
430
  ],
426
431
  "accessibility": [
427
432
  "Provide label only when the icon communicates meaning that surrounding text does not already convey.",
428
- "Omit label when the owning row or message already provides an equivalent accessible name."
433
+ "Omit label when the owning row or message already provides an equivalent accessible name.",
434
+ "Treat primary and secondary as general icon hierarchy; an owning product may map that hierarchy to states such as unread and read, but Avatar does not own those states."
429
435
  ],
430
436
  "responsiveBehavior": [
431
- "The avatar keeps its fixed 32px circle and 20px icon at every viewport size."
437
+ "The selected size stays fixed across viewports: md is a 32px circle with a 20px icon, sm is 24px with 16px, and xs is 16px with 12px."
432
438
  ],
433
439
  "references": [
434
440
  {
@@ -450,6 +456,10 @@
450
456
  "label": {
451
457
  "type": "string | undefined",
452
458
  "required": false
459
+ },
460
+ "size": {
461
+ "type": "AvatarSize",
462
+ "required": false
453
463
  }
454
464
  },
455
465
  "events": [],
@@ -767,16 +777,16 @@
767
777
  "tag": "ds-bar-title",
768
778
  "name": "bar-title",
769
779
  "title": "BarTitle",
770
- "summary": "Page-level title chrome with default and create/edit editor modes, optional route navigation, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
780
+ "summary": "Page-level title chrome with an optional expanded route breadcrumb, compact Back action, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
771
781
  "intentStatus": "complete",
772
782
  "intent": {
773
783
  "audience": "general",
774
784
  "status": "stable",
775
- "summary": "Page-level title chrome with default and create/edit editor modes, optional route navigation, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
785
+ "summary": "Page-level title chrome with an optional expanded route breadcrumb, compact Back action, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
776
786
  "useWhen": [
777
787
  "A top-level page needs one h1 above its content.",
778
788
  "A list or detail page has multiple route-level sections that belong in the inline active-section menu.",
779
- "A detail page needs a page-level Back action, or a create/edit page needs editor-mode Exit and Save chrome.",
789
+ "A detail page needs route ancestors in expanded presentation and a page-level Back action in compact chrome.",
780
790
  "A page needs one primary action plus optional secondary or destructive overflow commands."
781
791
  ],
782
792
  "avoidWhen": [
@@ -787,6 +797,11 @@
787
797
  "Automatic sticky or responsive page orchestration is required; compose BarTitle in ShellPage rather than implementing it in the header."
788
798
  ],
789
799
  "alternatives": [
800
+ {
801
+ "when": "A create or edit workflow needs Exit, persistent step navigation, and a final Save or Submit action.",
802
+ "component": "component:ds-bar-workflow",
803
+ "reason": "BarWorkflow owns compact-only workflow progression rather than responsive page identity."
804
+ },
790
805
  {
791
806
  "when": "The header belongs to a PanelTools product view.",
792
807
  "component": "component:ds-panel-tool-header",
@@ -802,6 +817,7 @@
802
817
  "component:ds-shell-page",
803
818
  "component:ds-button-filled",
804
819
  "component:ds-button-unfilled",
820
+ "component:ds-breadcrumb",
805
821
  "component:ds-menu",
806
822
  "component:ds-text"
807
823
  ],
@@ -810,7 +826,8 @@
810
826
  ],
811
827
  "accessibility": [
812
828
  "Provide one concise heading; BarTitle renders exactly one h1 and changes only its visual recipe between variants.",
813
- "Give Back a destination-specific accessible name such as Back to Drivers, provide the concise parent label such as Drivers for the expanded breadcrumb, and handle dsBack in the route owner.",
829
+ "Give compact Back a destination-specific accessible name such as Back to Drivers and handle dsBack in the route owner.",
830
+ "Provide ordered breadcrumb items for deeper expanded paths and handle dsBreadcrumbSelect when native href navigation is not used; backLabel remains the single-parent expanded fallback.",
814
831
  "Keep value synchronized with the current child route; dsSectionChange returns the selected section id.",
815
832
  "Section and overflow triggers expose menu relationships and restore focus after selection or dismissal.",
816
833
  "Use one filled primary action in the page decision area and mark destructive overflow actions explicitly."
@@ -819,28 +836,27 @@
819
836
  "Omitting Back, sections, primaryAction, and actions produces the top-level title-only header.",
820
837
  "Two or more selectable sections add the inline section trigger; one section does not render a redundant menu.",
821
838
  "Dividers in sections or actions create separate Menu groups without becoming selectable rows.",
822
- "expanded renders the larger heading, optional description, inset divider, and an xs icon-label Back breadcrumb in the top inset. The title and right-side actions share one top alignment whether Back is present, while the description remains in the left title column; compact renders 48px chrome with inline Back; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
823
- "primaryAction collapse defaults to auto. Use never for exceptional default-mode actions whose hierarchy must remain visible in constrained layouts.",
824
- "editor mode renders bold-brand chrome without the bottom boundary, treats the leading dsBack action as Exit, and keeps the primary Save action visible. Expanded uses Cross plus the Exit label and a label Save button; compact and constrained use Cross and Check icon buttons."
839
+ "The overflow trigger uses its bordered treatment whenever the primary action is visible beside it; overflow-only and auto-collapsed-primary presentations keep the trigger borderless.",
840
+ "expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after 32px top padding; the following title and right-side actions share one top alignment. Compact renders 48px chrome with the existing icon Back action; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
841
+ "primaryAction collapse defaults to auto. Use never for exceptional actions whose hierarchy must remain visible in constrained layouts."
825
842
  ],
826
843
  "responsiveBehavior": [
827
844
  "BarTitle does not observe viewport, shell, scroll, or container state. Its owner selects an explicit variant.",
828
845
  "ShellPage is the standard owner for automatic expanded, compact, and constrained selection.",
829
846
  "Compact titles use the shared md control inset so top-level headings align with BarNav and inline Back geometry aligns with PanelToolHeader. Long headings and section labels truncate independently while Back and action controls retain complete hit targets and accessible names.",
830
- "A never-collapse default-mode primary action remains visible in constrained mode; the title and section label yield space first.",
831
- "Editor mode keeps Exit and Save available in every presentation. Supply a concise Exit accessible name through backAriaLabel, use backLabel for the expanded Exit label, and provide primaryAction so dsAction can identify Save."
847
+ "A never-collapse primary action remains visible in constrained mode; the title and section label yield space first."
832
848
  ],
833
849
  "frameworkCaveats": {
834
850
  "customElements": [
835
- "Assign sections, primaryAction, and actions as JavaScript properties and replace array or object identities when controlled state changes.",
836
- "Handle dsBack in the router owner, update value after dsSectionChange, and execute product commands from dsAction."
851
+ "Assign breadcrumbs, sections, primaryAction, and actions as JavaScript properties and replace array or object identities when controlled state changes.",
852
+ "Handle dsBack for compact navigation and dsBreadcrumbSelect for application-owned expanded breadcrumb navigation, update value after dsSectionChange, and execute product commands from dsAction."
837
853
  ],
838
854
  "react": [
839
- "Pass arrays and objects directly to DsBarTitle and keep value controlled from route state.",
855
+ "Pass breadcrumb, section, and action arrays directly to DsBarTitle and keep value controlled from route state.",
840
856
  "Place DsBarTitle in DsShellPage with slot=header when automatic page behavior is required."
841
857
  ],
842
858
  "angular": [
843
- "Bind complex values on the standalone DsBarTitle adapter and handle the three intent events in the route shell.",
859
+ "Bind complex values on the standalone DsBarTitle adapter and handle Back, breadcrumb, section, and action intent events in the route shell.",
844
860
  "Place ds-bar-title in ds-shell-page with slot=header; do not render router-outlet inside BarTitle."
845
861
  ]
846
862
  },
@@ -877,6 +893,14 @@
877
893
  "type": "string",
878
894
  "required": false
879
895
  },
896
+ "breadcrumbAriaLabel": {
897
+ "type": "string",
898
+ "required": false
899
+ },
900
+ "breadcrumbs": {
901
+ "type": "BreadcrumbItem[]",
902
+ "required": false
903
+ },
880
904
  "description": {
881
905
  "type": "string",
882
906
  "required": false
@@ -885,10 +909,6 @@
885
909
  "type": "string",
886
910
  "required": true
887
911
  },
888
- "mode": {
889
- "type": "BarTitleMode",
890
- "required": false
891
- },
892
912
  "primaryAction": {
893
913
  "type": "BarTitlePrimaryAction | null",
894
914
  "required": false
@@ -923,6 +943,10 @@
923
943
  "name": "dsBack",
924
944
  "detail": "MouseEvent"
925
945
  },
946
+ {
947
+ "name": "dsBreadcrumbSelect",
948
+ "detail": "BreadcrumbSelectDetail"
949
+ },
926
950
  {
927
951
  "name": "dsSectionChange",
928
952
  "detail": "string"
@@ -941,6 +965,7 @@
941
965
  "@ds-mo/icons"
942
966
  ],
943
967
  "componentDependencies": [
968
+ "breadcrumb",
944
969
  "button-filled",
945
970
  "button-unfilled",
946
971
  "icon",
@@ -949,6 +974,277 @@
949
974
  "tooltip"
950
975
  ]
951
976
  },
977
+ {
978
+ "id": "component:ds-bar-workflow",
979
+ "tag": "ds-bar-workflow",
980
+ "name": "bar-workflow",
981
+ "title": "BarWorkflow",
982
+ "summary": "Compact bold-brand create/edit workflow chrome with Exit, controlled previous and next step navigation, and a final Save or Submit action.",
983
+ "intentStatus": "complete",
984
+ "intent": {
985
+ "audience": "general",
986
+ "status": "stable",
987
+ "summary": "Compact bold-brand create/edit workflow chrome with Exit, controlled previous and next step navigation, and a final Save or Submit action.",
988
+ "useWhen": [
989
+ "A create or edit flow needs persistent page-level Exit and step navigation.",
990
+ "A single-step form needs the same compact workflow chrome and final Save or Submit action.",
991
+ "Next or Submit must remain visible while the application owns validation and the current step."
992
+ ],
993
+ "avoidWhen": [
994
+ "The header identifies a routed page, list, or detail view; use BarTitle instead.",
995
+ "The steps must be visibly enumerated or expose progress; BarWorkflow uses steps only to resolve its navigation controls.",
996
+ "The header belongs to a PanelTools drawer or fullscreen pane; use PanelToolHeader through PanelTools instead.",
997
+ "The interaction is a local wizard inside page content rather than page-level workflow chrome."
998
+ ],
999
+ "alternatives": [
1000
+ {
1001
+ "when": "A routed page needs responsive title, section, Back, and page-action presentations.",
1002
+ "component": "component:ds-bar-title",
1003
+ "reason": "BarTitle owns page identity and capacity variants rather than workflow progression."
1004
+ },
1005
+ {
1006
+ "when": "The workflow belongs to a tool drawer or fullscreen tool pane.",
1007
+ "component": "component:ds-panel-tool-header",
1008
+ "reason": "PanelToolHeader owns tool-pane navigation and actions within PanelTools."
1009
+ }
1010
+ ],
1011
+ "commonlyComposedWith": [
1012
+ "component:ds-shell-page",
1013
+ "component:ds-button-filled",
1014
+ "component:ds-button-unfilled",
1015
+ "component:ds-text",
1016
+ "component:ds-tooltip"
1017
+ ],
1018
+ "patterns": [],
1019
+ "accessibility": [
1020
+ "Provide one concise workflow heading; BarWorkflow renders exactly one h1 and appends the controlled current-step count as heading · X/N only for multi-step workflows.",
1021
+ "Provide a workflow-specific Exit accessible name that describes the consequence or destination.",
1022
+ "Give every step a stable id and concise label even though step labels are not rendered as visible progress.",
1023
+ "Previous is omitted on the first step; it appears from step two onward. Next remains visible on intermediate steps and becomes the final labeled Check action on the last step.",
1024
+ "Use submitAction.type=submit inside a form so the final action preserves native submission semantics."
1025
+ ],
1026
+ "states": [
1027
+ "BarWorkflow always renders compact 48px bold-brand chrome and has no expanded, constrained, or responsive variant.",
1028
+ "An unrecognized value resolves navigation from the first step without mutating the controlled value.",
1029
+ "The first step omits Previous. Intermediate steps show Previous and Next. The last step replaces Next with the Check Save or Submit action.",
1030
+ "The default empty steps array is a single-step flow with the plain heading, no Previous control, and the final action visible. An explicit one-step array behaves the same way.",
1031
+ "isNextInactive blocks forward navigation while preserving the Next control; the target step's isInactive state also blocks entry.",
1032
+ "submitAction owns the final label, native button type, inactive state, and loading state."
1033
+ ],
1034
+ "responsiveBehavior": [
1035
+ "BarWorkflow does not expose a presentation variant and never collapses its navigation actions.",
1036
+ "The heading truncates before Exit, Previous, and Next or Submit lose their complete hit targets.",
1037
+ "When slotted into ShellPage, BarWorkflow remains compact while ShellPage continues to provide sticky placement."
1038
+ ],
1039
+ "frameworkCaveats": {
1040
+ "customElements": [
1041
+ "Assign steps and submitAction as JavaScript properties and replace their identities when controlled state changes.",
1042
+ "Update value after dsStepChange, handle dsExit in the workflow owner, and use dsSubmit only when product behavior supplements native form submission."
1043
+ ],
1044
+ "react": [
1045
+ "Pass steps and submitAction directly to DsBarWorkflow and keep value controlled in the workflow route.",
1046
+ "Place DsBarWorkflow in DsShellPage with slot=header when sticky page placement is required."
1047
+ ],
1048
+ "angular": [
1049
+ "Bind steps and submitAction on the standalone DsBarWorkflow adapter and update value from dsStepChange.",
1050
+ "Place ds-bar-workflow in ds-shell-page with slot=header and keep the form or router outlet in ShellPage content."
1051
+ ]
1052
+ },
1053
+ "references": [
1054
+ {
1055
+ "label": "Workflow states and controlled navigation",
1056
+ "path": "src/wc/components/BarWorkflow/BarWorkflow.stories.ts"
1057
+ },
1058
+ {
1059
+ "label": "Cross-browser workflow behavior",
1060
+ "path": "tests/e2e/bar-workflow.spec.ts"
1061
+ }
1062
+ ]
1063
+ },
1064
+ "api": {
1065
+ "props": {
1066
+ "exitAriaLabel": {
1067
+ "type": "string",
1068
+ "required": false
1069
+ },
1070
+ "exitLabel": {
1071
+ "type": "string",
1072
+ "required": false
1073
+ },
1074
+ "heading": {
1075
+ "type": "string",
1076
+ "required": true
1077
+ },
1078
+ "isNextInactive": {
1079
+ "type": "boolean",
1080
+ "required": false
1081
+ },
1082
+ "nextLabel": {
1083
+ "type": "string",
1084
+ "required": false
1085
+ },
1086
+ "previousLabel": {
1087
+ "type": "string",
1088
+ "required": false
1089
+ },
1090
+ "steps": {
1091
+ "type": "BarWorkflowStep[]",
1092
+ "required": false
1093
+ },
1094
+ "submitAction": {
1095
+ "type": "BarWorkflowSubmitAction",
1096
+ "required": false
1097
+ },
1098
+ "value": {
1099
+ "type": "string",
1100
+ "required": false
1101
+ }
1102
+ },
1103
+ "events": [
1104
+ {
1105
+ "name": "dsExit",
1106
+ "detail": "MouseEvent"
1107
+ },
1108
+ {
1109
+ "name": "dsStepChange",
1110
+ "detail": "string"
1111
+ },
1112
+ {
1113
+ "name": "dsSubmit",
1114
+ "detail": "MouseEvent"
1115
+ }
1116
+ ],
1117
+ "slots": []
1118
+ },
1119
+ "exports": {
1120
+ "customElement": "ds-bar-workflow",
1121
+ "react": "DsBarWorkflow",
1122
+ "angular": "DsBarWorkflow"
1123
+ },
1124
+ "dependencies": [
1125
+ "@ds-mo/ui",
1126
+ "@ds-mo/tokens"
1127
+ ],
1128
+ "componentDependencies": [
1129
+ "button-filled",
1130
+ "button-unfilled",
1131
+ "text",
1132
+ "tooltip"
1133
+ ]
1134
+ },
1135
+ {
1136
+ "id": "component:ds-breadcrumb",
1137
+ "tag": "ds-breadcrumb",
1138
+ "name": "breadcrumb",
1139
+ "title": "Breadcrumb",
1140
+ "summary": "Compact hierarchical page navigation with native links or application-owned selection, optional current-page semantics, and slash separators.",
1141
+ "intentStatus": "complete",
1142
+ "intent": {
1143
+ "audience": "general",
1144
+ "status": "stable",
1145
+ "summary": "Compact hierarchical page navigation with native links or application-owned selection, optional current-page semantics, and slash separators.",
1146
+ "useWhen": [
1147
+ "A page needs to expose its hierarchical ancestors above the current page title.",
1148
+ "Users need to move directly to a broader page in the current route hierarchy.",
1149
+ "BarTitle expanded presentation needs an ancestor path instead of a directional Back button."
1150
+ ],
1151
+ "avoidWhen": [
1152
+ "The navigation represents primary application destinations; use PanelNav or BarNav.",
1153
+ "The choices switch peer views within the current page; use TabGroup or the BarTitle section selector.",
1154
+ "Only a directional return command is needed in compact chrome; use the owning header's Back action.",
1155
+ "The path would repeat the same current-page label already communicated by a nearby h1 without adding useful ancestors."
1156
+ ],
1157
+ "alternatives": [
1158
+ {
1159
+ "when": "The title and breadcrumb belong to responsive page chrome with page-level actions.",
1160
+ "component": "component:ds-bar-title",
1161
+ "reason": "BarTitle composes Breadcrumb in expanded mode and preserves compact Back behavior."
1162
+ },
1163
+ {
1164
+ "when": "A small set of peer content views should remain directly selectable.",
1165
+ "component": "component:ds-tab-group",
1166
+ "reason": "TabGroup communicates peer selection rather than route ancestry."
1167
+ }
1168
+ ],
1169
+ "commonlyComposedWith": [
1170
+ "component:ds-bar-title",
1171
+ "component:ds-text",
1172
+ "component:ds-shell-page"
1173
+ ],
1174
+ "accessibility": [
1175
+ "The component renders a named navigation landmark containing an ordered list.",
1176
+ "Provide href for native navigation or handle dsSelect when the application router owns navigation.",
1177
+ "Mark at most one item current; it renders without interaction and exposes aria-current=page.",
1178
+ "Visible caption labels use secondary foreground and slash separators are decorative and hidden from assistive technology.",
1179
+ "Every interactive item remains keyboard reachable and receives the shared focus ring."
1180
+ ],
1181
+ "states": [
1182
+ "Items with href render native anchors; items without href render buttons and emit the same dsSelect detail.",
1183
+ "Preventing dsSelect cancels native anchor navigation.",
1184
+ "A current item is static text and never emits selection.",
1185
+ "Links have no resting underline and add a quaternary-foreground solid underline on hover; focus remains communicated by the shared focus ring."
1186
+ ],
1187
+ "responsiveBehavior": [
1188
+ "The path stays on one caption line and truncates long labels within the available width.",
1189
+ "Width is protected newest-to-oldest: the oldest ancestor collapses to a literal ellipsis before the next ancestor yields width, and the current location truncates only after every ancestor reaches its minimum.",
1190
+ "A fully collapsed item keeps its complete label available to assistive technology while rendering only the literal ellipsis visually.",
1191
+ "Separators remain visible while labels yield width."
1192
+ ],
1193
+ "frameworkCaveats": {
1194
+ "customElements": [
1195
+ "Assign items as a JavaScript property and replace its array identity when the route changes.",
1196
+ "Use relative or absolute href values for native navigation; omit href when the host router handles dsSelect."
1197
+ ],
1198
+ "react": [
1199
+ "Pass items to DsBreadcrumb and handle onDsSelect when navigation is application-owned."
1200
+ ],
1201
+ "angular": [
1202
+ "Bind items on the standalone DsBreadcrumb adapter and handle dsSelect when navigation is application-owned."
1203
+ ]
1204
+ },
1205
+ "references": [
1206
+ {
1207
+ "label": "Storybook examples",
1208
+ "path": "src/wc/components/Breadcrumb/Breadcrumb.stories.ts"
1209
+ },
1210
+ {
1211
+ "label": "Expanded page-header composition",
1212
+ "path": "src/wc/components/BarTitle/BarTitle.tsx"
1213
+ }
1214
+ ]
1215
+ },
1216
+ "api": {
1217
+ "props": {
1218
+ "ariaLabel": {
1219
+ "type": "string",
1220
+ "required": false
1221
+ },
1222
+ "items": {
1223
+ "type": "BreadcrumbItem[]",
1224
+ "required": false
1225
+ }
1226
+ },
1227
+ "events": [
1228
+ {
1229
+ "name": "dsSelect",
1230
+ "detail": "BreadcrumbSelectDetail"
1231
+ }
1232
+ ],
1233
+ "slots": []
1234
+ },
1235
+ "exports": {
1236
+ "customElement": "ds-breadcrumb",
1237
+ "react": "DsBreadcrumb",
1238
+ "angular": "DsBreadcrumb"
1239
+ },
1240
+ "dependencies": [
1241
+ "@ds-mo/ui",
1242
+ "@ds-mo/tokens"
1243
+ ],
1244
+ "componentDependencies": [
1245
+ "text"
1246
+ ]
1247
+ },
952
1248
  {
953
1249
  "id": "component:ds-button-filled",
954
1250
  "tag": "ds-button-filled",
@@ -1308,6 +1604,120 @@
1308
1604
  "text"
1309
1605
  ]
1310
1606
  },
1607
+ {
1608
+ "id": "component:ds-card-data-viz-bar",
1609
+ "tag": "ds-card-data-viz-bar",
1610
+ "name": "card-data-viz-bar",
1611
+ "title": "CardDataVizBar",
1612
+ "summary": "Canonical bar-chart dashboard card with shared data-viz chrome, a filter action, a fill chart region, and an optional static legend.",
1613
+ "intentStatus": "complete",
1614
+ "intent": {
1615
+ "audience": "specialized",
1616
+ "status": "experimental",
1617
+ "summary": "Canonical bar-chart dashboard card with shared data-viz chrome, a filter action, a fill chart region, and an optional static legend.",
1618
+ "useWhen": [
1619
+ "A dashboard widget needs a regular, stacked, or percentage bar chart in the standard data-viz card.",
1620
+ "A stacked bar chart needs a visible static series key beneath the chart."
1621
+ ],
1622
+ "avoidWhen": [
1623
+ "The visualization needs selectable legend rows or chart-to-legend hover synchronization.",
1624
+ "The product needs supporting metrics or an alternate chart layout beyond the chart and optional legend."
1625
+ ],
1626
+ "alternatives": [
1627
+ {
1628
+ "when": "The bar chart needs a custom layout without card chrome.",
1629
+ "component": "component:ds-chart-bar",
1630
+ "reason": "Compose ChartBar directly in the product-owned layout."
1631
+ },
1632
+ {
1633
+ "when": "The visualization communicates change as continuous lines.",
1634
+ "component": "component:ds-card-data-viz-line",
1635
+ "reason": "CardDataVizLine owns the canonical line-chart card layout."
1636
+ },
1637
+ {
1638
+ "when": "The visualization communicates parts of one total with synchronized slice emphasis.",
1639
+ "component": "component:ds-card-data-viz-donut",
1640
+ "reason": "CardDataVizDonut owns the donut layout and bidirectional hover synchronization."
1641
+ }
1642
+ ],
1643
+ "commonlyComposedWith": [
1644
+ "component:ds-card-shell-data-viz",
1645
+ "component:ds-chart-bar",
1646
+ "component:ds-chart-bar-stacked",
1647
+ "component:ds-chart-legend",
1648
+ "component:ds-button-unfilled"
1649
+ ],
1650
+ "accessibility": [
1651
+ "Provide a concise heading that identifies the measure and meaningful visible labels for every legend entry.",
1652
+ "Keep essential series and value context available textually rather than relying on bar color alone.",
1653
+ "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1654
+ ],
1655
+ "states": [
1656
+ "The chart region fills the remaining card body while an optional legend remains content-sized.",
1657
+ "The card disables local hover highlighting on a slotted ChartLegend because bar legends are static keys.",
1658
+ "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1659
+ "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1660
+ ],
1661
+ "responsiveBehavior": [
1662
+ "The selected sm, md, or lg shell size controls the card dimensions while the bar chart shrinks within its chart region.",
1663
+ "The horizontal legend wraps complete entries when the available width is constrained.",
1664
+ "The parent dashboard owns card wrapping and breakpoint changes."
1665
+ ],
1666
+ "frameworkCaveats": {
1667
+ "customElements": [
1668
+ "Assign data or series and categories as JavaScript properties, then place the bar chart and optional legend in their named slots."
1669
+ ],
1670
+ "react": [
1671
+ "Keep filter and dataset state in the owner; pass the chart and optional legend with chart and legend slot attributes."
1672
+ ],
1673
+ "angular": [
1674
+ "Keep filter and dataset state in the owner; project the chart and optional legend into the chart and legend slots."
1675
+ ]
1676
+ },
1677
+ "references": [
1678
+ {
1679
+ "label": "Storybook examples",
1680
+ "path": "src/wc/components/CardDataVizBar/CardDataVizBar.stories.ts"
1681
+ }
1682
+ ]
1683
+ },
1684
+ "api": {
1685
+ "props": {
1686
+ "cardWidth": {
1687
+ "type": "CardDataVizBarWidth",
1688
+ "required": false
1689
+ },
1690
+ "filterLabel": {
1691
+ "type": "string",
1692
+ "required": false
1693
+ },
1694
+ "heading": {
1695
+ "type": "string",
1696
+ "required": true
1697
+ }
1698
+ },
1699
+ "events": [
1700
+ {
1701
+ "name": "dsFilterClick",
1702
+ "detail": "void"
1703
+ }
1704
+ ],
1705
+ "slots": []
1706
+ },
1707
+ "exports": {
1708
+ "customElement": "ds-card-data-viz-bar",
1709
+ "react": "DsCardDataVizBar",
1710
+ "angular": "DsCardDataVizBar"
1711
+ },
1712
+ "dependencies": [
1713
+ "@ds-mo/ui",
1714
+ "@ds-mo/tokens"
1715
+ ],
1716
+ "componentDependencies": [
1717
+ "button-unfilled",
1718
+ "card-shell-data-viz"
1719
+ ]
1720
+ },
1311
1721
  {
1312
1722
  "id": "component:ds-card-data-viz-donut",
1313
1723
  "tag": "ds-card-data-viz-donut",
@@ -1422,6 +1832,114 @@
1422
1832
  "card-shell-data-viz"
1423
1833
  ]
1424
1834
  },
1835
+ {
1836
+ "id": "component:ds-card-data-viz-line",
1837
+ "tag": "ds-card-data-viz-line",
1838
+ "name": "card-data-viz-line",
1839
+ "title": "CardDataVizLine",
1840
+ "summary": "Canonical line-chart dashboard card with shared data-viz chrome, a filter action, fill chart region, and a static horizontal legend.",
1841
+ "intentStatus": "complete",
1842
+ "intent": {
1843
+ "audience": "specialized",
1844
+ "status": "experimental",
1845
+ "summary": "Canonical line-chart dashboard card with shared data-viz chrome, a filter action, fill chart region, and a static horizontal legend.",
1846
+ "useWhen": [
1847
+ "A dashboard widget needs the standard line chart and visible series key in one data-viz card.",
1848
+ "The legend identifies static line series and should not highlight or dim rows on hover."
1849
+ ],
1850
+ "avoidWhen": [
1851
+ "The visualization needs chart-to-legend hover synchronization or selectable series controls.",
1852
+ "The product needs a custom legend treatment, supporting metrics, or an alternate chart layout."
1853
+ ],
1854
+ "alternatives": [
1855
+ {
1856
+ "when": "The line chart and legend need a custom layout without card chrome.",
1857
+ "component": "component:ds-chart-line",
1858
+ "reason": "Compose ChartLine and a static ChartLegend directly in the product-owned layout."
1859
+ },
1860
+ {
1861
+ "when": "The visualization communicates parts of a total with synchronized slice emphasis.",
1862
+ "component": "component:ds-card-data-viz-donut",
1863
+ "reason": "CardDataVizDonut owns the donut layout and bidirectional hover synchronization."
1864
+ }
1865
+ ],
1866
+ "commonlyComposedWith": [
1867
+ "component:ds-card-shell-data-viz",
1868
+ "component:ds-chart-line",
1869
+ "component:ds-chart-legend",
1870
+ "component:ds-button-unfilled"
1871
+ ],
1872
+ "accessibility": [
1873
+ "Provide a concise heading that identifies the trend and meaningful visible labels for every legend entry.",
1874
+ "Keep essential series and value context available textually rather than relying on line color alone.",
1875
+ "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1876
+ ],
1877
+ "states": [
1878
+ "The chart region fills the remaining card body while the legend remains content-sized.",
1879
+ "The card disables local hover highlighting on a slotted ChartLegend because the line chart is static.",
1880
+ "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1881
+ "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1882
+ ],
1883
+ "responsiveBehavior": [
1884
+ "The selected sm, md, or lg shell size controls the card dimensions while the line chart shrinks within its chart region.",
1885
+ "The horizontal legend wraps complete entries when the available width is constrained.",
1886
+ "The parent dashboard owns card wrapping and breakpoint changes."
1887
+ ],
1888
+ "frameworkCaveats": {
1889
+ "customElements": [
1890
+ "Assign series, categories, and legend items as JavaScript properties, then place the chart and legend in their named slots."
1891
+ ],
1892
+ "react": [
1893
+ "Keep filter and dataset state in the owner; pass the chart and legend with chart and legend slot attributes."
1894
+ ],
1895
+ "angular": [
1896
+ "Keep filter and dataset state in the owner; project the chart and legend into the chart and legend slots."
1897
+ ]
1898
+ },
1899
+ "references": [
1900
+ {
1901
+ "label": "Storybook examples",
1902
+ "path": "src/wc/components/CardDataVizLine/CardDataVizLine.stories.ts"
1903
+ }
1904
+ ]
1905
+ },
1906
+ "api": {
1907
+ "props": {
1908
+ "cardWidth": {
1909
+ "type": "CardDataVizLineWidth",
1910
+ "required": false
1911
+ },
1912
+ "filterLabel": {
1913
+ "type": "string",
1914
+ "required": false
1915
+ },
1916
+ "heading": {
1917
+ "type": "string",
1918
+ "required": true
1919
+ }
1920
+ },
1921
+ "events": [
1922
+ {
1923
+ "name": "dsFilterClick",
1924
+ "detail": "void"
1925
+ }
1926
+ ],
1927
+ "slots": []
1928
+ },
1929
+ "exports": {
1930
+ "customElement": "ds-card-data-viz-line",
1931
+ "react": "DsCardDataVizLine",
1932
+ "angular": "DsCardDataVizLine"
1933
+ },
1934
+ "dependencies": [
1935
+ "@ds-mo/ui",
1936
+ "@ds-mo/tokens"
1937
+ ],
1938
+ "componentDependencies": [
1939
+ "button-unfilled",
1940
+ "card-shell-data-viz"
1941
+ ]
1942
+ },
1425
1943
  {
1426
1944
  "id": "component:ds-card-setting",
1427
1945
  "tag": "ds-card-setting",
@@ -1597,13 +2115,20 @@
1597
2115
  "when": "The composition is the standard donut chart plus synchronized legend.",
1598
2116
  "component": "component:ds-card-data-viz-donut",
1599
2117
  "reason": "CardDataVizDonut composes this shell with donut-specific regions and hover synchronization."
2118
+ },
2119
+ {
2120
+ "when": "The composition is the standard line chart plus static horizontal legend.",
2121
+ "component": "component:ds-card-data-viz-line",
2122
+ "reason": "CardDataVizLine composes this shell with line-specific regions and disables decorative legend hover."
1600
2123
  }
1601
2124
  ],
1602
2125
  "commonlyComposedWith": [
1603
2126
  "component:ds-chart-bar",
2127
+ "component:ds-chart-bar-stacked",
1604
2128
  "component:ds-chart-donut",
1605
2129
  "component:ds-chart-line",
1606
2130
  "component:ds-chart-legend",
2131
+ "component:ds-card-data-viz-line",
1607
2132
  "component:ds-button-unfilled"
1608
2133
  ],
1609
2134
  "accessibility": [
@@ -1689,6 +2214,11 @@
1689
2214
  "The data communicates a part-to-whole relationship."
1690
2215
  ],
1691
2216
  "alternatives": [
2217
+ {
2218
+ "when": "Each category contains several additive series or needs normalized composition.",
2219
+ "component": "component:ds-chart-bar-stacked",
2220
+ "reason": "ChartBarStacked compares raw stacked totals or normalized 0–100% composition."
2221
+ },
1692
2222
  {
1693
2223
  "when": "Users need to follow one or more trends across ordered categories.",
1694
2224
  "component": "component:ds-chart-line",
@@ -1701,6 +2231,7 @@
1701
2231
  }
1702
2232
  ],
1703
2233
  "commonlyComposedWith": [
2234
+ "component:ds-chart-bar-stacked",
1704
2235
  "component:ds-card-shell-data-viz",
1705
2236
  "component:ds-tooltip-data-viz"
1706
2237
  ],
@@ -1712,6 +2243,7 @@
1712
2243
  "states": [
1713
2244
  "The chart is currently a static single-series rendering without hover, selection, loading, or empty-state policy.",
1714
2245
  "An empty dataset renders no bars; the owning card or product supplies meaningful empty-state messaging.",
2246
+ "Bars use 2px top corner radii while the lower corners touching the zero axis remain square.",
1715
2247
  "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.",
1716
2248
  "Authored datum colors override the shared categorical palette."
1717
2249
  ],
@@ -1767,6 +2299,123 @@
1767
2299
  ],
1768
2300
  "componentDependencies": []
1769
2301
  },
2302
+ {
2303
+ "id": "component:ds-chart-bar-stacked",
2304
+ "tag": "ds-chart-bar-stacked",
2305
+ "name": "chart-bar-stacked",
2306
+ "title": "ChartBarStacked",
2307
+ "summary": "Multi-series stacked bar chart for comparing raw totals or normalized 0–100% composition across ordered categories and time buckets.",
2308
+ "intentStatus": "complete",
2309
+ "intent": {
2310
+ "audience": "specialized",
2311
+ "status": "experimental",
2312
+ "summary": "Multi-series stacked bar chart for comparing raw totals or normalized 0–100% composition across ordered categories and time buckets.",
2313
+ "useWhen": [
2314
+ "Users need to compare both a category total and the contribution of several consistent series.",
2315
+ "A time series needs to show how its composition changes across equal time buckets.",
2316
+ "Every category should normalize to 100% so proportional composition can be compared independently of total magnitude."
2317
+ ],
2318
+ "avoidWhen": [
2319
+ "Users need to compare individual series values precisely across categories; use grouped bars or separate charts.",
2320
+ "The visualization has only one measure per category; use ChartBar.",
2321
+ "The primary task is following continuous trends; use ChartLine.",
2322
+ "Series contain negative values or do not align with the shared category list."
2323
+ ],
2324
+ "alternatives": [
2325
+ {
2326
+ "when": "Each category contains one independent value.",
2327
+ "component": "component:ds-chart-bar",
2328
+ "reason": "ChartBar provides the simpler single-series magnitude comparison."
2329
+ },
2330
+ {
2331
+ "when": "Users need to follow one or more trends rather than compare stack composition.",
2332
+ "component": "component:ds-chart-line",
2333
+ "reason": "ChartLine preserves each series as a continuous path across the ordered axis."
2334
+ },
2335
+ {
2336
+ "when": "One category's parts-to-whole composition is the focus.",
2337
+ "component": "component:ds-chart-donut",
2338
+ "reason": "ChartDonut provides the dedicated single-total composition treatment."
2339
+ }
2340
+ ],
2341
+ "commonlyComposedWith": [
2342
+ "component:ds-chart-legend",
2343
+ "component:ds-card-shell-data-viz",
2344
+ "component:ds-tooltip-data-viz"
2345
+ ],
2346
+ "accessibility": [
2347
+ "Provide a visible legend or adjacent textual summary that names every series; do not rely on segment color alone.",
2348
+ "The chart image name includes each category and series value, using normalized percentages in percentage mode.",
2349
+ "Use an adjacent data table when exact cross-category comparisons are necessary to complete the task."
2350
+ ],
2351
+ "states": [
2352
+ "Stacked mode preserves raw magnitudes and scales the y-axis to the largest category total.",
2353
+ "Percentage mode normalizes each non-empty category independently and renders a fixed 0%, 25%, 50%, 75%, and 100% axis.",
2354
+ "Series render bottom-to-top in authored order; keep that order and color mapping stable across categories.",
2355
+ "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.",
2356
+ "Adjacent segments are separated by a non-scaling 1px gap; the stack's outer edges do not receive that separator.",
2357
+ "Negative values are unsupported and render as zero; the owning product supplies loading, empty, and error states."
2358
+ ],
2359
+ "responsiveBehavior": [
2360
+ "The SVG preserves its authored aspect ratio while shrinking to fit a narrower parent.",
2361
+ "The parent supplies dimensions and chooses how many time buckets remain legible at each width.",
2362
+ "Pre-format category labels and reduce bucket count before rendering when horizontal space becomes constrained."
2363
+ ],
2364
+ "frameworkCaveats": {
2365
+ "customElements": [
2366
+ "Assign series and categories as JavaScript properties and keep every series aligned to the category count."
2367
+ ],
2368
+ "react": [
2369
+ "Pass stable series and category arrays; choose percentage variant only when each category represents a meaningful whole."
2370
+ ],
2371
+ "angular": [
2372
+ "Bind series and categories as properties; choose percentage variant only when each category represents a meaningful whole."
2373
+ ]
2374
+ },
2375
+ "references": [
2376
+ {
2377
+ "label": "Storybook examples",
2378
+ "path": "src/wc/components/ChartBarStacked/ChartBarStacked.stories.ts"
2379
+ }
2380
+ ]
2381
+ },
2382
+ "api": {
2383
+ "props": {
2384
+ "categories": {
2385
+ "type": "string[]",
2386
+ "required": false
2387
+ },
2388
+ "height": {
2389
+ "type": "number",
2390
+ "required": false
2391
+ },
2392
+ "series": {
2393
+ "type": "ChartSeries[]",
2394
+ "required": false
2395
+ },
2396
+ "variant": {
2397
+ "type": "ChartBarStackedVariant",
2398
+ "required": false
2399
+ },
2400
+ "width": {
2401
+ "type": "number",
2402
+ "required": false
2403
+ }
2404
+ },
2405
+ "events": [],
2406
+ "slots": []
2407
+ },
2408
+ "exports": {
2409
+ "customElement": "ds-chart-bar-stacked",
2410
+ "react": "DsChartBarStacked",
2411
+ "angular": "DsChartBarStacked"
2412
+ },
2413
+ "dependencies": [
2414
+ "@ds-mo/ui",
2415
+ "@ds-mo/tokens"
2416
+ ],
2417
+ "componentDependencies": []
2418
+ },
1770
2419
  {
1771
2420
  "id": "component:ds-chart-donut",
1772
2421
  "tag": "ds-chart-donut",
@@ -1940,12 +2589,19 @@
1940
2589
  "when": "The donut belongs in the canonical dashboard card.",
1941
2590
  "component": "component:ds-card-data-viz-donut",
1942
2591
  "reason": "The dedicated card places the legend and handles bidirectional highlight synchronization."
2592
+ },
2593
+ {
2594
+ "when": "A static line chart and series key belong in the canonical dashboard card.",
2595
+ "component": "component:ds-card-data-viz-line",
2596
+ "reason": "The dedicated card places the horizontal legend and disables decorative local hover highlighting."
1943
2597
  }
1944
2598
  ],
1945
2599
  "commonlyComposedWith": [
1946
2600
  "component:ds-chart-donut",
2601
+ "component:ds-chart-bar-stacked",
1947
2602
  "component:ds-chart-line",
1948
2603
  "component:ds-card-data-viz-donut",
2604
+ "component:ds-card-data-viz-line",
1949
2605
  "component:ds-card-shell-data-viz"
1950
2606
  ],
1951
2607
  "accessibility": [
@@ -1955,7 +2611,8 @@
1955
2611
  "Do not rely on swatch color alone; every entry requires a meaningful visible label."
1956
2612
  ],
1957
2613
  "states": [
1958
- "Local pointer or focus interaction and external chart highlight remain separate; both may dim peers, but only a real link row receives interactive affordances.",
2614
+ "Local pointer or focus interaction and external chart highlight remain separate; both may dim peers, but only a real link row receives navigation affordances.",
2615
+ "Disable local hover highlighting for static keys such as a line-chart legend; externally controlled activeLabel highlighting and genuine link affordances remain available.",
1959
2616
  "Hover synchronization is temporary emphasis, never filtering, toggling, or selected state.",
1960
2617
  "Percentage values use one consistent precision across the complete legend.",
1961
2618
  "The list owns pointer leave so moving across row gaps does not clear and reapply highlight."
@@ -1997,6 +2654,10 @@
1997
2654
  "type": "ChartLegendDirection",
1998
2655
  "required": false
1999
2656
  },
2657
+ "highlightOnHover": {
2658
+ "type": "boolean",
2659
+ "required": false
2660
+ },
2000
2661
  "items": {
2001
2662
  "type": "ChartLegendItem[]",
2002
2663
  "required": false
@@ -2075,6 +2736,7 @@
2075
2736
  ],
2076
2737
  "commonlyComposedWith": [
2077
2738
  "component:ds-chart-legend",
2739
+ "component:ds-card-data-viz-line",
2078
2740
  "component:ds-card-shell-data-viz",
2079
2741
  "component:ds-tooltip-data-viz"
2080
2742
  ],
@@ -2085,11 +2747,12 @@
2085
2747
  ],
2086
2748
  "states": [
2087
2749
  "The chart is currently static and does not own hover, selection, loading, or empty-state policy.",
2750
+ "Its standard horizontal legend is a static key with local hover highlighting disabled.",
2088
2751
  "Point markers may be shown or hidden without changing the underlying series meaning.",
2089
2752
  "Authored series colors override the shared categorical palette."
2090
2753
  ],
2091
2754
  "responsiveBehavior": [
2092
- "The owner supplies dimensions and updates them when its layout changes.",
2755
+ "The owner supplies intrinsic dimensions; the SVG preserves its aspect ratio while shrinking to fit a narrower parent.",
2093
2756
  "Category positions are always equally spaced, even when labels represent time.",
2094
2757
  "Reduce or pre-format dense labels before passing them; the chart renders authored labels without a continuous time scale."
2095
2758
  ],
@@ -2504,12 +3167,12 @@
2504
3167
  "tag": "ds-conversation-list",
2505
3168
  "name": "conversation-list",
2506
3169
  "title": "ConversationList",
2507
- "summary": "Scrollable conversation-list region with dedicated empty and floating-action placement.",
3170
+ "summary": "Scrollable conversation-list region with dedicated empty and persistent action placement.",
2508
3171
  "intentStatus": "complete",
2509
3172
  "intent": {
2510
3173
  "audience": "general",
2511
3174
  "status": "experimental",
2512
- "summary": "Scrollable conversation-list region with dedicated empty and floating-action placement.",
3175
+ "summary": "Scrollable conversation-list region with dedicated empty and persistent action placement.",
2513
3176
  "useWhen": [
2514
3177
  "A messaging-like surface needs a reusable history list with empty and action regions."
2515
3178
  ],
@@ -2519,17 +3182,24 @@
2519
3182
  "commonlyComposedWith": [
2520
3183
  "component:ds-conversation-list-section",
2521
3184
  "component:ds-conversation-list-item",
2522
- "component:ds-empty-state"
3185
+ "component:ds-empty-state",
3186
+ "component:ds-scroll-overlay"
2523
3187
  ],
2524
3188
  "patterns": [
2525
3189
  "pattern:conversation"
2526
3190
  ],
2527
3191
  "accessibility": [
2528
3192
  "Provide an accessible list label through the surrounding heading or region.",
2529
- "Keep the empty message descriptive and the floating action explicitly named."
3193
+ "Keep the empty message descriptive and every persistent action explicitly named."
3194
+ ],
3195
+ "states": [
3196
+ "The default floating action stays at the lower end corner.",
3197
+ "actionLayout footer stretches a long action between 8px side and bottom insets.",
3198
+ "Both action layouts share the always-active scroll-overlay fade controller, reserve measured end clearance, and begin fading 8px before the visible action.",
3199
+ "ConversationList paints its measured fade on a separate surface-aware layer so contextual row actions retain a real backdrop for blur; hovered, focused, and menu-open rows rise above that decorative fade."
2530
3200
  ],
2531
3201
  "responsiveBehavior": [
2532
- "The list fills its owner, scrolls independently, and keeps its action at the lower end corner."
3202
+ "The list fills its owner, scrolls independently, and keeps its persistent action above scrolling rows."
2533
3203
  ],
2534
3204
  "references": [
2535
3205
  {
@@ -2539,7 +3209,12 @@
2539
3209
  ]
2540
3210
  },
2541
3211
  "api": {
2542
- "props": {},
3212
+ "props": {
3213
+ "actionLayout": {
3214
+ "type": "ConversationListActionLayout",
3215
+ "required": false
3216
+ }
3217
+ },
2543
3218
  "events": [],
2544
3219
  "slots": []
2545
3220
  },
@@ -2587,7 +3262,7 @@
2587
3262
  ],
2588
3263
  "states": [
2589
3264
  "Rows reuse the md choice-item label/subtext recipe used by Menu, including 6px row padding, 2px text inset, and the shared content gap. The enclosing conversation-list scroll region supplies the larger 8px outer container padding.",
2590
- "Busy and error are generic channel-neutral states; the owning product supplies suitable status wording. A busy row pairs its body-small status with the sm 16px Loader at an 8px gap.",
3265
+ "Busy and error are generic channel-neutral states; the owning product supplies suitable status wording. A busy row pairs its body-small status with the sm 16px Loader at a 4px gap.",
2591
3266
  "Any positive unreadCount renders one dot on the title row rather than a visible counter; the accessible row name may still announce the exact unread quantity.",
2592
3267
  "Hover and press use the shared interaction hover and pressed overlays. Only the selected conversation uses the persistent active fill.",
2593
3268
  "The title uses body-medium, not title-small, and the body-small preview truncates after one line. Unread titles use emphasis with primary foreground; read titles use regular weight with secondary foreground.",
@@ -2693,7 +3368,7 @@
2693
3368
  "The visible heading labels the section and must describe the relationship shared by its rows."
2694
3369
  ],
2695
3370
  "responsiveBehavior": [
2696
- "Rows remain full width while the heading stays visible in document order."
3371
+ "Rows remain full width with a 4px gap between adjacent items while the heading stays visible in document order."
2697
3372
  ],
2698
3373
  "references": [
2699
3374
  {
@@ -3514,24 +4189,24 @@
3514
4189
  "tag": "ds-markdown",
3515
4190
  "name": "markdown",
3516
4191
  "title": "Markdown",
3517
- "summary": "Safe CommonMark and GFM renderer built from parsed nodes without raw HTML injection.",
4192
+ "summary": "Optional safe CommonMark and GFM renderer that emits semantic nodes without raw HTML injection and consumes the shared prose CSS contract.",
3518
4193
  "intentStatus": "complete",
3519
4194
  "intent": {
3520
4195
  "audience": "specialized",
3521
4196
  "status": "experimental",
3522
- "summary": "Safe CommonMark and GFM renderer built from parsed nodes without raw HTML injection.",
4197
+ "summary": "Optional safe CommonMark and GFM renderer that emits semantic nodes without raw HTML injection and consumes the shared prose CSS contract.",
3523
4198
  "useWhen": [
3524
- "Trusted or untrusted message text needs headings, lists, links, tables, tasks, quotes, and code."
4199
+ "A serializable Markdown string needs the design system's safe, opinionated renderer for headings, lists, links, tables, tasks, quotes, and code."
3525
4200
  ],
3526
4201
  "avoidWhen": [
4202
+ "The application already owns a safe semantic-DOM renderer and only needs @ds-mo/ui/prose.css.",
3527
4203
  "The application needs arbitrary HTML, custom plugins, or a full document CMS renderer."
3528
4204
  ],
3529
4205
  "commonlyComposedWith": [
3530
- "component:ds-code-block",
3531
- "component:ds-message-bubble"
4206
+ "component:ds-agent-response",
4207
+ "component:ds-code-block"
3532
4208
  ],
3533
4209
  "patterns": [
3534
- "pattern:conversation",
3535
4210
  "pattern:agent-chat"
3536
4211
  ],
3537
4212
  "accessibility": [
@@ -3540,7 +4215,8 @@
3540
4215
  "Link text must remain descriptive in authored content."
3541
4216
  ],
3542
4217
  "states": [
3543
- "Streaming updates are coalesced to one parse and render per animation frame."
4218
+ "Streaming updates are coalesced to one parse and render per animation frame.",
4219
+ "Typography, rhythm, opt-out, and overflow styling come from the renderer-neutral .ds-prose source rather than a Markdown-only recipe."
3544
4220
  ],
3545
4221
  "responsiveBehavior": [
3546
4222
  "Tables and code scroll horizontally instead of forcing the transcript wider."
@@ -3548,7 +4224,11 @@
3548
4224
  "references": [
3549
4225
  {
3550
4226
  "label": "Storybook examples",
3551
- "path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
4227
+ "path": "src/wc/components/AgentResponse/AgentResponse.stories.ts"
4228
+ },
4229
+ {
4230
+ "label": "Prose distribution decision",
4231
+ "path": "docs/prose-foundation.md"
3552
4232
  }
3553
4233
  ]
3554
4234
  },
@@ -3637,14 +4317,14 @@
3637
4317
  "states": [
3638
4318
  "The host owns open state and responds to selection and close events.",
3639
4319
  "Use either flat items or sections, not both.",
3640
- "After dsSelect from a switch row, update switchValue in the items property so the controlled indicator reflects the new state.",
3641
- "For selectionMode single, keep exactly one item isSelected and update the items property after dsSelect.",
4320
+ "After dsSelect from a switch row, replace the items or sections array with updated switchValue data so the controlled indicator reflects the new state.",
4321
+ "For selectionMode single, keep exactly one item isSelected and replace the items or sections array after dsSelect; Menu never mutates consumer-owned selection data.",
3642
4322
  "Arrays, objects, and element anchors must be assigned as JavaScript properties.",
3643
4323
  "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."
3644
4324
  ],
3645
4325
  "responsiveBehavior": [
3646
4326
  "Keep the default choice-cell anchor alignment so the first or last interactive row edge aligns with its trigger, matching Select; use popup-frame only for deliberate custom frame geometry.",
3647
- "Choose placement relative to the trigger and allow the component to clamp the popup to the viewport.",
4327
+ "Treat side as the preferred placement. When the popup cannot fit there and the opposite side offers more room, Menu flips on that main axis before clamping the final position to the viewport.",
3648
4328
  "Avoid fixed widths that exceed narrow viewports."
3649
4329
  ],
3650
4330
  "frameworkCaveats": {
@@ -3798,10 +4478,11 @@
3798
4478
  ],
3799
4479
  "accessibility": [
3800
4480
  "Author and time metadata remain textual when they are necessary to interpret the transcript.",
3801
- "Delivery failure uses negative Failed to send text in the footer while the message bubble keeps its normal outgoing treatment."
4481
+ "Delivery failure uses negative Failed to send text in the footer while the message bubble keeps its normal outgoing treatment; when time is also visible, a tertiary middle dot separates the failure label and timestamp."
3802
4482
  ],
3803
4483
  "states": [
3804
4484
  "Pass an ISO timestamp. Message keeps the full value in dateTime and formats the visible value as a localized time; applications must not render a raw ISO string as visible transcript metadata.",
4485
+ "A visible incoming author uses body-small emphasis with primary foreground; timestamp and delivery metadata remain caption text.",
3805
4486
  "Visible author, bubble content, and timestamp or delivery footer use consistent 4px vertical gaps.",
3806
4487
  "Grouping joins adjacent bubble corners, shows the incoming author only at the start, and shows delivery/time metadata only at the end. Outgoing author remains in the accessible message label without repeating a visible You label.",
3807
4488
  "Set showAuthor false only when the product makes participant and assistant roles visually self-evident; continue passing author so the accessible message label remains specific."
@@ -4078,10 +4759,12 @@
4078
4759
  "Selection and transcript interaction release automatic following.",
4079
4760
  "Opening saved history, message jumps, and prepended history preserve deliberate position.",
4080
4761
  "The scroll-to-latest action is absent at the live edge, appears only after the reader moves away, and disappears again after returning to the newest message.",
4081
- "Place a composer container with 8px padding on every side in the overlay slot so messages scroll behind it; the scroller measures its live height, reserves matching transcript clearance, and keeps scroll-to-latest above it."
4762
+ "Place a composer container with 8px padding on every side in the overlay slot so messages scroll behind it; the shared scroll-overlay controller tracks every composer growth step, reserves matching transcript clearance, begins the fade 8px before the visible composer, and keeps scroll-to-latest above it."
4082
4763
  ],
4083
4764
  "responsiveBehavior": [
4084
- "Transcript width is readable while the scroll region fills available height."
4765
+ "Transcript width is readable while the scroll region fills available height.",
4766
+ "For a narrower fullscreen conversation lane, set --ds-message-scroller-content-max-width on the host instead of constraining the host; the full-width viewport then keeps its scrollbar at the outer edge while the transcript remains centered.",
4767
+ "The custom property sizes the padded transcript box. If the target is the usable conversation width, add the transcript's two 16px inline paddings and size the centered overlay container to the same target plus its two 8px paddings so messages and the visible composer align."
4085
4768
  ],
4086
4769
  "references": [
4087
4770
  {
@@ -4787,7 +5470,7 @@
4787
5470
  ],
4788
5471
  "accessibility": [
4789
5472
  "Provide an aria-label that names the searched domain, such as Search agent chats or Search messages.",
4790
- "The standard search clear action restores focus, exposes its localized name in a tooltip, and emits both the empty query and dsClear.",
5473
+ "The standard search clear action restores focus, uses the concise localized clearLabel by itself for both its tooltip and accessible name, and emits both the empty query and dsClear.",
4791
5474
  "When showFilter is enabled, provide stable filterTriggerId and filterControls values, synchronize filterExpanded with the controlled menu, and restore focus after selection; filterAriaLabel also labels its tooltip."
4792
5475
  ],
4793
5476
  "states": [
@@ -5262,6 +5945,85 @@
5262
5945
  "text"
5263
5946
  ]
5264
5947
  },
5948
+ {
5949
+ "id": "component:ds-scroll-overlay",
5950
+ "tag": "ds-scroll-overlay",
5951
+ "name": "scroll-overlay",
5952
+ "title": "ScrollOverlay",
5953
+ "summary": "Generic scroll owner for content that moves behind a persistent footer action or composer with an always-active alpha fade.",
5954
+ "intentStatus": "complete",
5955
+ "intent": {
5956
+ "audience": "general",
5957
+ "status": "experimental",
5958
+ "summary": "Generic scroll owner for content that moves behind a persistent footer action or composer with an always-active alpha fade.",
5959
+ "useWhen": [
5960
+ "A bounded region owns scrolling while footer actions remain overlaid and continuously visible.",
5961
+ "The final content must clear a live-height footer while earlier content can move behind it."
5962
+ ],
5963
+ "avoidWhen": [
5964
+ "The footer belongs in normal document flow rather than overlaying content.",
5965
+ "Another component already owns scrolling and cannot delegate its scrollport to this component."
5966
+ ],
5967
+ "commonlyComposedWith": [
5968
+ "component:ds-button-filled",
5969
+ "component:ds-message-composer"
5970
+ ],
5971
+ "accessibility": [
5972
+ "Provide scrollLabel when the scrollport needs its own named, keyboard-focusable region.",
5973
+ "Keep footer actions keyboard accessible and explicitly named; the fade is decorative and never intercepts pointer input."
5974
+ ],
5975
+ "states": [
5976
+ "The alpha mask remains active at every scroll position and moves in content coordinates so it stays pinned behind the footer without masking native scrollbars.",
5977
+ "The component measures the complete overlay for end clearance, measures its visible child for fade depth, and begins the fade 8px before that visible content.",
5978
+ "An md 32px footer action with 8px bottom inset therefore produces a 48px fade; variable-height composers produce a correspondingly taller measured fade."
5979
+ ],
5980
+ "responsiveBehavior": [
5981
+ "The scrollport and overlay fill the available width and height; the owner supplies responsive sizing and overlay insets."
5982
+ ],
5983
+ "frameworkCaveats": {
5984
+ "customElements": [
5985
+ "Place scrollable content in the default slot and one footer wrapper in the overlay slot; use dsScroll only when the application needs position data."
5986
+ ],
5987
+ "react": [
5988
+ "Use DsScrollOverlay with ordinary children plus an element carrying slot=\"overlay\"."
5989
+ ],
5990
+ "angular": [
5991
+ "Import DsScrollOverlay and project the persistent footer wrapper with slot=\"overlay\"."
5992
+ ]
5993
+ },
5994
+ "references": [
5995
+ {
5996
+ "label": "Storybook examples",
5997
+ "path": "src/wc/components/ScrollOverlay/ScrollOverlay.stories.ts"
5998
+ }
5999
+ ]
6000
+ },
6001
+ "api": {
6002
+ "props": {
6003
+ "scrollLabel": {
6004
+ "type": "string | undefined",
6005
+ "required": false
6006
+ }
6007
+ },
6008
+ "events": [
6009
+ {
6010
+ "name": "dsScroll",
6011
+ "detail": "ScrollOverlayScrollDetail"
6012
+ }
6013
+ ],
6014
+ "slots": []
6015
+ },
6016
+ "exports": {
6017
+ "customElement": "ds-scroll-overlay",
6018
+ "react": "DsScrollOverlay",
6019
+ "angular": "DsScrollOverlay"
6020
+ },
6021
+ "dependencies": [
6022
+ "@ds-mo/ui",
6023
+ "@ds-mo/tokens"
6024
+ ],
6025
+ "componentDependencies": []
6026
+ },
5265
6027
  {
5266
6028
  "id": "component:ds-select",
5267
6029
  "tag": "ds-select",
@@ -6121,15 +6883,16 @@
6121
6883
  "tag": "ds-shell-page",
6122
6884
  "name": "shell-page",
6123
6885
  "title": "ShellPage",
6124
- "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle placement, container-aware header variants, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
6886
+ "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, application-supplied BarTitle capacity, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
6125
6887
  "intentStatus": "complete",
6126
6888
  "intent": {
6127
6889
  "audience": "general",
6128
6890
  "status": "stable",
6129
- "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle placement, container-aware header variants, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
6891
+ "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, application-supplied BarTitle capacity, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
6130
6892
  "useWhen": [
6131
6893
  "Rendering a standard routed page inside ShellApp's default content region.",
6132
- "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the page column narrows.",
6894
+ "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the application shell reports reduced capacity.",
6895
+ "BarWorkflow needs sticky page-level placement while remaining compact.",
6133
6896
  "Pages need consistent content gutters with an explicit full-bleed option."
6134
6897
  ],
6135
6898
  "avoidWhen": [
@@ -6152,6 +6915,7 @@
6152
6915
  "commonlyComposedWith": [
6153
6916
  "component:ds-shell-app",
6154
6917
  "component:ds-bar-title",
6918
+ "component:ds-bar-workflow",
6155
6919
  "component:ds-tab-group"
6156
6920
  ],
6157
6921
  "patterns": [
@@ -6159,35 +6923,38 @@
6159
6923
  ],
6160
6924
  "accessibility": [
6161
6925
  "ShellPage exposes the routed page as the main landmark; render exactly one active ShellPage inside ShellApp.",
6162
- "Provide exactly one BarTitle through the header slot so the page has one h1.",
6926
+ "Provide exactly one BarTitle or BarWorkflow through the header slot so the page has one h1.",
6163
6927
  "Keep loading, empty, validation, error, progress, success, and failure communication in the default product-content slot.",
6164
6928
  "Responsive variant changes preserve the same heading, controls, accessible names, and keyboard focus targets."
6165
6929
  ],
6166
6930
  "states": [
6167
- "headerPresentation=auto selects expanded, compact, or constrained from ShellPage's own inline capacity and scroll position.",
6931
+ "headerCapacity=roomy, compact, or constrained is supplied before paint by the owning application shell and describes the page-header space available after viewport and shell-chrome policy are applied.",
6932
+ "headerPresentation=auto selects the matching header variant from headerCapacity and scroll position.",
6168
6933
  "expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
6169
6934
  "contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
6170
- "The required header slot accepts one BarTitle. The default slot owns router output and all page product content."
6935
+ "The required header slot accepts one BarTitle or BarWorkflow. The default slot owns router output and all page product content."
6171
6936
  ],
6172
6937
  "responsiveBehavior": [
6173
- "ShellPage observes its own rendered width instead of viewport media queries or ShellApp desktop/tablet modes.",
6174
- "Roomy pages expand at the top and compact after scroll; medium-capacity pages start compact; narrow pages use the constrained header variant.",
6175
- "A newly navigated header resolves current page capacity before it is revealed, so persistent tool or navigation chrome cannot flash the expanded presentation first.",
6176
- "Token-based capacity bands use hysteresis so opening tools or resizing navigation cannot oscillate near a boundary.",
6938
+ "The owning application shell resolves viewport and persistent-chrome state into the explicit headerCapacity prop; ShellPage never guesses the cause of reduced width from its own rendered size.",
6939
+ "Roomy capacity expands at the top and compacts after scroll; compact capacity stays compact; constrained capacity uses the constrained action layout.",
6940
+ "A ShellPage-managed BarTitle remains concealed until headerCapacity is available and its rendered variant matches the resolved presentation, preventing a default-variant flash during route activation.",
6941
+ "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
6942
+ "On roomy pages, the expanded header scrolls upward until its title and action row reaches the compact row position, then snaps variants without moving that shared visual anchor.",
6177
6943
  "Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
6178
- "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling."
6944
+ "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling.",
6945
+ "BarWorkflow remains compact and is not assigned BarTitle's capacity or scroll variants."
6179
6946
  ],
6180
6947
  "frameworkCaveats": {
6181
6948
  "customElements": [
6182
- "Import ShellPage and BarTitle, place one ds-bar-title in slot=header, and render route content as default children.",
6949
+ "Import ShellPage with BarTitle or BarWorkflow, place one header in slot=header, and render route content as default children.",
6183
6950
  "Do not set BarTitle.variant while ShellPage owns headerPresentation."
6184
6951
  ],
6185
6952
  "react": [
6186
- "Render DsBarTitle with slot=header inside DsShellPage and keep routed content as the remaining children.",
6953
+ "Render DsBarTitle or DsBarWorkflow with slot=header inside DsShellPage and keep routed content as the remaining children.",
6187
6954
  "Use contentInset none only for deliberately full-bleed page products."
6188
6955
  ],
6189
6956
  "angular": [
6190
- "Import the generated standalone DsShellPage and DsBarTitle adapters, preserve slot=header, and place router-outlet in the ShellPage default slot.",
6957
+ "Import the generated standalone DsShellPage adapter with DsBarTitle or DsBarWorkflow, preserve slot=header, and place router-outlet in the ShellPage default slot.",
6191
6958
  "Do not add another overflow auto wrapper around the routed page."
6192
6959
  ]
6193
6960
  },
@@ -6212,6 +6979,10 @@
6212
6979
  "type": "ShellPageContentInset",
6213
6980
  "required": false
6214
6981
  },
6982
+ "headerCapacity": {
6983
+ "type": "ShellPageCapacity",
6984
+ "required": false
6985
+ },
6215
6986
  "headerPresentation": {
6216
6987
  "type": "ShellPageHeaderPresentation",
6217
6988
  "required": false
@@ -7748,12 +8519,12 @@
7748
8519
  "pattern:conversation"
7749
8520
  ],
7750
8521
  "accessibility": [
7751
- "Provide concise localized status text that names the participant when that context is not otherwise clear.",
8522
+ "Provide concise localized status text; the standard label is Typing followed by a three-dot ellipsis.",
7752
8523
  "The polite atomic status announces typing without representing it as a message bubble."
7753
8524
  ],
7754
8525
  "states": [
7755
8526
  "TypingIndicator is transient conversation status, never persisted message content.",
7756
- "Its body-small secondary text may shimmer, while reduced-motion preferences retain a static readable status."
8527
+ "Its body-medium secondary text may shimmer, while reduced-motion preferences retain a static readable status."
7757
8528
  ],
7758
8529
  "responsiveBehavior": [
7759
8530
  "The indicator fills the message content width and wraps only when localized status text requires it."