@workbench-kit/react 0.0.2-prototype.0.1.2 → 0.0.2-prototype.0.2.2

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 (534) hide show
  1. package/package.json +31 -23
  2. package/src/brand/TilepaperAppIcon.tsx +181 -0
  3. package/src/brand/index.ts +2 -0
  4. package/src/brand/tilepaper-app-icon-geometry.ts +201 -0
  5. package/src/icons/WorkbenchIcon.tsx +57 -0
  6. package/src/icons/WorkbenchIconContext.tsx +25 -0
  7. package/src/icons/file-icon.ts +154 -0
  8. package/src/icons/index.ts +17 -0
  9. package/src/icons/resolveWorkbenchIcon.ts +48 -0
  10. package/src/icons/types.ts +28 -0
  11. package/src/index.ts +261 -71
  12. package/src/jdw/JdwPreview.tsx +165 -8
  13. package/src/jdw/JdwPreviewViewport.tsx +190 -0
  14. package/src/jdw/JsonCodeEditorPane.tsx +165 -15
  15. package/src/jdw/builtins/renderBuiltinWidgetLeaf.tsx +101 -0
  16. package/src/jdw/createBuiltinJdwRegistry.ts +330 -5
  17. package/src/jdw/cssRenderBackend.tsx +96 -7
  18. package/src/jdw/document.ts +0 -3
  19. package/src/jdw/fixtures/jdw-sample-screens.ts +10 -8
  20. package/src/jdw/index.ts +9 -4
  21. package/src/jdw/jdw-preview-viewport.css +41 -0
  22. package/src/jdw/renderJdw.tsx +49 -8
  23. package/src/json-config/JsonConfigWorkbench.tsx +11 -14
  24. package/src/layout/ViewEmptyState.tsx +14 -0
  25. package/src/layout/WorkbenchCanvas.tsx +113 -6
  26. package/src/layout/WorkbenchLayout.tsx +3 -0
  27. package/src/layout/WorkbenchLayoutBase.tsx +43 -2
  28. package/src/layout/WorkbenchMediaPreviewViewport.tsx +122 -0
  29. package/src/layout/WorkbenchPropertyOverrideLabel.tsx +90 -0
  30. package/src/layout/WorkbenchPropertyPanel.tsx +153 -17
  31. package/src/layout/WorkbenchPropertySearch.tsx +51 -0
  32. package/src/layout/WorkbenchTree.tsx +9 -10
  33. package/src/layout/canvas/canvas-drag-ghost.css +21 -0
  34. package/src/layout/canvas/canvas-drag-preview-frame.css +15 -0
  35. package/src/layout/canvas/canvas-drop-indicator.css +16 -0
  36. package/src/layout/canvas/canvas-frame-handle.css +37 -0
  37. package/src/layout/canvas/canvas-frame-surface.css +24 -0
  38. package/src/layout/canvas/canvas-guide-block.css +17 -0
  39. package/src/layout/canvas/canvas-guide-layer.css +6 -0
  40. package/src/layout/canvas/canvas-guide-line.css +22 -0
  41. package/src/layout/canvas/canvas-item-badge.css +23 -0
  42. package/src/layout/canvas/canvas-item-frame.css +54 -0
  43. package/src/layout/canvas/canvas-pane-surface.css +9 -0
  44. package/src/layout/canvas/canvas-placeholder.css +21 -0
  45. package/src/layout/canvas/canvas-resize-frame.css +9 -0
  46. package/src/layout/canvas/canvas-resize-handle.css +74 -0
  47. package/src/layout/canvas/canvas-resize-preview.css +11 -0
  48. package/src/layout/canvas/canvas-selection-marquee.css +14 -0
  49. package/src/layout/canvas/canvas-viewport.css +18 -0
  50. package/src/layout/canvas/index.css +19 -0
  51. package/src/layout/canvas/preview-canvas.css +144 -0
  52. package/src/layout/editor/editor-body.css +9 -0
  53. package/src/layout/editor/editor-bottom-panel.css +44 -0
  54. package/src/layout/editor/editor-frame.css +14 -0
  55. package/src/layout/editor/editor-viewport.css +7 -0
  56. package/src/layout/editor/floating-menu.css +91 -0
  57. package/src/layout/editor/index.css +10 -0
  58. package/src/layout/editor/parse-error.css +9 -0
  59. package/src/layout/editor/problem-item.css +52 -0
  60. package/src/layout/editor/problem-list.css +7 -0
  61. package/src/layout/editor/render-surface.css +13 -0
  62. package/src/layout/fillScrollContract.ts +49 -0
  63. package/src/layout/fullscreen/fullscreen-backdrop.css +31 -0
  64. package/src/layout/fullscreen/fullscreen-button.css +44 -0
  65. package/src/layout/fullscreen/fullscreen-carousel.css +20 -0
  66. package/src/layout/fullscreen/fullscreen-content.css +8 -0
  67. package/src/layout/fullscreen/fullscreen-empty.css +16 -0
  68. package/src/layout/fullscreen/fullscreen-header.css +77 -0
  69. package/src/layout/fullscreen/fullscreen-hero.css +41 -0
  70. package/src/layout/fullscreen/fullscreen-nav-button.css +29 -0
  71. package/src/layout/fullscreen/fullscreen-option.css +83 -0
  72. package/src/layout/fullscreen/fullscreen-pill-row.css +6 -0
  73. package/src/layout/fullscreen/fullscreen-pill.css +10 -0
  74. package/src/layout/fullscreen/fullscreen-root.css +11 -0
  75. package/src/layout/fullscreen/index.css +13 -0
  76. package/src/layout/index.ts +156 -0
  77. package/src/layout/layout-base/banner.css +32 -0
  78. package/src/layout/layout-base/center.css +7 -0
  79. package/src/layout/layout-base/column.css +7 -0
  80. package/src/layout/layout-base/divider.css +5 -0
  81. package/src/layout/layout-base/empty.css +12 -0
  82. package/src/layout/layout-base/fill-scroll.css +36 -0
  83. package/src/layout/layout-base/fill.css +18 -0
  84. package/src/layout/layout-base/index.css +13 -0
  85. package/src/layout/layout-base/pane.css +6 -0
  86. package/src/layout/layout-base/panel-scroll.css +5 -0
  87. package/src/layout/layout-base/panel-surface.css +14 -0
  88. package/src/layout/layout-base/root.css +9 -0
  89. package/src/layout/layout-base/section-title.css +8 -0
  90. package/src/layout/layout.css +10 -0
  91. package/src/layout/layoutHelpers.ts +4 -2
  92. package/src/layout/media/index.css +2 -0
  93. package/src/layout/media/media-preview-viewport.css +69 -0
  94. package/src/layout/{Panel.tsx → panel/Panel.tsx} +29 -40
  95. package/src/layout/panel/TemplateGallery.tsx +90 -0
  96. package/src/layout/panel/WorkbenchAuthoringShell.tsx +57 -0
  97. package/src/layout/panel/WorkbenchLabeledPane.tsx +81 -0
  98. package/src/layout/panel/WorkbenchSidebarStack.tsx +15 -0
  99. package/src/layout/panel/filter-bar.css +59 -0
  100. package/src/layout/panel/index.css +7 -0
  101. package/src/layout/panel/index.ts +70 -0
  102. package/src/layout/panel/preview-pane.css +63 -0
  103. package/src/layout/panel/template-gallery.css +131 -0
  104. package/src/layout/panel/workbench-authoring-shell.css +48 -0
  105. package/src/layout/panel/workbench-labeled-pane.css +69 -0
  106. package/src/layout/panel/workbench-sidebar-stack.css +18 -0
  107. package/src/layout/property/color-input.css +8 -0
  108. package/src/layout/property/color-row.css +6 -0
  109. package/src/layout/property/index.css +15 -0
  110. package/src/layout/property/property-card.css +8 -0
  111. package/src/layout/property/property-grid.css +24 -0
  112. package/src/layout/property/property-hint.css +4 -0
  113. package/src/layout/property/property-inline.css +10 -0
  114. package/src/layout/property/property-key-value.css +29 -0
  115. package/src/layout/property/property-override-label.css +34 -0
  116. package/src/layout/property/property-panel.css +20 -0
  117. package/src/layout/property/property-row.css +17 -0
  118. package/src/layout/property/property-search.css +43 -0
  119. package/src/layout/property/property-section.css +97 -0
  120. package/src/layout/property/property-stack.css +11 -0
  121. package/src/layout/property/property-toggle.css +14 -0
  122. package/src/layout/propertyFieldFilter.ts +84 -0
  123. package/src/layout/sidebar/SideBarViewFrame.tsx +235 -0
  124. package/src/layout/sidebar/SideBarViewTabStrip.tsx +60 -0
  125. package/src/layout/sidebar/SideBarViewTitleMenu.tsx +75 -0
  126. package/src/layout/sidebar/SidebarActionIconBar.tsx +242 -0
  127. package/src/layout/sidebar/SidebarSectionNestingContext.tsx +21 -0
  128. package/src/layout/sidebar/SidebarSlotChrome.tsx +32 -0
  129. package/src/layout/sidebar/SidebarToolbar.tsx +10 -0
  130. package/src/layout/sidebar/WorkbenchActionSidebar.tsx +73 -0
  131. package/src/layout/{WorkbenchSidebarActions.tsx → sidebar/WorkbenchSidebarActions.tsx} +105 -51
  132. package/src/layout/sidebar/WorkbenchSidebarSectionStack.tsx +165 -0
  133. package/src/layout/sidebar/index.css +5 -0
  134. package/src/layout/sidebar/index.ts +55 -0
  135. package/src/layout/sidebar/sidebar-chrome.css +95 -0
  136. package/src/layout/sidebar/sidebar-section-stack.css +25 -0
  137. package/src/layout/sidebar/sidebar-section.css +124 -0
  138. package/src/layout/sidebar/sidebar-view.css +290 -0
  139. package/src/layout/tree/drag-preview.css +25 -0
  140. package/src/layout/tree/index.css +10 -0
  141. package/src/layout/tree/template-glyph.css +96 -0
  142. package/src/layout/tree/tree-action.css +20 -0
  143. package/src/layout/tree/tree-drag-overlay.css +13 -0
  144. package/src/layout/tree/tree-drop-line.css +17 -0
  145. package/src/layout/tree/tree-drop-zone.css +13 -0
  146. package/src/layout/tree/tree-expander.css +23 -0
  147. package/src/layout/tree/tree-item.css +93 -0
  148. package/src/layout/tree/tree.css +49 -0
  149. package/src/layout/usePreviewViewport.ts +428 -0
  150. package/src/modal/ConfirmDialog.tsx +1 -1
  151. package/src/modal/Modal.tsx +148 -305
  152. package/src/modal/ModalResizeHandles.tsx +40 -0
  153. package/src/modal/ModalTitlebar.tsx +86 -0
  154. package/src/modal/modal.css +291 -0
  155. package/src/modal/modalContainer.ts +36 -0
  156. package/src/modal/modalPosition.ts +36 -0
  157. package/src/modal/modalSize.ts +84 -0
  158. package/src/modal/modalTypes.ts +13 -0
  159. package/src/modal/useModalContainerViewport.ts +41 -0
  160. package/src/modal/useModalDrag.ts +118 -0
  161. package/src/modal/useModalResize.ts +122 -0
  162. package/src/modal/useModalWindowFrame.ts +122 -0
  163. package/src/overlay/ContextMenu.tsx +28 -50
  164. package/src/overlay/clampFixedOverlayPosition.ts +22 -0
  165. package/src/overlay/context-menu.css +127 -0
  166. package/src/overlay/index.ts +31 -0
  167. package/src/overlay/measureAnchoredOverlayPanel.ts +107 -0
  168. package/src/overlay/overlay.css +2 -0
  169. package/src/overlay/pointerPassthroughRegion.ts +83 -0
  170. package/src/overlay/useAnchoredOverlayPanel.ts +222 -0
  171. package/src/overlay/useClampedFixedOverlayPosition.ts +27 -0
  172. package/src/overlay/useContextMenuState.ts +59 -0
  173. package/src/overlay/useFixedOverlayDismiss.ts +49 -0
  174. package/src/overlay/usePointerPassthroughRegion.ts +85 -0
  175. package/src/primitives/{AbsoluteBox.tsx → absolute-box/AbsoluteBox.tsx} +1 -1
  176. package/src/primitives/absolute-box/index.ts +1 -0
  177. package/src/primitives/{Badge.tsx → badge/Badge.tsx} +4 -2
  178. package/src/primitives/badge/badge.css +20 -0
  179. package/src/primitives/badge/index.ts +1 -0
  180. package/src/primitives/{Button.tsx → button/Button.tsx} +3 -2
  181. package/src/primitives/button/button.css +76 -0
  182. package/src/primitives/button/index.ts +1 -0
  183. package/src/primitives/catalog-browse-card/CatalogBrowseCard.tsx +121 -0
  184. package/src/primitives/catalog-browse-card/catalog-browse-card.css +175 -0
  185. package/src/primitives/catalog-browse-card/index.ts +1 -0
  186. package/src/primitives/catalog-browse-pane/CatalogBrowseFacetChips.tsx +59 -0
  187. package/src/primitives/catalog-browse-pane/CatalogBrowsePane.tsx +360 -0
  188. package/src/primitives/catalog-browse-pane/catalog-browse-facet-chips.css +8 -0
  189. package/src/primitives/catalog-browse-pane/catalog-browse-pane.css +84 -0
  190. package/src/primitives/catalog-browse-pane/filterCatalogBrowseItems.ts +27 -0
  191. package/src/primitives/catalog-browse-pane/index.ts +3 -0
  192. package/src/primitives/catalog-filter-overlay/CatalogFilterOverlay.tsx +73 -0
  193. package/src/primitives/catalog-filter-overlay/catalog-filter-overlay.css +65 -0
  194. package/src/primitives/catalog-filter-overlay/index.ts +1 -0
  195. package/src/primitives/checkbox/Checkbox.tsx +40 -0
  196. package/src/primitives/checkbox/checkbox.css +81 -0
  197. package/src/primitives/checkbox/index.ts +1 -0
  198. package/src/primitives/chip/Chip.tsx +43 -0
  199. package/src/primitives/chip/chip.css +110 -0
  200. package/src/primitives/chip/index.ts +2 -0
  201. package/src/primitives/clearable-text-input/ClearableTextInput.tsx +78 -0
  202. package/src/primitives/clearable-text-input/clearable-text-input.css +15 -0
  203. package/src/primitives/clearable-text-input/index.ts +1 -0
  204. package/src/primitives/codicon/Codicon.tsx +20 -0
  205. package/src/primitives/codicon/index.ts +1 -0
  206. package/src/primitives/{EmptyState.tsx → empty-state/EmptyState.tsx} +9 -3
  207. package/src/primitives/empty-state/empty-state.css +20 -0
  208. package/src/primitives/empty-state/index.ts +1 -0
  209. package/src/primitives/external-link-button/ExternalLinkButton.tsx +56 -0
  210. package/src/primitives/external-link-button/index.ts +1 -0
  211. package/src/primitives/{Field.tsx → field/Field.tsx} +2 -1
  212. package/src/primitives/field/field.css +51 -0
  213. package/src/primitives/field/index.ts +1 -0
  214. package/src/primitives/file-icon/FileIcon.tsx +21 -0
  215. package/src/primitives/file-icon/index.ts +1 -0
  216. package/src/primitives/{IconButton.tsx → icon-button/IconButton.tsx} +6 -4
  217. package/src/primitives/icon-button/icon-button.css +46 -0
  218. package/src/primitives/icon-button/index.ts +1 -0
  219. package/src/primitives/index.ts +210 -50
  220. package/src/primitives/library-detail-layout/LibraryDetailLayout.tsx +135 -0
  221. package/src/primitives/library-detail-layout/index.ts +1 -0
  222. package/src/primitives/library-detail-layout/library-detail-layout.css +169 -0
  223. package/src/primitives/library-facet-filter-panel/LibraryFacetFilterPanel.tsx +454 -0
  224. package/src/primitives/library-facet-filter-panel/index.ts +1 -0
  225. package/src/primitives/library-facet-filter-panel/library-facet-filter-panel.css +205 -0
  226. package/src/primitives/library-facet-filter-strip/LibraryFacetFilterStrip.tsx +527 -0
  227. package/src/primitives/library-facet-filter-strip/index.ts +1 -0
  228. package/src/primitives/library-facet-filter-strip/library-facet-filter-strip.css +31 -0
  229. package/src/primitives/{List.tsx → list/List.tsx} +15 -6
  230. package/src/primitives/list/index.ts +1 -0
  231. package/src/primitives/list/list-empty-state.css +10 -0
  232. package/src/primitives/list/list-item.css +93 -0
  233. package/src/primitives/list/list.css +6 -0
  234. package/src/primitives/number-input/NumberInput.tsx +235 -0
  235. package/src/primitives/number-input/index.ts +1 -0
  236. package/src/primitives/number-input/number-input.css +105 -0
  237. package/src/primitives/panel-loading/PanelLoading.tsx +29 -0
  238. package/src/primitives/panel-loading/index.ts +1 -0
  239. package/src/primitives/panel-loading/panel-loading.css +16 -0
  240. package/src/primitives/panel-surface/panel-surface.css +77 -0
  241. package/src/primitives/primitives.css +36 -0
  242. package/src/primitives/record-media-hero/RecordMediaHero.tsx +81 -0
  243. package/src/primitives/record-media-hero/index.ts +1 -0
  244. package/src/primitives/record-media-hero/record-media-hero.css +84 -0
  245. package/src/primitives/scroll-area/ScrollArea.tsx +200 -0
  246. package/src/primitives/scroll-area/index.ts +1 -0
  247. package/src/primitives/scroll-area/scroll-area-overlay.css +69 -0
  248. package/src/primitives/scroll-area-infinite-load/ScrollAreaInfiniteSentinel.tsx +22 -0
  249. package/src/primitives/scroll-area-infinite-load/index.ts +2 -0
  250. package/src/primitives/scroll-area-infinite-load/scroll-area-infinite-sentinel.css +6 -0
  251. package/src/primitives/scroll-area-infinite-load/useScrollAreaInfiniteLoad.ts +84 -0
  252. package/src/primitives/searchable-multi-select/SearchableMultiSelect.tsx +378 -0
  253. package/src/primitives/searchable-multi-select/index.ts +9 -0
  254. package/src/primitives/searchable-multi-select/overlay.ts +125 -0
  255. package/src/primitives/searchable-multi-select/searchable-multi-select.css +129 -0
  256. package/src/primitives/select/Select.tsx +21 -3
  257. package/src/primitives/select/overlay.ts +23 -4
  258. package/src/primitives/select/select.app.css +5 -2
  259. package/src/primitives/select/select.css +49 -12
  260. package/src/primitives/styles.css +3 -952
  261. package/src/primitives/tabbed-panels/TabbedPanels.tsx +68 -0
  262. package/src/primitives/tabbed-panels/index.ts +2 -0
  263. package/src/primitives/tabbed-panels/tabbed-panels.css +58 -0
  264. package/src/primitives/{TextArea.tsx → text-area/TextArea.tsx} +2 -1
  265. package/src/primitives/text-area/index.ts +1 -0
  266. package/src/primitives/{TextInput.tsx → text-input/TextInput.tsx} +2 -1
  267. package/src/primitives/text-input/index.ts +1 -0
  268. package/src/primitives/text-input/input.css +54 -0
  269. package/src/primitives/{Toolbar.tsx → toolbar/Toolbar.tsx} +1 -1
  270. package/src/primitives/toolbar/index.ts +1 -0
  271. package/src/primitives/visually-hidden/visually-hidden.css +11 -0
  272. package/src/primitives/{WorkbenchEditor.tsx → workbench-editor/WorkbenchEditor.tsx} +81 -43
  273. package/src/primitives/workbench-editor/button-group.css +10 -0
  274. package/src/primitives/workbench-editor/editor-tabs.css +201 -0
  275. package/src/primitives/workbench-editor/index.ts +1 -0
  276. package/src/primitives/workbench-editor/resizable-panels.css +53 -0
  277. package/src/primitives/workbench-editor/segmented-control.css +98 -0
  278. package/src/primitives/workbench-media-slot/WorkbenchMediaPlaceholder.tsx +25 -0
  279. package/src/primitives/workbench-media-slot/WorkbenchMediaSlot.tsx +60 -0
  280. package/src/primitives/workbench-media-slot/index.ts +2 -0
  281. package/src/primitives/workbench-media-slot/media-slot.css +72 -0
  282. package/src/primitives/workbench-thumbnail/WorkbenchThumbnail.tsx +38 -0
  283. package/src/primitives/workbench-thumbnail/index.ts +1 -0
  284. package/src/primitives/workbench-thumbnail/thumbnail.css +69 -0
  285. package/src/scrollbars.css +77 -2
  286. package/src/styles.css +14 -7735
  287. package/src/test-utils/workbenchMonacoMock.tsx +37 -0
  288. package/src/utils/dragMime.ts +89 -0
  289. package/src/utils/useWorkbenchMediaImage.ts +37 -0
  290. package/src/widget-asset/WidgetAssetEditor.tsx +9 -7
  291. package/src/widget-asset/WidgetAssetModeControls.tsx +1 -1
  292. package/src/widget-asset/WidgetAssetWorkbench.tsx +5 -6
  293. package/src/widget-studio/create-widget-studio-workspace-editor.tsx +1 -2
  294. package/src/widget-studio/index.ts +4 -1
  295. package/src/widget-studio/resolve-widget-studio-asset-catalog.ts +27 -10
  296. package/src/widget-tree/WidgetAssetPalette.tsx +35 -7
  297. package/src/widget-tree/WidgetInspectorPanel.tsx +53 -3
  298. package/src/widget-tree/WidgetSourceEditor.tsx +90 -3
  299. package/src/widget-tree/WidgetTreeCanvasPreview.tsx +875 -0
  300. package/src/widget-tree/WidgetTreeLab.tsx +411 -83
  301. package/src/widget-tree/WidgetTreeModeControls.tsx +30 -1
  302. package/src/widget-tree/WidgetTreeSidePanel.tsx +24 -34
  303. package/src/widget-tree/WidgetTreeView.tsx +711 -11
  304. package/src/widget-tree/WidgetTreeWorkbench.tsx +59 -15
  305. package/src/widget-tree/WidgetTreeWorkspaceShell.tsx +26 -8
  306. package/src/widget-tree/index.ts +22 -4
  307. package/src/widget-tree/widget-placement-asset-dnd.ts +35 -0
  308. package/src/widget-tree/widget-tree-document.ts +3 -9
  309. package/src/widget-tree/widget-tree-editor-state.ts +40 -0
  310. package/src/widget-tree/widget-tree-layout.ts +48 -3
  311. package/src/widget-tree/widget-tree-play-helpers.ts +69 -58
  312. package/src/workbench/ActivityBar.tsx +128 -21
  313. package/src/workbench/ArtifactShell.tsx +8 -8
  314. package/src/workbench/CommandGroupShell.tsx +131 -0
  315. package/src/workbench/CommandList.tsx +167 -0
  316. package/src/workbench/CommandPalette.tsx +194 -596
  317. package/src/workbench/ConfirmationFlow.tsx +3 -5
  318. package/src/workbench/MarkdownPreview.tsx +8 -12
  319. package/src/workbench/ShortcutCommandBridge.tsx +1 -4
  320. package/src/workbench/SplitView.tsx +385 -36
  321. package/src/workbench/StatusBar.tsx +4 -2
  322. package/src/workbench/StructuredArtifactEditor.tsx +3 -3
  323. package/src/workbench/Timeline.tsx +2 -7
  324. package/src/workbench/WorkbenchCanvasShell.defaults.ts +106 -0
  325. package/src/workbench/WorkbenchCanvasShell.model.ts +46 -0
  326. package/src/workbench/WorkbenchCanvasShell.tsx +32 -146
  327. package/src/workbench/WorkbenchDesktopTitleBar.tsx +126 -0
  328. package/src/workbench/WorkbenchEditorTabs.tsx +52 -0
  329. package/src/workbench/WorkbenchModalPortal.tsx +52 -0
  330. package/src/workbench/WorkbenchPlatformContext.tsx +31 -0
  331. package/src/workbench/WorkbenchShell.tsx +144 -26
  332. package/src/workbench/WorkbenchShellTitleBarLayoutControls.tsx +80 -0
  333. package/src/workbench/WorkbenchStandaloneShell.tsx +327 -41
  334. package/src/workbench/WorkbenchThemeProvider.tsx +142 -0
  335. package/src/workbench/WorkbenchViewEditor.tsx +75 -0
  336. package/src/workbench/WorkbenchViewSidebar.tsx +85 -0
  337. package/src/workbench/WorkbenchWindowChromeControls.tsx +290 -0
  338. package/src/workbench/activityBarOrder.ts +98 -0
  339. package/src/workbench/appearanceLabels.ts +28 -0
  340. package/src/workbench/auth/WorkbenchLoginView.tsx +4 -6
  341. package/src/workbench/auth/auth-flows.css +440 -0
  342. package/src/workbench/auth/auth.css +3 -0
  343. package/src/workbench/auth/profile-modals.css +115 -0
  344. package/src/workbench/bootstrap/WorkbenchBootstrapGate.tsx +45 -0
  345. package/src/workbench/bootstrap/WorkbenchBootstrapView.tsx +100 -0
  346. package/src/workbench/bootstrap/index.ts +12 -0
  347. package/src/workbench/bootstrap/useWorkbenchBootstrap.ts +130 -0
  348. package/src/workbench/chat/ChatCommandProposalCard.tsx +115 -0
  349. package/src/workbench/chat/ChatComposer.tsx +32 -34
  350. package/src/workbench/chat/ChatConversationBar.tsx +134 -0
  351. package/src/workbench/chat/ChatHistoryMenu.tsx +171 -0
  352. package/src/workbench/chat/ChatHistoryMenuRow.tsx +74 -0
  353. package/src/workbench/chat/ChatMessageCollapsible.tsx +115 -0
  354. package/src/workbench/chat/ChatMessageItem.tsx +293 -19
  355. package/src/workbench/chat/ChatMessageList.tsx +109 -24
  356. package/src/workbench/chat/ChatPanel.tsx +132 -19
  357. package/src/workbench/chat/ChatPhasedRunProgress.tsx +202 -0
  358. package/src/workbench/chat/ChatRenameDialog.tsx +77 -0
  359. package/src/workbench/chat/chat-conversation.css +273 -0
  360. package/src/workbench/chat/chat-ui.css +1124 -0
  361. package/src/workbench/chat/chat.css +3 -0
  362. package/src/workbench/chat/chatConversation.ts +46 -0
  363. package/src/workbench/chat/chatHistoryRowMenuItems.ts +29 -0
  364. package/src/workbench/chat/chatMessageMeta.tsx +252 -0
  365. package/src/workbench/chat/chatScroll.ts +22 -0
  366. package/src/workbench/chat/index.ts +47 -1
  367. package/src/workbench/chat/slashCommand.ts +5 -7
  368. package/src/workbench/chat/types.ts +35 -0
  369. package/src/workbench/chat/useCancelRuntimeOnUnmount.ts +60 -0
  370. package/src/workbench/chat/useChatPrependPagination.ts +233 -0
  371. package/src/workbench/chat/useChatRuntimeState.ts +3 -15
  372. package/src/workbench/chat/useSlashCommandSuggest.ts +76 -23
  373. package/src/workbench/chrome/index.css +6 -0
  374. package/src/workbench/chrome/workbench-desktop-titlebar.css +60 -0
  375. package/src/workbench/chrome/workbench-host.css +85 -0
  376. package/src/workbench/chrome/workbench-layout-regions.css +42 -0
  377. package/src/workbench/chrome/workbench-platform-chrome.css +142 -0
  378. package/src/workbench/chrome/workbench-shell-titlebar.css +124 -0
  379. package/src/workbench/command-execution-policy.ts +61 -0
  380. package/src/workbench/command-model.ts +275 -0
  381. package/src/workbench/command-palette/command-palette.css +156 -0
  382. package/src/workbench/commands.ts +62 -6
  383. package/src/workbench/editor-tabs/index.ts +22 -0
  384. package/src/workbench/editor-tabs-dnd.ts +162 -0
  385. package/src/workbench/editorTabContextMenu.ts +111 -0
  386. package/src/workbench/hardReset.ts +64 -0
  387. package/src/workbench/index.ts +234 -2
  388. package/src/workbench/jdw/jdw-editors.css +4 -0
  389. package/src/workbench/jdw/jdw.css +2 -0
  390. package/src/workbench/management/AccountManagementPanel.tsx +82 -0
  391. package/src/workbench/management/CommandInspectorPanel.tsx +127 -0
  392. package/src/workbench/management/CommandManagementPanel.tsx +129 -0
  393. package/src/workbench/management/CommandManagementSidebar.tsx +318 -0
  394. package/src/workbench/management/ExtensionManagementPanel.tsx +498 -0
  395. package/src/workbench/management/ExtensionManagementSidebar.tsx +492 -0
  396. package/src/workbench/management/IntegrationCommandActions.tsx +78 -0
  397. package/src/workbench/management/IntegrationSettingsSurface.tsx +290 -0
  398. package/src/workbench/management/IntegrationsShell.tsx +53 -0
  399. package/src/workbench/management/KeybindingCaptureField.tsx +142 -0
  400. package/src/workbench/management/KeybindingManagementPanel.tsx +120 -0
  401. package/src/workbench/management/LibraryCatalogPickerDialog.tsx +208 -0
  402. package/src/workbench/management/LibraryFacetFilterDialog.tsx +62 -0
  403. package/src/workbench/management/ManagementCard.tsx +89 -0
  404. package/src/workbench/management/ManagementFilterChips.tsx +41 -0
  405. package/src/workbench/management/ManagementGroup.tsx +56 -0
  406. package/src/workbench/management/ManagementPanelControls.tsx +43 -0
  407. package/src/workbench/management/ManagementPanelFrame.tsx +109 -0
  408. package/src/workbench/management/WorkbenchDialogFrame.tsx +148 -0
  409. package/src/workbench/management/WorkbenchNotice.tsx +211 -0
  410. package/src/workbench/management/build-command-management-groups.ts +157 -0
  411. package/src/workbench/management/command-inspector-uri.ts +26 -0
  412. package/src/workbench/management/extension-category-display.ts +42 -0
  413. package/src/workbench/management/format-command-run-state.ts +19 -0
  414. package/src/workbench/management/index.ts +130 -0
  415. package/src/workbench/management/integration-command-action.ts +25 -0
  416. package/src/workbench/management/library-catalog-picker-dialog.css +56 -0
  417. package/src/workbench/management/library-facet-filter-dialog.css +8 -0
  418. package/src/workbench/management/management-panel.css +444 -0
  419. package/src/workbench/management/management.css +4 -0
  420. package/src/workbench/management/types.ts +126 -0
  421. package/src/workbench/markdownRemarkPlugins.ts +4 -0
  422. package/src/workbench/schema/index.ts +0 -1
  423. package/src/workbench/settings/NavigationPanel.tsx +41 -2
  424. package/src/workbench/settings/SchemaForm.tsx +20 -7
  425. package/src/workbench/settings/SectionTabPanel.tsx +172 -0
  426. package/src/workbench/settings/SectionedPanel.tsx +40 -286
  427. package/src/workbench/settings/StructuredDataForm.tsx +106 -26
  428. package/src/workbench/settings/StructuredDataSchemaPanel.tsx +345 -93
  429. package/src/workbench/settings/StructuredDataTableView.tsx +2 -2
  430. package/src/workbench/settings/WorkbenchPanelRegion.tsx +1 -1
  431. package/src/workbench/settings/WorkbenchSettingsModal.tsx +116 -62
  432. package/src/workbench/settings/WorkbenchSettingsNav.tsx +3 -3
  433. package/src/workbench/settings/extensionSettingsForm.ts +34 -0
  434. package/src/workbench/settings/index.ts +36 -1
  435. package/src/workbench/settings/navigation-panel.css +59 -0
  436. package/src/workbench/settings/panel-region.css +3 -2
  437. package/src/workbench/settings/schema-form.css +36 -0
  438. package/src/workbench/settings/schemaFormSettingSpec.ts +177 -0
  439. package/src/workbench/settings/schemaFormSettingsCategory.tsx +21 -0
  440. package/src/workbench/settings/section-tab-panel.css +157 -0
  441. package/src/workbench/settings/sectionScrollSpyDom.ts +139 -0
  442. package/src/workbench/settings/sectioned-panel.css +162 -0
  443. package/src/workbench/settings/sectionedPanelScrollSpy.ts +158 -28
  444. package/src/workbench/settings/settings-responsive.css +58 -0
  445. package/src/workbench/settings/settings.css +11 -0
  446. package/src/workbench/settings/settingsCommit.tsx +55 -0
  447. package/src/workbench/settings/structured-data-form.css +114 -0
  448. package/src/workbench/settings/structured-data-schema-panel.css +33 -19
  449. package/src/workbench/settings/structuredDataFormModel.ts +140 -0
  450. package/src/workbench/settings/structuredDataSchema.ts +111 -658
  451. package/src/workbench/settings/structuredDataSchemaDate.ts +197 -0
  452. package/src/workbench/settings/structuredDataSchemaField.ts +105 -0
  453. package/src/workbench/settings/structuredDataSchemaSection.ts +74 -0
  454. package/src/workbench/settings/structuredDataSchemaTable.ts +120 -0
  455. package/src/workbench/settings/structuredDataSchemaTypes.ts +308 -0
  456. package/src/workbench/settings/structuredDataSchemaValidation.ts +166 -0
  457. package/src/workbench/settings/useSectionScrollSpy.ts +420 -0
  458. package/src/workbench/settings/workbench-settings-modal.css +273 -0
  459. package/src/workbench/shell/activity-bar.css +245 -0
  460. package/src/workbench/shell/confirmation-flow.css +87 -0
  461. package/src/workbench/shell/index.css +5 -0
  462. package/src/workbench/shell/split-view.css +188 -0
  463. package/src/workbench/shell/status-bar.css +141 -0
  464. package/src/workbench/shell.ts +133 -2
  465. package/src/workbench/shellPresets.ts +36 -0
  466. package/src/workbench/shellState.ts +16 -23
  467. package/src/workbench/shellViewModel.ts +160 -0
  468. package/src/workbench/sidebarViewPlacementDnd.ts +61 -0
  469. package/src/workbench/standalone.ts +9 -9
  470. package/src/workbench/status.ts +10 -6
  471. package/src/workbench/theme.ts +8 -2
  472. package/src/workbench/themePresets.ts +191 -0
  473. package/src/workbench/useDeferredWorkbenchMount.ts +71 -0
  474. package/src/workbench/useEditorTabsStripDnd.ts +262 -0
  475. package/src/workbench/useWorkbenchAppearanceDocumentSync.tsx +17 -0
  476. package/src/workbench/useWorkbenchEditorTabContextMenu.tsx +66 -0
  477. package/src/workbench/useWorkbenchSidebarActionBarDnd.ts +227 -0
  478. package/src/workbench/useWorkbenchSidebarLayout.tsx +232 -0
  479. package/src/workbench/useWorkbenchSidebarViewPlacementDropZone.ts +194 -0
  480. package/src/workbench/useWorkbenchStandaloneShellStateSync.tsx +112 -0
  481. package/src/workbench/views/action-list.css +144 -0
  482. package/src/workbench/views/artifact-preview.css +184 -0
  483. package/src/workbench/views/command-inspector.css +98 -0
  484. package/src/workbench/views/command-list.css +356 -0
  485. package/src/workbench/views/commands-sidebar.css +51 -0
  486. package/src/workbench/views/extensions-sidebar.css +175 -0
  487. package/src/workbench/views/multi-provider-explorer.css +182 -0
  488. package/src/workbench/views/search.css +10 -0
  489. package/src/workbench/views/timeline.css +239 -0
  490. package/src/workbench/views/view-hosts.css +37 -0
  491. package/src/workbench/views/view-sidebar.css +21 -0
  492. package/src/workbench/views/views.css +12 -0
  493. package/src/workbench/widgets/widget-tree.css +598 -0
  494. package/src/workbench/widgets/widgets.css +2 -0
  495. package/src/workbench/workbench-chrome.css +4 -0
  496. package/src/workbench/workbenchContextMenu.ts +18 -0
  497. package/src/workbench/workbenchModalViewState.ts +52 -0
  498. package/src/workbench/workbenchOverlaysContext.tsx +21 -0
  499. package/src/workbench/workbenchPlatformChrome.ts +40 -0
  500. package/src/workbench/workbenchSidebarLayoutContext.ts +46 -0
  501. package/src/workbench/workbenchStandaloneShellReactContext.tsx +80 -0
  502. package/src/workbench/workbenchViewRouteState.ts +151 -0
  503. package/src/workbench/workspace/WorkspaceDraftsContext.tsx +59 -71
  504. package/src/workbench/workspace/WorkspaceEditor.tsx +27 -123
  505. package/src/workbench/workspace/WorkspaceEditorPanel.tsx +67 -8
  506. package/src/workbench/workspace/WorkspaceExplorer.tsx +149 -51
  507. package/src/workbench/workspace/WorkspaceExplorerPanel.tsx +73 -0
  508. package/src/workbench/workspace/WorkspaceFileIcon.tsx +4 -160
  509. package/src/workbench/workspace/WorkspacePathLabel.tsx +42 -0
  510. package/src/workbench/workspace/WorkspaceSearchPanel.tsx +18 -15
  511. package/src/workbench/workspace/WorkspaceSearchResults.tsx +6 -2
  512. package/src/workbench/workspace/build-workspace-explorer-nodes.ts +44 -0
  513. package/src/workbench/workspace/createVirtualWorkspaceExplorerPort.ts +141 -0
  514. package/src/workbench/workspace/explorer-tree-style.ts +18 -0
  515. package/src/workbench/workspace/index.ts +45 -32
  516. package/src/workbench/workspace/json-config-workbench.css +57 -0
  517. package/src/workbench/workspace/monaco-panel.css +71 -0
  518. package/src/workbench/workspace/path.ts +2 -0
  519. package/src/workbench/workspace/useWorkspaceExplorerController.ts +490 -0
  520. package/src/workbench/workspace/workspace-editor.css +235 -0
  521. package/src/workbench/workspace/workspace-explorer-panel.css +33 -0
  522. package/src/workbench/workspace/workspace.css +5 -0
  523. package/src/workbench/workspace/workspaceExplorerController.ts +193 -0
  524. package/src/workbench/workspace/workspaceJsonDiagnostics.ts +2 -2
  525. package/src/workbench-menu-surfaces.css +57 -0
  526. package/src/jdw/builtins/renderBuiltinWidgetNode.tsx +0 -126
  527. package/src/layout/SideBarViewFrame.tsx +0 -367
  528. package/src/primitives/Checkbox.tsx +0 -21
  529. package/src/primitives/NumberInput.tsx +0 -38
  530. package/src/primitives/ScrollArea.tsx +0 -42
  531. package/src/primitives/Select.tsx +0 -1
  532. package/src/primitives/StatusBar.tsx +0 -46
  533. package/src/primitives/WorkbenchChrome.tsx +0 -424
  534. package/src/workbench/workspace/MultiProviderExplorer.tsx +0 -625
@@ -1,11 +1,17 @@
1
- import { useMemo } from 'react';
1
+ import { useMemo, useRef } from 'react';
2
+ import { useResolvedWorkbenchTheme } from './theme';
2
3
  import type { CSSProperties, MouseEvent, ReactNode } from 'react';
4
+ import { useWorkbenchStandaloneShellStateSync } from './useWorkbenchStandaloneShellStateSync';
5
+ import {
6
+ WorkbenchStandaloneShellReactContextProvider,
7
+ type WorkbenchStandaloneShellStateChange,
8
+ } from './workbenchStandaloneShellReactContext';
3
9
  import { cxCodicon } from '../utils/codicon';
4
10
  import type { StatusBarItemModel, StatusBarSectionModel } from './StatusBar';
5
11
  import type { WorkbenchShellProps } from './WorkbenchShell';
6
12
  import { WorkbenchShell } from './WorkbenchShell';
7
13
  import type { WorkbenchShellCommandContext } from './commands';
8
- import { DEFAULT_PRIMARY_SIDEBAR_SIZE_PERCENT, useWorkbenchShellState } from './shellState';
14
+ import { DEFAULT_PRIMARY_SIDEBAR_SIZE_PX, useWorkbenchShellState } from './shellState';
9
15
  import type {
10
16
  WorkbenchActivityChangeEvent,
11
17
  WorkbenchActivityDescriptor,
@@ -30,12 +36,13 @@ export interface WorkbenchStandaloneShellContext<
30
36
  commandContext: WorkbenchShellCommandContext<TActivityId>;
31
37
  isPrimarySidebarVisible: boolean;
32
38
  isSettingsOpen: boolean;
33
- primarySidebarSizePercent: number;
39
+ primarySidebarLifecycle: WorkbenchPrimarySidebarLifecycle<TActivityId>;
40
+ primarySidebarSizePx: number;
34
41
  theme: TTheme;
35
42
  showActivity: (activityId: TActivityId) => void;
36
43
  activateActivity: (activityId: TActivityId) => void;
37
44
  setTheme: (theme: TTheme) => void;
38
- setPrimarySidebarSizePercent: (sizePercent: number) => void;
45
+ setPrimarySidebarSizePx: (sizePx: number) => void;
39
46
  setPrimarySidebarVisible: (isVisible: boolean) => void;
40
47
  togglePrimarySidebar: () => void;
41
48
  openSettings: () => void;
@@ -45,6 +52,45 @@ export interface WorkbenchStandaloneShellContext<
45
52
  setSettingsSearchValue: (settingsSearchValue: string) => void;
46
53
  }
47
54
 
55
+ export type WorkbenchPrimarySidebarLifecycleReason =
56
+ 'activity-switch' | 'initial' | 'sidebar-hide' | 'sidebar-show';
57
+
58
+ export interface WorkbenchPrimarySidebarLifecycle<TActivityId extends string = string> {
59
+ activityId: TActivityId;
60
+ previousActivityId: TActivityId;
61
+ isVisible: boolean;
62
+ wasVisible: boolean;
63
+ reason: WorkbenchPrimarySidebarLifecycleReason;
64
+ }
65
+
66
+ export interface WorkbenchPrimarySidebarLifecycleCallbacks<TActivityId extends string = string> {
67
+ onDidChange?: (event: WorkbenchPrimarySidebarLifecycle<TActivityId>) => void;
68
+ onDidHide?: (event: WorkbenchPrimarySidebarLifecycle<TActivityId>) => void;
69
+ onDidShow?: (event: WorkbenchPrimarySidebarLifecycle<TActivityId>) => void;
70
+ onDidSwitchActivity?: (event: WorkbenchPrimarySidebarLifecycle<TActivityId>) => void;
71
+ }
72
+
73
+ export interface WorkbenchActivityLifecycleEvent<TActivityId extends string = string> {
74
+ activityId: TActivityId;
75
+ activeActivityId: TActivityId;
76
+ previousActivityId: TActivityId;
77
+ isVisible: boolean;
78
+ wasVisible: boolean;
79
+ reason: WorkbenchPrimarySidebarLifecycleReason;
80
+ primarySidebarLifecycle: WorkbenchPrimarySidebarLifecycle<TActivityId>;
81
+ }
82
+
83
+ export interface WorkbenchActivityLifecycleCallbacks<TActivityId extends string = string> {
84
+ onDidActivate?: (event: WorkbenchActivityLifecycleEvent<TActivityId>) => void;
85
+ onDidDeactivate?: (event: WorkbenchActivityLifecycleEvent<TActivityId>) => void;
86
+ onDidHide?: (event: WorkbenchActivityLifecycleEvent<TActivityId>) => void;
87
+ onDidShow?: (event: WorkbenchActivityLifecycleEvent<TActivityId>) => void;
88
+ }
89
+
90
+ export type WorkbenchActivityLifecycleCallbackMap<TActivityId extends string = string> = Partial<
91
+ Record<TActivityId, WorkbenchActivityLifecycleCallbacks<TActivityId>>
92
+ >;
93
+
48
94
  /**
49
95
  * Props for the standalone workbench chrome host. Supply `bootstrap` plus render
50
96
  * callbacks; the shell manages activity, theme, sidebar, and settings visibility.
@@ -59,9 +105,18 @@ export interface WorkbenchStandaloneShellProps<
59
105
  'items' | 'secondaryItems' | 'onContextMenu' | 'onItemActivate'
60
106
  >;
61
107
  compactStatus?: boolean;
108
+ /**
109
+ * When true, renders a Help utility item in the activity bar footer
110
+ * immediately before Settings (legacy Content Hub pattern).
111
+ */
112
+ includeHelp?: boolean;
62
113
  includeSettings?: boolean;
63
- maxPrimarySidebarSizePercent?: number;
64
- minPrimarySidebarSizePercent?: number;
114
+ /** Host-controlled Help open state for footer item active styling. */
115
+ isHelpOpen?: boolean;
116
+ maxPrimarySidebarSizePx?: number;
117
+ minPrimarySidebarSizePx?: number;
118
+ activityLifecycleCallbacks?: WorkbenchActivityLifecycleCallbackMap<TActivityId>;
119
+ primarySidebarLifecycleCallbacks?: WorkbenchPrimarySidebarLifecycleCallbacks<TActivityId>;
65
120
  onActivityActivate?: (
66
121
  event: WorkbenchActivityChangeEvent<TActivityId>,
67
122
  context: WorkbenchStandaloneShellContext<TActivityId, TTheme>,
@@ -74,18 +129,38 @@ export interface WorkbenchStandaloneShellProps<
74
129
  itemId: TActivityId | string,
75
130
  context: WorkbenchStandaloneShellContext<TActivityId, TTheme>,
76
131
  ) => void;
132
+ /** Fired when the footer Help utility item is activated. */
133
+ onHelpActivate?: (context: WorkbenchStandaloneShellContext<TActivityId, TTheme>) => void;
77
134
  onStatusItemActivate?: (
78
135
  item: StatusBarItemModel,
79
136
  context: WorkbenchStandaloneShellContext<TActivityId, TTheme>,
80
137
  ) => void;
81
138
  onEvent?: (event: WorkbenchStandaloneBootstrapEvent<TActivityId>) => void;
139
+ /**
140
+ * Fired once on mount (`kind: 'initial'`) and when activity, sidebar visibility/size,
141
+ * settings open state, or theme changes. Use for persistence and instrumentation instead
142
+ * of duplicating effects in each render slot.
143
+ */
144
+ onShellStateChange?: (change: WorkbenchStandaloneShellStateChange<TActivityId, TTheme>) => void;
145
+ /**
146
+ * Optional wrapper around the workbench chrome tree. Receives the stable shell context and
147
+ * the default shell element so hosts can add a single instrumentation or domain provider.
148
+ */
149
+ renderShellHost?: (
150
+ context: WorkbenchStandaloneShellContext<TActivityId, TTheme>,
151
+ shell: ReactNode,
152
+ ) => ReactNode;
82
153
  renderPrimarySidebar: (
83
154
  context: WorkbenchStandaloneShellContext<TActivityId, TTheme>,
84
155
  ) => ReactNode;
85
156
  renderOverlays?: (context: WorkbenchStandaloneShellContext<TActivityId, TTheme>) => ReactNode;
86
157
  renderSecondaryArea: (context: WorkbenchStandaloneShellContext<TActivityId, TTheme>) => ReactNode;
158
+ renderTitleBar?: (context: WorkbenchStandaloneShellContext<TActivityId, TTheme>) => ReactNode;
87
159
  rootClassName?: string;
88
160
  rootStyle?: CSSProperties;
161
+ helpItemIcon?: ReactNode;
162
+ helpItemId?: string;
163
+ helpItemLabel?: string;
89
164
  settingsItemIcon?: ReactNode;
90
165
  settingsItemId?: string;
91
166
  settingsItemLabel?: string;
@@ -94,6 +169,10 @@ export interface WorkbenchStandaloneShellProps<
94
169
  getStatusSections?: (
95
170
  context: WorkbenchStandaloneShellContext<TActivityId, TTheme>,
96
171
  ) => StatusBarSectionModel[];
172
+ /** Active CSS preset for the resolved document theme (e.g. `skyblue`, `purple`). */
173
+ documentThemePreset?: string;
174
+ /** Shell density preset (e.g. `default`, `workbench`). */
175
+ shellPreset?: string;
97
176
  }
98
177
 
99
178
  function toWorkbenchActivityItems<TActivityId extends string>(
@@ -113,25 +192,38 @@ export function WorkbenchStandaloneShell<
113
192
  bootstrap,
114
193
  activityBar,
115
194
  compactStatus = true,
195
+ includeHelp = false,
116
196
  includeSettings = true,
117
- maxPrimarySidebarSizePercent,
118
- minPrimarySidebarSizePercent,
197
+ isHelpOpen = false,
198
+ maxPrimarySidebarSizePx,
199
+ minPrimarySidebarSizePx,
200
+ activityLifecycleCallbacks,
201
+ primarySidebarLifecycleCallbacks,
119
202
  onActivityActivate,
120
203
  onActivityBarContextMenu,
121
204
  onActivityBarItemActivate,
205
+ onHelpActivate,
122
206
  onStatusItemActivate,
123
207
  onEvent,
208
+ onShellStateChange,
209
+ renderShellHost,
124
210
  renderPrimarySidebar,
125
211
  renderOverlays,
126
212
  renderSecondaryArea,
213
+ renderTitleBar,
127
214
  rootClassName,
128
215
  rootStyle,
216
+ helpItemIcon,
217
+ helpItemId = 'help',
218
+ helpItemLabel = 'Help',
129
219
  settingsItemIcon,
130
220
  settingsItemId = 'settings',
131
221
  settingsItemLabel = 'Settings',
132
222
  primarySidebarClassName,
133
223
  primarySidebarStyle,
134
224
  getStatusSections,
225
+ documentThemePreset,
226
+ shellPreset,
135
227
  }: WorkbenchStandaloneShellProps<TActivityId, TTheme>) {
136
228
  const { contract, initialState } = bootstrap;
137
229
  const activityIds = useMemo(
@@ -146,25 +238,126 @@ export function WorkbenchStandaloneShell<
146
238
  (DEFAULT_ACTIVITY_ID as TActivityId),
147
239
  isPrimarySidebarVisible: initialState?.isPrimarySidebarVisible ?? true,
148
240
  isSettingsOpen: initialState?.isSettingsOpen ?? false,
149
- primarySidebarSizePercent:
150
- initialState?.primarySidebarSizePercent ?? DEFAULT_PRIMARY_SIDEBAR_SIZE_PERCENT,
241
+ primarySidebarSizePx: initialState?.primarySidebarSizePx ?? DEFAULT_PRIMARY_SIDEBAR_SIZE_PX,
151
242
  settingsCategoryId: initialState?.settingsCategoryId ?? '',
152
243
  settingsScopeId: initialState?.settingsScopeId ?? '',
153
244
  settingsSearchValue: initialState?.settingsSearchValue ?? '',
154
245
  theme: (initialState?.theme ?? contract.initialTheme ?? DEFAULT_THEME) as TTheme,
155
246
  });
156
- const {
157
- isPrimarySidebarVisible,
158
- isSettingsOpen,
159
- primarySidebarSizePercent,
160
- theme,
161
- activeActivityId,
162
- } = shell.state;
247
+ const { isPrimarySidebarVisible, isSettingsOpen, primarySidebarSizePx, theme, activeActivityId } =
248
+ shell.state;
249
+ const primarySidebarLifecycleRef = useRef<WorkbenchPrimarySidebarLifecycle<TActivityId>>({
250
+ activityId: activeActivityId,
251
+ previousActivityId: activeActivityId,
252
+ isVisible: isPrimarySidebarVisible,
253
+ wasVisible: isPrimarySidebarVisible,
254
+ reason: 'initial',
255
+ });
256
+ const resolvedTheme = useResolvedWorkbenchTheme(theme as WorkbenchTheme | 'system');
163
257
 
164
258
  const emitEvent = (event: WorkbenchStandaloneBootstrapEvent<TActivityId>) => {
165
259
  onEvent?.(event);
166
260
  };
261
+ const emitPrimarySidebarLifecycle = (
262
+ lifecycle: WorkbenchPrimarySidebarLifecycle<TActivityId>,
263
+ ) => {
264
+ primarySidebarLifecycleCallbacks?.onDidChange?.(lifecycle);
265
+
266
+ if (lifecycle.reason === 'activity-switch') {
267
+ primarySidebarLifecycleCallbacks?.onDidSwitchActivity?.(lifecycle);
268
+ }
269
+
270
+ if (!lifecycle.isVisible && lifecycle.wasVisible) {
271
+ primarySidebarLifecycleCallbacks?.onDidHide?.(lifecycle);
272
+ }
273
+
274
+ if (lifecycle.isVisible && !lifecycle.wasVisible) {
275
+ primarySidebarLifecycleCallbacks?.onDidShow?.(lifecycle);
276
+ }
277
+ };
278
+ const createActivityLifecycleEvent = (
279
+ lifecycle: WorkbenchPrimarySidebarLifecycle<TActivityId>,
280
+ activityId: TActivityId,
281
+ isVisible: boolean,
282
+ wasVisible: boolean,
283
+ ): WorkbenchActivityLifecycleEvent<TActivityId> => ({
284
+ activityId,
285
+ activeActivityId: lifecycle.activityId,
286
+ previousActivityId: lifecycle.previousActivityId,
287
+ isVisible,
288
+ wasVisible,
289
+ reason: lifecycle.reason,
290
+ primarySidebarLifecycle: lifecycle,
291
+ });
292
+ const emitActivityLifecycle = (lifecycle: WorkbenchPrimarySidebarLifecycle<TActivityId>) => {
293
+ if (lifecycle.reason === 'activity-switch') {
294
+ const previousCallbacks = activityLifecycleCallbacks?.[lifecycle.previousActivityId];
295
+ const nextCallbacks = activityLifecycleCallbacks?.[lifecycle.activityId];
296
+ const previousEvent = createActivityLifecycleEvent(
297
+ lifecycle,
298
+ lifecycle.previousActivityId,
299
+ false,
300
+ lifecycle.wasVisible,
301
+ );
302
+ const nextEvent = createActivityLifecycleEvent(
303
+ lifecycle,
304
+ lifecycle.activityId,
305
+ lifecycle.isVisible,
306
+ false,
307
+ );
308
+
309
+ previousCallbacks?.onDidDeactivate?.(previousEvent);
310
+ if (lifecycle.wasVisible) {
311
+ previousCallbacks?.onDidHide?.(previousEvent);
312
+ }
313
+
314
+ nextCallbacks?.onDidActivate?.(nextEvent);
315
+ if (lifecycle.isVisible) {
316
+ nextCallbacks?.onDidShow?.(nextEvent);
317
+ }
318
+ return;
319
+ }
320
+
321
+ const callbacks = activityLifecycleCallbacks?.[lifecycle.activityId];
322
+ if (!callbacks) return;
323
+
324
+ const event = createActivityLifecycleEvent(
325
+ lifecycle,
326
+ lifecycle.activityId,
327
+ lifecycle.isVisible,
328
+ lifecycle.wasVisible,
329
+ );
330
+
331
+ if (!lifecycle.isVisible && lifecycle.wasVisible) {
332
+ callbacks.onDidHide?.(event);
333
+ }
334
+
335
+ if (lifecycle.isVisible && !lifecycle.wasVisible) {
336
+ callbacks.onDidShow?.(event);
337
+ }
338
+ };
339
+ const setPrimarySidebarLifecycle = (
340
+ activityId: TActivityId,
341
+ isVisible: boolean,
342
+ reason: WorkbenchPrimarySidebarLifecycleReason,
343
+ ) => {
344
+ const lifecycle: WorkbenchPrimarySidebarLifecycle<TActivityId> = {
345
+ activityId,
346
+ previousActivityId: activeActivityId,
347
+ isVisible,
348
+ wasVisible: isPrimarySidebarVisible,
349
+ reason,
350
+ };
351
+ primarySidebarLifecycleRef.current = lifecycle;
352
+ emitPrimarySidebarLifecycle(lifecycle);
353
+ emitActivityLifecycle(lifecycle);
354
+ };
167
355
  const showActivity = (activityId: TActivityId) => {
356
+ setPrimarySidebarLifecycle(
357
+ activityId,
358
+ true,
359
+ activityId === activeActivityId ? 'sidebar-show' : 'activity-switch',
360
+ );
168
361
  shell.showActivity(activityId);
169
362
  emitEvent({ type: 'activity-change', payload: { nextActivityId: activityId } });
170
363
  onActivityActivate?.(
@@ -176,6 +369,18 @@ export function WorkbenchStandaloneShell<
176
369
  );
177
370
  };
178
371
  const activateActivity = (activityId: TActivityId) => {
372
+ const isCurrentActivity = activityId === activeActivityId;
373
+ const nextSidebarVisible = !(isCurrentActivity && isPrimarySidebarVisible);
374
+
375
+ setPrimarySidebarLifecycle(
376
+ activityId,
377
+ nextSidebarVisible,
378
+ nextSidebarVisible
379
+ ? isCurrentActivity
380
+ ? 'sidebar-show'
381
+ : 'activity-switch'
382
+ : 'sidebar-hide',
383
+ );
179
384
  shell.activateActivity(activityId);
180
385
  emitEvent({ type: 'activity-change', payload: { nextActivityId: activityId } });
181
386
  onActivityActivate?.(
@@ -197,19 +402,43 @@ export function WorkbenchStandaloneShell<
197
402
  commandContext: {
198
403
  isPrimarySidebarVisible,
199
404
  openSettings: shell.openSettings,
200
- showActivity: shell.showActivity,
201
- togglePrimarySidebar: shell.togglePrimarySidebar,
405
+ showActivity,
406
+ togglePrimarySidebar: () => {
407
+ const nextSidebarVisible = !isPrimarySidebarVisible;
408
+ setPrimarySidebarLifecycle(
409
+ activeActivityId,
410
+ nextSidebarVisible,
411
+ nextSidebarVisible ? 'sidebar-show' : 'sidebar-hide',
412
+ );
413
+ shell.togglePrimarySidebar();
414
+ },
202
415
  },
203
416
  isPrimarySidebarVisible,
204
417
  isSettingsOpen,
205
- primarySidebarSizePercent,
418
+ primarySidebarLifecycle: primarySidebarLifecycleRef.current,
419
+ primarySidebarSizePx,
206
420
  theme,
207
421
  showActivity,
208
422
  activateActivity,
209
423
  setTheme: shell.setTheme,
210
- setPrimarySidebarSizePercent: shell.setPrimarySidebarSizePercent,
211
- setPrimarySidebarVisible: shell.setPrimarySidebarVisible,
212
- togglePrimarySidebar: shell.togglePrimarySidebar,
424
+ setPrimarySidebarSizePx: shell.setPrimarySidebarSizePx,
425
+ setPrimarySidebarVisible: (isVisible) => {
426
+ setPrimarySidebarLifecycle(
427
+ activeActivityId,
428
+ isVisible,
429
+ isVisible ? 'sidebar-show' : 'sidebar-hide',
430
+ );
431
+ shell.setPrimarySidebarVisible(isVisible);
432
+ },
433
+ togglePrimarySidebar: () => {
434
+ const nextSidebarVisible = !isPrimarySidebarVisible;
435
+ setPrimarySidebarLifecycle(
436
+ activeActivityId,
437
+ nextSidebarVisible,
438
+ nextSidebarVisible ? 'sidebar-show' : 'sidebar-hide',
439
+ );
440
+ shell.togglePrimarySidebar();
441
+ },
213
442
  openSettings: shell.openSettings,
214
443
  closeSettings: shell.closeSettings,
215
444
  setSettingsCategoryId: shell.setSettingsCategoryId,
@@ -224,7 +453,9 @@ export function WorkbenchStandaloneShell<
224
453
  activeActivityId,
225
454
  isPrimarySidebarVisible,
226
455
  isSettingsOpen,
227
- primarySidebarSizePercent,
456
+ primarySidebarSizePx,
457
+ activityLifecycleCallbacks,
458
+ primarySidebarLifecycleCallbacks,
228
459
  theme,
229
460
  ],
230
461
  );
@@ -252,30 +483,59 @@ export function WorkbenchStandaloneShell<
252
483
  [activityItems, activeActivityId],
253
484
  );
254
485
 
486
+ const hasHelpSection = includeHelp && helpItemId !== '';
255
487
  const hasSettingsSection = includeSettings && settingsItemId !== '';
488
+ const secondaryItems = [
489
+ ...(hasHelpSection
490
+ ? [
491
+ {
492
+ id: helpItemId,
493
+ icon: helpItemIcon ?? <i className="codicon codicon-question" />,
494
+ label: helpItemLabel,
495
+ active: isHelpOpen,
496
+ },
497
+ ]
498
+ : []),
499
+ ...(hasSettingsSection
500
+ ? [
501
+ {
502
+ id: settingsItemId,
503
+ icon: settingsItemIcon ?? <i className="codicon codicon-settings-gear" />,
504
+ label: settingsItemLabel,
505
+ active: isSettingsOpen,
506
+ },
507
+ ]
508
+ : []),
509
+ ];
256
510
 
257
511
  const primarySidebarNode = renderPrimarySidebar(context);
258
512
  const secondaryArea = renderSecondaryArea(context);
259
513
  const overlays = renderOverlays?.(context);
514
+ const titleBar = renderTitleBar?.(context);
260
515
 
261
- return (
262
- <WorkspaceDraftsProvider>
516
+ const workbenchShell = (
517
+ <>
518
+ <WorkbenchStandaloneShellStateHost
519
+ context={context}
520
+ onShellStateChange={onShellStateChange}
521
+ />
263
522
  <WorkbenchShell
264
523
  activityBar={{
265
524
  ...activityBar,
266
525
  items: activityBarItems,
267
- secondaryItems: hasSettingsSection
268
- ? [
269
- {
270
- id: settingsItemId,
271
- icon: settingsItemIcon ?? <i className="codicon codicon-settings-gear" />,
272
- label: settingsItemLabel,
273
- active: isSettingsOpen,
274
- },
275
- ]
276
- : [],
526
+ secondaryItems,
277
527
  onContextMenu: (event) => onActivityBarContextMenu?.(event, context),
278
528
  onItemActivate: (item) => {
529
+ if (hasHelpSection && item.id === helpItemId) {
530
+ onHelpActivate?.(context);
531
+ onActivityBarItemActivate?.(item.id, context);
532
+ emitEvent({
533
+ type: 'status-message',
534
+ message: 'Help activated',
535
+ });
536
+ return;
537
+ }
538
+
279
539
  if (item.id === settingsItemId) {
280
540
  shell.openSettings();
281
541
  emitEvent({
@@ -299,10 +559,10 @@ export function WorkbenchStandaloneShell<
299
559
  primarySidebar={{
300
560
  className: primarySidebarClassName,
301
561
  isVisible: isPrimarySidebarVisible,
302
- maxPrimarySizePercent: maxPrimarySidebarSizePercent,
303
- minPrimarySizePercent: minPrimarySidebarSizePercent,
304
- onSizePercentChange: shell.setPrimarySidebarSizePercent,
305
- primarySizePercent: primarySidebarSizePercent,
562
+ maxPrimarySizePx: maxPrimarySidebarSizePx,
563
+ minPrimarySizePx: minPrimarySidebarSizePx,
564
+ onSizePxChange: shell.setPrimarySidebarSizePx,
565
+ primarySizePx: primarySidebarSizePx,
306
566
  node: primarySidebarNode,
307
567
  style: primarySidebarStyle,
308
568
  }}
@@ -310,9 +570,35 @@ export function WorkbenchStandaloneShell<
310
570
  rootStyle={rootStyle}
311
571
  secondaryArea={secondaryArea}
312
572
  statusSections={statusSections}
313
- theme={theme}
573
+ theme={resolvedTheme}
574
+ themePreference={theme}
575
+ themePreset={documentThemePreset}
576
+ shellPreset={shellPreset}
577
+ titleBar={titleBar}
314
578
  overlays={overlays}
315
579
  />
580
+ </>
581
+ );
582
+
583
+ return (
584
+ <WorkspaceDraftsProvider>
585
+ <WorkbenchStandaloneShellReactContextProvider value={context}>
586
+ {renderShellHost ? renderShellHost(context, workbenchShell) : workbenchShell}
587
+ </WorkbenchStandaloneShellReactContextProvider>
316
588
  </WorkspaceDraftsProvider>
317
589
  );
318
590
  }
591
+
592
+ function WorkbenchStandaloneShellStateHost<
593
+ TActivityId extends string,
594
+ TTheme extends WorkbenchTheme,
595
+ >({
596
+ context,
597
+ onShellStateChange,
598
+ }: {
599
+ context: WorkbenchStandaloneShellContext<TActivityId, TTheme>;
600
+ onShellStateChange?: (change: WorkbenchStandaloneShellStateChange<TActivityId, TTheme>) => void;
601
+ }) {
602
+ useWorkbenchStandaloneShellStateSync(context, onShellStateChange);
603
+ return null;
604
+ }
@@ -0,0 +1,142 @@
1
+ import { useEffect, useMemo, type ComponentPropsWithoutRef, type ReactNode } from 'react';
2
+ import './chrome/workbench-host.css';
3
+ import './chrome/workbench-platform-chrome.css';
4
+
5
+ import { WorkbenchPlatformProvider } from './WorkbenchPlatformContext';
6
+ import {
7
+ applyWorkbenchThemeProviderAttributes,
8
+ type WorkbenchThemeProviderAttributes,
9
+ } from './themePresets';
10
+ import type { ResolvedWorkbenchTheme } from './theme';
11
+ import {
12
+ resolveWorkbenchHostPlatform,
13
+ type WorkbenchHostPlatform,
14
+ } from './workbenchPlatformChrome';
15
+
16
+ export interface WorkbenchThemeProviderProps extends Omit<
17
+ ComponentPropsWithoutRef<'div'>,
18
+ 'children'
19
+ > {
20
+ children: ReactNode;
21
+ platform?: WorkbenchHostPlatform | undefined;
22
+ shellPreset?: string | undefined;
23
+ syncDocumentElement?: boolean | undefined;
24
+ theme?: string | undefined;
25
+ themePreset?: string | undefined;
26
+ themePreference?: string | undefined;
27
+ }
28
+
29
+ function toProviderAttributes({
30
+ platform,
31
+ shellPreset,
32
+ theme,
33
+ themePreset,
34
+ themePreference,
35
+ }: Pick<
36
+ WorkbenchThemeProviderProps,
37
+ 'platform' | 'shellPreset' | 'theme' | 'themePreset' | 'themePreference'
38
+ >): WorkbenchThemeProviderAttributes & { platform: WorkbenchHostPlatform } {
39
+ const resolvedPlatform = resolveWorkbenchHostPlatform(platform ?? null);
40
+
41
+ return {
42
+ platform: resolvedPlatform,
43
+ shellPreset,
44
+ theme: (theme ?? 'dark') as ResolvedWorkbenchTheme,
45
+ themePreference,
46
+ themePreset: themePreset ?? undefined,
47
+ };
48
+ }
49
+
50
+ export function WorkbenchThemeProvider({
51
+ children,
52
+ platform,
53
+ shellPreset,
54
+ syncDocumentElement = false,
55
+ theme,
56
+ themePreset,
57
+ themePreference,
58
+ ...props
59
+ }: WorkbenchThemeProviderProps) {
60
+ const attributes = useMemo(
61
+ () =>
62
+ toProviderAttributes({
63
+ platform,
64
+ shellPreset,
65
+ theme,
66
+ themePreset,
67
+ themePreference,
68
+ }),
69
+ [platform, shellPreset, theme, themePreset, themePreference],
70
+ );
71
+
72
+ useEffect(() => {
73
+ if (!syncDocumentElement || theme === undefined || typeof document === 'undefined') {
74
+ return undefined;
75
+ }
76
+
77
+ const rootElement = document.documentElement;
78
+ const previousTheme = rootElement.dataset.theme;
79
+ const previousThemePreset = rootElement.dataset.themePreset;
80
+ const previousShellPreset = rootElement.dataset.shellPreset;
81
+ const previousThemePreference = rootElement.dataset.themePreference;
82
+ const previousPlatform = rootElement.dataset.workbenchPlatform;
83
+
84
+ applyWorkbenchThemeProviderAttributes(rootElement, attributes);
85
+ rootElement.dataset.workbenchPlatform = attributes.platform;
86
+
87
+ return () => {
88
+ if (previousTheme === undefined) {
89
+ delete rootElement.dataset.theme;
90
+ } else {
91
+ rootElement.dataset.theme = previousTheme;
92
+ }
93
+
94
+ if (previousThemePreset === undefined) {
95
+ delete rootElement.dataset.themePreset;
96
+ } else {
97
+ rootElement.dataset.themePreset = previousThemePreset;
98
+ }
99
+
100
+ if (previousShellPreset === undefined) {
101
+ delete rootElement.dataset.shellPreset;
102
+ } else {
103
+ rootElement.dataset.shellPreset = previousShellPreset;
104
+ }
105
+
106
+ if (previousThemePreference === undefined) {
107
+ delete rootElement.dataset.themePreference;
108
+ } else {
109
+ rootElement.dataset.themePreference = previousThemePreference;
110
+ }
111
+
112
+ if (previousPlatform === undefined) {
113
+ delete rootElement.dataset.workbenchPlatform;
114
+ } else {
115
+ rootElement.dataset.workbenchPlatform = previousPlatform;
116
+ }
117
+ };
118
+ }, [
119
+ attributes.platform,
120
+ attributes.shellPreset,
121
+ attributes.theme,
122
+ attributes.themePreference,
123
+ attributes.themePreset,
124
+ syncDocumentElement,
125
+ theme,
126
+ ]);
127
+
128
+ return (
129
+ <WorkbenchPlatformProvider platform={attributes.platform}>
130
+ <div
131
+ {...props}
132
+ data-theme={theme}
133
+ data-theme-preset={themePreset}
134
+ data-shell-preset={shellPreset}
135
+ data-theme-preference={themePreference}
136
+ data-workbench-platform={attributes.platform}
137
+ >
138
+ {children}
139
+ </div>
140
+ </WorkbenchPlatformProvider>
141
+ );
142
+ }