@ds-mo/ui 12.2.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 (222) hide show
  1. package/README.md +8 -2
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +6 -6
  4. package/dist/agent.json +530 -25
  5. package/dist/angular/ds-bar-title.d.ts +7 -1
  6. package/dist/angular/ds-bar-title.js +7 -4
  7. package/dist/angular/ds-breadcrumb.d.ts +19 -0
  8. package/dist/angular/ds-breadcrumb.js +42 -0
  9. package/dist/angular/ds-card-data-viz-bar.d.ts +18 -0
  10. package/dist/angular/ds-card-data-viz-bar.js +42 -0
  11. package/dist/angular/ds-card-data-viz-line.d.ts +18 -0
  12. package/dist/angular/ds-card-data-viz-line.js +42 -0
  13. package/dist/angular/ds-chart-bar-stacked.d.ts +12 -0
  14. package/dist/angular/ds-chart-bar-stacked.js +38 -0
  15. package/dist/angular/ds-chart-legend.d.ts +1 -1
  16. package/dist/angular/ds-chart-legend.js +3 -3
  17. package/dist/angular/ds-shell-page.d.ts +1 -1
  18. package/dist/angular/ds-shell-page.js +3 -3
  19. package/dist/angular/index.d.ts +1 -1
  20. package/dist/angular/index.js +4 -0
  21. package/dist/angular/proxies.d.ts +4 -0
  22. package/dist/angular/proxies.js +4 -0
  23. package/dist/components/ds-agent-activity.js +1 -1
  24. package/dist/components/ds-agent-response.js +1 -1
  25. package/dist/components/ds-agent-source-list.js +1 -1
  26. package/dist/components/ds-agent-tool-call.js +1 -1
  27. package/dist/components/ds-attachment-list.js +1 -1
  28. package/dist/components/ds-badge.js +1 -1
  29. package/dist/components/ds-bar-nav.js +1 -1
  30. package/dist/components/ds-bar-title.js +1 -1
  31. package/dist/components/ds-bar-title.js.map +1 -1
  32. package/dist/components/ds-bar-workflow.js +1 -1
  33. package/dist/components/ds-breadcrumb.d.ts +11 -0
  34. package/dist/components/ds-breadcrumb.js +2 -0
  35. package/dist/components/ds-breadcrumb.js.map +1 -0
  36. package/dist/components/ds-button-filled.js +1 -1
  37. package/dist/components/ds-button-unfilled.js +1 -1
  38. package/dist/components/ds-card-data-viz-bar.d.ts +11 -0
  39. package/dist/components/ds-card-data-viz-bar.js +2 -0
  40. package/dist/components/ds-card-data-viz-bar.js.map +1 -0
  41. package/dist/components/ds-card-data-viz-donut.js +1 -1
  42. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  43. package/dist/components/ds-card-data-viz-line.d.ts +11 -0
  44. package/dist/components/ds-card-data-viz-line.js +2 -0
  45. package/dist/components/ds-card-data-viz-line.js.map +1 -0
  46. package/dist/components/ds-card-setting.js +1 -1
  47. package/dist/components/ds-card-setting.js.map +1 -1
  48. package/dist/components/ds-card-shell-data-viz.js +1 -1
  49. package/dist/components/ds-chart-bar-stacked.d.ts +11 -0
  50. package/dist/components/ds-chart-bar-stacked.js +2 -0
  51. package/dist/components/ds-chart-bar-stacked.js.map +1 -0
  52. package/dist/components/ds-chart-bar.js +1 -1
  53. package/dist/components/ds-chart-bar.js.map +1 -1
  54. package/dist/components/ds-chart-donut.js +1 -1
  55. package/dist/components/ds-chart-legend.js +1 -1
  56. package/dist/components/ds-chart-legend.js.map +1 -1
  57. package/dist/components/ds-chart-line.js +1 -1
  58. package/dist/components/ds-chart-line.js.map +1 -1
  59. package/dist/components/ds-checkbox.js +1 -1
  60. package/dist/components/ds-chip.js +1 -1
  61. package/dist/components/ds-code-block.js +1 -1
  62. package/dist/components/ds-conversation-list-item.js +1 -1
  63. package/dist/components/ds-conversation-list-item.js.map +1 -1
  64. package/dist/components/ds-conversation-list-section.js +1 -1
  65. package/dist/components/ds-conversation-list.js +1 -1
  66. package/dist/components/ds-divider.js +1 -1
  67. package/dist/components/ds-empty-state.js +1 -1
  68. package/dist/components/ds-field.js +1 -1
  69. package/dist/components/ds-input.js +1 -1
  70. package/dist/components/ds-markdown.js +1 -1
  71. package/dist/components/ds-menu.js +1 -1
  72. package/dist/components/ds-message-bubble.js +1 -1
  73. package/dist/components/ds-message-bubble.js.map +1 -1
  74. package/dist/components/ds-message-composer.js +1 -1
  75. package/dist/components/ds-message-scroller.js +1 -1
  76. package/dist/components/ds-message-scroller.js.map +1 -1
  77. package/dist/components/ds-message.js +1 -1
  78. package/dist/components/ds-modal.js +1 -1
  79. package/dist/components/ds-panel-nav.js +1 -1
  80. package/dist/components/ds-panel-sub-nav.js +1 -1
  81. package/dist/components/ds-panel-tool-header.js +1 -1
  82. package/dist/components/ds-panel-tool-search.js +1 -1
  83. package/dist/components/ds-panel-tools.js +1 -1
  84. package/dist/components/ds-radio.js +1 -1
  85. package/dist/components/ds-scroll-overlay.js +1 -1
  86. package/dist/components/ds-scroll-overlay.js.map +1 -1
  87. package/dist/components/ds-select-multi.js +1 -1
  88. package/dist/components/ds-select-multi.js.map +1 -1
  89. package/dist/components/ds-select.js +1 -1
  90. package/dist/components/ds-select.js.map +1 -1
  91. package/dist/components/ds-shell-app.js +1 -1
  92. package/dist/components/ds-shell-app.js.map +1 -1
  93. package/dist/components/ds-shell-gradient-picker.js +1 -1
  94. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  95. package/dist/components/ds-shell-page.js +1 -1
  96. package/dist/components/ds-shell-page.js.map +1 -1
  97. package/dist/components/ds-skeleton.js +1 -1
  98. package/dist/components/ds-slider.js +1 -1
  99. package/dist/components/ds-slider.js.map +1 -1
  100. package/dist/components/ds-swatch-picker.js +1 -1
  101. package/dist/components/ds-switch.js +1 -1
  102. package/dist/components/ds-tab-group.js +1 -1
  103. package/dist/components/ds-tag.js +1 -1
  104. package/dist/components/ds-text.js +1 -1
  105. package/dist/components/ds-toast.js +1 -1
  106. package/dist/components/ds-tooltip-data-viz.js +1 -1
  107. package/dist/components/ds-tooltip.js +1 -1
  108. package/dist/components/ds-typing-indicator.js +1 -1
  109. package/dist/components/ds-typing-indicator.js.map +1 -1
  110. package/dist/components/{p-DcGpdIlT.js → p-9dQQSgwT.js} +2 -2
  111. package/dist/components/p-B3rbhRAk.js +2 -0
  112. package/dist/components/p-B3rbhRAk.js.map +1 -0
  113. package/dist/components/{p-BWUTr_XN.js → p-BJMRBHKW.js} +2 -2
  114. package/dist/components/p-BJMRBHKW.js.map +1 -0
  115. package/dist/components/p-BVV_rlIP.js +2 -0
  116. package/dist/components/p-BVV_rlIP.js.map +1 -0
  117. package/dist/components/{p-GMDGgtY8.js → p-BhxwpOH8.js} +2 -2
  118. package/dist/components/{p-2W-ZjZCR.js → p-Bi_bxbih.js} +2 -2
  119. package/dist/components/{p-CG5EX4NW.js → p-BtEjlcB9.js} +2 -2
  120. package/dist/components/{p-C0_8K4y7.js → p-BwGnhInj.js} +2 -2
  121. package/dist/components/p-BwGnhInj.js.map +1 -0
  122. package/dist/components/p-C0NPJ0h2.js +2 -0
  123. package/dist/components/{p-BpA9uYKX.js.map → p-C0NPJ0h2.js.map} +1 -1
  124. package/dist/components/{p-D6jK2Hyi.js → p-C7bZ-jiU.js} +2 -2
  125. package/dist/components/p-CH3w-P2H.js +2 -0
  126. package/dist/components/p-CH3w-P2H.js.map +1 -0
  127. package/dist/components/{p-DOCKtrS4.js → p-CH6cNXXF.js} +2 -2
  128. package/dist/components/p-CWlh7HAg.js +2 -0
  129. package/dist/components/{p-8OOCLGph.js.map → p-CWlh7HAg.js.map} +1 -1
  130. package/dist/components/{p-BE_CDJeL.js → p-CY19gMiz.js} +2 -2
  131. package/dist/components/p-C_ewSXTT.js +2 -0
  132. package/dist/components/p-C_ewSXTT.js.map +1 -0
  133. package/dist/components/{p-CHkI3oIS.js → p-Ce52yVXF.js} +2 -2
  134. package/dist/components/{p-xY3TjBF5.js → p-CoYFJD-w.js} +2 -2
  135. package/dist/components/{p-DBi1bmOL.js → p-Cuw2Lo2g.js} +2 -2
  136. package/dist/components/{p-BRLDJmkh.js → p-D-xttdpn.js} +2 -2
  137. package/dist/components/{p-CCHqsF_H.js → p-D3DYxbC5.js} +2 -2
  138. package/dist/components/{p-Cxpl-rzP.js → p-DC7yOUQx.js} +2 -2
  139. package/dist/components/{p-CNffejay.js → p-DSa0Hnd3.js} +2 -2
  140. package/dist/components/p-DXewjzkM.js +2 -0
  141. package/dist/components/p-DXewjzkM.js.map +1 -0
  142. package/dist/components/{p-DyGB97Oy.js → p-DYqReipj.js} +2 -2
  143. package/dist/components/{p-ky1msbJ8.js → p-DjPZxzIG.js} +2 -2
  144. package/dist/components/{p-ky1msbJ8.js.map → p-DjPZxzIG.js.map} +1 -1
  145. package/dist/components/p-J6xK6Ihq.js +2 -0
  146. package/dist/components/p-jCWtxthA.js +2 -0
  147. package/dist/components/{p-XgIQ3oI_.js.map → p-jCWtxthA.js.map} +1 -1
  148. package/dist/docs/components.json +956 -145
  149. package/dist/lib/utils/index.js +3 -1
  150. package/dist/lib/utils/index.js.map +2 -2
  151. package/dist/mcp/cli.js +142 -18
  152. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  153. package/dist/mcp-data/registry/bar-title.json +68 -14
  154. package/dist/mcp-data/registry/breadcrumb.json +205 -0
  155. package/dist/mcp-data/registry/card-data-viz-bar.json +212 -0
  156. package/dist/mcp-data/registry/card-data-viz-line.json +206 -0
  157. package/dist/mcp-data/registry/card-shell-data-viz.json +7 -0
  158. package/dist/mcp-data/registry/chart-bar-stacked.json +225 -0
  159. package/dist/mcp-data/registry/chart-bar.json +9 -2
  160. package/dist/mcp-data/registry/chart-legend.json +29 -3
  161. package/dist/mcp-data/registry/chart-line.json +4 -2
  162. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  163. package/dist/mcp-data/registry/message-scroller.json +4 -2
  164. package/dist/mcp-data/registry/message.json +3 -2
  165. package/dist/mcp-data/registry/registry.json +541 -24
  166. package/dist/mcp-data/registry/shell-page.json +31 -13
  167. package/dist/mcp-data/registry/text.json +1 -1
  168. package/dist/mcp-data/registry/typing-indicator.json +7 -7
  169. package/dist/react/components.d.ts +4 -0
  170. package/dist/react/components.js +4 -0
  171. package/dist/react/ds-bar-title.d.ts +2 -1
  172. package/dist/react/ds-bar-title.js +1 -0
  173. package/dist/react/ds-breadcrumb.d.ts +12 -0
  174. package/dist/react/ds-breadcrumb.js +12 -0
  175. package/dist/react/ds-card-data-viz-bar.d.ts +12 -0
  176. package/dist/react/ds-card-data-viz-bar.js +12 -0
  177. package/dist/react/ds-card-data-viz-line.d.ts +12 -0
  178. package/dist/react/ds-card-data-viz-line.js +12 -0
  179. package/dist/react/ds-chart-bar-stacked.d.ts +9 -0
  180. package/dist/react/ds-chart-bar-stacked.js +12 -0
  181. package/dist/styles/prose.css +1 -0
  182. package/dist/types/components/BarTitle/BarTitle.d.ts +13 -1
  183. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +31 -0
  184. package/dist/types/components/Breadcrumb/breadcrumb-types.d.ts +17 -0
  185. package/dist/types/components/CardDataVizBar/CardDataVizBar.d.ts +24 -0
  186. package/dist/types/components/CardDataVizBar/index.d.ts +2 -0
  187. package/dist/types/components/CardDataVizLine/CardDataVizLine.d.ts +24 -0
  188. package/dist/types/components/CardDataVizLine/index.d.ts +2 -0
  189. package/dist/types/components/ChartBarStacked/ChartBarStacked.d.ts +15 -0
  190. package/dist/types/components/ChartBarStacked/index.d.ts +3 -0
  191. package/dist/types/components/ChartLegend/ChartLegend.d.ts +3 -0
  192. package/dist/types/components/ShellPage/ShellPage.d.ts +19 -7
  193. package/dist/types/components/ShellPage/shell-page-responsive.d.ts +0 -8
  194. package/dist/types/components/TypingIndicator/TypingIndicator.d.ts +1 -1
  195. package/dist/types/components.d.ts +339 -10
  196. package/package.json +1 -1
  197. package/dist/components/p-8OOCLGph.js +0 -2
  198. package/dist/components/p-B8CubPgQ.js +0 -2
  199. package/dist/components/p-BWUTr_XN.js.map +0 -1
  200. package/dist/components/p-BpA9uYKX.js +0 -2
  201. package/dist/components/p-C0_8K4y7.js.map +0 -1
  202. package/dist/components/p-CA3kLO7K.js +0 -2
  203. package/dist/components/p-CA3kLO7K.js.map +0 -1
  204. package/dist/components/p-CzBnvtcz.js +0 -2
  205. package/dist/components/p-CzBnvtcz.js.map +0 -1
  206. package/dist/components/p-XgIQ3oI_.js +0 -2
  207. /package/dist/components/{p-DcGpdIlT.js.map → p-9dQQSgwT.js.map} +0 -0
  208. /package/dist/components/{p-GMDGgtY8.js.map → p-BhxwpOH8.js.map} +0 -0
  209. /package/dist/components/{p-2W-ZjZCR.js.map → p-Bi_bxbih.js.map} +0 -0
  210. /package/dist/components/{p-CG5EX4NW.js.map → p-BtEjlcB9.js.map} +0 -0
  211. /package/dist/components/{p-D6jK2Hyi.js.map → p-C7bZ-jiU.js.map} +0 -0
  212. /package/dist/components/{p-DOCKtrS4.js.map → p-CH6cNXXF.js.map} +0 -0
  213. /package/dist/components/{p-BE_CDJeL.js.map → p-CY19gMiz.js.map} +0 -0
  214. /package/dist/components/{p-CHkI3oIS.js.map → p-Ce52yVXF.js.map} +0 -0
  215. /package/dist/components/{p-xY3TjBF5.js.map → p-CoYFJD-w.js.map} +0 -0
  216. /package/dist/components/{p-DBi1bmOL.js.map → p-Cuw2Lo2g.js.map} +0 -0
  217. /package/dist/components/{p-BRLDJmkh.js.map → p-D-xttdpn.js.map} +0 -0
  218. /package/dist/components/{p-CCHqsF_H.js.map → p-D3DYxbC5.js.map} +0 -0
  219. /package/dist/components/{p-Cxpl-rzP.js.map → p-DC7yOUQx.js.map} +0 -0
  220. /package/dist/components/{p-CNffejay.js.map → p-DSa0Hnd3.js.map} +0 -0
  221. /package/dist/components/{p-DyGB97Oy.js.map → p-DYqReipj.js.map} +0 -0
  222. /package/dist/components/{p-B8CubPgQ.js.map → p-J6xK6Ihq.js.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "shell-page",
4
4
  "title": "ShellPage",
5
- "description": "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.",
5
+ "description": "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.",
6
6
  "type": "registry:ui",
7
7
  "meta": {
8
8
  "library": "@ds-mo/ui",
@@ -13,10 +13,10 @@
13
13
  "intent": {
14
14
  "audience": "general",
15
15
  "status": "stable",
16
- "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.",
16
+ "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.",
17
17
  "useWhen": [
18
18
  "Rendering a standard routed page inside ShellApp's default content region.",
19
- "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the page column narrows.",
19
+ "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the application shell reports reduced capacity.",
20
20
  "BarWorkflow needs sticky page-level placement while remaining compact.",
21
21
  "Pages need consistent content gutters with an explicit full-bleed option."
22
22
  ],
@@ -53,16 +53,18 @@
53
53
  "Responsive variant changes preserve the same heading, controls, accessible names, and keyboard focus targets."
54
54
  ],
55
55
  "states": [
56
- "headerPresentation=auto selects expanded, compact, or constrained from ShellPage's own inline capacity and scroll position.",
56
+ "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.",
57
+ "headerPresentation=auto selects the matching header variant from headerCapacity and scroll position.",
57
58
  "expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
58
59
  "contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
59
60
  "The required header slot accepts one BarTitle or BarWorkflow. The default slot owns router output and all page product content."
60
61
  ],
61
62
  "responsiveBehavior": [
62
- "ShellPage observes its own rendered width instead of viewport media queries or ShellApp desktop/tablet modes.",
63
- "Roomy pages expand at the top and compact after scroll; medium-capacity pages start compact; narrow pages use the constrained header variant.",
64
- "A newly navigated header resolves current page capacity before it is revealed, so persistent tool or navigation chrome cannot flash the expanded presentation first.",
65
- "Token-based capacity bands use hysteresis so opening tools or resizing navigation cannot oscillate near a boundary.",
63
+ "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.",
64
+ "Roomy capacity expands at the top and compacts after scroll; compact capacity stays compact; constrained capacity uses the constrained action layout.",
65
+ "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.",
66
+ "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
67
+ "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.",
66
68
  "Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
67
69
  "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling.",
68
70
  "BarWorkflow remains compact and is not assigned BarTitle's capacity or scroll variants."
@@ -107,6 +109,14 @@
107
109
  "mutable": false,
108
110
  "description": "Standard page gutters, or no inset for full-bleed page content."
109
111
  },
112
+ "headerCapacity": {
113
+ "type": "ShellPageCapacity",
114
+ "resolvedType": "\"compact\" | \"constrained\" | \"roomy\" | undefined",
115
+ "attribute": "header-capacity",
116
+ "required": false,
117
+ "mutable": false,
118
+ "description": "Available page-header capacity supplied by the owning application shell."
119
+ },
110
120
  "headerPresentation": {
111
121
  "type": "ShellPageHeaderPresentation",
112
122
  "resolvedType": "\"auto\" | \"compact\" | \"constrained\" | \"expanded\"",
@@ -114,7 +124,7 @@
114
124
  "default": "'auto'",
115
125
  "required": false,
116
126
  "mutable": false,
117
- "description": "Automatic container/scroll behavior, or an explicit header variant override."
127
+ "description": "Automatic capacity/scroll behavior, or an explicit header variant override."
118
128
  }
119
129
  },
120
130
  "events": [],
@@ -131,6 +141,14 @@
131
141
  "mutable": false,
132
142
  "description": "Standard page gutters, or no inset for full-bleed page content."
133
143
  },
144
+ "headerCapacity": {
145
+ "type": "ShellPageCapacity",
146
+ "resolvedType": "\"compact\" | \"constrained\" | \"roomy\" | undefined",
147
+ "attribute": "header-capacity",
148
+ "required": false,
149
+ "mutable": false,
150
+ "description": "Available page-header capacity supplied by the owning application shell."
151
+ },
134
152
  "headerPresentation": {
135
153
  "type": "ShellPageHeaderPresentation",
136
154
  "resolvedType": "\"auto\" | \"compact\" | \"constrained\" | \"expanded\"",
@@ -138,7 +156,7 @@
138
156
  "default": "'auto'",
139
157
  "required": false,
140
158
  "mutable": false,
141
- "description": "Automatic container/scroll behavior, or an explicit header variant override."
159
+ "description": "Automatic capacity/scroll behavior, or an explicit header variant override."
142
160
  }
143
161
  },
144
162
  "events": [],
@@ -181,17 +199,17 @@
181
199
  "files": [
182
200
  {
183
201
  "path": "src/wc/components/ShellPage/ShellPage.css",
184
- "content": ":host {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 100%;\n box-sizing: border-box;\n background: var(--color-background-primary);\n}\n\n.shell-page__scroll-sentinel {\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: 0;\n width: var(--dimension-stroke-width-012);\n height: var(--dimension-stroke-width-012);\n pointer-events: none;\n}\n\n.shell-page__sticky-header {\n position: sticky;\n inset-block-start: 0;\n z-index: var(--dimension-z-index-raised);\n min-width: 0;\n background: var(--color-background-primary);\n overflow: visible;\n overflow-anchor: none;\n}\n\n.shell-page__sticky-header ::slotted(ds-bar-title),\n.shell-page__sticky-header ::slotted(ds-bar-workflow) {\n display: block;\n min-width: 0;\n}\n\n.shell-page__flow-spacer {\n height: var(--ds-shell-page-flow-spacer, 0);\n background: var(--color-background-primary);\n}\n\n.shell-page__content {\n min-width: 0;\n box-sizing: border-box;\n background: var(--color-background-primary);\n}\n\n:host(.shell-page-host--inset-default) .shell-page__content {\n padding: var(--dimension-space-400) var(--dimension-space-400) var(--dimension-space-800);\n}\n\n:host(.shell-page-host--inset-none) .shell-page__content {\n padding: 0;\n}\n",
202
+ "content": ":host {\n display: block;\n position: relative;\n min-width: 0;\n min-height: 100%;\n box-sizing: border-box;\n background: var(--color-background-primary);\n}\n\n.shell-page__scroll-sentinel {\n position: absolute;\n inset-block-start: var(--ds-shell-page-header-travel, 0);\n inset-inline-start: 0;\n width: var(--dimension-stroke-width-012);\n height: var(--dimension-stroke-width-012);\n pointer-events: none;\n}\n\n.shell-page__sticky-header {\n position: sticky;\n inset-block-start: var(--ds-shell-page-sticky-offset, 0);\n z-index: var(--dimension-z-index-raised);\n min-width: 0;\n background: var(--color-background-primary);\n overflow: visible;\n overflow-anchor: none;\n}\n\n.shell-page__sticky-header ::slotted(ds-bar-title),\n.shell-page__sticky-header ::slotted(ds-bar-workflow) {\n display: block;\n min-width: 0;\n}\n\n.shell-page__flow-spacer {\n height: var(--ds-shell-page-flow-spacer, 0);\n background: var(--color-background-primary);\n}\n\n.shell-page__content {\n min-width: 0;\n box-sizing: border-box;\n background: var(--color-background-primary);\n}\n\n:host(.shell-page-host--inset-default) .shell-page__content {\n padding: var(--dimension-space-400) var(--dimension-space-400) var(--dimension-space-800);\n}\n\n:host(.shell-page-host--inset-none) .shell-page__content {\n padding: 0;\n}\n",
185
203
  "type": "registry:ui"
186
204
  },
187
205
  {
188
206
  "path": "src/wc/components/ShellPage/ShellPage.tsx",
189
- "content": "import { Component, Element, h, Host, Prop, State } from '@stencil/core';\nimport { createRafCoalescer } from '../../shell/chrome-transition';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport type { BarTitleVariant } from '../BarTitle/bar-title-types';\nimport { resolveShellPageCapacity, resolveShellPageHeaderVariant } from './shell-page-responsive';\nimport type {\n ShellPageCapacity,\n ShellPageContentInset,\n ShellPageHeaderPresentation,\n} from './shell-page-types';\n\ntype BarTitleElement = HTMLElement & { variant: BarTitleVariant };\n\n@Component({\n tag: 'ds-shell-page',\n styleUrl: 'ShellPage.css',\n scoped: true,\n})\nexport class ShellPage {\n private static readonly MAX_HEADER_REVEAL_FRAMES = 12;\n\n @Element() el!: HTMLElement;\n\n /** Automatic container/scroll behavior, or an explicit header variant override. */\n @Prop() headerPresentation: ShellPageHeaderPresentation = 'auto';\n\n /** Standard page gutters, or no inset for full-bleed page content. */\n @Prop() contentInset: ShellPageContentInset = 'default';\n\n @State() private capacity: ShellPageCapacity | null = null;\n @State() private pageTopVisible = true;\n\n private sentinelEl: HTMLElement | null = null;\n private spacerEl: HTMLElement | null = null;\n private headerEl: BarTitleElement | null = null;\n private expandedHeaderHeight = 0;\n private resizeObserver: ResizeObserver | null = null;\n private headerResizeObserver: ResizeObserver | null = null;\n private headerRevealFrame: number | null = null;\n private scrollRoot: HTMLElement | Window | null = null;\n private readonly layoutCoalescer = createRafCoalescer(() => this.syncCapacity());\n\n componentDidLoad() {\n // Resolve the already-laid-out page width before adopting a slotted header.\n // Waiting for the first ResizeObserver/RAF lets BarTitle paint its default\n // expanded variant for one frame when persistent shell chrome narrows a\n // newly navigated page.\n this.syncCapacity();\n this.observeHeader(this.findHeader());\n this.connectObservers();\n this.connectScrollRoot();\n this.layoutCoalescer.schedule();\n }\n\n componentDidRender() {\n this.syncHeaderVariant();\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.headerResizeObserver?.disconnect();\n this.headerResizeObserver = null;\n this.cancelHeaderReveal();\n this.scrollRoot?.removeEventListener('scroll', this.handleScroll);\n this.scrollRoot = null;\n this.layoutCoalescer.cancel();\n }\n\n private get effectiveVariant(): BarTitleVariant {\n return resolveShellPageHeaderVariant(\n this.headerPresentation,\n this.capacity ?? 'roomy',\n this.pageTopVisible\n );\n }\n\n private get isScrollCompacted(): boolean {\n return this.headerPresentation === 'auto' && this.capacity === 'roomy' && !this.pageTopVisible;\n }\n\n private connectObservers() {\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.layoutCoalescer.schedule());\n this.resizeObserver.observe(this.el);\n }\n }\n\n private composedParent(element: Element): Element | null {\n return (element as HTMLElement).assignedSlot?.parentElement ?? element.parentElement;\n }\n\n private findScrollRoot(): HTMLElement | Window {\n let ancestor = this.composedParent(this.el);\n while (ancestor && ancestor !== document.documentElement) {\n const overflow = getComputedStyle(ancestor).overflowY;\n if (overflow === 'auto' || overflow === 'scroll') return ancestor as HTMLElement;\n ancestor = this.composedParent(ancestor);\n }\n return window;\n }\n\n private connectScrollRoot() {\n this.scrollRoot?.removeEventListener('scroll', this.handleScroll);\n this.scrollRoot = this.findScrollRoot();\n this.scrollRoot.addEventListener('scroll', this.handleScroll, { passive: true });\n this.handleScroll();\n }\n\n private handleScroll = () => {\n if (!this.sentinelEl || !this.scrollRoot) return;\n const rootTop =\n this.scrollRoot === window ? 0 : (this.scrollRoot as HTMLElement).getBoundingClientRect().top;\n this.pageTopVisible = this.sentinelEl.getBoundingClientRect().top >= rootTop;\n };\n\n private findHeader(): BarTitleElement | null {\n return this.el.querySelector<BarTitleElement>('ds-bar-title');\n }\n\n private syncCapacity() {\n const inlineSize = this.el.getBoundingClientRect().width;\n if (inlineSize <= 0) return;\n\n const compactAt = resolveCssLengthPx('--dimension-panel-width-2xl', 0);\n const constrainedAt = resolveCssLengthPx('--dimension-panel-width-lg', 0);\n const hysteresis = resolveCssLengthPx('--dimension-space-100', 0);\n if (compactAt <= 0 || constrainedAt <= 0) return;\n\n const next = resolveShellPageCapacity({\n inlineSize,\n compactAt,\n constrainedAt,\n hysteresis,\n previous: this.capacity,\n });\n if (next !== this.capacity) this.capacity = next;\n else this.syncHeaderVariant();\n }\n\n private get compactHeaderHeight(): number {\n return resolveCssLengthPx('--dimension-size-600', 0);\n }\n\n private setSpacerHeight(height: number) {\n if (!this.spacerEl) return;\n this.spacerEl.style.setProperty('--ds-shell-page-flow-spacer', `${Math.max(0, height)}px`);\n }\n\n private variantClass(variant: BarTitleVariant): string {\n return `bar-title-host--${variant}`;\n }\n\n private cancelHeaderReveal() {\n if (this.headerRevealFrame !== null) cancelAnimationFrame(this.headerRevealFrame);\n this.headerRevealFrame = null;\n this.headerEl?.removeAttribute('data-shell-page-syncing');\n }\n\n private revealHeaderWhenSynced(header: BarTitleElement, variant: BarTitleVariant) {\n // Stencil re-renders within a frame or two of a prop change, but this cap\n // guarantees the header can never stay hidden indefinitely if that\n // assumption ever breaks.\n let framesRemaining = ShellPage.MAX_HEADER_REVEAL_FRAMES;\n const reveal = () => {\n if (this.headerEl !== header) {\n header.removeAttribute('data-shell-page-syncing');\n return;\n }\n framesRemaining -= 1;\n if (framesRemaining <= 0 || header.classList.contains(this.variantClass(variant))) {\n header.removeAttribute('data-shell-page-syncing');\n this.headerRevealFrame = null;\n return;\n }\n this.headerRevealFrame = requestAnimationFrame(reveal);\n };\n this.headerRevealFrame = requestAnimationFrame(reveal);\n }\n\n private syncHeaderVariant(concealUntilSynced = false) {\n const header = this.headerEl;\n if (!header) return;\n\n const next = this.effectiveVariant;\n if (header.variant === 'expanded') {\n this.expandedHeaderHeight = header.getBoundingClientRect().height;\n }\n\n this.setSpacerHeight(\n this.isScrollCompacted ? this.expandedHeaderHeight - this.compactHeaderHeight : 0\n );\n\n const renderedVariantIsStale = !header.classList.contains(this.variantClass(next));\n if (concealUntilSynced && renderedVariantIsStale) {\n header.setAttribute('data-shell-page-syncing', '');\n }\n if (header.variant !== next) header.variant = next;\n if (concealUntilSynced && renderedVariantIsStale) {\n this.revealHeaderWhenSynced(header, next);\n }\n }\n\n private observeHeader(header: BarTitleElement | null) {\n this.cancelHeaderReveal();\n this.headerResizeObserver?.disconnect();\n this.headerResizeObserver = null;\n this.headerEl = header;\n this.expandedHeaderHeight = 0;\n this.setSpacerHeight(0);\n\n if (!header) return;\n if (typeof ResizeObserver !== 'undefined') {\n this.headerResizeObserver = new ResizeObserver(() => {\n if (header.variant === 'expanded') {\n this.expandedHeaderHeight = header.getBoundingClientRect().height;\n }\n });\n this.headerResizeObserver.observe(header);\n }\n this.syncHeaderVariant(true);\n }\n\n private handleHeaderSlotChange = (event: Event) => {\n const slot = event.target as HTMLSlotElement;\n const header = slot\n .assignedElements({ flatten: true })\n .find(element => element.tagName.toLowerCase() === 'ds-bar-title');\n this.observeHeader((header as BarTitleElement | undefined) ?? null);\n };\n\n render() {\n return (\n <Host\n role=\"main\"\n class={{\n 'shell-page-host--inset-default': this.contentInset === 'default',\n 'shell-page-host--inset-none': this.contentInset === 'none',\n [`shell-page-host--header-${this.effectiveVariant}`]: true,\n }}\n >\n <div\n ref={el => {\n this.sentinelEl = el ?? null;\n }}\n class=\"shell-page__scroll-sentinel\"\n aria-hidden=\"true\"\n />\n <div class=\"shell-page__sticky-header\">\n <slot name=\"header\" onSlotchange={this.handleHeaderSlotChange} />\n </div>\n <div\n ref={el => {\n this.spacerEl = el ?? null;\n }}\n class=\"shell-page__flow-spacer\"\n aria-hidden=\"true\"\n />\n <div class=\"shell-page__content\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n",
207
+ "content": "import { Component, Element, h, Host, Prop, State, Watch } from '@stencil/core';\nimport { resolveCssLengthPx } from '../../utils/resolve-css-length-px';\nimport type { BarTitleVariant } from '../BarTitle/bar-title-types';\nimport { resolveShellPageHeaderVariant } from './shell-page-responsive';\nimport type {\n ShellPageCapacity,\n ShellPageContentInset,\n ShellPageHeaderPresentation,\n} from './shell-page-types';\n\ntype BarTitleElement = HTMLElement & { variant: BarTitleVariant };\n\n@Component({\n tag: 'ds-shell-page',\n styleUrl: 'ShellPage.css',\n scoped: true,\n})\nexport class ShellPage {\n private static readonly MAX_HEADER_REVEAL_FRAMES = 12;\n private static readonly MAX_HEADER_GEOMETRY_FRAMES = 12;\n\n @Element() el!: HTMLElement;\n\n /** Automatic capacity/scroll behavior, or an explicit header variant override. */\n @Prop() headerPresentation: ShellPageHeaderPresentation = 'auto';\n\n /** Available page-header capacity supplied by the owning application shell. */\n @Prop() headerCapacity?: ShellPageCapacity;\n\n /** Standard page gutters, or no inset for full-bleed page content. */\n @Prop() contentInset: ShellPageContentInset = 'default';\n\n @State() private pageTopVisible = true;\n\n private sentinelEl: HTMLElement | null = null;\n private spacerEl: HTMLElement | null = null;\n private stickyHeaderEl: HTMLElement | null = null;\n private headerEl: BarTitleElement | null = null;\n private expandedHeaderHeight = 0;\n private headerTravel = 0;\n private expandedGeometryFrozen = false;\n private headerResizeObserver: ResizeObserver | null = null;\n private headerMutationObserver: MutationObserver | null = null;\n private headerRevealFrame: number | null = null;\n private headerGeometryFrame: number | null = null;\n private scrollRoot: HTMLElement | Window | null = null;\n\n @Watch('headerCapacity')\n @Watch('headerPresentation')\n handleHeaderContractChange() {\n this.syncHeaderVariant(true);\n }\n\n componentDidLoad() {\n this.observeHeader(this.findHeader());\n this.connectScrollRoot();\n }\n\n componentDidRender() {\n this.syncHeaderVariant();\n }\n\n disconnectedCallback() {\n this.headerResizeObserver?.disconnect();\n this.headerResizeObserver = null;\n this.headerMutationObserver?.disconnect();\n this.headerMutationObserver = null;\n this.cancelHeaderReveal();\n this.cancelHeaderGeometrySync();\n this.scrollRoot?.removeEventListener('scroll', this.handleScroll);\n this.scrollRoot = null;\n }\n\n private get effectiveVariant(): BarTitleVariant {\n return resolveShellPageHeaderVariant(\n this.headerPresentation,\n this.headerCapacity ?? 'roomy',\n this.pageTopVisible\n );\n }\n\n private get headerContractResolved(): boolean {\n return this.headerPresentation !== 'auto' || this.headerCapacity !== undefined;\n }\n\n private get isScrollCompacted(): boolean {\n return (\n this.headerPresentation === 'auto' && this.headerCapacity === 'roomy' && !this.pageTopVisible\n );\n }\n\n private composedParent(element: Element): Element | null {\n return (element as HTMLElement).assignedSlot?.parentElement ?? element.parentElement;\n }\n\n private findScrollRoot(): HTMLElement | Window {\n let ancestor = this.composedParent(this.el);\n while (ancestor && ancestor !== document.documentElement) {\n const overflow = getComputedStyle(ancestor).overflowY;\n if (overflow === 'auto' || overflow === 'scroll' || overflow === 'overlay') {\n return ancestor as HTMLElement;\n }\n ancestor = this.composedParent(ancestor);\n }\n return window;\n }\n\n private connectScrollRoot() {\n const next = this.findScrollRoot();\n if (next === this.scrollRoot) return;\n this.scrollRoot?.removeEventListener('scroll', this.handleScroll);\n this.scrollRoot = next;\n this.scrollRoot.addEventListener('scroll', this.handleScroll, { passive: true });\n this.handleScroll();\n }\n\n private handleScroll = () => {\n if (!this.sentinelEl || !this.scrollRoot) return;\n const rootTop =\n this.scrollRoot === window ? 0 : (this.scrollRoot as HTMLElement).getBoundingClientRect().top;\n const nextPageTopVisible = this.sentinelEl.getBoundingClientRect().top >= rootTop;\n if (\n !nextPageTopVisible &&\n this.pageTopVisible &&\n this.headerEl?.classList.contains(this.variantClass('expanded'))\n ) {\n this.captureExpandedHeaderGeometry(this.headerEl);\n this.expandedGeometryFrozen = true;\n }\n if (\n nextPageTopVisible &&\n this.expandedGeometryFrozen &&\n this.el.getBoundingClientRect().top >= rootTop\n ) {\n this.expandedGeometryFrozen = false;\n if (this.headerEl?.classList.contains(this.variantClass('expanded'))) {\n this.captureExpandedHeaderGeometry(this.headerEl);\n }\n }\n this.pageTopVisible = nextPageTopVisible;\n };\n\n private findHeader(): BarTitleElement | null {\n return this.el.querySelector<BarTitleElement>('ds-bar-title');\n }\n\n private get compactHeaderHeight(): number {\n return resolveCssLengthPx('--dimension-size-600', 0);\n }\n\n private setHeaderTravel(distance: number) {\n const next = Math.max(0, distance);\n if (Math.abs(next - this.headerTravel) < 0.5) return;\n this.headerTravel = next;\n this.el.style.setProperty('--ds-shell-page-header-travel', `${next}px`);\n this.handleScroll();\n }\n\n private measureHeaderTravel(header: BarTitleElement) {\n const anchor = header.querySelector<HTMLElement>('[data-shell-page-header-anchor]');\n const compactHeight = this.compactHeaderHeight;\n if (!anchor || compactHeight <= 0) return;\n\n const headerRect = header.getBoundingClientRect();\n const anchorRect = anchor.getBoundingClientRect();\n if (headerRect.height <= 0 || anchorRect.height <= 0) return;\n\n const expandedAnchorTop = anchorRect.top - headerRect.top;\n const compactAnchorTop = Math.max(0, (compactHeight - anchorRect.height) / 2);\n this.setHeaderTravel(expandedAnchorTop - compactAnchorTop);\n }\n\n private captureExpandedHeaderGeometry(header: BarTitleElement) {\n this.expandedHeaderHeight = header.getBoundingClientRect().height;\n this.measureHeaderTravel(header);\n }\n\n private setSpacerHeight(height: number) {\n if (!this.spacerEl) return;\n this.spacerEl.style.setProperty('--ds-shell-page-flow-spacer', `${Math.max(0, height)}px`);\n }\n\n private variantClass(variant: BarTitleVariant): string {\n return `bar-title-host--${variant}`;\n }\n\n private setStickyHeaderOffset(renderedVariant: BarTitleVariant) {\n this.stickyHeaderEl?.style.setProperty(\n '--ds-shell-page-sticky-offset',\n renderedVariant === 'expanded' &&\n this.headerPresentation === 'auto' &&\n this.headerCapacity === 'roomy'\n ? `${-this.headerTravel}px`\n : '0px'\n );\n }\n\n private syncRenderedHeaderGeometry(header: BarTitleElement) {\n const renderedVariant = this.effectiveVariant;\n if (!header.classList.contains(this.variantClass(renderedVariant))) return;\n\n // Update both flow-preservation pieces before reading layout. Otherwise a\n // reverse compact → expanded render can briefly contain the tall header and\n // the compact spacer together, giving browser scroll anchoring a transient\n // height change to compensate.\n this.setSpacerHeight(\n this.isScrollCompacted ? this.expandedHeaderHeight - this.compactHeaderHeight : 0\n );\n this.setStickyHeaderOffset(renderedVariant);\n\n if (renderedVariant === 'expanded' && !this.expandedGeometryFrozen) {\n this.captureExpandedHeaderGeometry(header);\n this.setStickyHeaderOffset(renderedVariant);\n }\n }\n\n private cancelHeaderGeometrySync() {\n if (this.headerGeometryFrame !== null) cancelAnimationFrame(this.headerGeometryFrame);\n this.headerGeometryFrame = null;\n }\n\n private scheduleHeaderGeometrySync(header: BarTitleElement) {\n this.cancelHeaderGeometrySync();\n let framesRemaining = ShellPage.MAX_HEADER_GEOMETRY_FRAMES;\n let framesElapsed = 0;\n const sync = () => {\n if (this.headerEl !== header) return;\n framesRemaining -= 1;\n framesElapsed += 1;\n // In WebKit a child's componentDidLoad can precede its assignment into\n // the parent's rendered slot. Revalidate after ShellApp has had a frame\n // to expose the actual content scroller.\n this.connectScrollRoot();\n this.syncRenderedHeaderGeometry(header);\n const geometryReady =\n this.effectiveVariant !== 'expanded' ||\n (this.expandedHeaderHeight > 0 && this.headerTravel > 0);\n if ((geometryReady && framesElapsed >= 2) || framesRemaining <= 0) {\n this.headerGeometryFrame = null;\n return;\n }\n this.headerGeometryFrame = requestAnimationFrame(sync);\n };\n this.headerGeometryFrame = requestAnimationFrame(sync);\n }\n\n private cancelHeaderReveal() {\n if (this.headerRevealFrame !== null) cancelAnimationFrame(this.headerRevealFrame);\n this.headerRevealFrame = null;\n this.headerEl?.removeAttribute('data-shell-page-syncing');\n }\n\n private revealHeaderWhenSynced(header: BarTitleElement, variant: BarTitleVariant) {\n // Stencil normally re-renders within a frame or two of a prop change. Stop\n // polling at the cap, but fail closed: a stale variant must never paint.\n let framesRemaining = ShellPage.MAX_HEADER_REVEAL_FRAMES;\n const reveal = () => {\n if (this.headerEl !== header) {\n header.removeAttribute('data-shell-page-syncing');\n return;\n }\n framesRemaining -= 1;\n if (header.classList.contains(this.variantClass(variant))) {\n header.removeAttribute('data-shell-page-syncing');\n this.headerRevealFrame = null;\n return;\n }\n if (framesRemaining <= 0) {\n this.headerRevealFrame = null;\n return;\n }\n this.headerRevealFrame = requestAnimationFrame(reveal);\n };\n this.headerRevealFrame = requestAnimationFrame(reveal);\n }\n\n private syncHeaderVariant(concealUntilSynced = false) {\n const header = this.headerEl;\n if (!header) return;\n\n if (!this.headerContractResolved) {\n this.cancelHeaderReveal();\n header.setAttribute('data-shell-page-syncing', '');\n return;\n }\n\n const next = this.effectiveVariant;\n const renderedVariantIsStale = !header.classList.contains(this.variantClass(next));\n if (!renderedVariantIsStale) this.syncRenderedHeaderGeometry(header);\n if (concealUntilSynced) {\n this.cancelHeaderReveal();\n header.setAttribute('data-shell-page-syncing', '');\n }\n if (header.variant !== next) header.variant = next;\n if (concealUntilSynced) {\n this.revealHeaderWhenSynced(header, next);\n }\n }\n\n private observeHeader(header: BarTitleElement | null) {\n this.cancelHeaderReveal();\n this.cancelHeaderGeometrySync();\n this.headerResizeObserver?.disconnect();\n this.headerResizeObserver = null;\n this.headerMutationObserver?.disconnect();\n this.headerMutationObserver = null;\n this.headerEl = header;\n this.expandedHeaderHeight = 0;\n this.expandedGeometryFrozen = false;\n this.setHeaderTravel(0);\n this.setSpacerHeight(0);\n this.stickyHeaderEl?.style.setProperty('--ds-shell-page-sticky-offset', '0px');\n\n if (!header) return;\n if (header.classList.contains(this.variantClass('expanded'))) {\n this.captureExpandedHeaderGeometry(header);\n }\n if (typeof ResizeObserver !== 'undefined') {\n this.headerResizeObserver = new ResizeObserver(() => {\n this.syncRenderedHeaderGeometry(header);\n });\n this.headerResizeObserver.observe(header);\n }\n if (typeof MutationObserver !== 'undefined') {\n this.headerMutationObserver = new MutationObserver(() => {\n this.syncRenderedHeaderGeometry(header);\n });\n this.headerMutationObserver.observe(header, {\n attributes: true,\n attributeFilter: ['class'],\n });\n }\n this.syncHeaderVariant(true);\n this.scheduleHeaderGeometrySync(header);\n }\n\n private handleHeaderSlotChange = (event: Event) => {\n const slot = event.target as HTMLSlotElement;\n const header = slot\n .assignedElements({ flatten: true })\n .find(element => element.tagName.toLowerCase() === 'ds-bar-title');\n this.observeHeader((header as BarTitleElement | undefined) ?? null);\n };\n\n render() {\n return (\n <Host\n role=\"main\"\n class={{\n 'shell-page-host--inset-default': this.contentInset === 'default',\n 'shell-page-host--inset-none': this.contentInset === 'none',\n [`shell-page-host--header-${this.effectiveVariant}`]: true,\n }}\n >\n <div\n ref={el => {\n this.sentinelEl = el ?? null;\n }}\n class=\"shell-page__scroll-sentinel\"\n aria-hidden=\"true\"\n />\n <div\n ref={el => {\n this.stickyHeaderEl = el ?? null;\n }}\n class=\"shell-page__sticky-header\"\n >\n <slot name=\"header\" onSlotchange={this.handleHeaderSlotChange} />\n </div>\n <div\n ref={el => {\n this.spacerEl = el ?? null;\n }}\n class=\"shell-page__flow-spacer\"\n aria-hidden=\"true\"\n />\n <div class=\"shell-page__content\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n",
190
208
  "type": "registry:ui"
191
209
  },
192
210
  {
193
211
  "path": "src/wc/components/ShellPage/shell-page-responsive.ts",
194
- "content": "import type { ShellPageCapacity, ShellPageHeaderPresentation } from './shell-page-types';\nimport type { BarTitleVariant } from '../BarTitle/bar-title-types';\n\nexport interface ShellPageCapacityOptions {\n inlineSize: number;\n compactAt: number;\n constrainedAt: number;\n hysteresis: number;\n previous: ShellPageCapacity | null;\n}\n\nexport function resolveShellPageCapacity({\n inlineSize,\n compactAt,\n constrainedAt,\n hysteresis,\n previous,\n}: ShellPageCapacityOptions): ShellPageCapacity {\n if (previous === null) {\n if (inlineSize <= constrainedAt) return 'constrained';\n if (inlineSize <= compactAt) return 'compact';\n return 'roomy';\n }\n\n if (previous === 'constrained') {\n if (inlineSize <= constrainedAt + hysteresis) return 'constrained';\n return inlineSize <= compactAt ? 'compact' : 'roomy';\n }\n\n if (inlineSize <= constrainedAt) return 'constrained';\n\n if (previous === 'compact') {\n return inlineSize <= compactAt + hysteresis ? 'compact' : 'roomy';\n }\n\n return inlineSize <= compactAt ? 'compact' : 'roomy';\n}\n\nexport function resolveShellPageHeaderVariant(\n presentation: ShellPageHeaderPresentation,\n capacity: ShellPageCapacity,\n pageTopVisible: boolean\n): BarTitleVariant {\n if (presentation !== 'auto') return presentation;\n if (capacity === 'constrained') return 'constrained';\n if (capacity === 'compact' || !pageTopVisible) return 'compact';\n return 'expanded';\n}\n",
212
+ "content": "import type { ShellPageCapacity, ShellPageHeaderPresentation } from './shell-page-types';\nimport type { BarTitleVariant } from '../BarTitle/bar-title-types';\n\nexport function resolveShellPageHeaderVariant(\n presentation: ShellPageHeaderPresentation,\n capacity: ShellPageCapacity,\n pageTopVisible: boolean\n): BarTitleVariant {\n if (presentation !== 'auto') return presentation;\n if (capacity === 'constrained') return 'constrained';\n if (capacity === 'compact' || !pageTopVisible) return 'compact';\n return 'expanded';\n}\n",
195
213
  "type": "registry:ui"
196
214
  },
197
215
  {
@@ -349,7 +349,7 @@
349
349
  "files": [
350
350
  {
351
351
  "path": "src/wc/components/Text/Text.css",
352
- "content": "@import '../../utils/typography.css';\n@import '../../utils/shimmer.css';\n\n:host {\n box-sizing: border-box;\n max-width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font-family: var(--typography-font-family);\n}\n\n:host(:where(.ds-text--inline-box)) {\n display: inline-block;\n}\n\n:host(:where(.ds-text--block-box)) {\n display: block;\n width: 100%;\n}\n\n/*\n * The host is the measurable typography box. The semantic inner element fills\n * it and inherits every text metric without adding margins, padding, or its own\n * line-height strut. One rendered line therefore measures exactly one token\n * line-height; N lines measure N × that token.\n */\n.ds-text__element {\n display: block;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n text-transform: inherit;\n text-align: inherit;\n text-decoration: inherit;\n font-style: inherit;\n font-variant-numeric: inherit;\n font-feature-settings: inherit;\n -webkit-user-select: inherit;\n user-select: inherit;\n white-space: inherit;\n text-wrap: inherit;\n overflow-wrap: inherit;\n word-break: inherit;\n /* Consumer truncation on the host (PanelNav, ChartLegend, …) must reach the\n text node — overflow/text-overflow are not inherited by default. */\n overflow: inherit;\n text-overflow: inherit;\n}\n\n/* ── Truncation ─────────────────────────────────────────────────────────── */\n\n:host(.ds-text--truncate-1) {\n overflow: hidden;\n}\n\n:host(.ds-text--truncate-1) .ds-text__element {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:host(.ds-text--truncate-2),\n:host(.ds-text--truncate-3),\n:host(.ds-text--truncate-4),\n:host(.ds-text--truncate-5) {\n overflow: hidden;\n}\n\n:host(.ds-text--truncate-2) .ds-text__element,\n:host(.ds-text--truncate-3) .ds-text__element,\n:host(.ds-text--truncate-4) .ds-text__element,\n:host(.ds-text--truncate-5) .ds-text__element {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n:host(.ds-text--truncate-2) .ds-text__element { -webkit-line-clamp: 2; }\n:host(.ds-text--truncate-3) .ds-text__element { -webkit-line-clamp: 3; }\n:host(.ds-text--truncate-4) .ds-text__element { -webkit-line-clamp: 4; }\n:host(.ds-text--truncate-5) .ds-text__element { -webkit-line-clamp: 5; }\n\n/* ── Wrap ───────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--nowrap),\n:host(.ds-text--nowrap) .ds-text__element {\n white-space: nowrap;\n word-break: normal;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n:host(.ds-text--balance),\n:host(.ds-text--balance) .ds-text__element { text-wrap: balance; }\n\n:host(.ds-text--pretty),\n:host(.ds-text--pretty) .ds-text__element { text-wrap: pretty; }\n\n/* ── Color ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--color-primary) { color: var(--color-foreground-primary); }\n:host(.ds-text--color-secondary) { color: var(--color-foreground-secondary); }\n:host(.ds-text--color-tertiary) { color: var(--color-foreground-tertiary); }\n:host(.ds-text--color-quaternary) { color: var(--color-foreground-quaternary); }\n:host(.ds-text--color-brand) { color: var(--color-foreground-bold-brand); }\n:host(.ds-text--color-negative) { color: var(--color-foreground-bold-negative); }\n:host(.ds-text--color-positive) { color: var(--color-foreground-bold-positive); }\n:host(.ds-text--color-warning) { color: var(--color-foreground-bold-warning); }\n:host(.ds-text--color-caution) { color: var(--color-foreground-bold-caution); }\n:host(.ds-text--color-ai) { color: var(--color-foreground-bold-ai); }\n:host(.ds-text--color-on-strong) { color: var(--color-foreground-on-strong-background-primary); }\n:host(.ds-text--color-on-bold) { color: var(--color-foreground-on-bold-background-primary); }\n:host(.ds-text--color-inherit) { color: inherit; }\n\n/* ── Decorations ─────────────────────────────────────────────────────────── */\n\n:host(.ds-text--decoration-underline) {\n text-decoration: underline;\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n:host(.ds-text--decoration-dotted-underline) {\n text-decoration: underline dotted;\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n/* ── Style ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--italic) { font-style: italic; }\n\n:host(.ds-text--font-feature-tabular-nums) {\n font-variant-numeric: tabular-nums;\n font-feature-settings: 'tnum';\n}\n\n/* ── Align ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--align-left) { text-align: left; }\n:host(.ds-text--align-center) { text-align: center; }\n:host(.ds-text--align-right) { text-align: right; }\n",
352
+ "content": "@import '../../utils/typography.css';\n@import '../../utils/shimmer.css';\n\n:host {\n box-sizing: border-box;\n max-width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font-family: var(--typography-font-family);\n}\n\n:host(:where(.ds-text--inline-box)) {\n display: inline-block;\n}\n\n:host(:where(.ds-text--block-box)) {\n display: block;\n width: 100%;\n}\n\n/*\n * The host is the measurable typography box. The semantic inner element fills\n * it and inherits every text metric without adding margins, padding, or its own\n * line-height strut. One rendered line therefore measures exactly one token\n * line-height; N lines measure N × that token.\n */\n.ds-text__element {\n display: block;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n text-transform: inherit;\n text-align: inherit;\n text-decoration: inherit;\n font-style: inherit;\n font-variant-numeric: inherit;\n font-feature-settings: inherit;\n -webkit-user-select: inherit;\n user-select: inherit;\n white-space: inherit;\n text-wrap: inherit;\n overflow-wrap: inherit;\n word-break: inherit;\n /* Consumer truncation on the host (PanelNav, ChartLegend, …) must reach the\n text node — overflow/text-overflow are not inherited by default. */\n overflow: inherit;\n text-overflow: inherit;\n}\n\n/* ── Truncation ─────────────────────────────────────────────────────────── */\n\n:host(.ds-text--truncate-1) {\n overflow: hidden;\n}\n\n:host(.ds-text--truncate-1) .ds-text__element {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n:host(.ds-text--truncate-2),\n:host(.ds-text--truncate-3),\n:host(.ds-text--truncate-4),\n:host(.ds-text--truncate-5) {\n overflow: hidden;\n}\n\n:host(.ds-text--truncate-2) .ds-text__element,\n:host(.ds-text--truncate-3) .ds-text__element,\n:host(.ds-text--truncate-4) .ds-text__element,\n:host(.ds-text--truncate-5) .ds-text__element {\n display: -webkit-box;\n -webkit-box-orient: vertical;\n overflow: hidden;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n\n:host(.ds-text--truncate-2) .ds-text__element { -webkit-line-clamp: 2; }\n:host(.ds-text--truncate-3) .ds-text__element { -webkit-line-clamp: 3; }\n:host(.ds-text--truncate-4) .ds-text__element { -webkit-line-clamp: 4; }\n:host(.ds-text--truncate-5) .ds-text__element { -webkit-line-clamp: 5; }\n\n/* ── Wrap ───────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--nowrap),\n:host(.ds-text--nowrap) .ds-text__element {\n white-space: nowrap;\n word-break: normal;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 0;\n}\n\n:host(.ds-text--balance),\n:host(.ds-text--balance) .ds-text__element { text-wrap: balance; }\n\n:host(.ds-text--pretty),\n:host(.ds-text--pretty) .ds-text__element { text-wrap: pretty; }\n\n/* ── Color ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--color-primary) { color: var(--color-foreground-primary); }\n:host(.ds-text--color-secondary) { color: var(--color-foreground-secondary); }\n:host(.ds-text--color-tertiary) { color: var(--color-foreground-tertiary); }\n:host(.ds-text--color-quaternary) { color: var(--color-foreground-quaternary); }\n:host(.ds-text--color-brand) { color: var(--color-foreground-bold-brand); }\n:host(.ds-text--color-negative) { color: var(--color-foreground-bold-negative); }\n:host(.ds-text--color-positive) { color: var(--color-foreground-bold-positive); }\n:host(.ds-text--color-warning) { color: var(--color-foreground-bold-warning); }\n:host(.ds-text--color-caution) { color: var(--color-foreground-bold-caution); }\n:host(.ds-text--color-ai) { color: var(--color-foreground-bold-ai); }\n:host(.ds-text--color-on-strong) { color: var(--color-foreground-on-strong-background-primary); }\n:host(.ds-text--color-on-bold) { color: var(--color-foreground-on-bold-background-primary); }\n:host(.ds-text--color-inherit) { color: inherit; }\n\n/* ── Decorations ─────────────────────────────────────────────────────────── */\n\n:host(.ds-text--decoration-underline) {\n text-decoration: underline;\n text-decoration-color: var(--color-foreground-tertiary);\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n:host(.ds-text--decoration-dotted-underline) {\n text-decoration: underline dotted;\n text-decoration-color: var(--color-foreground-tertiary);\n text-underline-offset: 2px;\n text-decoration-thickness: 1px;\n}\n\n/* ── Style ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--italic) { font-style: italic; }\n\n:host(.ds-text--font-feature-tabular-nums) {\n font-variant-numeric: tabular-nums;\n font-feature-settings: 'tnum';\n}\n\n/* ── Align ──────────────────────────────────────────────────────────────── */\n\n:host(.ds-text--align-left) { text-align: left; }\n:host(.ds-text--align-center) { text-align: center; }\n:host(.ds-text--align-right) { text-align: right; }\n",
353
353
  "type": "registry:ui"
354
354
  },
355
355
  {
@@ -29,12 +29,12 @@
29
29
  "pattern:conversation"
30
30
  ],
31
31
  "accessibility": [
32
- "Provide concise localized status text that names the participant when that context is not otherwise clear.",
32
+ "Provide concise localized status text; the standard label is Typing followed by a three-dot ellipsis.",
33
33
  "The polite atomic status announces typing without representing it as a message bubble."
34
34
  ],
35
35
  "states": [
36
36
  "TypingIndicator is transient conversation status, never persisted message content.",
37
- "Its body-small secondary text may shimmer, while reduced-motion preferences retain a static readable status."
37
+ "Its body-medium secondary text may shimmer, while reduced-motion preferences retain a static readable status."
38
38
  ],
39
39
  "responsiveBehavior": [
40
40
  "The indicator fills the message content width and wraps only when localized status text requires it."
@@ -52,10 +52,10 @@
52
52
  "type": "string",
53
53
  "resolvedType": "string",
54
54
  "attribute": "label",
55
- "default": "'Typing'",
55
+ "default": "'Typing...'",
56
56
  "required": false,
57
57
  "mutable": false,
58
- "description": "Concise localized status text, ideally naming the participant who is typing."
58
+ "description": "Concise localized typing status."
59
59
  }
60
60
  },
61
61
  "events": [],
@@ -67,10 +67,10 @@
67
67
  "type": "string",
68
68
  "resolvedType": "string",
69
69
  "attribute": "label",
70
- "default": "'Typing'",
70
+ "default": "'Typing...'",
71
71
  "required": false,
72
72
  "mutable": false,
73
- "description": "Concise localized status text, ideally naming the participant who is typing."
73
+ "description": "Concise localized typing status."
74
74
  }
75
75
  },
76
76
  "events": [],
@@ -120,7 +120,7 @@
120
120
  },
121
121
  {
122
122
  "path": "src/wc/components/TypingIndicator/TypingIndicator.tsx",
123
- "content": "import { Component, h, Host, Prop } from '@stencil/core';\n\n@Component({\n tag: 'ds-typing-indicator',\n styleUrl: 'TypingIndicator.css',\n scoped: true,\n})\nexport class TypingIndicator {\n /** Concise localized status text, ideally naming the participant who is typing. */\n @Prop() label: string = 'Typing';\n\n render() {\n return (\n <Host role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <ds-text as=\"span\" variant=\"text-body-small\" color=\"secondary\" shimmer>\n {this.label}\n </ds-text>\n </Host>\n );\n }\n}\n",
123
+ "content": "import { Component, h, Host, Prop } from '@stencil/core';\n\n@Component({\n tag: 'ds-typing-indicator',\n styleUrl: 'TypingIndicator.css',\n scoped: true,\n})\nexport class TypingIndicator {\n /** Concise localized typing status. */\n @Prop() label: string = 'Typing...';\n\n render() {\n return (\n <Host role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n <ds-text as=\"span\" variant=\"text-body-medium\" color=\"secondary\" shimmer>\n {this.label}\n </ds-text>\n </Host>\n );\n }\n}\n",
124
124
  "type": "registry:ui"
125
125
  }
126
126
  ]
@@ -12,11 +12,15 @@ export { DsBadge } from "./ds-badge.js";
12
12
  export { DsBarNav } from "./ds-bar-nav.js";
13
13
  export { DsBarTitle } from "./ds-bar-title.js";
14
14
  export { DsBarWorkflow } from "./ds-bar-workflow.js";
15
+ export { DsBreadcrumb } from "./ds-breadcrumb.js";
15
16
  export { DsButtonFilled } from "./ds-button-filled.js";
16
17
  export { DsButtonUnfilled } from "./ds-button-unfilled.js";
18
+ export { DsCardDataVizBar } from "./ds-card-data-viz-bar.js";
17
19
  export { DsCardDataVizDonut } from "./ds-card-data-viz-donut.js";
20
+ export { DsCardDataVizLine } from "./ds-card-data-viz-line.js";
18
21
  export { DsCardSetting } from "./ds-card-setting.js";
19
22
  export { DsCardShellDataViz } from "./ds-card-shell-data-viz.js";
23
+ export { DsChartBarStacked } from "./ds-chart-bar-stacked.js";
20
24
  export { DsChartBar } from "./ds-chart-bar.js";
21
25
  export { DsChartDonut } from "./ds-chart-donut.js";
22
26
  export { DsChartLegend } from "./ds-chart-legend.js";
@@ -13,11 +13,15 @@ export { DsBadge } from "./ds-badge.js";
13
13
  export { DsBarNav } from "./ds-bar-nav.js";
14
14
  export { DsBarTitle } from "./ds-bar-title.js";
15
15
  export { DsBarWorkflow } from "./ds-bar-workflow.js";
16
+ export { DsBreadcrumb } from "./ds-breadcrumb.js";
16
17
  export { DsButtonFilled } from "./ds-button-filled.js";
17
18
  export { DsButtonUnfilled } from "./ds-button-unfilled.js";
19
+ export { DsCardDataVizBar } from "./ds-card-data-viz-bar.js";
18
20
  export { DsCardDataVizDonut } from "./ds-card-data-viz-donut.js";
21
+ export { DsCardDataVizLine } from "./ds-card-data-viz-line.js";
19
22
  export { DsCardSetting } from "./ds-card-setting.js";
20
23
  export { DsCardShellDataViz } from "./ds-card-shell-data-viz.js";
24
+ export { DsChartBarStacked } from "./ds-chart-bar-stacked.js";
21
25
  export { DsChartBar } from "./ds-chart-bar.js";
22
26
  export { DsChartDonut } from "./ds-chart-donut.js";
23
27
  export { DsChartLegend } from "./ds-chart-legend.js";
@@ -3,11 +3,12 @@
3
3
  * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
4
  */
5
5
  import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
6
- import { type DsBarTitleCustomEvent } from "@ds-mo/ui";
6
+ import { type BreadcrumbSelectDetail, type DsBarTitleCustomEvent } from "@ds-mo/ui";
7
7
  import type { Components } from "@ds-mo/ui/dist/components";
8
8
  import { DsBarTitle as DsBarTitleElement } from "@ds-mo/ui/dist/components/ds-bar-title.js";
9
9
  export type DsBarTitleEvents = {
10
10
  onDsBack: EventName<DsBarTitleCustomEvent<MouseEvent>>;
11
+ onDsBreadcrumbSelect: EventName<DsBarTitleCustomEvent<BreadcrumbSelectDetail>>;
11
12
  onDsSectionChange: EventName<DsBarTitleCustomEvent<string>>;
12
13
  onDsAction: EventName<DsBarTitleCustomEvent<string>>;
13
14
  };
@@ -9,6 +9,7 @@ export const DsBarTitle = /*@__PURE__*/ createComponent({
9
9
  react: React,
10
10
  events: {
11
11
  onDsBack: 'dsBack',
12
+ onDsBreadcrumbSelect: 'dsBreadcrumbSelect',
12
13
  onDsSectionChange: 'dsSectionChange',
13
14
  onDsAction: 'dsAction'
14
15
  },
@@ -0,0 +1,12 @@
1
+ /**
2
+ * This file was automatically generated by the Stencil React Output Target.
3
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
+ */
5
+ import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
6
+ import { type BreadcrumbSelectDetail, type DsBreadcrumbCustomEvent } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsBreadcrumb as DsBreadcrumbElement } from "@ds-mo/ui/dist/components/ds-breadcrumb.js";
9
+ export type DsBreadcrumbEvents = {
10
+ onDsSelect: EventName<DsBreadcrumbCustomEvent<BreadcrumbSelectDetail>>;
11
+ };
12
+ export declare const DsBreadcrumb: StencilReactComponent<DsBreadcrumbElement, DsBreadcrumbEvents, Components.DsBreadcrumb>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { createComponent } from '@stencil/react-output-target/runtime';
3
+ import React from 'react';
4
+ import { DsBreadcrumb as DsBreadcrumbElement, defineCustomElement as defineDsBreadcrumb } from "@ds-mo/ui/dist/components/ds-breadcrumb.js";
5
+ export const DsBreadcrumb = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-breadcrumb',
7
+ elementClass: DsBreadcrumbElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: { onDsSelect: 'dsSelect' },
11
+ defineCustomElement: defineDsBreadcrumb
12
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * This file was automatically generated by the Stencil React Output Target.
3
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
+ */
5
+ import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
6
+ import { type DsCardDataVizBarCustomEvent } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsCardDataVizBar as DsCardDataVizBarElement } from "@ds-mo/ui/dist/components/ds-card-data-viz-bar.js";
9
+ export type DsCardDataVizBarEvents = {
10
+ onDsFilterClick: EventName<DsCardDataVizBarCustomEvent<void>>;
11
+ };
12
+ export declare const DsCardDataVizBar: StencilReactComponent<DsCardDataVizBarElement, DsCardDataVizBarEvents, Components.DsCardDataVizBar, 'heading'>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { createComponent } from '@stencil/react-output-target/runtime';
3
+ import React from 'react';
4
+ import { DsCardDataVizBar as DsCardDataVizBarElement, defineCustomElement as defineDsCardDataVizBar } from "@ds-mo/ui/dist/components/ds-card-data-viz-bar.js";
5
+ export const DsCardDataVizBar = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-card-data-viz-bar',
7
+ elementClass: DsCardDataVizBarElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: { onDsFilterClick: 'dsFilterClick' },
11
+ defineCustomElement: defineDsCardDataVizBar
12
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * This file was automatically generated by the Stencil React Output Target.
3
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
+ */
5
+ import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
6
+ import { type DsCardDataVizLineCustomEvent } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsCardDataVizLine as DsCardDataVizLineElement } from "@ds-mo/ui/dist/components/ds-card-data-viz-line.js";
9
+ export type DsCardDataVizLineEvents = {
10
+ onDsFilterClick: EventName<DsCardDataVizLineCustomEvent<void>>;
11
+ };
12
+ export declare const DsCardDataVizLine: StencilReactComponent<DsCardDataVizLineElement, DsCardDataVizLineEvents, Components.DsCardDataVizLine, 'heading'>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { createComponent } from '@stencil/react-output-target/runtime';
3
+ import React from 'react';
4
+ import { DsCardDataVizLine as DsCardDataVizLineElement, defineCustomElement as defineDsCardDataVizLine } from "@ds-mo/ui/dist/components/ds-card-data-viz-line.js";
5
+ export const DsCardDataVizLine = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-card-data-viz-line',
7
+ elementClass: DsCardDataVizLineElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: { onDsFilterClick: 'dsFilterClick' },
11
+ defineCustomElement: defineDsCardDataVizLine
12
+ });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * This file was automatically generated by the Stencil React Output Target.
3
+ * Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
4
+ */
5
+ import type { StencilReactComponent } from '@stencil/react-output-target/runtime';
6
+ import type { Components } from "@ds-mo/ui/dist/components";
7
+ import { DsChartBarStacked as DsChartBarStackedElement } from "@ds-mo/ui/dist/components/ds-chart-bar-stacked.js";
8
+ export type DsChartBarStackedEvents = NonNullable<unknown>;
9
+ export declare const DsChartBarStacked: StencilReactComponent<DsChartBarStackedElement, DsChartBarStackedEvents, Components.DsChartBarStacked>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { createComponent } from '@stencil/react-output-target/runtime';
3
+ import React from 'react';
4
+ import { DsChartBarStacked as DsChartBarStackedElement, defineCustomElement as defineDsChartBarStacked } from "@ds-mo/ui/dist/components/ds-chart-bar-stacked.js";
5
+ export const DsChartBarStacked = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-chart-bar-stacked',
7
+ elementClass: DsChartBarStackedElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: {},
11
+ defineCustomElement: defineDsChartBarStacked
12
+ });
@@ -122,6 +122,7 @@
122
122
  :where(a):not(:where([data-ds-prose='off'], [data-ds-prose='off'] *)) {
123
123
  color: var(--color-foreground-brand);
124
124
  text-decoration: underline;
125
+ text-decoration-color: var(--color-foreground-tertiary);
125
126
  }
126
127
 
127
128
  :where(.ds-prose)
@@ -1,6 +1,8 @@
1
1
  import { EventEmitter } from '../../stencil-public-runtime';
2
+ import type { BreadcrumbItem, BreadcrumbSelectDetail } from '../Breadcrumb/breadcrumb-types';
2
3
  import { type BarTitleActionItem, type BarTitlePrimaryAction, type BarTitleSectionItem, type BarTitleVariant } from './bar-title-types';
3
4
  export declare class BarTitle {
5
+ el: HTMLElement;
4
6
  /** The page's single visible h1. */
5
7
  heading: string;
6
8
  /** Optional supporting copy shown in the expanded presentation. */
@@ -9,8 +11,12 @@ export declare class BarTitle {
9
11
  showBack: boolean;
10
12
  /** Accessible name for the leading Back action. */
11
13
  backAriaLabel: string;
12
- /** Visible parent-page label used by the expanded Back breadcrumb. */
14
+ /** Visible parent-page label used by the expanded breadcrumb when breadcrumbs is empty. */
13
15
  backLabel: string;
16
+ /** Optional expanded ancestor path. Compact variants continue to use the Back action. */
17
+ breadcrumbs: BreadcrumbItem[];
18
+ /** Accessible name for the expanded breadcrumb navigation landmark. */
19
+ breadcrumbAriaLabel: string;
14
20
  /** Optional page sections exposed through the active-section menu. */
15
21
  sections: BarTitleSectionItem[];
16
22
  /** Id of the active page section. */
@@ -27,6 +33,8 @@ export declare class BarTitle {
27
33
  variant: BarTitleVariant;
28
34
  /** Emitted when the leading Back action is activated. */
29
35
  dsBack: EventEmitter<MouseEvent>;
36
+ /** Emitted when an authored expanded breadcrumb item is activated. */
37
+ dsBreadcrumbSelect: EventEmitter<BreadcrumbSelectDetail>;
30
38
  /** Emitted with the newly selected page-section id. */
31
39
  dsSectionChange: EventEmitter<string>;
32
40
  /** Emitted with the activated primary or overflow action id. */
@@ -42,9 +50,11 @@ export declare class BarTitle {
42
50
  private readonly actionMenuId;
43
51
  private sectionTriggerEl;
44
52
  private actionTriggerEl;
53
+ componentWillLoad(): void;
45
54
  handleSectionsChange(): void;
46
55
  handleActionsChange(): void;
47
56
  private get compact();
57
+ private get expandedBreadcrumbItems();
48
58
  /** Tooltip copy is fixed and generic; backAriaLabel/actionsAriaLabel stay page-specific. */
49
59
  private get backTooltipLabel();
50
60
  private get primaryCollapsed();
@@ -67,6 +77,8 @@ export declare class BarTitle {
67
77
  private handleActionSelect;
68
78
  private renderSectionSelector;
69
79
  private renderActions;
80
+ private handleBreadcrumbSelect;
81
+ private renderBreadcrumb;
70
82
  private renderBack;
71
83
  render(): any;
72
84
  }
@@ -0,0 +1,31 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ import type { BreadcrumbItem, BreadcrumbSelectDetail } from './breadcrumb-types';
3
+ export declare class Breadcrumb {
4
+ /** Ordered path from the broadest ancestor to the nearest page. */
5
+ items: BreadcrumbItem[];
6
+ /** Accessible name for the breadcrumb navigation landmark. */
7
+ ariaLabel: string;
8
+ /** Emitted when an interactive breadcrumb item is activated. Prevent to cancel native navigation. */
9
+ dsSelect: EventEmitter<BreadcrumbSelectDetail>;
10
+ private labelWidths;
11
+ private collapsedLabels;
12
+ private navElement?;
13
+ private listElement?;
14
+ private measurementElements;
15
+ private separatorElements;
16
+ private ellipsisMeasurement?;
17
+ private resizeObserver?;
18
+ private observedElement?;
19
+ private measurementFrame?;
20
+ componentDidLoad(): void;
21
+ componentDidRender(): void;
22
+ disconnectedCallback(): void;
23
+ handleItemsChange(): void;
24
+ private observeContainer;
25
+ private scheduleMeasurement;
26
+ private measureLabels;
27
+ private handleSelect;
28
+ private renderItem;
29
+ render(): any;
30
+ }
31
+ //# sourceMappingURL=Breadcrumb.d.ts.map
@@ -0,0 +1,17 @@
1
+ export interface BreadcrumbItem {
2
+ /** Stable value returned from dsSelect. */
3
+ id: string;
4
+ /** Visible caption label. */
5
+ label: string;
6
+ /** Optional accessible name when the visible label is not destination-specific enough. */
7
+ ariaLabel?: string;
8
+ /** Native destination. Omit when the route owner handles dsSelect. */
9
+ href?: string;
10
+ /** Marks this item as the current page and removes its interaction. */
11
+ isCurrent?: boolean;
12
+ }
13
+ export interface BreadcrumbSelectDetail {
14
+ item: BreadcrumbItem;
15
+ originalEvent: MouseEvent;
16
+ }
17
+ //# sourceMappingURL=breadcrumb-types.d.ts.map
@@ -0,0 +1,24 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ import type { CardShellDataVizWidth } from '../CardShellDataViz/CardShellDataViz';
3
+ export type CardDataVizBarWidth = CardShellDataVizWidth;
4
+ /**
5
+ * Bar-chart data-viz card — dedicated `ds-card-shell-data-viz` chrome with a fill chart
6
+ * region and an optional, content-sized static legend.
7
+ */
8
+ export declare class CardDataVizBar {
9
+ el: HTMLElement;
10
+ /** Widget heading shown in the card header. */
11
+ heading: string;
12
+ /** Card width token — also sets matching min-height. */
13
+ cardWidth: CardDataVizBarWidth;
14
+ filterLabel: string;
15
+ /** Emits when the header filter control is activated. */
16
+ dsFilterClick: EventEmitter<void>;
17
+ private hasChartSlot;
18
+ private hasLegendSlot;
19
+ componentWillRender(): void;
20
+ componentDidRender(): void;
21
+ private handleFilterClick;
22
+ render(): any;
23
+ }
24
+ //# sourceMappingURL=CardDataVizBar.d.ts.map
@@ -0,0 +1,2 @@
1
+ export type { CardDataVizBarWidth } from './CardDataVizBar';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,24 @@
1
+ import { EventEmitter } from '../../stencil-public-runtime';
2
+ import type { CardShellDataVizWidth } from '../CardShellDataViz/CardShellDataViz';
3
+ export type CardDataVizLineWidth = CardShellDataVizWidth;
4
+ /**
5
+ * Line-chart data-viz card — dedicated `ds-card-shell-data-viz` chrome with a fill chart
6
+ * region and a content-sized, static legend.
7
+ */
8
+ export declare class CardDataVizLine {
9
+ el: HTMLElement;
10
+ /** Widget heading shown in the card header. */
11
+ heading: string;
12
+ /** Card width token — also sets matching min-height. */
13
+ cardWidth: CardDataVizLineWidth;
14
+ filterLabel: string;
15
+ /** Emits when the header filter control is activated. */
16
+ dsFilterClick: EventEmitter<void>;
17
+ private hasChartSlot;
18
+ private hasLegendSlot;
19
+ componentWillRender(): void;
20
+ componentDidRender(): void;
21
+ private handleFilterClick;
22
+ render(): any;
23
+ }
24
+ //# sourceMappingURL=CardDataVizLine.d.ts.map
@@ -0,0 +1,2 @@
1
+ export type { CardDataVizLineWidth } from './CardDataVizLine';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,15 @@
1
+ import type { ChartSeries } from '../../utils/chart-types';
2
+ export type ChartBarStackedVariant = 'stacked' | 'percentage';
3
+ export declare class ChartBarStacked {
4
+ /** Ordered stack series. Set as a JS property (not an HTML attribute). */
5
+ series: ChartSeries[];
6
+ /** X-axis labels — must match each series' `data` length. Set as a JS property. */
7
+ categories: string[];
8
+ variant: ChartBarStackedVariant;
9
+ width: number;
10
+ height: number;
11
+ private valuesForCategory;
12
+ private accessibleLabel;
13
+ render(): any;
14
+ }
15
+ //# sourceMappingURL=ChartBarStacked.d.ts.map