@ds-mo/ui 11.1.0 → 12.0.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 (204) hide show
  1. package/README.md +1 -1
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +150 -9
  4. package/dist/agent.json +481 -174
  5. package/dist/angular/ds-bar-title.d.ts +28 -0
  6. package/dist/angular/ds-bar-title.js +48 -0
  7. package/dist/angular/ds-panel-nav.d.ts +1 -1
  8. package/dist/angular/{ds-app-shell.d.ts → ds-shell-app.d.ts} +5 -5
  9. package/dist/angular/{ds-app-shell.js → ds-shell-app.js} +10 -10
  10. package/dist/angular/ds-shell-page.d.ts +12 -0
  11. package/dist/angular/ds-shell-page.js +38 -0
  12. package/dist/angular/index.d.ts +1 -1
  13. package/dist/angular/index.js +3 -1
  14. package/dist/angular/proxies.d.ts +3 -1
  15. package/dist/angular/proxies.js +3 -1
  16. package/dist/components/ds-agent-activity.js +1 -1
  17. package/dist/components/ds-agent-response.js +1 -1
  18. package/dist/components/ds-agent-response.js.map +1 -1
  19. package/dist/components/ds-agent-source-list.js +1 -1
  20. package/dist/components/ds-agent-tool-call.js +1 -1
  21. package/dist/components/ds-attachment-list.js +1 -1
  22. package/dist/components/ds-avatar.js +1 -1
  23. package/dist/components/ds-avatar.js.map +1 -1
  24. package/dist/components/ds-badge.js +1 -1
  25. package/dist/components/ds-bar-nav.js +1 -1
  26. package/dist/components/ds-bar-nav.js.map +1 -1
  27. package/dist/components/{ds-app-shell.d.ts → ds-bar-title.d.ts} +4 -4
  28. package/dist/components/ds-bar-title.js +2 -0
  29. package/dist/components/ds-bar-title.js.map +1 -0
  30. package/dist/components/ds-button-filled.js +1 -1
  31. package/dist/components/ds-button-unfilled.js +1 -1
  32. package/dist/components/ds-card-data-viz-donut.js +1 -1
  33. package/dist/components/ds-card-setting.js +1 -1
  34. package/dist/components/ds-card-shell-data-viz.js +1 -1
  35. package/dist/components/ds-chart-bar.js +1 -1
  36. package/dist/components/ds-chart-donut.js +1 -1
  37. package/dist/components/ds-chart-legend.js +1 -1
  38. package/dist/components/ds-chart-line.js +1 -1
  39. package/dist/components/ds-checkbox.js +1 -1
  40. package/dist/components/ds-chip.js +1 -1
  41. package/dist/components/ds-code-block.js +1 -1
  42. package/dist/components/ds-conversation-list-item.js +1 -1
  43. package/dist/components/ds-conversation-list-item.js.map +1 -1
  44. package/dist/components/ds-conversation-list-section.js +1 -1
  45. package/dist/components/ds-conversation-list.js +1 -1
  46. package/dist/components/ds-empty-state.js +1 -1
  47. package/dist/components/ds-field.js +1 -1
  48. package/dist/components/ds-input.js +1 -1
  49. package/dist/components/ds-markdown.js +1 -1
  50. package/dist/components/ds-menu.js +1 -1
  51. package/dist/components/ds-message-composer.js +1 -1
  52. package/dist/components/ds-message-composer.js.map +1 -1
  53. package/dist/components/ds-message-scroller.js +1 -1
  54. package/dist/components/ds-message-scroller.js.map +1 -1
  55. package/dist/components/ds-message.js +1 -1
  56. package/dist/components/ds-modal.js +1 -1
  57. package/dist/components/ds-modal.js.map +1 -1
  58. package/dist/components/ds-panel-nav.js +1 -1
  59. package/dist/components/ds-panel-nav.js.map +1 -1
  60. package/dist/components/ds-panel-sub-nav.js +1 -1
  61. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  62. package/dist/components/ds-panel-tool-header.js +1 -1
  63. package/dist/components/ds-panel-tool-search.js +1 -1
  64. package/dist/components/ds-panel-tool-search.js.map +1 -1
  65. package/dist/components/ds-panel-tools.js +1 -1
  66. package/dist/components/ds-panel-tools.js.map +1 -1
  67. package/dist/components/ds-radio.js +1 -1
  68. package/dist/components/ds-select-multi.js +1 -1
  69. package/dist/components/ds-select-multi.js.map +1 -1
  70. package/dist/components/ds-select.js +1 -1
  71. package/dist/components/ds-select.js.map +1 -1
  72. package/dist/components/ds-shell-app.d.ts +11 -0
  73. package/dist/components/ds-shell-app.js +2 -0
  74. package/dist/components/ds-shell-app.js.map +1 -0
  75. package/dist/components/ds-shell-gradient-picker.js +1 -1
  76. package/dist/components/ds-shell-gradient-picker.js.map +1 -1
  77. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  78. package/dist/components/ds-shell-page.d.ts +11 -0
  79. package/dist/components/ds-shell-page.js +2 -0
  80. package/dist/components/ds-shell-page.js.map +1 -0
  81. package/dist/components/ds-skeleton.js +1 -1
  82. package/dist/components/ds-slider.js +1 -1
  83. package/dist/components/ds-slider.js.map +1 -1
  84. package/dist/components/ds-swatch-picker.js +1 -1
  85. package/dist/components/ds-switch.js +1 -1
  86. package/dist/components/ds-tab-group.js +1 -1
  87. package/dist/components/ds-tag.js +1 -1
  88. package/dist/components/ds-text.js +1 -1
  89. package/dist/components/ds-toast.js +1 -1
  90. package/dist/components/ds-tooltip-data-viz.js +1 -1
  91. package/dist/components/ds-tooltip.js +1 -1
  92. package/dist/components/ds-typing-indicator.js +1 -1
  93. package/dist/components/{p-DJ78wdNv.js → p-6vj4kh70.js} +2 -2
  94. package/dist/components/{p-bNpFhP5L.js → p-B3YvoGjS.js} +2 -2
  95. package/dist/components/{p-BEWtqFX7.js → p-BH3es4p7.js} +2 -2
  96. package/dist/components/{p-BaZRP4Oo.js → p-BUmDHPr3.js} +2 -2
  97. package/dist/components/p-BYHKdFzV.js +2 -0
  98. package/dist/components/p-BYHKdFzV.js.map +1 -0
  99. package/dist/components/p-BZZwQfmN.js +2 -0
  100. package/dist/components/{p-B_qVPsEU.js.map → p-BZZwQfmN.js.map} +1 -1
  101. package/dist/components/{p-Dh4q5TSS.js → p-BhKhX1er.js} +2 -2
  102. package/dist/components/{p-CZZYGqKz.js → p-Bs6SS34m.js} +2 -2
  103. package/dist/components/p-CUik7PCi.js +2 -0
  104. package/dist/components/p-CUik7PCi.js.map +1 -0
  105. package/dist/components/{p-CyoHRqy6.js → p-Cf-i-6aE.js} +2 -2
  106. package/dist/components/p-Cf2J9MEo.js +2 -0
  107. package/dist/components/{p-Bet_UjML.js.map → p-Cf2J9MEo.js.map} +1 -1
  108. package/dist/components/{p-P_4vE1ub.js → p-CwTVEAl2.js} +2 -2
  109. package/dist/components/p-Cy04lXlc.js +2 -0
  110. package/dist/components/p-Cy04lXlc.js.map +1 -0
  111. package/dist/components/{p-BKhG2xrW.js → p-D2x17ei-.js} +1 -1
  112. package/dist/components/{p-BKhG2xrW.js.map → p-D2x17ei-.js.map} +1 -1
  113. package/dist/components/{p-CjP8sYlo.js → p-DABj3qTX.js} +2 -2
  114. package/dist/components/{p-DTqCBjUj.js → p-DUHcJWTQ.js} +2 -2
  115. package/dist/components/{p-CPPAndX2.js → p-DVk0wxxX.js} +2 -2
  116. package/dist/components/p-DfIch2Dk.js +2 -0
  117. package/dist/components/{p-BCCt2eT_.js.map → p-DfIch2Dk.js.map} +1 -1
  118. package/dist/components/{p-CrwU83-g.js → p-Dg3xLna0.js} +2 -2
  119. package/dist/components/{p-DrDHC7V6.js → p-DxeHimqk.js} +2 -2
  120. package/dist/components/{p-DrDHC7V6.js.map → p-DxeHimqk.js.map} +1 -1
  121. package/dist/components/{p-CLn7QnE0.js → p-Dy_sZ-dI.js} +2 -2
  122. package/dist/components/{p-0kEg-Z4f.js → p-liMPkhUP.js} +2 -2
  123. package/dist/components/p-xFbUt9Tc.js +2 -0
  124. package/dist/components/p-xFbUt9Tc.js.map +1 -0
  125. package/dist/docs/components.json +1082 -336
  126. package/dist/lib/shell/chrome-transition.d.ts +1 -1
  127. package/dist/lib/shell/index.js +1 -1
  128. package/dist/lib/shell/index.js.map +1 -1
  129. package/dist/lib/shell/shell-gradient.d.ts +2 -2
  130. package/dist/mcp-data/registry/avatar.json +1 -1
  131. package/dist/mcp-data/registry/badge.json +4 -4
  132. package/dist/mcp-data/registry/bar-nav.json +8 -8
  133. package/dist/mcp-data/registry/bar-title.json +431 -0
  134. package/dist/mcp-data/registry/code-block.json +4 -3
  135. package/dist/mcp-data/registry/menu.json +1 -1
  136. package/dist/mcp-data/registry/message-composer.json +7 -5
  137. package/dist/mcp-data/registry/message-scroller.json +4 -3
  138. package/dist/mcp-data/registry/modal.json +5 -4
  139. package/dist/mcp-data/registry/panel-nav.json +8 -8
  140. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  141. package/dist/mcp-data/registry/panel-tool-header.json +4 -3
  142. package/dist/mcp-data/registry/panel-tool-search.json +6 -5
  143. package/dist/mcp-data/registry/panel-tools.json +13 -13
  144. package/dist/mcp-data/registry/registry.json +489 -176
  145. package/dist/mcp-data/registry/select-multi.json +2 -1
  146. package/dist/mcp-data/registry/select.json +2 -1
  147. package/dist/mcp-data/registry/shell-app.json +213 -0
  148. package/dist/mcp-data/registry/shell-gradient-picker.json +8 -8
  149. package/dist/mcp-data/registry/shell-gradient-swatch.json +2 -2
  150. package/dist/mcp-data/registry/shell-page.json +199 -0
  151. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  152. package/dist/react/components.d.ts +3 -1
  153. package/dist/react/components.js +3 -1
  154. package/dist/react/ds-bar-title.d.ts +14 -0
  155. package/dist/react/ds-bar-title.js +16 -0
  156. package/dist/react/{ds-app-shell.d.ts → ds-shell-app.d.ts} +3 -3
  157. package/dist/react/ds-shell-app.js +12 -0
  158. package/dist/react/ds-shell-page.d.ts +9 -0
  159. package/dist/react/ds-shell-page.js +12 -0
  160. package/dist/types/components/Badge/Badge.d.ts +1 -1
  161. package/dist/types/components/BarTitle/BarTitle.d.ts +71 -0
  162. package/dist/types/components/BarTitle/bar-title-types.d.ts +29 -0
  163. package/dist/types/components/BarTitle/index.d.ts +2 -0
  164. package/dist/types/components/Menu/Menu.d.ts +5 -0
  165. package/dist/types/components/PanelNav/PanelNav.d.ts +1 -1
  166. package/dist/types/components/{AppShell/AppShell.d.ts → ShellApp/ShellApp.d.ts} +3 -3
  167. package/dist/types/components/ShellPage/ShellPage.d.ts +37 -0
  168. package/dist/types/components/ShellPage/index.d.ts +3 -0
  169. package/dist/types/components/ShellPage/shell-page-responsive.d.ts +12 -0
  170. package/dist/types/components/ShellPage/shell-page-types.d.ts +5 -0
  171. package/dist/types/components.d.ts +267 -55
  172. package/dist/types/shell/chrome-transition.d.ts +1 -1
  173. package/dist/types/shell/shell-gradient.d.ts +2 -2
  174. package/dist/types/shell/shell-shortcuts.d.ts +1 -1
  175. package/package.json +1 -1
  176. package/dist/components/ds-app-shell.js +0 -2
  177. package/dist/components/ds-app-shell.js.map +0 -1
  178. package/dist/components/p-BCCt2eT_.js +0 -2
  179. package/dist/components/p-B_qVPsEU.js +0 -2
  180. package/dist/components/p-Bet_UjML.js +0 -2
  181. package/dist/components/p-BsnezUUC.js +0 -2
  182. package/dist/components/p-BsnezUUC.js.map +0 -1
  183. package/dist/components/p-C1K5QGUZ.js +0 -2
  184. package/dist/components/p-C1K5QGUZ.js.map +0 -1
  185. package/dist/components/p-CKaJx0IX.js +0 -2
  186. package/dist/components/p-CKaJx0IX.js.map +0 -1
  187. package/dist/components/p-ZTugT4as.js +0 -2
  188. package/dist/components/p-ZTugT4as.js.map +0 -1
  189. package/dist/mcp-data/registry/app-shell.json +0 -210
  190. package/dist/react/ds-app-shell.js +0 -12
  191. /package/dist/components/{p-DJ78wdNv.js.map → p-6vj4kh70.js.map} +0 -0
  192. /package/dist/components/{p-bNpFhP5L.js.map → p-B3YvoGjS.js.map} +0 -0
  193. /package/dist/components/{p-BEWtqFX7.js.map → p-BH3es4p7.js.map} +0 -0
  194. /package/dist/components/{p-BaZRP4Oo.js.map → p-BUmDHPr3.js.map} +0 -0
  195. /package/dist/components/{p-Dh4q5TSS.js.map → p-BhKhX1er.js.map} +0 -0
  196. /package/dist/components/{p-CZZYGqKz.js.map → p-Bs6SS34m.js.map} +0 -0
  197. /package/dist/components/{p-CyoHRqy6.js.map → p-Cf-i-6aE.js.map} +0 -0
  198. /package/dist/components/{p-P_4vE1ub.js.map → p-CwTVEAl2.js.map} +0 -0
  199. /package/dist/components/{p-CjP8sYlo.js.map → p-DABj3qTX.js.map} +0 -0
  200. /package/dist/components/{p-DTqCBjUj.js.map → p-DUHcJWTQ.js.map} +0 -0
  201. /package/dist/components/{p-CPPAndX2.js.map → p-DVk0wxxX.js.map} +0 -0
  202. /package/dist/components/{p-CrwU83-g.js.map → p-Dg3xLna0.js.map} +0 -0
  203. /package/dist/components/{p-CLn7QnE0.js.map → p-Dy_sZ-dI.js.map} +0 -0
  204. /package/dist/components/{p-0kEg-Z4f.js.map → p-liMPkhUP.js.map} +0 -0
@@ -1,210 +0,0 @@
1
- {
2
- "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
- "name": "app-shell",
4
- "title": "AppShell",
5
- "description": "The single required workspace root for standard authenticated application pages, coordinating primary and secondary navigation, tools chrome, responsive composition, content geometry, shared styling, and shell behavior.",
6
- "type": "registry:ui",
7
- "meta": {
8
- "library": "@ds-mo/ui",
9
- "distribution": "npm",
10
- "storybook": "https://zainadeel.github.io/compomo/?path=/story/app-shell",
11
- "source": "src/wc/components/AppShell/AppShell.tsx",
12
- "intentStatus": "complete",
13
- "intent": {
14
- "audience": "specialized",
15
- "status": "stable",
16
- "summary": "The single required workspace root for standard authenticated application pages, coordinating primary and secondary navigation, tools chrome, responsive composition, content geometry, shared styling, and shell behavior.",
17
- "useWhen": [
18
- "Building any standard authenticated product or workspace page with CompoMo.",
19
- "PanelNav, BarNav, PanelTools, page content, shared chrome, responsive behavior, and shell shortcuts must be composed as one application frame.",
20
- "Future application templates need the supported base-page composition boundary."
21
- ],
22
- "avoidWhen": [
23
- "Building authentication, onboarding, public, marketing, print, error, or intentionally focused full-screen experiences that require a different layout.",
24
- "Another AppShell already exists in the page; applications must render exactly one and must never nest AppShells.",
25
- "Building content inside an existing AppShell; render the page content rather than another shell."
26
- ],
27
- "commonlyComposedWith": [
28
- "component:ds-panel-nav",
29
- "component:ds-bar-nav",
30
- "component:ds-panel-tools",
31
- "component:ds-swatch-picker"
32
- ],
33
- "patterns": [
34
- "pattern:application-shell"
35
- ],
36
- "accessibility": [
37
- "Keep primary destinations in PanelNav and secondary route sections in BarNav.",
38
- "Ensure the default content region contains the page's single main landmark.",
39
- "Keep PanelNav, BarNav, and PanelTools chrome available in the shell's supported desktop and tablet compositions.",
40
- "Do not override browser keyboard chords when enabling shell shortcuts.",
41
- "Require Search and Help as the minimum PanelTools actions and provide accessible labels for every tool.",
42
- "Preserve focus and accessible names across navigation, collapse, overflow, and responsive presentation changes."
43
- ],
44
- "states": [
45
- "Render exactly one AppShell as the workspace root and never nest it.",
46
- "PanelNav, BarNav, and PanelTools are required shell regions; PanelTools contains at least Search and Help even when no additional product tools apply.",
47
- "The application router owns the current route, authorization filtering, Dashboard or Settings context, destination collections, section collections, and localized content labels.",
48
- "AppShell propagates navStyle and coordinates layout, gradient alignment, transitions, metrics, shortcuts, and responsive composition.",
49
- "Set gradientPreset to the single resolved global chrome preference: neutral by default, none for solid chrome, or cool, neutral, warm, and fresh for token-based washes.",
50
- "The application owns gradient preference persistence, cross-tab synchronization, and server or account precedence; AppShell owns rendering the resolved preset across authenticated routes.",
51
- "Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
52
- "Update PanelNav groups, BarNav tabs and heading, navStyle, basePath, and currentUrl atomically from one resolved route state.",
53
- "BarNav remains present: it shows route-section tabs when available and the active PanelNav destination label as heading otherwise.",
54
- "The application filters unauthorized destinations, sections, and tools before passing them into shell components."
55
- ],
56
- "responsiveBehavior": [
57
- "AppShell owns the fixed system breakpoints and resolves desktop at 1200px and wider, tablet from 768px through 1199px, and mobile below 768px.",
58
- "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
59
- "On tablet, AppShell keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
60
- "On mobile, AppShell remains the page root but replaces PanelNav and desktop navigation composition with a future dedicated mobile navigation design.",
61
- "Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
62
- "The current runtime does not yet implement the complete desktop, tablet, and mobile composition contract; consuming applications must enforce missing breakpoint behavior until AppShell provides it."
63
- ],
64
- "frameworkCaveats": {
65
- "customElements": [
66
- "Assign complex navigation and tool collections as JavaScript properties on the slotted components.",
67
- "Stamp route-derived nav-style before components connect when deterministic first paint is required."
68
- ],
69
- "react": [
70
- "Use generated wrappers and preserve native slot names for PanelNav, BarNav, PanelTools, and main content.",
71
- "Resolve all shell inputs from one router state before rendering the composition."
72
- ],
73
- "angular": [
74
- "Use generated standalone adapters and preserve slot attributes in templates.",
75
- "Bind complex inputs as properties and update navigation inputs atomically from one resolved router state.",
76
- "Bind both nav-style attributes and properties when deterministic first paint is required."
77
- ]
78
- },
79
- "references": [
80
- {
81
- "label": "Component guide",
82
- "path": "src/wc/components/AppShell/AppShell.mdx"
83
- },
84
- {
85
- "label": "Executable Storybook composition",
86
- "path": "src/wc/components/AppShell/AppShell.stories.ts"
87
- },
88
- {
89
- "label": "Framework integration",
90
- "path": "docs/framework-integration.md"
91
- },
92
- {
93
- "label": "Application shell contract",
94
- "path": "agent/patterns/application-shell/pattern.agent.json"
95
- }
96
- ]
97
- },
98
- "api": {
99
- "props": {
100
- "gradientPreset": {
101
- "type": "ShellGradientPreset",
102
- "resolvedType": "\"cool\" | \"fresh\" | \"neutral\" | \"none\" | \"warm\"",
103
- "attribute": "gradient-preset",
104
- "default": "'neutral'",
105
- "required": false,
106
- "mutable": false,
107
- "description": "Shell chrome wash preset. `none` renders solid chrome; the remaining\npresets use token-based washes that adapt to the active color theme."
108
- },
109
- "navStyle": {
110
- "type": "NavChromeStyle",
111
- "resolvedType": "\"dashboard\" | \"settings\"",
112
- "attribute": "nav-style",
113
- "default": "'dashboard'",
114
- "required": false,
115
- "mutable": false,
116
- "description": "Chrome style propagated to slotted `ds-panel-nav` and `ds-bar-nav`."
117
- },
118
- "shortcutsEnabled": {
119
- "type": "boolean",
120
- "resolvedType": "boolean",
121
- "attribute": "shortcuts-enabled",
122
- "default": "true",
123
- "required": false,
124
- "mutable": false,
125
- "description": "When `true` (default), registers global shell keyboard shortcuts. `[` toggles panel nav; `]` closes tools; K/A/S/M/N/? toggle tool drawers. Modifiers are ignored so browser chords like ⌘N stay native."
126
- }
127
- },
128
- "events": [],
129
- "methods": [],
130
- "slots": []
131
- },
132
- "props": {
133
- "gradientPreset": {
134
- "type": "ShellGradientPreset",
135
- "resolvedType": "\"cool\" | \"fresh\" | \"neutral\" | \"none\" | \"warm\"",
136
- "attribute": "gradient-preset",
137
- "default": "'neutral'",
138
- "required": false,
139
- "mutable": false,
140
- "description": "Shell chrome wash preset. `none` renders solid chrome; the remaining\npresets use token-based washes that adapt to the active color theme."
141
- },
142
- "navStyle": {
143
- "type": "NavChromeStyle",
144
- "resolvedType": "\"dashboard\" | \"settings\"",
145
- "attribute": "nav-style",
146
- "default": "'dashboard'",
147
- "required": false,
148
- "mutable": false,
149
- "description": "Chrome style propagated to slotted `ds-panel-nav` and `ds-bar-nav`."
150
- },
151
- "shortcutsEnabled": {
152
- "type": "boolean",
153
- "resolvedType": "boolean",
154
- "attribute": "shortcuts-enabled",
155
- "default": "true",
156
- "required": false,
157
- "mutable": false,
158
- "description": "When `true` (default), registers global shell keyboard shortcuts. `[` toggles panel nav; `]` closes tools; K/A/S/M/N/? toggle tool drawers. Modifiers are ignored so browser chords like ⌘N stay native."
159
- }
160
- },
161
- "events": [],
162
- "methods": [],
163
- "slots": [],
164
- "exports": {
165
- "customElement": "ds-app-shell",
166
- "react": "DsAppShell",
167
- "angular": "DsAppShell"
168
- },
169
- "consumption": {
170
- "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
171
- "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
172
- "customElements": {
173
- "import": "import '@ds-mo/ui/dist/components/ds-app-shell.js';",
174
- "example": "<ds-app-shell></ds-app-shell>"
175
- },
176
- "react": {
177
- "import": "import { DsAppShell } from '@ds-mo/ui/react';",
178
- "example": "<DsAppShell />"
179
- },
180
- "angular": {
181
- "import": "import { DsAppShell } from '@ds-mo/ui/angular/ds-app-shell';",
182
- "example": "<ds-app-shell></ds-app-shell>"
183
- },
184
- "peerDependencies": {
185
- "required": [
186
- "@ds-mo/tokens ^3.1.1",
187
- "@ds-mo/icons ^6.3.0"
188
- ],
189
- "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
190
- }
191
- }
192
- },
193
- "dependencies": [
194
- "@ds-mo/ui",
195
- "@ds-mo/tokens"
196
- ],
197
- "registryDependencies": [],
198
- "files": [
199
- {
200
- "path": "src/wc/components/AppShell/AppShell.css",
201
- "content": ":host {\n display: block;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n overscroll-behavior: none;\n --ds-shell-panel-tools-width: var(--dimension-panel-width-xs);\n}\n\n.app-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n overscroll-behavior: none;\n font-family: var(--typography-font-family, system-ui);\n}\n\n:host {\n --_shell-chrome-bg: var(--color-background-secondary);\n}\n\n.app-shell__row {\n display: flex;\n flex: 1 1 auto;\n min-height: 0;\n height: 100%;\n position: relative;\n}\n\n/*\n * One chrome layer behind the shell row. Wash uses background-attachment: fixed\n * so the pattern is locked to the viewport — panel/tools collapse only changes the\n * transparent window, not the pattern phase. JS sets wash background-size from\n * readShellViewportDimensions(), not the shell element box.\n */\n.app-shell__chrome {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n background-color: var(--_shell-chrome-bg);\n}\n\n:host(.app-shell--gradient) .app-shell__chrome::before {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n background-position: 0 0;\n background-attachment: fixed;\n z-index: 1;\n opacity: var(--ds-shell-gradient-opacity, 1);\n background-image: var(--ds-shell-gradient-image, none);\n background-size: var(--ds-shell-gradient-size, auto);\n background-repeat: no-repeat;\n}\n\n.app-shell__panel {\n flex: 0 0 auto;\n min-height: 0;\n height: 100%;\n position: relative;\n /* Above main so resize handle line can paint over the workspace edge */\n z-index: 2;\n}\n\n.app-shell__panel ::slotted(ds-panel-nav) {\n display: block;\n height: 100%;\n}\n\n.app-shell__main {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: auto minmax(0, 1fr);\n grid-template-areas:\n 'bar tools'\n 'content tools';\n position: relative;\n z-index: 1;\n}\n\n.app-shell__bar {\n grid-area: bar;\n flex: 0 0 auto;\n min-width: 0;\n}\n\n.app-shell__bar ::slotted(ds-bar-nav) {\n display: block;\n}\n\n.app-shell__content {\n grid-area: content;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: none;\n /* Limit reflow to the page column — not on __main (breaks tools flex shrink). */\n contain: layout;\n}\n\n/* Opaque page surface — masks the fixed chrome layer in the content column. */\n.app-shell__content {\n position: relative;\n z-index: 1;\n background-color: var(--color-background-primary);\n}\n\n.app-shell__tools {\n grid-area: tools;\n flex: 0 0 auto;\n min-width: 0;\n min-height: 0;\n height: 100%;\n display: flex;\n position: relative;\n z-index: 0;\n overflow: hidden;\n}\n\n.app-shell__tools ::slotted(ds-panel-tools) {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n:host(.app-shell--tools-fullscreen) .app-shell__panel,\n:host(.app-shell--tools-fullscreen) .app-shell__bar,\n:host(.app-shell--tools-fullscreen) .app-shell__content {\n visibility: hidden;\n}\n",
202
- "type": "registry:ui"
203
- },
204
- {
205
- "path": "src/wc/components/AppShell/AppShell.tsx",
206
- "content": "import { Component, Prop, Element, State, Watch, Listen, h, Host } from '@stencil/core';\nimport type { NavChromeStyle } from '../../shell/nav-chrome';\nimport {\n isEditableShortcutTarget,\n resolveShellShortcut,\n} from '../../shell/shell-shortcuts';\nimport type { PanelToolsToolId } from '../PanelTools/panel-tools-types';\nimport {\n DEFAULT_SHELL_GRADIENT_PRESET,\n normalizeShellGradientPreset,\n type ShellGradientPreset,\n} from '../../shell/shell-gradient-presets';\nimport {\n CHROME_TRANSITION_END,\n CHROME_TRANSITION_START,\n ChromeTransitionDepth,\n createRafCoalescer,\n readChromeTransitionSource,\n} from '../../shell/chrome-transition';\nimport {\n isPanelNavCollapsed,\n panelWidthPxFromTokens,\n readPanelNavWidthTokens,\n type PanelNavWidthTokens,\n} from '../../shell/shell-chrome-metrics';\nimport {\n SHELL_GRADIENT_IMAGE_VAR,\n SHELL_GRADIENT_OPACITY_VAR,\n SHELL_GRADIENT_POSITION_BAR_VAR,\n SHELL_GRADIENT_POSITION_PANEL_VAR,\n SHELL_GRADIENT_SIZE_VAR,\n buildShellRadialGradient,\n readShellViewportDimensions,\n shellGradientPositionBar,\n shellGradientPositionPanel,\n shellGradientPresetOpacity,\n shellGradientSize,\n} from '../../shell/shell-gradient';\n\n@Component({\n tag: 'ds-app-shell',\n styleUrl: 'AppShell.css',\n scoped: true,\n})\nexport class AppShell {\n /** Chrome style propagated to slotted `ds-panel-nav` and `ds-bar-nav`. */\n @Prop({ attribute: 'nav-style', reflect: true }) navStyle: NavChromeStyle = 'dashboard';\n\n /**\n * Shell chrome wash preset. `none` renders solid chrome; the remaining\n * presets use token-based washes that adapt to the active color theme.\n */\n @Prop({ attribute: 'gradient-preset', reflect: true }) gradientPreset: ShellGradientPreset =\n DEFAULT_SHELL_GRADIENT_PRESET;\n\n /** When `true` (default), registers global shell keyboard shortcuts. `[` toggles panel nav; `]` closes tools; K/A/S/M/N/? toggle tool drawers. Modifiers are ignored so browser chords like ⌘N stay native. */\n @Prop({ attribute: 'shortcuts-enabled' }) shortcutsEnabled: boolean = true;\n\n @Element() el!: HTMLElement;\n @State() private toolsFullscreen = false;\n\n private resizeObserver: ResizeObserver | null = null;\n private readonly panelNavTransition = new ChromeTransitionDepth();\n private readonly chromeSyncCoalescer = createRafCoalescer(() => this.syncChrome());\n private panelWidthTokens: PanelNavWidthTokens = { expandedPx: 0, collapsedPx: 0 };\n private cachedViewportWidth = 0;\n private cachedViewportHeight = 0;\n private onWindowResize = () => {\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n };\n private onVisualViewportChange = () => {\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n };\n\n componentDidLoad() {\n this.syncSlottedNavStyle();\n this.connectMetricsObserver();\n this.connectViewportListeners();\n this.el.addEventListener(CHROME_TRANSITION_START, this.onChromeTransitionStart);\n this.el.addEventListener(CHROME_TRANSITION_END, this.onChromeTransitionEnd);\n requestAnimationFrame(() => {\n this.cachePanelWidthTokens();\n this.scheduleChromeSync();\n });\n const tools = this.el.querySelector('ds-panel-tools');\n this.toolsFullscreen = tools?.getAttribute('presentation') === 'fullscreen';\n }\n\n @Listen('dsPresentationChange')\n handleToolsPresentation(event: CustomEvent<{ presentation?: string }>) {\n this.toolsFullscreen = event.detail?.presentation === 'fullscreen';\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.disconnectViewportListeners();\n this.chromeSyncCoalescer.cancel();\n this.el.removeEventListener(CHROME_TRANSITION_START, this.onChromeTransitionStart);\n this.el.removeEventListener(CHROME_TRANSITION_END, this.onChromeTransitionEnd);\n }\n\n @Watch('navStyle')\n @Watch('gradientPreset')\n onShellPropsChange() {\n this.syncSlottedNavStyle();\n this.scheduleChromeSync();\n }\n\n private onChromeTransitionStart = (event: Event) => {\n if (readChromeTransitionSource(event) !== 'panel-nav') return;\n\n this.panelNavTransition.enter();\n const viewport = readShellViewportDimensions();\n this.cachedViewportWidth = viewport.width;\n this.cachedViewportHeight = viewport.height;\n this.syncChrome();\n };\n\n private onChromeTransitionEnd = (event: Event) => {\n if (readChromeTransitionSource(event) !== 'panel-nav') return;\n\n this.panelNavTransition.exit();\n if (!this.panelNavTransition.isActive) {\n this.scheduleChromeSync();\n }\n };\n\n /** Coalesce ResizeObserver bursts to one layout read per frame. */\n private scheduleChromeSync() {\n this.chromeSyncCoalescer.schedule();\n }\n\n private syncSlottedNavStyle() {\n const panel = this.el.querySelector('ds-panel-nav') as (HTMLElement & { navStyle: NavChromeStyle }) | null;\n const bar = this.el.querySelector('ds-bar-nav') as (HTMLElement & { navStyle: NavChromeStyle }) | null;\n if (panel) {\n panel.setAttribute('nav-style', this.navStyle);\n panel.navStyle = this.navStyle;\n }\n if (bar) {\n bar.setAttribute('nav-style', this.navStyle);\n bar.navStyle = this.navStyle;\n }\n }\n\n private connectMetricsObserver() {\n this.resizeObserver = new ResizeObserver(() => {\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n });\n this.resizeObserver.observe(this.el);\n const panelWrap = this.el.querySelector('.app-shell__panel');\n if (panelWrap) this.resizeObserver.observe(panelWrap);\n }\n\n private connectViewportListeners() {\n if (typeof window === 'undefined') return;\n\n window.addEventListener('resize', this.onWindowResize, { passive: true });\n\n const visual = window.visualViewport;\n if (visual) {\n visual.addEventListener('resize', this.onVisualViewportChange, { passive: true });\n visual.addEventListener('scroll', this.onVisualViewportChange, { passive: true });\n }\n }\n\n private disconnectViewportListeners() {\n if (typeof window === 'undefined') return;\n\n window.removeEventListener('resize', this.onWindowResize);\n\n const visual = window.visualViewport;\n if (visual) {\n visual.removeEventListener('resize', this.onVisualViewportChange);\n visual.removeEventListener('scroll', this.onVisualViewportChange);\n }\n }\n\n private cachePanelWidthTokens() {\n const navRoot = this.el.querySelector('ds-panel-nav .panel-nav') as HTMLElement | null;\n if (!navRoot) return;\n this.panelWidthTokens = readPanelNavWidthTokens(navRoot);\n }\n\n private applyGradientVars(target: HTMLElement, vars: Record<string, string | null>) {\n const style = target.style;\n for (const [name, value] of Object.entries(vars)) {\n if (value === null) style.removeProperty(name);\n else style.setProperty(name, value);\n }\n }\n\n private clearGradientPaintVars(targets: HTMLElement[]) {\n const keys = [\n SHELL_GRADIENT_IMAGE_VAR,\n SHELL_GRADIENT_SIZE_VAR,\n SHELL_GRADIENT_OPACITY_VAR,\n ];\n for (const target of targets) {\n for (const key of keys) target.style.removeProperty(key);\n }\n }\n\n /** Panel/bar wash offsets for scroll fades and badge rings. */\n private syncChromeLayoutVars(\n panel: HTMLElement | null,\n bar: HTMLElement | null,\n panelPosition: string,\n barPosition: string,\n ) {\n if (panel) {\n panel.style.setProperty(SHELL_GRADIENT_POSITION_PANEL_VAR, panelPosition);\n }\n if (bar) {\n bar.style.setProperty(SHELL_GRADIENT_POSITION_BAR_VAR, barPosition);\n }\n }\n\n private resolvePanelWidthPx(panelNav: HTMLElement | null): number {\n const navRoot = panelNav?.querySelector('.panel-nav') as HTMLElement | null;\n\n if (this.panelNavTransition.isActive && this.panelWidthTokens.expandedPx > 0) {\n const collapsed = isPanelNavCollapsed(panelNav, navRoot);\n return panelWidthPxFromTokens(this.panelWidthTokens, collapsed);\n }\n\n const panelWrap = this.el.querySelector('.app-shell__panel') as HTMLElement | null;\n const measured = panelWrap?.getBoundingClientRect().width ?? 0;\n if (measured > 0) return measured;\n\n if (this.panelWidthTokens.expandedPx > 0) {\n const collapsed = isPanelNavCollapsed(panelNav, navRoot);\n return panelWidthPxFromTokens(this.panelWidthTokens, collapsed);\n }\n\n return 0;\n }\n\n /** Fixed-attachment wash/grid size — always the viewport, never the shell element box. */\n private resolveViewportDimensions(): { width: number; height: number } {\n if (this.panelNavTransition.isActive && this.cachedViewportWidth > 0) {\n return {\n width: this.cachedViewportWidth,\n height: this.cachedViewportHeight,\n };\n }\n\n return readShellViewportDimensions();\n }\n\n private chromeLayerActive(): boolean {\n return normalizeShellGradientPreset(this.gradientPreset) !== 'none';\n }\n\n @Listen('keydown', { target: 'window', capture: true })\n handleWindowKeyDown(e: KeyboardEvent) {\n if (!this.shortcutsEnabled) return;\n if (isEditableShortcutTarget(e.target)) return;\n\n const action = resolveShellShortcut(e);\n if (!action) return;\n\n e.preventDefault();\n\n const panel = this.el.querySelector('ds-panel-nav') as HTMLDsPanelNavElement | null;\n const tools = this.el.querySelector('ds-panel-tools') as HTMLDsPanelToolsElement | null;\n\n if (action === 'toggle-panel-nav') {\n void panel?.toggleCollapsed();\n return;\n }\n\n if (action === 'close-panel-tools') {\n void tools?.closeDrawer();\n return;\n }\n\n if (action.startsWith('open-tool:') && tools) {\n const toolId = action.slice('open-tool:'.length) as PanelToolsToolId;\n void tools.activateTool(toolId);\n }\n }\n\n private syncChrome() {\n const panelNav = this.el.querySelector('ds-panel-nav') as HTMLElement | null;\n const bar = this.el.querySelector('ds-bar-nav') as HTMLElement | null;\n const targets = [this.el, panelNav, bar].filter((el): el is HTMLElement => el !== null);\n\n const clearLayoutVars = () => {\n if (panelNav) panelNav.style.removeProperty(SHELL_GRADIENT_POSITION_PANEL_VAR);\n if (bar) bar.style.removeProperty(SHELL_GRADIENT_POSITION_BAR_VAR);\n };\n\n const preset = normalizeShellGradientPreset(this.gradientPreset);\n if (preset === 'none') {\n this.clearGradientPaintVars(targets);\n clearLayoutVars();\n return;\n }\n\n const viewport = this.resolveViewportDimensions();\n const panelWidth = this.resolvePanelWidthPx(panelNav);\n\n const panelPosition = shellGradientPositionPanel();\n const barPosition = shellGradientPositionBar(panelWidth);\n\n this.syncChromeLayoutVars(panelNav, bar, panelPosition, barPosition);\n\n const image = buildShellRadialGradient(preset);\n\n const size = shellGradientSize({\n width: viewport.width,\n height: viewport.height,\n });\n const opacity = shellGradientPresetOpacity(preset);\n\n for (const target of targets) {\n if (target === this.el) {\n this.applyGradientVars(target, {\n [SHELL_GRADIENT_IMAGE_VAR]: image,\n [SHELL_GRADIENT_SIZE_VAR]: size,\n [SHELL_GRADIENT_POSITION_PANEL_VAR]: panelPosition,\n [SHELL_GRADIENT_POSITION_BAR_VAR]: barPosition,\n [SHELL_GRADIENT_OPACITY_VAR]: opacity,\n });\n continue;\n }\n\n const isBar = target.tagName.toLowerCase() === 'ds-bar-nav';\n this.applyGradientVars(target, {\n [SHELL_GRADIENT_IMAGE_VAR]: image,\n [SHELL_GRADIENT_SIZE_VAR]: size,\n [SHELL_GRADIENT_OPACITY_VAR]: opacity,\n [SHELL_GRADIENT_POSITION_PANEL_VAR]: isBar ? null : panelPosition,\n [SHELL_GRADIENT_POSITION_BAR_VAR]: isBar ? barPosition : null,\n });\n }\n }\n\n render() {\n const chromeActive = this.chromeLayerActive();\n const shellCls: Record<string, boolean> = {\n 'app-shell': true,\n 'app-shell--gradient': chromeActive,\n [`app-shell--${this.navStyle}`]: true,\n 'app-shell--tools-fullscreen': this.toolsFullscreen,\n };\n\n return (\n <Host class={shellCls}>\n <div class=\"app-shell__row\">\n <div class=\"app-shell__chrome\" aria-hidden=\"true\" />\n <div class=\"app-shell__panel\" aria-hidden={this.toolsFullscreen ? 'true' : undefined} inert={this.toolsFullscreen ? true : undefined}>\n <slot name=\"panel\" />\n </div>\n <div class=\"app-shell__main\">\n <div class=\"app-shell__bar\" aria-hidden={this.toolsFullscreen ? 'true' : undefined} inert={this.toolsFullscreen ? true : undefined}>\n <slot name=\"bar\" />\n </div>\n <div class=\"app-shell__tools\">\n <slot name=\"tools\" />\n </div>\n <div class=\"app-shell__content\" aria-hidden={this.toolsFullscreen ? 'true' : undefined} inert={this.toolsFullscreen ? true : undefined}>\n <slot />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n",
207
- "type": "registry:ui"
208
- }
209
- ]
210
- }
@@ -1,12 +0,0 @@
1
- 'use client';
2
- import { createComponent } from '@stencil/react-output-target/runtime';
3
- import React from 'react';
4
- import { DsAppShell as DsAppShellElement, defineCustomElement as defineDsAppShell } from "@ds-mo/ui/dist/components/ds-app-shell.js";
5
- export const DsAppShell = /*@__PURE__*/ createComponent({
6
- tagName: 'ds-app-shell',
7
- elementClass: DsAppShellElement,
8
- // @ts-ignore - ignore potential React type mismatches between the Stencil Output Target and your project.
9
- react: React,
10
- events: {},
11
- defineCustomElement: defineDsAppShell
12
- });