@ds-mo/ui 12.0.0 → 12.2.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 (253) hide show
  1. package/README.md +18 -1
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +3 -2
  4. package/dist/agent.json +314 -41
  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-workflow.d.ts +28 -0
  8. package/dist/angular/ds-bar-workflow.js +48 -0
  9. package/dist/angular/ds-conversation-list.d.ts +1 -1
  10. package/dist/angular/ds-conversation-list.js +4 -3
  11. package/dist/angular/ds-scroll-overlay.d.ts +19 -0
  12. package/dist/angular/ds-scroll-overlay.js +43 -0
  13. package/dist/angular/index.d.ts +1 -1
  14. package/dist/angular/index.js +2 -0
  15. package/dist/angular/proxies.d.ts +2 -0
  16. package/dist/angular/proxies.js +2 -0
  17. package/dist/components/ds-agent-activity.js +1 -1
  18. package/dist/components/ds-agent-response.js +1 -1
  19. package/dist/components/ds-agent-source-list.js +1 -1
  20. package/dist/components/ds-agent-tool-call.js +1 -1
  21. package/dist/components/ds-attachment-list.js +1 -1
  22. package/dist/components/ds-avatar.js +1 -1
  23. package/dist/components/ds-avatar.js.map +1 -1
  24. package/dist/components/ds-badge.js +1 -1
  25. package/dist/components/ds-bar-nav.js +1 -1
  26. package/dist/components/ds-bar-nav.js.map +1 -1
  27. package/dist/components/ds-bar-title.js +1 -1
  28. package/dist/components/ds-bar-title.js.map +1 -1
  29. package/dist/components/ds-bar-workflow.d.ts +11 -0
  30. package/dist/components/ds-bar-workflow.js +2 -0
  31. package/dist/components/ds-bar-workflow.js.map +1 -0
  32. package/dist/components/ds-button-filled.js +1 -1
  33. package/dist/components/ds-button-unfilled.js +1 -1
  34. package/dist/components/ds-card-data-viz-donut.js +1 -1
  35. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  36. package/dist/components/ds-card-setting.js +1 -1
  37. package/dist/components/ds-card-setting.js.map +1 -1
  38. package/dist/components/ds-card-shell-data-viz.js +1 -1
  39. package/dist/components/ds-chart-bar.js +1 -1
  40. package/dist/components/ds-chart-donut.js +1 -1
  41. package/dist/components/ds-chart-legend.js +1 -1
  42. package/dist/components/ds-chart-line.js +1 -1
  43. package/dist/components/ds-checkbox.js +1 -1
  44. package/dist/components/ds-chip.js +1 -1
  45. package/dist/components/ds-chip.js.map +1 -1
  46. package/dist/components/ds-code-block.js +1 -1
  47. package/dist/components/ds-conversation-list-item.js +1 -1
  48. package/dist/components/ds-conversation-list-item.js.map +1 -1
  49. package/dist/components/ds-conversation-list-section.js +1 -1
  50. package/dist/components/ds-conversation-list-section.js.map +1 -1
  51. package/dist/components/ds-conversation-list.js +1 -1
  52. package/dist/components/ds-conversation-list.js.map +1 -1
  53. package/dist/components/ds-divider.js +1 -1
  54. package/dist/components/ds-empty-state.js +1 -1
  55. package/dist/components/ds-field.js +1 -1
  56. package/dist/components/ds-icon.js +1 -1
  57. package/dist/components/ds-input.js +1 -1
  58. package/dist/components/ds-input.js.map +1 -1
  59. package/dist/components/ds-markdown.js +1 -1
  60. package/dist/components/ds-menu.js +1 -1
  61. package/dist/components/ds-message-bubble.js +1 -1
  62. package/dist/components/ds-message-bubble.js.map +1 -1
  63. package/dist/components/ds-message-composer.js +1 -1
  64. package/dist/components/ds-message-composer.js.map +1 -1
  65. package/dist/components/ds-message-scroller.js +1 -1
  66. package/dist/components/ds-message-scroller.js.map +1 -1
  67. package/dist/components/ds-message.js +1 -1
  68. package/dist/components/ds-modal.js +1 -1
  69. package/dist/components/ds-panel-nav.js +1 -1
  70. package/dist/components/ds-panel-sub-nav.js +1 -1
  71. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  72. package/dist/components/ds-panel-tool-header.js +1 -1
  73. package/dist/components/ds-panel-tool-search.js +1 -1
  74. package/dist/components/ds-panel-tools.js +1 -1
  75. package/dist/components/ds-radio.js +1 -1
  76. package/dist/components/ds-radio.js.map +1 -1
  77. package/dist/components/ds-scroll-overlay.d.ts +11 -0
  78. package/dist/components/ds-scroll-overlay.js +2 -0
  79. package/dist/components/ds-scroll-overlay.js.map +1 -0
  80. package/dist/components/ds-select-multi.js +1 -1
  81. package/dist/components/ds-select-multi.js.map +1 -1
  82. package/dist/components/ds-select.js +1 -1
  83. package/dist/components/ds-select.js.map +1 -1
  84. package/dist/components/ds-shell-app.js +1 -1
  85. package/dist/components/ds-shell-gradient-picker.js +1 -1
  86. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  87. package/dist/components/ds-shell-gradient-swatch.js.map +1 -1
  88. package/dist/components/ds-shell-page.js +1 -1
  89. package/dist/components/ds-shell-page.js.map +1 -1
  90. package/dist/components/ds-skeleton.js +1 -1
  91. package/dist/components/ds-slider.js +1 -1
  92. package/dist/components/ds-slider.js.map +1 -1
  93. package/dist/components/ds-swatch-picker.js +1 -1
  94. package/dist/components/ds-switch.js +1 -1
  95. package/dist/components/ds-tab-group.js +1 -1
  96. package/dist/components/ds-tab-group.js.map +1 -1
  97. package/dist/components/ds-tag.js +1 -1
  98. package/dist/components/ds-tag.js.map +1 -1
  99. package/dist/components/ds-text.js +1 -1
  100. package/dist/components/ds-toast.js +1 -1
  101. package/dist/components/ds-tooltip-data-viz.js +1 -1
  102. package/dist/components/ds-tooltip.js +1 -1
  103. package/dist/components/ds-typing-indicator.js +1 -1
  104. package/dist/components/p-2W-ZjZCR.js +2 -0
  105. package/dist/components/{p-CwTVEAl2.js.map → p-2W-ZjZCR.js.map} +1 -1
  106. package/dist/components/p-8OOCLGph.js +2 -0
  107. package/dist/components/p-8OOCLGph.js.map +1 -0
  108. package/dist/components/{p-BYHKdFzV.js → p-B8CubPgQ.js} +2 -2
  109. package/dist/components/{p-DuNZGFkV.js → p-BAfG3M8z.js} +2 -2
  110. package/dist/components/p-BAfG3M8z.js.map +1 -0
  111. package/dist/components/p-BE_CDJeL.js +2 -0
  112. package/dist/components/p-BE_CDJeL.js.map +1 -0
  113. package/dist/components/{p-BH3es4p7.js → p-BRLDJmkh.js} +2 -2
  114. package/dist/components/p-BpA9uYKX.js +2 -0
  115. package/dist/components/p-BpA9uYKX.js.map +1 -0
  116. package/dist/components/{p-Bs6SS34m.js → p-C0_8K4y7.js} +2 -2
  117. package/dist/components/{p-BhKhX1er.js → p-CA3kLO7K.js} +2 -2
  118. package/dist/components/{p-DfIch2Dk.js → p-CCHqsF_H.js} +2 -2
  119. package/dist/components/p-CG5EX4NW.js +2 -0
  120. package/dist/components/{p-DABj3qTX.js.map → p-CG5EX4NW.js.map} +1 -1
  121. package/dist/components/{p-DVk0wxxX.js → p-CHkI3oIS.js} +2 -2
  122. package/dist/components/{p-liMPkhUP.js → p-CNffejay.js} +2 -2
  123. package/dist/components/{p-B3YvoGjS.js → p-Cxpl-rzP.js} +2 -2
  124. package/dist/components/p-CydY-v7X.js +2 -0
  125. package/dist/components/p-CydY-v7X.js.map +1 -0
  126. package/dist/components/{p-BkwBtZs3.js → p-D6jK2Hyi.js} +2 -2
  127. package/dist/components/{p-Cy04lXlc.js → p-DBi1bmOL.js} +2 -2
  128. package/dist/components/{p-DxeHimqk.js → p-DOCKtrS4.js} +2 -2
  129. package/dist/components/p-DbpfpeQT.js +2 -0
  130. package/dist/components/p-DbpfpeQT.js.map +1 -0
  131. package/dist/components/{p-6vj4kh70.js → p-DcGpdIlT.js} +2 -2
  132. package/dist/components/p-DyGB97Oy.js +2 -0
  133. package/dist/components/{p-Dy_sZ-dI.js.map → p-DyGB97Oy.js.map} +1 -1
  134. package/dist/components/p-GMDGgtY8.js +2 -0
  135. package/dist/components/{p-BUmDHPr3.js.map → p-GMDGgtY8.js.map} +1 -1
  136. package/dist/components/{p-Cf2J9MEo.js → p-XgIQ3oI_.js} +2 -2
  137. package/dist/components/{p-Cf-i-6aE.js → p-ky1msbJ8.js} +2 -2
  138. package/dist/components/p-xY3TjBF5.js +2 -0
  139. package/dist/components/{p-DUHcJWTQ.js.map → p-xY3TjBF5.js.map} +1 -1
  140. package/dist/docs/components.json +685 -56
  141. package/dist/lib/utils/anchored-popup.d.ts +5 -1
  142. package/dist/mcp-data/registry/agent-activity.json +1 -1
  143. package/dist/mcp-data/registry/agent-response.json +10 -5
  144. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  145. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  146. package/dist/mcp-data/registry/attachment-list.json +1 -1
  147. package/dist/mcp-data/registry/avatar.json +27 -8
  148. package/dist/mcp-data/registry/badge.json +1 -1
  149. package/dist/mcp-data/registry/bar-nav.json +1 -1
  150. package/dist/mcp-data/registry/bar-title.json +13 -8
  151. package/dist/mcp-data/registry/bar-workflow.json +368 -0
  152. package/dist/mcp-data/registry/button-filled.json +2 -2
  153. package/dist/mcp-data/registry/button-unfilled.json +2 -2
  154. package/dist/mcp-data/registry/card-data-viz-donut.json +1 -1
  155. package/dist/mcp-data/registry/card-setting.json +1 -1
  156. package/dist/mcp-data/registry/card-shell-data-viz.json +1 -1
  157. package/dist/mcp-data/registry/chart-bar.json +1 -1
  158. package/dist/mcp-data/registry/chart-donut.json +1 -1
  159. package/dist/mcp-data/registry/chart-legend.json +1 -1
  160. package/dist/mcp-data/registry/chart-line.json +1 -1
  161. package/dist/mcp-data/registry/checkbox.json +2 -2
  162. package/dist/mcp-data/registry/chip.json +1 -1
  163. package/dist/mcp-data/registry/code-block.json +1 -1
  164. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  165. package/dist/mcp-data/registry/conversation-list-section.json +3 -3
  166. package/dist/mcp-data/registry/conversation-list.json +37 -10
  167. package/dist/mcp-data/registry/divider.json +1 -1
  168. package/dist/mcp-data/registry/empty-state.json +1 -1
  169. package/dist/mcp-data/registry/field.json +1 -1
  170. package/dist/mcp-data/registry/icon.json +2 -2
  171. package/dist/mcp-data/registry/input.json +1 -1
  172. package/dist/mcp-data/registry/loader.json +1 -1
  173. package/dist/mcp-data/registry/markdown.json +16 -11
  174. package/dist/mcp-data/registry/menu.json +10 -8
  175. package/dist/mcp-data/registry/message-bubble.json +1 -1
  176. package/dist/mcp-data/registry/message-composer.json +1 -1
  177. package/dist/mcp-data/registry/message-scroller.json +4 -4
  178. package/dist/mcp-data/registry/message.json +1 -1
  179. package/dist/mcp-data/registry/modal.json +1 -1
  180. package/dist/mcp-data/registry/panel-nav.json +1 -1
  181. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  182. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  183. package/dist/mcp-data/registry/panel-tool-search.json +2 -2
  184. package/dist/mcp-data/registry/panel-tools.json +1 -1
  185. package/dist/mcp-data/registry/radio.json +1 -1
  186. package/dist/mcp-data/registry/registry.json +320 -41
  187. package/dist/mcp-data/registry/scroll-overlay.json +183 -0
  188. package/dist/mcp-data/registry/select-multi.json +1 -1
  189. package/dist/mcp-data/registry/select.json +1 -1
  190. package/dist/mcp-data/registry/shell-app.json +1 -1
  191. package/dist/mcp-data/registry/shell-gradient-picker.json +1 -1
  192. package/dist/mcp-data/registry/shell-gradient-swatch.json +2 -2
  193. package/dist/mcp-data/registry/shell-page.json +15 -11
  194. package/dist/mcp-data/registry/skeleton.json +1 -1
  195. package/dist/mcp-data/registry/slider.json +2 -2
  196. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  197. package/dist/mcp-data/registry/switch.json +2 -2
  198. package/dist/mcp-data/registry/tab-group.json +2 -2
  199. package/dist/mcp-data/registry/tag.json +1 -1
  200. package/dist/mcp-data/registry/text.json +1 -1
  201. package/dist/mcp-data/registry/toast.json +1 -1
  202. package/dist/mcp-data/registry/tooltip-data-viz.json +1 -1
  203. package/dist/mcp-data/registry/tooltip.json +1 -1
  204. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  205. package/dist/react/components.d.ts +2 -0
  206. package/dist/react/components.js +2 -0
  207. package/dist/react/ds-bar-workflow.d.ts +14 -0
  208. package/dist/react/ds-bar-workflow.js +16 -0
  209. package/dist/react/ds-scroll-overlay.d.ts +12 -0
  210. package/dist/react/ds-scroll-overlay.js +12 -0
  211. package/dist/styles/prose.css +214 -0
  212. package/dist/types/components/Avatar/Avatar.d.ts +4 -1
  213. package/dist/types/components/BarTitle/BarTitle.d.ts +2 -0
  214. package/dist/types/components/BarWorkflow/BarWorkflow.d.ts +37 -0
  215. package/dist/types/components/BarWorkflow/bar-workflow-types.d.ts +12 -0
  216. package/dist/types/components/ConversationList/ConversationList.d.ts +12 -0
  217. package/dist/types/components/Menu/Menu.d.ts +1 -2
  218. package/dist/types/components/MessageScroller/MessageScroller.d.ts +1 -6
  219. package/dist/types/components/ScrollOverlay/ScrollOverlay.d.ts +28 -0
  220. package/dist/types/components/ShellPage/ShellPage.d.ts +5 -0
  221. package/dist/types/components.d.ts +231 -3
  222. package/dist/types/stories/isolated-overlay-docs.d.ts +13 -0
  223. package/dist/types/utils/anchored-popup.d.ts +5 -1
  224. package/dist/types/utils/scroll-overlay-controller.d.ts +35 -0
  225. package/package.json +6 -5
  226. package/dist/components/p-BUmDHPr3.js +0 -2
  227. package/dist/components/p-BZZwQfmN.js +0 -2
  228. package/dist/components/p-BZZwQfmN.js.map +0 -1
  229. package/dist/components/p-CUik7PCi.js +0 -2
  230. package/dist/components/p-CUik7PCi.js.map +0 -1
  231. package/dist/components/p-CwTVEAl2.js +0 -2
  232. package/dist/components/p-DABj3qTX.js +0 -2
  233. package/dist/components/p-DUHcJWTQ.js +0 -2
  234. package/dist/components/p-DuNZGFkV.js.map +0 -1
  235. package/dist/components/p-Dy_sZ-dI.js +0 -2
  236. package/dist/components/p-l6PmnW_P.js +0 -2
  237. package/dist/components/p-l6PmnW_P.js.map +0 -1
  238. package/dist/components/p-xFbUt9Tc.js +0 -2
  239. package/dist/components/p-xFbUt9Tc.js.map +0 -1
  240. /package/dist/components/{p-BYHKdFzV.js.map → p-B8CubPgQ.js.map} +0 -0
  241. /package/dist/components/{p-BH3es4p7.js.map → p-BRLDJmkh.js.map} +0 -0
  242. /package/dist/components/{p-Bs6SS34m.js.map → p-C0_8K4y7.js.map} +0 -0
  243. /package/dist/components/{p-BhKhX1er.js.map → p-CA3kLO7K.js.map} +0 -0
  244. /package/dist/components/{p-DfIch2Dk.js.map → p-CCHqsF_H.js.map} +0 -0
  245. /package/dist/components/{p-DVk0wxxX.js.map → p-CHkI3oIS.js.map} +0 -0
  246. /package/dist/components/{p-liMPkhUP.js.map → p-CNffejay.js.map} +0 -0
  247. /package/dist/components/{p-B3YvoGjS.js.map → p-Cxpl-rzP.js.map} +0 -0
  248. /package/dist/components/{p-BkwBtZs3.js.map → p-D6jK2Hyi.js.map} +0 -0
  249. /package/dist/components/{p-Cy04lXlc.js.map → p-DBi1bmOL.js.map} +0 -0
  250. /package/dist/components/{p-DxeHimqk.js.map → p-DOCKtrS4.js.map} +0 -0
  251. /package/dist/components/{p-6vj4kh70.js.map → p-DcGpdIlT.js.map} +0 -0
  252. /package/dist/components/{p-Cf2J9MEo.js.map → p-XgIQ3oI_.js.map} +0 -0
  253. /package/dist/components/{p-Cf-i-6aE.js.map → p-ky1msbJ8.js.map} +0 -0
package/README.md CHANGED
@@ -94,7 +94,7 @@ All tags are `ds-*` custom elements. Grouped by role (see Storybook for props an
94
94
 
95
95
  ### Navigation
96
96
  - **TabGroup** (horizontal local views), **PanelSubNav** (vertical local views)
97
- - **ShellApp**, **PanelNav**, **BarNav**, **PanelTools**
97
+ - **ShellApp**, **ShellPage**, **PanelNav**, **BarNav**, **BarTitle**, **BarWorkflow**, **PanelTools**
98
98
 
99
99
  ### Status & layout
100
100
  - **EmptyState**, **Loader**, **Skeleton**, **CardSetting**, **CardDataVizDonut**
@@ -103,6 +103,23 @@ All tags are `ds-*` custom elements. Grouped by role (see Storybook for props an
103
103
 
104
104
  All styling uses TokoMo CSS custom properties. No hardcoded colors, sizes, or shadows — everything maps to the token system. Components will render unstyled if `@ds-mo/tokens` is not imported.
105
105
 
106
+ ## Semantic prose
107
+
108
+ Safe semantic DOM produced by Markdown, CMS, or documentation renderers can use the renderer-neutral prose stylesheet:
109
+
110
+ ```css
111
+ @import '@ds-mo/ui/prose.css';
112
+ ```
113
+
114
+ ```html
115
+ <article class="ds-prose">
116
+ <h2>Summary</h2>
117
+ <p>Renderer-owned semantic content.</p>
118
+ </article>
119
+ ```
120
+
121
+ The application remains responsible for parsing and content safety. Use `data-ds-prose="off"` on embedded product UI, and wrap wide tables in `.ds-prose__table-scroll`. See the [prose foundation decision](docs/prose-foundation.md).
122
+
106
123
  ## Icon pattern
107
124
 
108
125
  Components that accept icons use a named `icon` slot:
package/dist/.build-stamp CHANGED
@@ -1 +1 @@
1
- 1784701897260
1
+ 1784783184986
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "12.0.0",
4
+ "packageVersion": "12.2.0",
5
5
  "kind": "patterns",
6
6
  "entries": [
7
7
  {
@@ -45,6 +45,7 @@
45
45
  "The application owns scripted or real transport, immutable response parts, retry, stop, generated titles, and persistence.",
46
46
  "User-sent prompts use MessageBubble's user variant and body-medium regular default with secondary foreground; the application does not promote ordinary sent-message copy to body-large.",
47
47
  "AgentResponse renders directly in Message without a MessageBubble surface, owns ordered display only, and never reveals private reasoning.",
48
+ "Markdown parsing and safe node creation belong to the renderer; the renderer-neutral @ds-mo/ui/prose.css surface owns only semantic-tree styling.",
48
49
  "Tool-call components display execution state but do not request participant approval."
49
50
  ],
50
51
  "accessibility": [
@@ -443,7 +444,7 @@
443
444
  ],
444
445
  "responsiveBehavior": [
445
446
  "Let ShellPage select expanded, compact, and constrained variants from its own capacity and scroll position.",
446
- "Set primaryAction.collapse to never only when the action must preserve visible hierarchy, such as Save in create and edit flows.",
447
+ "Set primaryAction.collapse to never only when an ordinary routed-page action must preserve visible hierarchy; create and edit workflows use BarWorkflow instead.",
447
448
  "Use contentInset none only for deliberately full-bleed products such as maps and canvases.",
448
449
  "Place TabGroup inside ShellPage content for inner-page panels; route-level sections remain in BarTitle."
449
450
  ],
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.0.0",
4
+ "packageVersion": "12.2.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 optional Back 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 optional route navigation, 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 optional Back 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 optional route navigation, 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, create, or edit page needs a page-level Back action.",
789
+ "A detail page needs a page-level Back action.",
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",
@@ -819,8 +834,8 @@
819
834
  "Omitting Back, sections, primaryAction, and actions produces the top-level title-only header.",
820
835
  "Two or more selectable sections add the inline section trigger; one section does not render a redundant menu.",
821
836
  "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 above a flush-left h1; 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 Save-like actions whose hierarchy must remain visible in constrained layouts."
837
+ "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.",
838
+ "primaryAction collapse defaults to auto. Use never for exceptional actions whose hierarchy must remain visible in constrained layouts."
824
839
  ],
825
840
  "responsiveBehavior": [
826
841
  "BarTitle does not observe viewport, shell, scroll, or container state. Its owner selects an explicit variant.",
@@ -943,6 +958,164 @@
943
958
  "tooltip"
944
959
  ]
945
960
  },
961
+ {
962
+ "id": "component:ds-bar-workflow",
963
+ "tag": "ds-bar-workflow",
964
+ "name": "bar-workflow",
965
+ "title": "BarWorkflow",
966
+ "summary": "Compact bold-brand create/edit workflow chrome with Exit, controlled previous and next step navigation, and a final Save or Submit action.",
967
+ "intentStatus": "complete",
968
+ "intent": {
969
+ "audience": "general",
970
+ "status": "stable",
971
+ "summary": "Compact bold-brand create/edit workflow chrome with Exit, controlled previous and next step navigation, and a final Save or Submit action.",
972
+ "useWhen": [
973
+ "A create or edit flow needs persistent page-level Exit and step navigation.",
974
+ "A single-step form needs the same compact workflow chrome and final Save or Submit action.",
975
+ "Next or Submit must remain visible while the application owns validation and the current step."
976
+ ],
977
+ "avoidWhen": [
978
+ "The header identifies a routed page, list, or detail view; use BarTitle instead.",
979
+ "The steps must be visibly enumerated or expose progress; BarWorkflow uses steps only to resolve its navigation controls.",
980
+ "The header belongs to a PanelTools drawer or fullscreen pane; use PanelToolHeader through PanelTools instead.",
981
+ "The interaction is a local wizard inside page content rather than page-level workflow chrome."
982
+ ],
983
+ "alternatives": [
984
+ {
985
+ "when": "A routed page needs responsive title, section, Back, and page-action presentations.",
986
+ "component": "component:ds-bar-title",
987
+ "reason": "BarTitle owns page identity and capacity variants rather than workflow progression."
988
+ },
989
+ {
990
+ "when": "The workflow belongs to a tool drawer or fullscreen tool pane.",
991
+ "component": "component:ds-panel-tool-header",
992
+ "reason": "PanelToolHeader owns tool-pane navigation and actions within PanelTools."
993
+ }
994
+ ],
995
+ "commonlyComposedWith": [
996
+ "component:ds-shell-page",
997
+ "component:ds-button-filled",
998
+ "component:ds-button-unfilled",
999
+ "component:ds-text",
1000
+ "component:ds-tooltip"
1001
+ ],
1002
+ "patterns": [],
1003
+ "accessibility": [
1004
+ "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.",
1005
+ "Provide a workflow-specific Exit accessible name that describes the consequence or destination.",
1006
+ "Give every step a stable id and concise label even though step labels are not rendered as visible progress.",
1007
+ "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.",
1008
+ "Use submitAction.type=submit inside a form so the final action preserves native submission semantics."
1009
+ ],
1010
+ "states": [
1011
+ "BarWorkflow always renders compact 48px bold-brand chrome and has no expanded, constrained, or responsive variant.",
1012
+ "An unrecognized value resolves navigation from the first step without mutating the controlled value.",
1013
+ "The first step omits Previous. Intermediate steps show Previous and Next. The last step replaces Next with the Check Save or Submit action.",
1014
+ "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.",
1015
+ "isNextInactive blocks forward navigation while preserving the Next control; the target step's isInactive state also blocks entry.",
1016
+ "submitAction owns the final label, native button type, inactive state, and loading state."
1017
+ ],
1018
+ "responsiveBehavior": [
1019
+ "BarWorkflow does not expose a presentation variant and never collapses its navigation actions.",
1020
+ "The heading truncates before Exit, Previous, and Next or Submit lose their complete hit targets.",
1021
+ "When slotted into ShellPage, BarWorkflow remains compact while ShellPage continues to provide sticky placement."
1022
+ ],
1023
+ "frameworkCaveats": {
1024
+ "customElements": [
1025
+ "Assign steps and submitAction as JavaScript properties and replace their identities when controlled state changes.",
1026
+ "Update value after dsStepChange, handle dsExit in the workflow owner, and use dsSubmit only when product behavior supplements native form submission."
1027
+ ],
1028
+ "react": [
1029
+ "Pass steps and submitAction directly to DsBarWorkflow and keep value controlled in the workflow route.",
1030
+ "Place DsBarWorkflow in DsShellPage with slot=header when sticky page placement is required."
1031
+ ],
1032
+ "angular": [
1033
+ "Bind steps and submitAction on the standalone DsBarWorkflow adapter and update value from dsStepChange.",
1034
+ "Place ds-bar-workflow in ds-shell-page with slot=header and keep the form or router outlet in ShellPage content."
1035
+ ]
1036
+ },
1037
+ "references": [
1038
+ {
1039
+ "label": "Workflow states and controlled navigation",
1040
+ "path": "src/wc/components/BarWorkflow/BarWorkflow.stories.ts"
1041
+ },
1042
+ {
1043
+ "label": "Cross-browser workflow behavior",
1044
+ "path": "tests/e2e/bar-workflow.spec.ts"
1045
+ }
1046
+ ]
1047
+ },
1048
+ "api": {
1049
+ "props": {
1050
+ "exitAriaLabel": {
1051
+ "type": "string",
1052
+ "required": false
1053
+ },
1054
+ "exitLabel": {
1055
+ "type": "string",
1056
+ "required": false
1057
+ },
1058
+ "heading": {
1059
+ "type": "string",
1060
+ "required": true
1061
+ },
1062
+ "isNextInactive": {
1063
+ "type": "boolean",
1064
+ "required": false
1065
+ },
1066
+ "nextLabel": {
1067
+ "type": "string",
1068
+ "required": false
1069
+ },
1070
+ "previousLabel": {
1071
+ "type": "string",
1072
+ "required": false
1073
+ },
1074
+ "steps": {
1075
+ "type": "BarWorkflowStep[]",
1076
+ "required": false
1077
+ },
1078
+ "submitAction": {
1079
+ "type": "BarWorkflowSubmitAction",
1080
+ "required": false
1081
+ },
1082
+ "value": {
1083
+ "type": "string",
1084
+ "required": false
1085
+ }
1086
+ },
1087
+ "events": [
1088
+ {
1089
+ "name": "dsExit",
1090
+ "detail": "MouseEvent"
1091
+ },
1092
+ {
1093
+ "name": "dsStepChange",
1094
+ "detail": "string"
1095
+ },
1096
+ {
1097
+ "name": "dsSubmit",
1098
+ "detail": "MouseEvent"
1099
+ }
1100
+ ],
1101
+ "slots": []
1102
+ },
1103
+ "exports": {
1104
+ "customElement": "ds-bar-workflow",
1105
+ "react": "DsBarWorkflow",
1106
+ "angular": "DsBarWorkflow"
1107
+ },
1108
+ "dependencies": [
1109
+ "@ds-mo/ui",
1110
+ "@ds-mo/tokens"
1111
+ ],
1112
+ "componentDependencies": [
1113
+ "button-filled",
1114
+ "button-unfilled",
1115
+ "text",
1116
+ "tooltip"
1117
+ ]
1118
+ },
946
1119
  {
947
1120
  "id": "component:ds-button-filled",
948
1121
  "tag": "ds-button-filled",
@@ -2498,12 +2671,12 @@
2498
2671
  "tag": "ds-conversation-list",
2499
2672
  "name": "conversation-list",
2500
2673
  "title": "ConversationList",
2501
- "summary": "Scrollable conversation-list region with dedicated empty and floating-action placement.",
2674
+ "summary": "Scrollable conversation-list region with dedicated empty and persistent action placement.",
2502
2675
  "intentStatus": "complete",
2503
2676
  "intent": {
2504
2677
  "audience": "general",
2505
2678
  "status": "experimental",
2506
- "summary": "Scrollable conversation-list region with dedicated empty and floating-action placement.",
2679
+ "summary": "Scrollable conversation-list region with dedicated empty and persistent action placement.",
2507
2680
  "useWhen": [
2508
2681
  "A messaging-like surface needs a reusable history list with empty and action regions."
2509
2682
  ],
@@ -2513,17 +2686,24 @@
2513
2686
  "commonlyComposedWith": [
2514
2687
  "component:ds-conversation-list-section",
2515
2688
  "component:ds-conversation-list-item",
2516
- "component:ds-empty-state"
2689
+ "component:ds-empty-state",
2690
+ "component:ds-scroll-overlay"
2517
2691
  ],
2518
2692
  "patterns": [
2519
2693
  "pattern:conversation"
2520
2694
  ],
2521
2695
  "accessibility": [
2522
2696
  "Provide an accessible list label through the surrounding heading or region.",
2523
- "Keep the empty message descriptive and the floating action explicitly named."
2697
+ "Keep the empty message descriptive and every persistent action explicitly named."
2698
+ ],
2699
+ "states": [
2700
+ "The default floating action stays at the lower end corner.",
2701
+ "actionLayout footer stretches a long action between 8px side and bottom insets.",
2702
+ "Both action layouts share the always-active scroll-overlay fade controller, reserve measured end clearance, and begin fading 8px before the visible action.",
2703
+ "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."
2524
2704
  ],
2525
2705
  "responsiveBehavior": [
2526
- "The list fills its owner, scrolls independently, and keeps its action at the lower end corner."
2706
+ "The list fills its owner, scrolls independently, and keeps its persistent action above scrolling rows."
2527
2707
  ],
2528
2708
  "references": [
2529
2709
  {
@@ -2533,7 +2713,12 @@
2533
2713
  ]
2534
2714
  },
2535
2715
  "api": {
2536
- "props": {},
2716
+ "props": {
2717
+ "actionLayout": {
2718
+ "type": "ConversationListActionLayout",
2719
+ "required": false
2720
+ }
2721
+ },
2537
2722
  "events": [],
2538
2723
  "slots": []
2539
2724
  },
@@ -2687,7 +2872,7 @@
2687
2872
  "The visible heading labels the section and must describe the relationship shared by its rows."
2688
2873
  ],
2689
2874
  "responsiveBehavior": [
2690
- "Rows remain full width while the heading stays visible in document order."
2875
+ "Rows remain full width with a 4px gap between adjacent items while the heading stays visible in document order."
2691
2876
  ],
2692
2877
  "references": [
2693
2878
  {
@@ -3508,24 +3693,24 @@
3508
3693
  "tag": "ds-markdown",
3509
3694
  "name": "markdown",
3510
3695
  "title": "Markdown",
3511
- "summary": "Safe CommonMark and GFM renderer built from parsed nodes without raw HTML injection.",
3696
+ "summary": "Optional safe CommonMark and GFM renderer that emits semantic nodes without raw HTML injection and consumes the shared prose CSS contract.",
3512
3697
  "intentStatus": "complete",
3513
3698
  "intent": {
3514
3699
  "audience": "specialized",
3515
3700
  "status": "experimental",
3516
- "summary": "Safe CommonMark and GFM renderer built from parsed nodes without raw HTML injection.",
3701
+ "summary": "Optional safe CommonMark and GFM renderer that emits semantic nodes without raw HTML injection and consumes the shared prose CSS contract.",
3517
3702
  "useWhen": [
3518
- "Trusted or untrusted message text needs headings, lists, links, tables, tasks, quotes, and code."
3703
+ "A serializable Markdown string needs the design system's safe, opinionated renderer for headings, lists, links, tables, tasks, quotes, and code."
3519
3704
  ],
3520
3705
  "avoidWhen": [
3706
+ "The application already owns a safe semantic-DOM renderer and only needs @ds-mo/ui/prose.css.",
3521
3707
  "The application needs arbitrary HTML, custom plugins, or a full document CMS renderer."
3522
3708
  ],
3523
3709
  "commonlyComposedWith": [
3524
- "component:ds-code-block",
3525
- "component:ds-message-bubble"
3710
+ "component:ds-agent-response",
3711
+ "component:ds-code-block"
3526
3712
  ],
3527
3713
  "patterns": [
3528
- "pattern:conversation",
3529
3714
  "pattern:agent-chat"
3530
3715
  ],
3531
3716
  "accessibility": [
@@ -3534,7 +3719,8 @@
3534
3719
  "Link text must remain descriptive in authored content."
3535
3720
  ],
3536
3721
  "states": [
3537
- "Streaming updates are coalesced to one parse and render per animation frame."
3722
+ "Streaming updates are coalesced to one parse and render per animation frame.",
3723
+ "Typography, rhythm, opt-out, and overflow styling come from the renderer-neutral .ds-prose source rather than a Markdown-only recipe."
3538
3724
  ],
3539
3725
  "responsiveBehavior": [
3540
3726
  "Tables and code scroll horizontally instead of forcing the transcript wider."
@@ -3542,7 +3728,11 @@
3542
3728
  "references": [
3543
3729
  {
3544
3730
  "label": "Storybook examples",
3545
- "path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
3731
+ "path": "src/wc/components/AgentResponse/AgentResponse.stories.ts"
3732
+ },
3733
+ {
3734
+ "label": "Prose distribution decision",
3735
+ "path": "docs/prose-foundation.md"
3546
3736
  }
3547
3737
  ]
3548
3738
  },
@@ -3631,14 +3821,14 @@
3631
3821
  "states": [
3632
3822
  "The host owns open state and responds to selection and close events.",
3633
3823
  "Use either flat items or sections, not both.",
3634
- "After dsSelect from a switch row, update switchValue in the items property so the controlled indicator reflects the new state.",
3635
- "For selectionMode single, keep exactly one item isSelected and update the items property after dsSelect.",
3824
+ "After dsSelect from a switch row, replace the items or sections array with updated switchValue data so the controlled indicator reflects the new state.",
3825
+ "For selectionMode single, keep exactly one item isSelected and replace the items or sections array after dsSelect; Menu never mutates consumer-owned selection data.",
3636
3826
  "Arrays, objects, and element anchors must be assigned as JavaScript properties.",
3637
3827
  "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."
3638
3828
  ],
3639
3829
  "responsiveBehavior": [
3640
3830
  "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.",
3641
- "Choose placement relative to the trigger and allow the component to clamp the popup to the viewport.",
3831
+ "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.",
3642
3832
  "Avoid fixed widths that exceed narrow viewports."
3643
3833
  ],
3644
3834
  "frameworkCaveats": {
@@ -4072,7 +4262,7 @@
4072
4262
  "Selection and transcript interaction release automatic following.",
4073
4263
  "Opening saved history, message jumps, and prepended history preserve deliberate position.",
4074
4264
  "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.",
4075
- "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."
4265
+ "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."
4076
4266
  ],
4077
4267
  "responsiveBehavior": [
4078
4268
  "Transcript width is readable while the scroll region fills available height."
@@ -4781,7 +4971,7 @@
4781
4971
  ],
4782
4972
  "accessibility": [
4783
4973
  "Provide an aria-label that names the searched domain, such as Search agent chats or Search messages.",
4784
- "The standard search clear action restores focus, exposes its localized name in a tooltip, and emits both the empty query and dsClear.",
4974
+ "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.",
4785
4975
  "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."
4786
4976
  ],
4787
4977
  "states": [
@@ -5256,6 +5446,85 @@
5256
5446
  "text"
5257
5447
  ]
5258
5448
  },
5449
+ {
5450
+ "id": "component:ds-scroll-overlay",
5451
+ "tag": "ds-scroll-overlay",
5452
+ "name": "scroll-overlay",
5453
+ "title": "ScrollOverlay",
5454
+ "summary": "Generic scroll owner for content that moves behind a persistent footer action or composer with an always-active alpha fade.",
5455
+ "intentStatus": "complete",
5456
+ "intent": {
5457
+ "audience": "general",
5458
+ "status": "experimental",
5459
+ "summary": "Generic scroll owner for content that moves behind a persistent footer action or composer with an always-active alpha fade.",
5460
+ "useWhen": [
5461
+ "A bounded region owns scrolling while footer actions remain overlaid and continuously visible.",
5462
+ "The final content must clear a live-height footer while earlier content can move behind it."
5463
+ ],
5464
+ "avoidWhen": [
5465
+ "The footer belongs in normal document flow rather than overlaying content.",
5466
+ "Another component already owns scrolling and cannot delegate its scrollport to this component."
5467
+ ],
5468
+ "commonlyComposedWith": [
5469
+ "component:ds-button-filled",
5470
+ "component:ds-message-composer"
5471
+ ],
5472
+ "accessibility": [
5473
+ "Provide scrollLabel when the scrollport needs its own named, keyboard-focusable region.",
5474
+ "Keep footer actions keyboard accessible and explicitly named; the fade is decorative and never intercepts pointer input."
5475
+ ],
5476
+ "states": [
5477
+ "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.",
5478
+ "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.",
5479
+ "An md 32px footer action with 8px bottom inset therefore produces a 48px fade; variable-height composers produce a correspondingly taller measured fade."
5480
+ ],
5481
+ "responsiveBehavior": [
5482
+ "The scrollport and overlay fill the available width and height; the owner supplies responsive sizing and overlay insets."
5483
+ ],
5484
+ "frameworkCaveats": {
5485
+ "customElements": [
5486
+ "Place scrollable content in the default slot and one footer wrapper in the overlay slot; use dsScroll only when the application needs position data."
5487
+ ],
5488
+ "react": [
5489
+ "Use DsScrollOverlay with ordinary children plus an element carrying slot=\"overlay\"."
5490
+ ],
5491
+ "angular": [
5492
+ "Import DsScrollOverlay and project the persistent footer wrapper with slot=\"overlay\"."
5493
+ ]
5494
+ },
5495
+ "references": [
5496
+ {
5497
+ "label": "Storybook examples",
5498
+ "path": "src/wc/components/ScrollOverlay/ScrollOverlay.stories.ts"
5499
+ }
5500
+ ]
5501
+ },
5502
+ "api": {
5503
+ "props": {
5504
+ "scrollLabel": {
5505
+ "type": "string | undefined",
5506
+ "required": false
5507
+ }
5508
+ },
5509
+ "events": [
5510
+ {
5511
+ "name": "dsScroll",
5512
+ "detail": "ScrollOverlayScrollDetail"
5513
+ }
5514
+ ],
5515
+ "slots": []
5516
+ },
5517
+ "exports": {
5518
+ "customElement": "ds-scroll-overlay",
5519
+ "react": "DsScrollOverlay",
5520
+ "angular": "DsScrollOverlay"
5521
+ },
5522
+ "dependencies": [
5523
+ "@ds-mo/ui",
5524
+ "@ds-mo/tokens"
5525
+ ],
5526
+ "componentDependencies": []
5527
+ },
5259
5528
  {
5260
5529
  "id": "component:ds-select",
5261
5530
  "tag": "ds-select",
@@ -6115,15 +6384,16 @@
6115
6384
  "tag": "ds-shell-page",
6116
6385
  "name": "shell-page",
6117
6386
  "title": "ShellPage",
6118
- "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.",
6387
+ "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, container-aware BarTitle variants, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
6119
6388
  "intentStatus": "complete",
6120
6389
  "intent": {
6121
6390
  "audience": "general",
6122
6391
  "status": "stable",
6123
- "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.",
6392
+ "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, container-aware BarTitle variants, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
6124
6393
  "useWhen": [
6125
6394
  "Rendering a standard routed page inside ShellApp's default content region.",
6126
6395
  "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the page column narrows.",
6396
+ "BarWorkflow needs sticky page-level placement while remaining compact.",
6127
6397
  "Pages need consistent content gutters with an explicit full-bleed option."
6128
6398
  ],
6129
6399
  "avoidWhen": [
@@ -6146,6 +6416,7 @@
6146
6416
  "commonlyComposedWith": [
6147
6417
  "component:ds-shell-app",
6148
6418
  "component:ds-bar-title",
6419
+ "component:ds-bar-workflow",
6149
6420
  "component:ds-tab-group"
6150
6421
  ],
6151
6422
  "patterns": [
@@ -6153,7 +6424,7 @@
6153
6424
  ],
6154
6425
  "accessibility": [
6155
6426
  "ShellPage exposes the routed page as the main landmark; render exactly one active ShellPage inside ShellApp.",
6156
- "Provide exactly one BarTitle through the header slot so the page has one h1.",
6427
+ "Provide exactly one BarTitle or BarWorkflow through the header slot so the page has one h1.",
6157
6428
  "Keep loading, empty, validation, error, progress, success, and failure communication in the default product-content slot.",
6158
6429
  "Responsive variant changes preserve the same heading, controls, accessible names, and keyboard focus targets."
6159
6430
  ],
@@ -6161,26 +6432,28 @@
6161
6432
  "headerPresentation=auto selects expanded, compact, or constrained from ShellPage's own inline capacity and scroll position.",
6162
6433
  "expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
6163
6434
  "contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
6164
- "The required header slot accepts one BarTitle. The default slot owns router output and all page product content."
6435
+ "The required header slot accepts one BarTitle or BarWorkflow. The default slot owns router output and all page product content."
6165
6436
  ],
6166
6437
  "responsiveBehavior": [
6167
6438
  "ShellPage observes its own rendered width instead of viewport media queries or ShellApp desktop/tablet modes.",
6168
6439
  "Roomy pages expand at the top and compact after scroll; medium-capacity pages start compact; narrow pages use the constrained header variant.",
6440
+ "A newly navigated header resolves current page capacity before it is revealed, so persistent tool or navigation chrome cannot flash the expanded presentation first.",
6169
6441
  "Token-based capacity bands use hysteresis so opening tools or resizing navigation cannot oscillate near a boundary.",
6170
6442
  "Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
6171
- "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling."
6443
+ "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling.",
6444
+ "BarWorkflow remains compact and is not assigned BarTitle's capacity or scroll variants."
6172
6445
  ],
6173
6446
  "frameworkCaveats": {
6174
6447
  "customElements": [
6175
- "Import ShellPage and BarTitle, place one ds-bar-title in slot=header, and render route content as default children.",
6448
+ "Import ShellPage with BarTitle or BarWorkflow, place one header in slot=header, and render route content as default children.",
6176
6449
  "Do not set BarTitle.variant while ShellPage owns headerPresentation."
6177
6450
  ],
6178
6451
  "react": [
6179
- "Render DsBarTitle with slot=header inside DsShellPage and keep routed content as the remaining children.",
6452
+ "Render DsBarTitle or DsBarWorkflow with slot=header inside DsShellPage and keep routed content as the remaining children.",
6180
6453
  "Use contentInset none only for deliberately full-bleed page products."
6181
6454
  ],
6182
6455
  "angular": [
6183
- "Import the generated standalone DsShellPage and DsBarTitle adapters, preserve slot=header, and place router-outlet in the ShellPage default slot.",
6456
+ "Import the generated standalone DsShellPage adapter with DsBarTitle or DsBarWorkflow, preserve slot=header, and place router-outlet in the ShellPage default slot.",
6184
6457
  "Do not add another overflow auto wrapper around the routed page."
6185
6458
  ]
6186
6459
  },