@ds-mo/ui 12.1.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 (210) 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 +313 -47
  5. package/dist/angular/ds-avatar.d.ts +1 -1
  6. package/dist/angular/ds-avatar.js +3 -3
  7. package/dist/angular/ds-bar-title.d.ts +1 -1
  8. package/dist/angular/ds-bar-title.js +3 -3
  9. package/dist/angular/ds-bar-workflow.d.ts +28 -0
  10. package/dist/angular/ds-bar-workflow.js +48 -0
  11. package/dist/angular/ds-conversation-list.d.ts +1 -1
  12. package/dist/angular/ds-conversation-list.js +4 -3
  13. package/dist/angular/ds-scroll-overlay.d.ts +19 -0
  14. package/dist/angular/ds-scroll-overlay.js +43 -0
  15. package/dist/angular/index.d.ts +1 -1
  16. package/dist/angular/index.js +2 -0
  17. package/dist/angular/proxies.d.ts +2 -0
  18. package/dist/angular/proxies.js +2 -0
  19. package/dist/components/ds-agent-activity.js +1 -1
  20. package/dist/components/ds-agent-response.js +1 -1
  21. package/dist/components/ds-agent-source-list.js +1 -1
  22. package/dist/components/ds-agent-tool-call.js +1 -1
  23. package/dist/components/ds-attachment-list.js +1 -1
  24. package/dist/components/ds-avatar.js +1 -1
  25. package/dist/components/ds-avatar.js.map +1 -1
  26. package/dist/components/ds-badge.js +1 -1
  27. package/dist/components/ds-bar-nav.js +1 -1
  28. package/dist/components/ds-bar-nav.js.map +1 -1
  29. package/dist/components/ds-bar-title.js +1 -1
  30. package/dist/components/ds-bar-title.js.map +1 -1
  31. package/dist/components/ds-bar-workflow.d.ts +11 -0
  32. package/dist/components/ds-bar-workflow.js +2 -0
  33. package/dist/components/ds-bar-workflow.js.map +1 -0
  34. package/dist/components/ds-button-filled.js +1 -1
  35. package/dist/components/ds-button-unfilled.js +1 -1
  36. package/dist/components/ds-card-data-viz-donut.js +1 -1
  37. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  38. package/dist/components/ds-card-setting.js +1 -1
  39. package/dist/components/ds-card-setting.js.map +1 -1
  40. package/dist/components/ds-card-shell-data-viz.js +1 -1
  41. package/dist/components/ds-chart-bar.js +1 -1
  42. package/dist/components/ds-chart-donut.js +1 -1
  43. package/dist/components/ds-chart-legend.js +1 -1
  44. package/dist/components/ds-chart-line.js +1 -1
  45. package/dist/components/ds-checkbox.js +1 -1
  46. package/dist/components/ds-chip.js +1 -1
  47. package/dist/components/ds-chip.js.map +1 -1
  48. package/dist/components/ds-code-block.js +1 -1
  49. package/dist/components/ds-conversation-list-item.js +1 -1
  50. package/dist/components/ds-conversation-list-item.js.map +1 -1
  51. package/dist/components/ds-conversation-list-section.js +1 -1
  52. package/dist/components/ds-conversation-list-section.js.map +1 -1
  53. package/dist/components/ds-conversation-list.js +1 -1
  54. package/dist/components/ds-conversation-list.js.map +1 -1
  55. package/dist/components/ds-divider.js +1 -1
  56. package/dist/components/ds-empty-state.js +1 -1
  57. package/dist/components/ds-field.js +1 -1
  58. package/dist/components/ds-input.js +1 -1
  59. package/dist/components/ds-input.js.map +1 -1
  60. package/dist/components/ds-markdown.js +1 -1
  61. package/dist/components/ds-menu.js +1 -1
  62. package/dist/components/ds-message-bubble.js +1 -1
  63. package/dist/components/ds-message-bubble.js.map +1 -1
  64. package/dist/components/ds-message-composer.js +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-app.js.map +1 -1
  86. package/dist/components/ds-shell-gradient-picker.js +1 -1
  87. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  88. package/dist/components/ds-shell-gradient-swatch.js.map +1 -1
  89. package/dist/components/ds-shell-page.js +1 -1
  90. package/dist/components/ds-shell-page.js.map +1 -1
  91. package/dist/components/ds-skeleton.js +1 -1
  92. package/dist/components/ds-slider.js +1 -1
  93. package/dist/components/ds-slider.js.map +1 -1
  94. package/dist/components/ds-swatch-picker.js +1 -1
  95. package/dist/components/ds-switch.js +1 -1
  96. package/dist/components/ds-tab-group.js +1 -1
  97. package/dist/components/ds-tab-group.js.map +1 -1
  98. package/dist/components/ds-tag.js +1 -1
  99. package/dist/components/ds-tag.js.map +1 -1
  100. package/dist/components/ds-text.js +1 -1
  101. package/dist/components/ds-toast.js +1 -1
  102. package/dist/components/ds-tooltip-data-viz.js +1 -1
  103. package/dist/components/ds-tooltip.js +1 -1
  104. package/dist/components/ds-typing-indicator.js +1 -1
  105. package/dist/components/p-2W-ZjZCR.js +2 -0
  106. package/dist/components/{p-Dqwcw1-m.js.map → p-2W-ZjZCR.js.map} +1 -1
  107. package/dist/components/p-8OOCLGph.js +2 -0
  108. package/dist/components/p-8OOCLGph.js.map +1 -0
  109. package/dist/components/{p-CTV_QWC5.js → p-B8CubPgQ.js} +2 -2
  110. package/dist/components/p-BE_CDJeL.js +2 -0
  111. package/dist/components/p-BE_CDJeL.js.map +1 -0
  112. package/dist/components/{p-LFGbdi7Y.js → p-BRLDJmkh.js} +2 -2
  113. package/dist/components/p-BpA9uYKX.js +2 -0
  114. package/dist/components/p-BpA9uYKX.js.map +1 -0
  115. package/dist/components/{p-Bs6SS34m.js → p-C0_8K4y7.js} +2 -2
  116. package/dist/components/{p-BfEjWe8U.js → p-CA3kLO7K.js} +2 -2
  117. package/dist/components/{p-DfIch2Dk.js → p-CCHqsF_H.js} +2 -2
  118. package/dist/components/p-CG5EX4NW.js +2 -0
  119. package/dist/components/{p-DABj3qTX.js.map → p-CG5EX4NW.js.map} +1 -1
  120. package/dist/components/{p-tDXHTAJh.js → p-CHkI3oIS.js} +2 -2
  121. package/dist/components/{p-liMPkhUP.js → p-CNffejay.js} +2 -2
  122. package/dist/components/{p-CR7yMitN.js → p-Cxpl-rzP.js} +2 -2
  123. package/dist/components/p-CydY-v7X.js +2 -0
  124. package/dist/components/p-CydY-v7X.js.map +1 -0
  125. package/dist/components/{p-BkwBtZs3.js → p-D6jK2Hyi.js} +2 -2
  126. package/dist/components/{p-BzsITTZa.js → p-DBi1bmOL.js} +2 -2
  127. package/dist/components/{p-DxeHimqk.js → p-DOCKtrS4.js} +2 -2
  128. package/dist/components/p-DbpfpeQT.js +2 -0
  129. package/dist/components/p-DbpfpeQT.js.map +1 -0
  130. package/dist/components/{p-B9jvSGid.js → p-DcGpdIlT.js} +2 -2
  131. package/dist/components/p-DyGB97Oy.js +2 -0
  132. package/dist/components/{p-Dy_sZ-dI.js.map → p-DyGB97Oy.js.map} +1 -1
  133. package/dist/components/p-GMDGgtY8.js +2 -0
  134. package/dist/components/{p-DpyTrZa2.js.map → p-GMDGgtY8.js.map} +1 -1
  135. package/dist/components/p-XgIQ3oI_.js +2 -0
  136. package/dist/components/{p-Dfxnxx7L.js.map → p-XgIQ3oI_.js.map} +1 -1
  137. package/dist/components/{p-DszI94sZ.js → p-ky1msbJ8.js} +2 -2
  138. package/dist/components/p-xY3TjBF5.js +2 -0
  139. package/dist/components/{p-webARv8d.js.map → p-xY3TjBF5.js.map} +1 -1
  140. package/dist/docs/components.json +681 -98
  141. package/dist/lib/utils/anchored-popup.d.ts +5 -1
  142. package/dist/mcp-data/registry/agent-response.json +9 -4
  143. package/dist/mcp-data/registry/avatar.json +26 -7
  144. package/dist/mcp-data/registry/bar-title.json +13 -28
  145. package/dist/mcp-data/registry/bar-workflow.json +368 -0
  146. package/dist/mcp-data/registry/button-filled.json +1 -1
  147. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  148. package/dist/mcp-data/registry/checkbox.json +1 -1
  149. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  150. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  151. package/dist/mcp-data/registry/conversation-list.json +36 -9
  152. package/dist/mcp-data/registry/markdown.json +15 -10
  153. package/dist/mcp-data/registry/menu.json +9 -7
  154. package/dist/mcp-data/registry/message-scroller.json +3 -3
  155. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  156. package/dist/mcp-data/registry/registry.json +318 -46
  157. package/dist/mcp-data/registry/scroll-overlay.json +183 -0
  158. package/dist/mcp-data/registry/shell-gradient-swatch.json +1 -1
  159. package/dist/mcp-data/registry/shell-page.json +12 -9
  160. package/dist/mcp-data/registry/slider.json +1 -1
  161. package/dist/mcp-data/registry/switch.json +1 -1
  162. package/dist/mcp-data/registry/tab-group.json +1 -1
  163. package/dist/react/components.d.ts +2 -0
  164. package/dist/react/components.js +2 -0
  165. package/dist/react/ds-bar-workflow.d.ts +14 -0
  166. package/dist/react/ds-bar-workflow.js +16 -0
  167. package/dist/react/ds-scroll-overlay.d.ts +12 -0
  168. package/dist/react/ds-scroll-overlay.js +12 -0
  169. package/dist/styles/prose.css +214 -0
  170. package/dist/types/components/Avatar/Avatar.d.ts +4 -1
  171. package/dist/types/components/BarTitle/BarTitle.d.ts +1 -4
  172. package/dist/types/components/BarTitle/bar-title-types.d.ts +0 -1
  173. package/dist/types/components/BarWorkflow/BarWorkflow.d.ts +37 -0
  174. package/dist/types/components/BarWorkflow/bar-workflow-types.d.ts +12 -0
  175. package/dist/types/components/ConversationList/ConversationList.d.ts +12 -0
  176. package/dist/types/components/Menu/Menu.d.ts +1 -2
  177. package/dist/types/components/MessageScroller/MessageScroller.d.ts +1 -6
  178. package/dist/types/components/ScrollOverlay/ScrollOverlay.d.ts +28 -0
  179. package/dist/types/components.d.ts +233 -16
  180. package/dist/types/stories/isolated-overlay-docs.d.ts +13 -0
  181. package/dist/types/utils/anchored-popup.d.ts +5 -1
  182. package/dist/types/utils/scroll-overlay-controller.d.ts +35 -0
  183. package/package.json +4 -3
  184. package/dist/components/p-C3Zfn7hz.js +0 -2
  185. package/dist/components/p-C3Zfn7hz.js.map +0 -1
  186. package/dist/components/p-CUik7PCi.js +0 -2
  187. package/dist/components/p-CUik7PCi.js.map +0 -1
  188. package/dist/components/p-DABj3qTX.js +0 -2
  189. package/dist/components/p-Dfxnxx7L.js +0 -2
  190. package/dist/components/p-DpyTrZa2.js +0 -2
  191. package/dist/components/p-Dqwcw1-m.js +0 -2
  192. package/dist/components/p-Dy3Skua8.js +0 -2
  193. package/dist/components/p-Dy3Skua8.js.map +0 -1
  194. package/dist/components/p-Dy_sZ-dI.js +0 -2
  195. package/dist/components/p-l6PmnW_P.js +0 -2
  196. package/dist/components/p-l6PmnW_P.js.map +0 -1
  197. package/dist/components/p-webARv8d.js +0 -2
  198. /package/dist/components/{p-CTV_QWC5.js.map → p-B8CubPgQ.js.map} +0 -0
  199. /package/dist/components/{p-LFGbdi7Y.js.map → p-BRLDJmkh.js.map} +0 -0
  200. /package/dist/components/{p-Bs6SS34m.js.map → p-C0_8K4y7.js.map} +0 -0
  201. /package/dist/components/{p-BfEjWe8U.js.map → p-CA3kLO7K.js.map} +0 -0
  202. /package/dist/components/{p-DfIch2Dk.js.map → p-CCHqsF_H.js.map} +0 -0
  203. /package/dist/components/{p-tDXHTAJh.js.map → p-CHkI3oIS.js.map} +0 -0
  204. /package/dist/components/{p-liMPkhUP.js.map → p-CNffejay.js.map} +0 -0
  205. /package/dist/components/{p-CR7yMitN.js.map → p-Cxpl-rzP.js.map} +0 -0
  206. /package/dist/components/{p-BkwBtZs3.js.map → p-D6jK2Hyi.js.map} +0 -0
  207. /package/dist/components/{p-BzsITTZa.js.map → p-DBi1bmOL.js.map} +0 -0
  208. /package/dist/components/{p-DxeHimqk.js.map → p-DOCKtrS4.js.map} +0 -0
  209. /package/dist/components/{p-B9jvSGid.js.map → p-DcGpdIlT.js.map} +0 -0
  210. /package/dist/components/{p-DszI94sZ.js.map → p-ky1msbJ8.js.map} +0 -0
@@ -0,0 +1,183 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "scroll-overlay",
4
+ "title": "ScrollOverlay",
5
+ "description": "Generic scroll owner for content that moves behind a persistent footer action or composer with an always-active alpha fade.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/scroll-overlay",
11
+ "source": "src/wc/components/ScrollOverlay/ScrollOverlay.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "experimental",
16
+ "summary": "Generic scroll owner for content that moves behind a persistent footer action or composer with an always-active alpha fade.",
17
+ "useWhen": [
18
+ "A bounded region owns scrolling while footer actions remain overlaid and continuously visible.",
19
+ "The final content must clear a live-height footer while earlier content can move behind it."
20
+ ],
21
+ "avoidWhen": [
22
+ "The footer belongs in normal document flow rather than overlaying content.",
23
+ "Another component already owns scrolling and cannot delegate its scrollport to this component."
24
+ ],
25
+ "commonlyComposedWith": [
26
+ "component:ds-button-filled",
27
+ "component:ds-message-composer"
28
+ ],
29
+ "accessibility": [
30
+ "Provide scrollLabel when the scrollport needs its own named, keyboard-focusable region.",
31
+ "Keep footer actions keyboard accessible and explicitly named; the fade is decorative and never intercepts pointer input."
32
+ ],
33
+ "states": [
34
+ "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.",
35
+ "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.",
36
+ "An md 32px footer action with 8px bottom inset therefore produces a 48px fade; variable-height composers produce a correspondingly taller measured fade."
37
+ ],
38
+ "responsiveBehavior": [
39
+ "The scrollport and overlay fill the available width and height; the owner supplies responsive sizing and overlay insets."
40
+ ],
41
+ "frameworkCaveats": {
42
+ "customElements": [
43
+ "Place scrollable content in the default slot and one footer wrapper in the overlay slot; use dsScroll only when the application needs position data."
44
+ ],
45
+ "react": [
46
+ "Use DsScrollOverlay with ordinary children plus an element carrying slot=\"overlay\"."
47
+ ],
48
+ "angular": [
49
+ "Import DsScrollOverlay and project the persistent footer wrapper with slot=\"overlay\"."
50
+ ]
51
+ },
52
+ "references": [
53
+ {
54
+ "label": "Storybook examples",
55
+ "path": "src/wc/components/ScrollOverlay/ScrollOverlay.stories.ts"
56
+ }
57
+ ]
58
+ },
59
+ "api": {
60
+ "props": {
61
+ "scrollLabel": {
62
+ "type": "string | undefined",
63
+ "resolvedType": "string | undefined",
64
+ "attribute": "scroll-label",
65
+ "required": false,
66
+ "mutable": false,
67
+ "description": "Optional accessible name. When provided, the scrollport is a focusable region."
68
+ }
69
+ },
70
+ "events": [
71
+ {
72
+ "name": "dsScroll",
73
+ "detail": "ScrollOverlayScrollDetail",
74
+ "bubbles": true,
75
+ "cancelable": true,
76
+ "composed": true,
77
+ "description": "Reports scroll position without exposing the internal scrollport element."
78
+ }
79
+ ],
80
+ "methods": [
81
+ {
82
+ "name": "refreshOverlay",
83
+ "signature": "refreshOverlay() => Promise<void>",
84
+ "description": "Re-measure footer geometry after an imperative slotted-content update."
85
+ },
86
+ {
87
+ "name": "scrollToEnd",
88
+ "signature": "scrollToEnd() => Promise<void>",
89
+ "description": "Move the owned scrollport to its live end."
90
+ },
91
+ {
92
+ "name": "scrollToStart",
93
+ "signature": "scrollToStart() => Promise<void>",
94
+ "description": "Move the owned scrollport to its beginning."
95
+ }
96
+ ],
97
+ "slots": []
98
+ },
99
+ "props": {
100
+ "scrollLabel": {
101
+ "type": "string | undefined",
102
+ "resolvedType": "string | undefined",
103
+ "attribute": "scroll-label",
104
+ "required": false,
105
+ "mutable": false,
106
+ "description": "Optional accessible name. When provided, the scrollport is a focusable region."
107
+ }
108
+ },
109
+ "events": [
110
+ {
111
+ "name": "dsScroll",
112
+ "detail": "ScrollOverlayScrollDetail",
113
+ "bubbles": true,
114
+ "cancelable": true,
115
+ "composed": true,
116
+ "description": "Reports scroll position without exposing the internal scrollport element."
117
+ }
118
+ ],
119
+ "methods": [
120
+ {
121
+ "name": "refreshOverlay",
122
+ "signature": "refreshOverlay() => Promise<void>",
123
+ "description": "Re-measure footer geometry after an imperative slotted-content update."
124
+ },
125
+ {
126
+ "name": "scrollToEnd",
127
+ "signature": "scrollToEnd() => Promise<void>",
128
+ "description": "Move the owned scrollport to its live end."
129
+ },
130
+ {
131
+ "name": "scrollToStart",
132
+ "signature": "scrollToStart() => Promise<void>",
133
+ "description": "Move the owned scrollport to its beginning."
134
+ }
135
+ ],
136
+ "slots": [],
137
+ "exports": {
138
+ "customElement": "ds-scroll-overlay",
139
+ "react": "DsScrollOverlay",
140
+ "angular": "DsScrollOverlay"
141
+ },
142
+ "consumption": {
143
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
144
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
145
+ "customElements": {
146
+ "import": "import '@ds-mo/ui/dist/components/ds-scroll-overlay.js';",
147
+ "example": "<ds-scroll-overlay></ds-scroll-overlay>"
148
+ },
149
+ "react": {
150
+ "import": "import { DsScrollOverlay } from '@ds-mo/ui/react';",
151
+ "example": "<DsScrollOverlay />"
152
+ },
153
+ "angular": {
154
+ "import": "import { DsScrollOverlay } from '@ds-mo/ui/angular/ds-scroll-overlay';",
155
+ "example": "<ds-scroll-overlay></ds-scroll-overlay>"
156
+ },
157
+ "peerDependencies": {
158
+ "required": [
159
+ "@ds-mo/tokens ^3.1.1",
160
+ "@ds-mo/icons ^6.4.0"
161
+ ],
162
+ "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
163
+ }
164
+ }
165
+ },
166
+ "dependencies": [
167
+ "@ds-mo/ui",
168
+ "@ds-mo/tokens"
169
+ ],
170
+ "registryDependencies": [],
171
+ "files": [
172
+ {
173
+ "path": "src/wc/components/ScrollOverlay/ScrollOverlay.css",
174
+ "content": ":host {\n display: block;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n box-sizing: border-box;\n}\n\n.scroll-overlay {\n position: relative;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n\n.scroll-overlay__viewport {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: contain;\n box-sizing: border-box;\n}\n\n.scroll-overlay__viewport:focus-visible {\n outline: var(--dimension-stroke-width-025) solid var(--color-border-bold-brand);\n outline-offset: calc(-1 * var(--dimension-stroke-width-025));\n}\n\n.scroll-overlay__content {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n padding-block-end: var(--ds-scroll-overlay-block-size, 0);\n box-sizing: border-box;\n}\n\n.scroll-overlay__body {\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n flex: 1 0 auto;\n min-height: 0;\n}\n\n.scroll-overlay__overlay {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: var(--dimension-z-index-floating);\n}\n",
175
+ "type": "registry:ui"
176
+ },
177
+ {
178
+ "path": "src/wc/components/ScrollOverlay/ScrollOverlay.tsx",
179
+ "content": "import { Component, Element, Event, EventEmitter, h, Host, Method, Prop } from '@stencil/core';\nimport { ScrollOverlayController } from '../../utils/scroll-overlay-controller';\n\nexport interface ScrollOverlayScrollDetail {\n scrollTop: number;\n scrollHeight: number;\n clientHeight: number;\n}\n\n@Component({\n tag: 'ds-scroll-overlay',\n styleUrl: 'ScrollOverlay.css',\n styleUrls: ['../../utils/scroll-edge-fade.css'],\n scoped: true,\n})\nexport class ScrollOverlay {\n @Element() el!: HTMLElement;\n\n /** Optional accessible name. When provided, the scrollport is a focusable region. */\n @Prop() scrollLabel: string | undefined;\n\n /** Reports scroll position without exposing the internal scrollport element. */\n @Event() dsScroll!: EventEmitter<ScrollOverlayScrollDetail>;\n\n private viewport?: HTMLElement;\n private content?: HTMLElement;\n private overlay?: HTMLElement;\n private controller?: ScrollOverlayController;\n\n componentDidLoad(): void {\n if (!this.viewport || !this.content || !this.overlay) return;\n this.controller = new ScrollOverlayController({\n host: this.el,\n viewport: this.viewport,\n content: this.content,\n overlay: this.overlay,\n });\n this.controller.connect();\n }\n\n disconnectedCallback(): void {\n this.controller?.disconnect();\n }\n\n /** Move the owned scrollport to its beginning. */\n @Method()\n async scrollToStart(): Promise<void> {\n this.viewport?.scrollTo({ top: 0, behavior: 'auto' });\n this.controller?.sync();\n }\n\n /** Move the owned scrollport to its live end. */\n @Method()\n async scrollToEnd(): Promise<void> {\n this.viewport?.scrollTo({ top: this.viewport.scrollHeight, behavior: 'auto' });\n this.controller?.sync();\n }\n\n /** Re-measure footer geometry after an imperative slotted-content update. */\n @Method()\n async refreshOverlay(): Promise<void> {\n this.controller?.sync();\n }\n\n private handleScroll = (): void => {\n if (!this.viewport) return;\n this.controller?.sync();\n this.dsScroll.emit({\n scrollTop: this.viewport.scrollTop,\n scrollHeight: this.viewport.scrollHeight,\n clientHeight: this.viewport.clientHeight,\n });\n };\n\n render() {\n const labelled = Boolean(this.scrollLabel?.trim());\n return (\n <Host>\n <div class=\"scroll-overlay\">\n <div\n class=\"scroll-overlay__viewport\"\n ref={element => {\n this.viewport = element;\n }}\n role={labelled ? 'region' : undefined}\n aria-label={labelled ? this.scrollLabel : undefined}\n tabIndex={labelled ? 0 : undefined}\n onScroll={this.handleScroll}\n >\n <div\n class=\"scroll-overlay__content scroll-edge-fade--block-window\"\n ref={element => {\n this.content = element;\n }}\n >\n <div class=\"scroll-overlay__body\">\n <slot />\n </div>\n </div>\n </div>\n <div\n class=\"scroll-overlay__overlay\"\n ref={element => {\n this.overlay = element;\n }}\n >\n <slot name=\"overlay\" />\n </div>\n </div>\n </Host>\n );\n }\n}\n",
180
+ "type": "registry:ui"
181
+ }
182
+ ]
183
+ }
@@ -198,7 +198,7 @@
198
198
  "files": [
199
199
  {
200
200
  "path": "src/wc/components/ShellGradientSwatch/ShellGradientSwatch.css",
201
- "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n\n/**\n * Swatch — 24×24 orb (size-300). Spacing lives on the picker row.\n *\n * Layer stack (bottom → top):\n * Default: fill → border → interaction (hover/press)\n * Selected: fill → border → interaction → halo → stroke (brand)\n */\n\n:host {\n box-sizing: border-box;\n display: inline-flex;\n flex: 0 0 auto;\n width: var(--dimension-size-300);\n height: var(--dimension-size-300);\n --_swatch-inner-inset: calc(\n var(--dimension-stroke-width-025) + var(--dimension-space-025)\n );\n --_swatch-ring-bg: var(--color-background-primary);\n --_swatch-select-motion: var(--effect-motion-short-3);\n}\n\n.shell-gradient-swatch {\n position: relative;\n box-sizing: border-box;\n width: var(--dimension-size-300);\n height: var(--dimension-size-300);\n padding: 0;\n border: none;\n border-radius: var(--dimension-radius-half);\n background: transparent;\n cursor: pointer;\n flex-shrink: 0;\n isolation: isolate;\n}\n\n.shell-gradient-swatch__fill,\n.shell-gradient-swatch__border,\n.shell-gradient-swatch__interaction,\n.shell-gradient-swatch__halo,\n.shell-gradient-swatch__stroke {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n border-radius: inherit;\n pointer-events: none;\n}\n\n/* 1 — fill */\n.shell-gradient-swatch__fill {\n z-index: 1;\n background-color: var(--color-background-secondary);\n background-image: var(--_swatch-gradient-image);\n background-repeat: no-repeat;\n background-size: cover;\n background-position: 0 0;\n transition:\n top var(--_swatch-select-motion),\n right var(--_swatch-select-motion),\n bottom var(--_swatch-select-motion),\n left var(--_swatch-select-motion);\n}\n\n.shell-gradient-swatch--none .shell-gradient-swatch__fill {\n background-image: none;\n}\n\n.shell-gradient-swatch:not(.shell-gradient-swatch--none) .shell-gradient-swatch__fill {\n opacity: var(--ds-shell-gradient-opacity, 0.1);\n}\n\n/* 2 — secondary border (matches ds-interaction-fill--bordered) */\n.shell-gradient-swatch__border {\n z-index: 2;\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--color-border-secondary);\n transition:\n top var(--_swatch-select-motion),\n right var(--_swatch-select-motion),\n bottom var(--_swatch-select-motion),\n left var(--_swatch-select-motion);\n}\n\n/* 3 — hover / press (over border, under selected chrome) */\n.shell-gradient-swatch__interaction {\n z-index: 3;\n background: transparent;\n transition:\n top var(--_swatch-select-motion),\n right var(--_swatch-select-motion),\n bottom var(--_swatch-select-motion),\n left var(--_swatch-select-motion),\n background-color 0s;\n}\n\n.shell-gradient-swatch:hover:not(:disabled) .shell-gradient-swatch__interaction {\n background: var(--color-interaction-hover);\n}\n\n.shell-gradient-swatch:active:not(:disabled) .shell-gradient-swatch__interaction {\n background: var(--color-interaction-pressed);\n}\n\n/* 4 — halo gap (selected only) */\n.shell-gradient-swatch__halo {\n z-index: 4;\n opacity: 0;\n transform: scale(1.2);\n transform-origin: center;\n box-shadow: inset 0 0 0 var(--_swatch-inner-inset) var(--_swatch-ring-bg);\n transition:\n opacity var(--_swatch-select-motion),\n transform var(--_swatch-select-motion);\n}\n\n/* 5 — brand stroke (selected only) */\n.shell-gradient-swatch__stroke {\n z-index: 5;\n opacity: 0;\n transform: scale(1.2);\n transform-origin: center;\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-025) var(--color-border-bold-brand);\n transition:\n opacity var(--_swatch-select-motion),\n transform var(--_swatch-select-motion);\n}\n\n.shell-gradient-swatch--selected .shell-gradient-swatch__fill,\n.shell-gradient-swatch--selected .shell-gradient-swatch__border,\n.shell-gradient-swatch--selected .shell-gradient-swatch__interaction {\n top: var(--_swatch-inner-inset);\n right: var(--_swatch-inner-inset);\n bottom: var(--_swatch-inner-inset);\n left: var(--_swatch-inner-inset);\n}\n\n.shell-gradient-swatch--selected .shell-gradient-swatch__halo,\n.shell-gradient-swatch--selected .shell-gradient-swatch__stroke {\n opacity: 1;\n transform: scale(1);\n}\n\n/* Inactive: `.ds-control-inactive` (25% opacity). */\n\n@media (prefers-reduced-motion: reduce) {\n .shell-gradient-swatch__fill,\n .shell-gradient-swatch__border,\n .shell-gradient-swatch__interaction,\n .shell-gradient-swatch__halo,\n .shell-gradient-swatch__stroke {\n transition: none;\n }\n}\n",
201
+ "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n\n/**\n * Swatch — 24×24 orb (size-300). Spacing lives on the picker row.\n *\n * Layer stack (bottom → top):\n * Default: fill → border → interaction (hover/press)\n * Selected: fill → border → interaction → halo → stroke (brand)\n */\n\n:host {\n box-sizing: border-box;\n display: inline-flex;\n flex: 0 0 auto;\n width: var(--dimension-size-300);\n height: var(--dimension-size-300);\n --_swatch-inner-inset: calc(\n var(--dimension-stroke-width-025) + var(--dimension-space-025)\n );\n --_swatch-ring-bg: var(--color-background-primary);\n --_swatch-select-motion: var(--effect-motion-short-3);\n}\n\n.shell-gradient-swatch {\n position: relative;\n box-sizing: border-box;\n width: var(--dimension-size-300);\n height: var(--dimension-size-300);\n padding: 0;\n border: none;\n border-radius: var(--dimension-radius-half);\n background: transparent;\n cursor: pointer;\n flex-shrink: 0;\n isolation: isolate;\n}\n\n.shell-gradient-swatch__fill,\n.shell-gradient-swatch__border,\n.shell-gradient-swatch__interaction,\n.shell-gradient-swatch__halo,\n.shell-gradient-swatch__stroke {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n border-radius: inherit;\n pointer-events: none;\n}\n\n/* 1 — fill */\n.shell-gradient-swatch__fill {\n z-index: 1;\n background-color: var(--color-background-secondary);\n background-image: var(--_swatch-gradient-image);\n background-repeat: no-repeat;\n background-size: cover;\n background-position: 0 0;\n transition:\n top var(--_swatch-select-motion),\n right var(--_swatch-select-motion),\n bottom var(--_swatch-select-motion),\n left var(--_swatch-select-motion);\n}\n\n.shell-gradient-swatch--none .shell-gradient-swatch__fill {\n background-image: none;\n}\n\n.shell-gradient-swatch:not(.shell-gradient-swatch--none) .shell-gradient-swatch__fill {\n opacity: var(--ds-shell-gradient-opacity, 0.1);\n}\n\n/* 2 — secondary border (matches ds-interaction-fill--bordered) */\n.shell-gradient-swatch__border {\n z-index: 2;\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-012) var(--color-border-secondary);\n transition:\n top var(--_swatch-select-motion),\n right var(--_swatch-select-motion),\n bottom var(--_swatch-select-motion),\n left var(--_swatch-select-motion);\n}\n\n/* 3 — hover / press (over border, under selected chrome) */\n.shell-gradient-swatch__interaction {\n z-index: 3;\n background: transparent;\n transition:\n top var(--_swatch-select-motion),\n right var(--_swatch-select-motion),\n bottom var(--_swatch-select-motion),\n left var(--_swatch-select-motion),\n background-color 0s;\n}\n\n.shell-gradient-swatch:hover:not(:disabled) .shell-gradient-swatch__interaction {\n background: var(--color-interaction-hover);\n}\n\n.shell-gradient-swatch:active:not(:disabled) .shell-gradient-swatch__interaction {\n background: var(--color-interaction-pressed);\n}\n\n/* 4 — halo gap (selected only) */\n.shell-gradient-swatch__halo {\n z-index: 4;\n opacity: 0;\n transform: scale(1.2);\n transform-origin: center;\n box-shadow: inset 0 0 0 var(--_swatch-inner-inset) var(--_swatch-ring-bg);\n transition:\n opacity var(--_swatch-select-motion),\n transform var(--_swatch-select-motion);\n}\n\n/* 5 — brand stroke (selected only) */\n.shell-gradient-swatch__stroke {\n z-index: 5;\n opacity: 0;\n transform: scale(1.2);\n transform-origin: center;\n box-shadow: inset 0 0 0 var(--dimension-stroke-width-025) var(--color-border-bold-brand);\n transition:\n opacity var(--_swatch-select-motion),\n transform var(--_swatch-select-motion);\n}\n\n.shell-gradient-swatch--selected .shell-gradient-swatch__fill,\n.shell-gradient-swatch--selected .shell-gradient-swatch__border,\n.shell-gradient-swatch--selected .shell-gradient-swatch__interaction {\n top: var(--_swatch-inner-inset);\n right: var(--_swatch-inner-inset);\n bottom: var(--_swatch-inner-inset);\n left: var(--_swatch-inner-inset);\n}\n\n.shell-gradient-swatch--selected .shell-gradient-swatch__halo,\n.shell-gradient-swatch--selected .shell-gradient-swatch__stroke {\n opacity: 1;\n transform: scale(1);\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity). */\n\n@media (prefers-reduced-motion: reduce) {\n .shell-gradient-swatch__fill,\n .shell-gradient-swatch__border,\n .shell-gradient-swatch__interaction,\n .shell-gradient-swatch__halo,\n .shell-gradient-swatch__stroke {\n transition: none;\n }\n}\n",
202
202
  "type": "registry:ui"
203
203
  },
204
204
  {
@@ -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 placement, container-aware header 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, container-aware BarTitle variants, 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,11 @@
13
13
  "intent": {
14
14
  "audience": "general",
15
15
  "status": "stable",
16
- "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.",
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.",
17
17
  "useWhen": [
18
18
  "Rendering a standard routed page inside ShellApp's default content region.",
19
19
  "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the page column narrows.",
20
+ "BarWorkflow needs sticky page-level placement while remaining compact.",
20
21
  "Pages need consistent content gutters with an explicit full-bleed option."
21
22
  ],
22
23
  "avoidWhen": [
@@ -39,6 +40,7 @@
39
40
  "commonlyComposedWith": [
40
41
  "component:ds-shell-app",
41
42
  "component:ds-bar-title",
43
+ "component:ds-bar-workflow",
42
44
  "component:ds-tab-group"
43
45
  ],
44
46
  "patterns": [
@@ -46,7 +48,7 @@
46
48
  ],
47
49
  "accessibility": [
48
50
  "ShellPage exposes the routed page as the main landmark; render exactly one active ShellPage inside ShellApp.",
49
- "Provide exactly one BarTitle through the header slot so the page has one h1.",
51
+ "Provide exactly one BarTitle or BarWorkflow through the header slot so the page has one h1.",
50
52
  "Keep loading, empty, validation, error, progress, success, and failure communication in the default product-content slot.",
51
53
  "Responsive variant changes preserve the same heading, controls, accessible names, and keyboard focus targets."
52
54
  ],
@@ -54,7 +56,7 @@
54
56
  "headerPresentation=auto selects expanded, compact, or constrained from ShellPage's own inline capacity and scroll position.",
55
57
  "expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
56
58
  "contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
57
- "The required header slot accepts one BarTitle. The default slot owns router output and all page product content."
59
+ "The required header slot accepts one BarTitle or BarWorkflow. The default slot owns router output and all page product content."
58
60
  ],
59
61
  "responsiveBehavior": [
60
62
  "ShellPage observes its own rendered width instead of viewport media queries or ShellApp desktop/tablet modes.",
@@ -62,19 +64,20 @@
62
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.",
63
65
  "Token-based capacity bands use hysteresis so opening tools or resizing navigation cannot oscillate near a boundary.",
64
66
  "Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
65
- "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling."
67
+ "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling.",
68
+ "BarWorkflow remains compact and is not assigned BarTitle's capacity or scroll variants."
66
69
  ],
67
70
  "frameworkCaveats": {
68
71
  "customElements": [
69
- "Import ShellPage and BarTitle, place one ds-bar-title in slot=header, and render route content as default children.",
72
+ "Import ShellPage with BarTitle or BarWorkflow, place one header in slot=header, and render route content as default children.",
70
73
  "Do not set BarTitle.variant while ShellPage owns headerPresentation."
71
74
  ],
72
75
  "react": [
73
- "Render DsBarTitle with slot=header inside DsShellPage and keep routed content as the remaining children.",
76
+ "Render DsBarTitle or DsBarWorkflow with slot=header inside DsShellPage and keep routed content as the remaining children.",
74
77
  "Use contentInset none only for deliberately full-bleed page products."
75
78
  ],
76
79
  "angular": [
77
- "Import the generated standalone DsShellPage and DsBarTitle adapters, preserve slot=header, and place router-outlet in the ShellPage default slot.",
80
+ "Import the generated standalone DsShellPage adapter with DsBarTitle or DsBarWorkflow, preserve slot=header, and place router-outlet in the ShellPage default slot.",
78
81
  "Do not add another overflow auto wrapper around the routed page."
79
82
  ]
80
83
  },
@@ -178,7 +181,7 @@
178
181
  "files": [
179
182
  {
180
183
  "path": "src/wc/components/ShellPage/ShellPage.css",
181
- "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 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",
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",
182
185
  "type": "registry:ui"
183
186
  },
184
187
  {
@@ -645,7 +645,7 @@
645
645
  "files": [
646
646
  {
647
647
  "path": "src/wc/components/Slider/Slider.css",
648
- "content": "@import '../../utils/control-inactive.css';\n\n:host {\n --ds-slider-control-size: var(--dimension-size-400);\n --ds-slider-thumb-size: var(--dimension-size-200);\n --ds-slider-track-size: var(--dimension-size-100);\n --ds-slider-track-stroke: var(--dimension-stroke-width-012);\n --ds-slider-vertical-length: calc(var(--dimension-size-800) * 3);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n gap: var(--dimension-space-050);\n width: 100%;\n color: var(--color-foreground-primary);\n}\n\n:host(.slider--sm) {\n --ds-slider-control-size: var(--dimension-size-300);\n --ds-slider-thumb-size: var(--dimension-size-150);\n --ds-slider-track-size: var(--dimension-size-075);\n}\n\n:host(.slider--xs) {\n --ds-slider-control-size: var(--dimension-size-200);\n --ds-slider-thumb-size: var(--dimension-size-100);\n --ds-slider-track-size: var(--dimension-size-050);\n}\n\n:host(.slider--vertical) {\n width: fit-content;\n min-width: var(--dimension-form-width-xs);\n}\n\n.slider__label-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--dimension-space-100);\n min-width: 0;\n}\n\n.slider__label {\n min-width: 0;\n}\n\n.slider__value {\n flex-shrink: 0;\n}\n\n.slider__control {\n position: relative;\n width: 100%;\n height: var(--ds-slider-control-size);\n border-radius: var(--dimension-radius-half);\n cursor: pointer;\n touch-action: none;\n user-select: none;\n}\n\n:host(.slider--vertical) .slider__control {\n align-self: center;\n width: var(--ds-slider-control-size);\n height: var(--ds-slider-vertical-length);\n}\n\n:host(.slider--readonly) .slider__control {\n cursor: default;\n}\n\n/* Inactive: `.ds-control-inactive` (25% opacity) on the host. */\n:host(.ds-control-inactive) .slider__control {\n cursor: not-allowed;\n}\n\n.slider__rail {\n position: absolute;\n top: 50%;\n right: 0;\n left: 0;\n height: var(--ds-slider-track-size);\n overflow: hidden;\n border-radius: var(--dimension-radius-025);\n background-color: transparent;\n box-shadow: inset 0 0 0 var(--ds-slider-track-stroke) var(--color-border-secondary);\n transform: translateY(-50%);\n pointer-events: none;\n}\n\n:host(.slider--thumb-center) .slider__rail {\n right: calc(var(--ds-slider-thumb-size) / 2);\n left: calc(var(--ds-slider-thumb-size) / 2);\n}\n\n.slider__indicator {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: calc(\n var(--ds-slider-thumb-size) / 2 +\n (var(--ds-slider-end-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size))\n );\n border-radius: inherit;\n background-color: var(--color-background-bold-brand);\n}\n\n:host(.slider--range) .slider__indicator {\n left: calc(\n var(--ds-slider-thumb-size) / 2 +\n (var(--ds-slider-start-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size))\n );\n width: calc(\n ((var(--ds-slider-end-pct, 0) - var(--ds-slider-start-pct, 0)) / 100) *\n (100% - var(--ds-slider-thumb-size))\n );\n}\n\n:host(.slider--thumb-center) .slider__indicator {\n left: calc(var(--ds-slider-start-pct, 0) * 1%);\n width: calc((var(--ds-slider-end-pct, 0) - var(--ds-slider-start-pct, 0)) * 1%);\n}\n\n.slider__thumb {\n position: absolute;\n top: 50%;\n left: calc((var(--ds-slider-thumb-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size)));\n width: var(--ds-slider-thumb-size);\n height: var(--ds-slider-thumb-size);\n transform: translateY(-50%);\n z-index: 1;\n}\n\n.slider__thumb--active {\n z-index: 2;\n}\n\n.slider__input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n opacity: 0;\n appearance: none;\n pointer-events: none;\n z-index: 2;\n}\n\n.slider__thumb-visual {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n overflow: visible;\n border-radius: var(--dimension-radius-025);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-sm);\n pointer-events: none;\n transition:\n background-color var(--effect-motion-short-2),\n box-shadow var(--effect-motion-short-2);\n}\n\n.slider__thumb-wash {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background-color: transparent;\n transition: background-color var(--effect-motion-short-2);\n}\n\n:host(:not(.slider--readonly):not(.ds-control-inactive)) .slider__thumb:hover .slider__thumb-wash {\n background-color: var(--color-interaction-hover);\n}\n\n:host([data-dragging]:not(.slider--readonly):not(.ds-control-inactive))\n .slider__thumb--active .slider__thumb-wash {\n background-color: var(--color-interaction-pressed);\n}\n\n.slider__input:focus-visible + .slider__thumb-visual,\n:host([data-review-focus]) .slider__thumb[data-index='0'] .slider__thumb-visual {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n:host(.slider--vertical) .slider__rail {\n top: 0;\n right: auto;\n bottom: 0;\n left: 50%;\n width: var(--ds-slider-track-size);\n height: auto;\n transform: translateX(-50%);\n}\n\n:host(.slider--vertical.slider--thumb-center) .slider__rail {\n top: calc(var(--ds-slider-thumb-size) / 2);\n bottom: calc(var(--ds-slider-thumb-size) / 2);\n}\n\n:host(.slider--vertical) .slider__indicator {\n top: auto;\n right: 0;\n bottom: 0;\n left: 0;\n width: auto;\n height: calc(\n var(--ds-slider-thumb-size) / 2 +\n (var(--ds-slider-end-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size))\n );\n}\n\n:host(.slider--vertical.slider--range) .slider__indicator {\n bottom: calc(\n var(--ds-slider-thumb-size) / 2 +\n (var(--ds-slider-start-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size))\n );\n height: calc(\n ((var(--ds-slider-end-pct, 0) - var(--ds-slider-start-pct, 0)) / 100) *\n (100% - var(--ds-slider-thumb-size))\n );\n}\n\n:host(.slider--vertical.slider--thumb-center) .slider__indicator {\n bottom: calc(var(--ds-slider-start-pct, 0) * 1%);\n height: calc((var(--ds-slider-end-pct, 0) - var(--ds-slider-start-pct, 0)) * 1%);\n}\n\n:host(.slider--vertical) .slider__thumb {\n top: auto;\n bottom: calc((var(--ds-slider-thumb-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size)));\n left: 50%;\n transform: translateX(-50%);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .slider__thumb-visual,\n .slider__thumb-wash {\n transition: none;\n }\n}\n",
648
+ "content": "@import '../../utils/control-inactive.css';\n\n:host {\n --ds-slider-control-size: var(--dimension-size-400);\n --ds-slider-thumb-size: var(--dimension-size-200);\n --ds-slider-track-size: var(--dimension-size-100);\n --ds-slider-track-stroke: var(--dimension-stroke-width-012);\n --ds-slider-vertical-length: calc(var(--dimension-size-800) * 3);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n gap: var(--dimension-space-050);\n width: 100%;\n color: var(--color-foreground-primary);\n}\n\n:host(.slider--sm) {\n --ds-slider-control-size: var(--dimension-size-300);\n --ds-slider-thumb-size: var(--dimension-size-150);\n --ds-slider-track-size: var(--dimension-size-075);\n}\n\n:host(.slider--xs) {\n --ds-slider-control-size: var(--dimension-size-200);\n --ds-slider-thumb-size: var(--dimension-size-100);\n --ds-slider-track-size: var(--dimension-size-050);\n}\n\n:host(.slider--vertical) {\n width: fit-content;\n min-width: var(--dimension-form-width-xs);\n}\n\n.slider__label-row {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--dimension-space-100);\n min-width: 0;\n}\n\n.slider__label {\n min-width: 0;\n}\n\n.slider__value {\n flex-shrink: 0;\n}\n\n.slider__control {\n position: relative;\n width: 100%;\n height: var(--ds-slider-control-size);\n border-radius: var(--dimension-radius-half);\n cursor: pointer;\n touch-action: none;\n user-select: none;\n}\n\n:host(.slider--vertical) .slider__control {\n align-self: center;\n width: var(--ds-slider-control-size);\n height: var(--ds-slider-vertical-length);\n}\n\n:host(.slider--readonly) .slider__control {\n cursor: default;\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity) on the host. */\n:host(.ds-control-inactive) .slider__control {\n cursor: not-allowed;\n}\n\n.slider__rail {\n position: absolute;\n top: 50%;\n right: 0;\n left: 0;\n height: var(--ds-slider-track-size);\n overflow: hidden;\n border-radius: var(--dimension-radius-025);\n background-color: transparent;\n box-shadow: inset 0 0 0 var(--ds-slider-track-stroke) var(--color-border-secondary);\n transform: translateY(-50%);\n pointer-events: none;\n}\n\n:host(.slider--thumb-center) .slider__rail {\n right: calc(var(--ds-slider-thumb-size) / 2);\n left: calc(var(--ds-slider-thumb-size) / 2);\n}\n\n.slider__indicator {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: calc(\n var(--ds-slider-thumb-size) / 2 +\n (var(--ds-slider-end-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size))\n );\n border-radius: inherit;\n background-color: var(--color-background-bold-brand);\n}\n\n:host(.slider--range) .slider__indicator {\n left: calc(\n var(--ds-slider-thumb-size) / 2 +\n (var(--ds-slider-start-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size))\n );\n width: calc(\n ((var(--ds-slider-end-pct, 0) - var(--ds-slider-start-pct, 0)) / 100) *\n (100% - var(--ds-slider-thumb-size))\n );\n}\n\n:host(.slider--thumb-center) .slider__indicator {\n left: calc(var(--ds-slider-start-pct, 0) * 1%);\n width: calc((var(--ds-slider-end-pct, 0) - var(--ds-slider-start-pct, 0)) * 1%);\n}\n\n.slider__thumb {\n position: absolute;\n top: 50%;\n left: calc((var(--ds-slider-thumb-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size)));\n width: var(--ds-slider-thumb-size);\n height: var(--ds-slider-thumb-size);\n transform: translateY(-50%);\n z-index: 1;\n}\n\n.slider__thumb--active {\n z-index: 2;\n}\n\n.slider__input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n opacity: 0;\n appearance: none;\n pointer-events: none;\n z-index: 2;\n}\n\n.slider__thumb-visual {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n overflow: visible;\n border-radius: var(--dimension-radius-025);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-elevation-elevated-sm);\n pointer-events: none;\n transition:\n background-color var(--effect-motion-short-2),\n box-shadow var(--effect-motion-short-2);\n}\n\n.slider__thumb-wash {\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background-color: transparent;\n transition: background-color var(--effect-motion-short-2);\n}\n\n:host(:not(.slider--readonly):not(.ds-control-inactive)) .slider__thumb:hover .slider__thumb-wash {\n background-color: var(--color-interaction-hover);\n}\n\n:host([data-dragging]:not(.slider--readonly):not(.ds-control-inactive))\n .slider__thumb--active .slider__thumb-wash {\n background-color: var(--color-interaction-pressed);\n}\n\n.slider__input:focus-visible + .slider__thumb-visual,\n:host([data-review-focus]) .slider__thumb[data-index='0'] .slider__thumb-visual {\n outline: var(--dimension-stroke-width-025) solid var(--color-interaction-focus);\n outline-offset: var(--dimension-space-025);\n}\n\n:host(.slider--vertical) .slider__rail {\n top: 0;\n right: auto;\n bottom: 0;\n left: 50%;\n width: var(--ds-slider-track-size);\n height: auto;\n transform: translateX(-50%);\n}\n\n:host(.slider--vertical.slider--thumb-center) .slider__rail {\n top: calc(var(--ds-slider-thumb-size) / 2);\n bottom: calc(var(--ds-slider-thumb-size) / 2);\n}\n\n:host(.slider--vertical) .slider__indicator {\n top: auto;\n right: 0;\n bottom: 0;\n left: 0;\n width: auto;\n height: calc(\n var(--ds-slider-thumb-size) / 2 +\n (var(--ds-slider-end-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size))\n );\n}\n\n:host(.slider--vertical.slider--range) .slider__indicator {\n bottom: calc(\n var(--ds-slider-thumb-size) / 2 +\n (var(--ds-slider-start-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size))\n );\n height: calc(\n ((var(--ds-slider-end-pct, 0) - var(--ds-slider-start-pct, 0)) / 100) *\n (100% - var(--ds-slider-thumb-size))\n );\n}\n\n:host(.slider--vertical.slider--thumb-center) .slider__indicator {\n bottom: calc(var(--ds-slider-start-pct, 0) * 1%);\n height: calc((var(--ds-slider-end-pct, 0) - var(--ds-slider-start-pct, 0)) * 1%);\n}\n\n:host(.slider--vertical) .slider__thumb {\n top: auto;\n bottom: calc((var(--ds-slider-thumb-pct, 0) / 100) * (100% - var(--ds-slider-thumb-size)));\n left: 50%;\n transform: translateX(-50%);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .slider__thumb-visual,\n .slider__thumb-wash {\n transition: none;\n }\n}\n",
649
649
  "type": "registry:ui"
650
650
  },
651
651
  {
@@ -349,7 +349,7 @@
349
349
  "files": [
350
350
  {
351
351
  "path": "src/wc/components/Switch/Switch.css",
352
- "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n\n:host {\n --ds-switch-width: var(--dimension-size-400);\n --ds-switch-height: var(--dimension-size-250);\n --ds-switch-thumb-size: var(--dimension-size-150);\n --ds-switch-gap: var(--dimension-space-050);\n --ds-switch-stroke: var(--dimension-stroke-width-012);\n --ds-switch-inset: var(--ds-switch-gap);\n --ds-switch-thumb-hover: var(--color-interaction-hover);\n --ds-switch-thumb-pressed: var(--color-interaction-pressed);\n --ds-switch-travel: calc(\n var(--ds-switch-width) - var(--ds-switch-thumb-size) - var(--ds-switch-inset) -\n var(--ds-switch-inset)\n );\n position: relative;\n display: inline-flex;\n width: var(--ds-switch-width);\n height: var(--ds-switch-height);\n padding: 0;\n border: none;\n border-radius: var(--dimension-radius-half);\n box-sizing: border-box;\n flex-shrink: 0;\n overflow: visible;\n cursor: pointer;\n user-select: none;\n outline: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 var(--ds-switch-stroke) var(--color-border-secondary);\n transition:\n background-color var(--effect-motion-short-3),\n box-shadow var(--effect-motion-short-3);\n}\n\n:host(.switch--sm) {\n --ds-switch-width: var(--dimension-size-300);\n --ds-switch-height: var(--dimension-size-200);\n --ds-switch-thumb-size: calc(var(--dimension-size-base) * 5 / 4);\n --ds-switch-gap: calc(var(--dimension-space-025) + var(--dimension-space-012));\n}\n\n:host(.switch--xs) {\n --ds-switch-width: var(--dimension-size-250);\n --ds-switch-height: var(--dimension-size-150);\n --ds-switch-thumb-size: var(--dimension-size-100);\n --ds-switch-gap: var(--dimension-space-025);\n}\n\n:host(.checked) {\n background-color: var(--color-background-bold-brand);\n box-shadow: none;\n}\n\n:host(.switch--readonly),\n:host(.switch--presentation) {\n cursor: default;\n}\n\n:host(.switch--presentation) {\n pointer-events: none;\n}\n\n/* Inactive: `.ds-control-inactive` (25% opacity). */\n\n.thumb {\n position: absolute;\n top: 50%;\n left: var(--ds-switch-inset);\n width: var(--ds-switch-thumb-size);\n height: var(--ds-switch-thumb-size);\n border-radius: var(--dimension-radius-half);\n background-color: var(--color-foreground-tertiary);\n box-shadow: none;\n transform: translateY(-50%);\n transition:\n background-color var(--effect-motion-short-3),\n transform var(--effect-motion-short-3);\n pointer-events: none;\n}\n\n.thumb::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: transparent;\n pointer-events: none;\n}\n\n:host(:hover:not(:disabled):not(.ds-control-inactive):not(.switch--readonly):not(.switch--presentation))\n .thumb::after {\n background: var(--ds-switch-thumb-hover);\n}\n\n:host(:active:not(:disabled):not(.ds-control-inactive):not(.switch--readonly):not(.switch--presentation))\n .thumb::after {\n background: var(--ds-switch-thumb-pressed);\n}\n\n:host(.checked) .thumb {\n background-color: var(--color-background-primary);\n box-shadow: none;\n transform: translate3d(var(--ds-switch-travel), -50%, 0);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n transition: none;\n }\n\n .thumb {\n transition: none;\n }\n}\n",
352
+ "content": "@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n\n:host {\n --ds-switch-width: var(--dimension-size-400);\n --ds-switch-height: var(--dimension-size-250);\n --ds-switch-thumb-size: var(--dimension-size-150);\n --ds-switch-gap: var(--dimension-space-050);\n --ds-switch-stroke: var(--dimension-stroke-width-012);\n --ds-switch-inset: var(--ds-switch-gap);\n --ds-switch-thumb-hover: var(--color-interaction-hover);\n --ds-switch-thumb-pressed: var(--color-interaction-pressed);\n --ds-switch-travel: calc(\n var(--ds-switch-width) - var(--ds-switch-thumb-size) - var(--ds-switch-inset) -\n var(--ds-switch-inset)\n );\n position: relative;\n display: inline-flex;\n width: var(--ds-switch-width);\n height: var(--ds-switch-height);\n padding: 0;\n border: none;\n border-radius: var(--dimension-radius-half);\n box-sizing: border-box;\n flex-shrink: 0;\n overflow: visible;\n cursor: pointer;\n user-select: none;\n outline: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 var(--ds-switch-stroke) var(--color-border-secondary);\n transition:\n background-color var(--effect-motion-short-3),\n box-shadow var(--effect-motion-short-3);\n}\n\n:host(.switch--sm) {\n --ds-switch-width: var(--dimension-size-300);\n --ds-switch-height: var(--dimension-size-200);\n --ds-switch-thumb-size: calc(var(--dimension-size-base) * 5 / 4);\n --ds-switch-gap: calc(var(--dimension-space-025) + var(--dimension-space-012));\n}\n\n:host(.switch--xs) {\n --ds-switch-width: var(--dimension-size-250);\n --ds-switch-height: var(--dimension-size-150);\n --ds-switch-thumb-size: var(--dimension-size-100);\n --ds-switch-gap: var(--dimension-space-025);\n}\n\n:host(.checked) {\n background-color: var(--color-background-bold-brand);\n box-shadow: none;\n}\n\n:host(.switch--readonly),\n:host(.switch--presentation) {\n cursor: default;\n}\n\n:host(.switch--presentation) {\n pointer-events: none;\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity). */\n\n.thumb {\n position: absolute;\n top: 50%;\n left: var(--ds-switch-inset);\n width: var(--ds-switch-thumb-size);\n height: var(--ds-switch-thumb-size);\n border-radius: var(--dimension-radius-half);\n background-color: var(--color-foreground-tertiary);\n box-shadow: none;\n transform: translateY(-50%);\n transition:\n background-color var(--effect-motion-short-3),\n transform var(--effect-motion-short-3);\n pointer-events: none;\n}\n\n.thumb::after {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: inherit;\n background: transparent;\n pointer-events: none;\n}\n\n:host(:hover:not(:disabled):not(.ds-control-inactive):not(.switch--readonly):not(.switch--presentation))\n .thumb::after {\n background: var(--ds-switch-thumb-hover);\n}\n\n:host(:active:not(:disabled):not(.ds-control-inactive):not(.switch--readonly):not(.switch--presentation))\n .thumb::after {\n background: var(--ds-switch-thumb-pressed);\n}\n\n:host(.checked) .thumb {\n background-color: var(--color-background-primary);\n box-shadow: none;\n transform: translate3d(var(--ds-switch-travel), -50%, 0);\n}\n\n@media (prefers-reduced-motion: reduce) {\n :host {\n transition: none;\n }\n\n .thumb {\n transition: none;\n }\n}\n",
353
353
  "type": "registry:ui"
354
354
  },
355
355
  {
@@ -238,7 +238,7 @@
238
238
  "files": [
239
239
  {
240
240
  "path": "src/wc/components/TabGroup/TabGroup.css",
241
- "content": "@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n\n:host {\n display: block;\n --_tab-group-surface-border: var(--color-border-tertiary);\n --_tab-group-divider: var(--color-border-secondary);\n}\n\n:host(.tab-group-host--on-medium) {\n --_tab-group-surface-border: var(--color-border-on-medium-background-tertiary);\n --_tab-group-divider: var(--color-border-on-medium-background-secondary);\n}\n\n:host(.tab-group-host--on-bold) {\n --_tab-group-surface-border: var(--color-border-on-bold-background-tertiary);\n --_tab-group-divider: var(--color-border-on-bold-background-secondary);\n}\n\n:host(.tab-group-host--on-strong) {\n --_tab-group-surface-border: var(--color-border-on-strong-background-tertiary);\n --_tab-group-divider: var(--color-border-on-strong-background-secondary);\n}\n\n:host(.tab-group-host--on-translucent) {\n --_tab-group-surface-border: var(--color-translucent-border-tertiary);\n --_tab-group-divider: var(--color-translucent-border-secondary);\n}\n\n:host(.tab-group-host--on-inverted) {\n --_tab-group-surface-border: var(--color-inverted-border-tertiary);\n --_tab-group-divider: var(--color-inverted-border-secondary);\n}\n\n:host(.tab-group-host--on-media) {\n --_tab-group-surface-border: var(--color-media-border-tertiary);\n --_tab-group-divider: var(--color-media-border-secondary);\n}\n\n:host(.tab-group-host--on-always-dark) {\n --_tab-group-surface-border: var(--color-always-dark-border-tertiary);\n --_tab-group-divider: var(--color-always-dark-border-secondary);\n}\n\n.tab-list {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n position: relative;\n width: max-content;\n max-width: 100%;\n height: var(--dimension-size-400);\n padding: calc(var(--dimension-space-050) - var(--dimension-stroke-width-012));\n background-color: var(--color-background-secondary);\n border: var(--dimension-stroke-width-012) solid var(--_tab-group-surface-border);\n border-radius: var(--dimension-radius-half);\n box-sizing: border-box;\n}\n\n:host(.tab-group-host--surface) .tab-list {\n background-color: transparent;\n}\n\n.tab {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n padding: 0 var(--ds-control-padding-inline);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-half);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n color: var(--color-foreground-secondary);\n transition: color var(--effect-motion-short-2);\n flex-shrink: 0;\n height: var(--ds-control-height);\n min-width: var(--dimension-size-400);\n box-sizing: border-box;\n --_dot: var(--color-foreground-bold-brand);\n /* Hover/press: `.ds-interaction-fill` — fills cover full 24px box (no layout border). */\n}\n\n.tab--selected {\n color: var(--color-foreground-primary);\n background-color: var(--color-background-primary);\n /* Inset stroke on interaction-fill ::after — stays above hover wash. */\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--_tab-group-surface-border);\n}\n\n:host(.tab-group-host--surface) .tab--selected {\n background-color: var(--ds-interaction-active);\n}\n\n.tab--selected:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Inactive: `.ds-control-inactive` (25% opacity) — applied via class in TSX. */\n\n.tab__content {\n position: relative;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n min-width: 0;\n}\n\n.tab__content--dot {\n padding-right: var(--dimension-space-050);\n}\n\n.tab__label {\n padding: 0 var(--ds-control-label-inset);\n white-space: nowrap;\n}\n\n.tab__icon {\n flex-shrink: 0;\n}\n\n.tab__dot {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n pointer-events: none;\n}\n\n.on-medium {\n color: var(--color-foreground-on-medium-background-secondary);\n}\n\n.on-medium.tab--selected { color: var(--color-foreground-on-medium-background-primary); }\n\n.on-bold {\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n.on-bold.tab--selected { color: var(--color-foreground-on-bold-background-primary); }\n\n.on-strong {\n color: var(--color-foreground-on-strong-background-secondary);\n}\n\n.on-strong.tab--selected { color: var(--color-foreground-on-strong-background-primary); }\n\n.on-translucent { color: var(--color-translucent-foreground-secondary); }\n\n.on-translucent.tab--selected { color: var(--color-translucent-foreground-primary); }\n\n.on-inverted { color: var(--color-inverted-foreground-secondary); }\n\n.on-inverted.tab--selected { color: var(--color-inverted-foreground-primary); }\n\n.on-media { color: var(--color-media-foreground-secondary); }\n\n.on-media.tab--selected { color: var(--color-media-foreground-primary); }\n\n.on-always-dark {\n color: var(--color-always-dark-foreground-secondary);\n}\n\n.on-always-dark.tab--selected { color: var(--color-always-dark-foreground-primary); }\n\n.tab-divider {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--dimension-stroke-width-012);\n align-self: center;\n padding: 0;\n flex-shrink: 0;\n pointer-events: none;\n}\n\n.tab-divider__line {\n width: var(--dimension-stroke-width-012);\n height: var(--typography-lineheight-sm);\n flex-shrink: 0;\n background-color: var(--_tab-group-divider);\n}\n",
241
+ "content": "@import '../../utils/control-density.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/control-inactive.css';\n\n:host {\n display: block;\n --_tab-group-surface-border: var(--color-border-tertiary);\n --_tab-group-divider: var(--color-border-secondary);\n}\n\n:host(.tab-group-host--on-medium) {\n --_tab-group-surface-border: var(--color-border-on-medium-background-tertiary);\n --_tab-group-divider: var(--color-border-on-medium-background-secondary);\n}\n\n:host(.tab-group-host--on-bold) {\n --_tab-group-surface-border: var(--color-border-on-bold-background-tertiary);\n --_tab-group-divider: var(--color-border-on-bold-background-secondary);\n}\n\n:host(.tab-group-host--on-strong) {\n --_tab-group-surface-border: var(--color-border-on-strong-background-tertiary);\n --_tab-group-divider: var(--color-border-on-strong-background-secondary);\n}\n\n:host(.tab-group-host--on-translucent) {\n --_tab-group-surface-border: var(--color-translucent-border-tertiary);\n --_tab-group-divider: var(--color-translucent-border-secondary);\n}\n\n:host(.tab-group-host--on-inverted) {\n --_tab-group-surface-border: var(--color-inverted-border-tertiary);\n --_tab-group-divider: var(--color-inverted-border-secondary);\n}\n\n:host(.tab-group-host--on-media) {\n --_tab-group-surface-border: var(--color-media-border-tertiary);\n --_tab-group-divider: var(--color-media-border-secondary);\n}\n\n:host(.tab-group-host--on-always-dark) {\n --_tab-group-surface-border: var(--color-always-dark-border-tertiary);\n --_tab-group-divider: var(--color-always-dark-border-secondary);\n}\n\n.tab-list {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n position: relative;\n width: max-content;\n max-width: 100%;\n height: var(--dimension-size-400);\n padding: calc(var(--dimension-space-050) - var(--dimension-stroke-width-012));\n background-color: var(--color-background-secondary);\n border: var(--dimension-stroke-width-012) solid var(--_tab-group-surface-border);\n border-radius: var(--dimension-radius-half);\n box-sizing: border-box;\n}\n\n:host(.tab-group-host--surface) .tab-list {\n background-color: transparent;\n}\n\n.tab {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n padding: 0 var(--ds-control-padding-inline);\n background-color: transparent;\n border: none;\n border-radius: var(--dimension-radius-half);\n cursor: pointer;\n -webkit-user-select: none;\n user-select: none;\n color: var(--color-foreground-secondary);\n transition: color var(--effect-motion-short-2);\n flex-shrink: 0;\n height: var(--ds-control-height);\n min-width: var(--dimension-size-400);\n box-sizing: border-box;\n --_dot: var(--color-foreground-bold-brand);\n /* Hover/press: `.ds-interaction-fill` — fills cover full 24px box (no layout border). */\n}\n\n.tab--selected {\n color: var(--color-foreground-primary);\n background-color: var(--color-background-primary);\n /* Inset stroke on interaction-fill ::after — stays above hover wash. */\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--_tab-group-surface-border);\n}\n\n:host(.tab-group-host--surface) .tab--selected {\n background-color: var(--ds-interaction-active);\n}\n\n.tab--selected:not(.ds-interaction-fill) {\n box-shadow: inset 0 0 0 var(--ds-interaction-border-width) var(--ds-interaction-border-color);\n}\n\n/* Inactive: `.ds-control-inactive` (50% opacity) — applied via class in TSX. */\n\n.tab__content {\n position: relative;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--ds-control-gap);\n min-width: 0;\n}\n\n.tab__content--dot {\n padding-right: var(--dimension-space-050);\n}\n\n.tab__label {\n padding: 0 var(--ds-control-label-inset);\n white-space: nowrap;\n}\n\n.tab__icon {\n flex-shrink: 0;\n}\n\n.tab__dot {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n pointer-events: none;\n}\n\n.on-medium {\n color: var(--color-foreground-on-medium-background-secondary);\n}\n\n.on-medium.tab--selected { color: var(--color-foreground-on-medium-background-primary); }\n\n.on-bold {\n color: var(--color-foreground-on-bold-background-secondary);\n}\n\n.on-bold.tab--selected { color: var(--color-foreground-on-bold-background-primary); }\n\n.on-strong {\n color: var(--color-foreground-on-strong-background-secondary);\n}\n\n.on-strong.tab--selected { color: var(--color-foreground-on-strong-background-primary); }\n\n.on-translucent { color: var(--color-translucent-foreground-secondary); }\n\n.on-translucent.tab--selected { color: var(--color-translucent-foreground-primary); }\n\n.on-inverted { color: var(--color-inverted-foreground-secondary); }\n\n.on-inverted.tab--selected { color: var(--color-inverted-foreground-primary); }\n\n.on-media { color: var(--color-media-foreground-secondary); }\n\n.on-media.tab--selected { color: var(--color-media-foreground-primary); }\n\n.on-always-dark {\n color: var(--color-always-dark-foreground-secondary);\n}\n\n.on-always-dark.tab--selected { color: var(--color-always-dark-foreground-primary); }\n\n.tab-divider {\n display: flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: var(--dimension-stroke-width-012);\n align-self: center;\n padding: 0;\n flex-shrink: 0;\n pointer-events: none;\n}\n\n.tab-divider__line {\n width: var(--dimension-stroke-width-012);\n height: var(--typography-lineheight-sm);\n flex-shrink: 0;\n background-color: var(--_tab-group-divider);\n}\n",
242
242
  "type": "registry:ui"
243
243
  },
244
244
  {
@@ -11,6 +11,7 @@ export { DsAvatar } from "./ds-avatar.js";
11
11
  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
+ export { DsBarWorkflow } from "./ds-bar-workflow.js";
14
15
  export { DsButtonFilled } from "./ds-button-filled.js";
15
16
  export { DsButtonUnfilled } from "./ds-button-unfilled.js";
16
17
  export { DsCardDataVizDonut } from "./ds-card-data-viz-donut.js";
@@ -45,6 +46,7 @@ export { DsPanelToolHeader } from "./ds-panel-tool-header.js";
45
46
  export { DsPanelToolSearch } from "./ds-panel-tool-search.js";
46
47
  export { DsPanelTools } from "./ds-panel-tools.js";
47
48
  export { DsRadio } from "./ds-radio.js";
49
+ export { DsScrollOverlay } from "./ds-scroll-overlay.js";
48
50
  export { DsSelectMulti } from "./ds-select-multi.js";
49
51
  export { DsSelect } from "./ds-select.js";
50
52
  export { DsShellApp } from "./ds-shell-app.js";
@@ -12,6 +12,7 @@ export { DsAvatar } from "./ds-avatar.js";
12
12
  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
+ export { DsBarWorkflow } from "./ds-bar-workflow.js";
15
16
  export { DsButtonFilled } from "./ds-button-filled.js";
16
17
  export { DsButtonUnfilled } from "./ds-button-unfilled.js";
17
18
  export { DsCardDataVizDonut } from "./ds-card-data-viz-donut.js";
@@ -46,6 +47,7 @@ export { DsPanelToolHeader } from "./ds-panel-tool-header.js";
46
47
  export { DsPanelToolSearch } from "./ds-panel-tool-search.js";
47
48
  export { DsPanelTools } from "./ds-panel-tools.js";
48
49
  export { DsRadio } from "./ds-radio.js";
50
+ export { DsScrollOverlay } from "./ds-scroll-overlay.js";
49
51
  export { DsSelectMulti } from "./ds-select-multi.js";
50
52
  export { DsSelect } from "./ds-select.js";
51
53
  export { DsShellApp } from "./ds-shell-app.js";
@@ -0,0 +1,14 @@
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 DsBarWorkflowCustomEvent } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsBarWorkflow as DsBarWorkflowElement } from "@ds-mo/ui/dist/components/ds-bar-workflow.js";
9
+ export type DsBarWorkflowEvents = {
10
+ onDsExit: EventName<DsBarWorkflowCustomEvent<MouseEvent>>;
11
+ onDsStepChange: EventName<DsBarWorkflowCustomEvent<string>>;
12
+ onDsSubmit: EventName<DsBarWorkflowCustomEvent<MouseEvent>>;
13
+ };
14
+ export declare const DsBarWorkflow: StencilReactComponent<DsBarWorkflowElement, DsBarWorkflowEvents, Components.DsBarWorkflow, 'heading'>;
@@ -0,0 +1,16 @@
1
+ 'use client';
2
+ import { createComponent } from '@stencil/react-output-target/runtime';
3
+ import React from 'react';
4
+ import { DsBarWorkflow as DsBarWorkflowElement, defineCustomElement as defineDsBarWorkflow } from "@ds-mo/ui/dist/components/ds-bar-workflow.js";
5
+ export const DsBarWorkflow = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-bar-workflow',
7
+ elementClass: DsBarWorkflowElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: {
11
+ onDsExit: 'dsExit',
12
+ onDsStepChange: 'dsStepChange',
13
+ onDsSubmit: 'dsSubmit'
14
+ },
15
+ defineCustomElement: defineDsBarWorkflow
16
+ });
@@ -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 DsScrollOverlayCustomEvent, type ScrollOverlayScrollDetail } from "@ds-mo/ui";
7
+ import type { Components } from "@ds-mo/ui/dist/components";
8
+ import { DsScrollOverlay as DsScrollOverlayElement } from "@ds-mo/ui/dist/components/ds-scroll-overlay.js";
9
+ export type DsScrollOverlayEvents = {
10
+ onDsScroll: EventName<DsScrollOverlayCustomEvent<ScrollOverlayScrollDetail>>;
11
+ };
12
+ export declare const DsScrollOverlay: StencilReactComponent<DsScrollOverlayElement, DsScrollOverlayEvents, Components.DsScrollOverlay>;
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { createComponent } from '@stencil/react-output-target/runtime';
3
+ import React from 'react';
4
+ import { DsScrollOverlay as DsScrollOverlayElement, defineCustomElement as defineDsScrollOverlay } from "@ds-mo/ui/dist/components/ds-scroll-overlay.js";
5
+ export const DsScrollOverlay = /*@__PURE__*/ createComponent({
6
+ tagName: 'ds-scroll-overlay',
7
+ elementClass: DsScrollOverlayElement,
8
+ // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
+ react: React,
10
+ events: { onDsScroll: 'dsScroll' },
11
+ defineCustomElement: defineDsScrollOverlay
12
+ });