@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
@@ -0,0 +1,156 @@
1
+ .ui-workbench-command-palette-overlay {
2
+ position: fixed;
3
+ inset: 0;
4
+ z-index: 250;
5
+ display: grid;
6
+ align-items: start;
7
+ justify-items: center;
8
+ padding: 7vh 24px 24px;
9
+ background: rgba(0, 0, 0, 0.2);
10
+ }
11
+
12
+ .ui-workbench-command-palette {
13
+ width: min(640px, calc(100vw - 48px));
14
+ max-height: min(560px, calc(100vh - 96px));
15
+ overflow: hidden;
16
+ border: 1px solid var(--color-border);
17
+ border-radius: var(--radius-sm);
18
+ background: var(--color-surface-elevated);
19
+ box-shadow: var(--shadow-lg);
20
+ }
21
+
22
+ .ui-workbench-command-palette__header {
23
+ min-height: 30px;
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: space-between;
27
+ gap: 8px;
28
+ padding: 0 8px 0 12px;
29
+ border-bottom: 1px solid var(--color-border);
30
+ }
31
+
32
+ .ui-workbench-command-palette__title {
33
+ min-width: 0;
34
+ overflow: hidden;
35
+ color: var(--color-text);
36
+ font-size: 11px;
37
+ font-weight: 700;
38
+ letter-spacing: 0.04em;
39
+ line-height: 1.2;
40
+ text-overflow: ellipsis;
41
+ text-transform: uppercase;
42
+ white-space: nowrap;
43
+ }
44
+
45
+ .ui-workbench-command-palette__close {
46
+ --ui-icon-button-width: var(--workbench-command-palette-close-size);
47
+ --ui-icon-button-height: var(--workbench-command-palette-close-size);
48
+ --ui-icon-button-flex-shrink: 0;
49
+ --ui-icon-button-padding: 0;
50
+ --ui-icon-button-border: 0;
51
+ --ui-icon-button-border-radius: var(--radius-sm);
52
+ --ui-icon-button-color: var(--color-text-muted);
53
+ --ui-icon-button-background: transparent;
54
+ --ui-icon-button-hover-color: var(--color-text);
55
+ --ui-icon-button-hover-background: var(--color-surface-hover);
56
+ width: var(--workbench-command-palette-close-size);
57
+ height: var(--workbench-command-palette-close-size);
58
+ display: inline-flex;
59
+ flex-shrink: 0;
60
+ align-items: center;
61
+ justify-content: center;
62
+ padding: 0;
63
+ border: 0;
64
+ border-radius: var(--radius-sm);
65
+ color: var(--color-text-muted);
66
+ background: transparent;
67
+ cursor: pointer;
68
+ }
69
+
70
+ .ui-workbench-command-palette__close:hover,
71
+ .ui-workbench-command-palette__close:focus-visible {
72
+ color: var(--color-text);
73
+ background: var(--color-surface-hover);
74
+ outline: none;
75
+ }
76
+
77
+ .ui-workbench-command-palette__search {
78
+ height: 42px;
79
+ display: grid;
80
+ grid-template-columns: 18px minmax(0, 1fr);
81
+ align-items: center;
82
+ gap: 8px;
83
+ padding: 0 12px;
84
+ border-bottom: 1px solid var(--color-border);
85
+ color: var(--color-text-subtle);
86
+ }
87
+
88
+ .ui-workbench-command-palette__input {
89
+ --ui-input-width: 100%;
90
+ --ui-input-min-width: 0;
91
+ --ui-input-height: var(--workbench-command-palette-input-height);
92
+ --ui-input-padding: 0;
93
+ --ui-input-border: 0;
94
+ --ui-input-color: var(--color-text);
95
+ --ui-input-background: transparent;
96
+ --ui-input-font-family: var(--font-sans);
97
+ --ui-input-font-size: 14px;
98
+ --ui-input-line-height: 1.4;
99
+ --ui-input-focus-border-color: transparent;
100
+ min-width: 0;
101
+ height: var(--workbench-command-palette-input-height);
102
+ padding: 0;
103
+ border: 0;
104
+ color: var(--color-text);
105
+ background: transparent;
106
+ font: 14px/1.4 var(--font-sans);
107
+ }
108
+
109
+ .ui-workbench-command-palette__input:focus {
110
+ outline: none;
111
+ }
112
+
113
+ .ui-workbench-command-palette__input::placeholder {
114
+ color: var(--color-text-subtle);
115
+ }
116
+
117
+ @media (max-width: 640px) {
118
+ .ui-workbench-command-palette-overlay {
119
+ padding: 16px 12px;
120
+ }
121
+
122
+ .ui-workbench-command-palette {
123
+ width: 100%;
124
+ max-height: calc(100vh - 32px);
125
+ }
126
+
127
+ .ui-workbench-command-group-shell {
128
+ grid-template-columns: minmax(0, 1fr);
129
+ }
130
+
131
+ .ui-workbench-command-group-shell__nav {
132
+ max-height: none;
133
+ display: flex;
134
+ overflow-x: auto;
135
+ overflow-y: hidden;
136
+ border-right: 0;
137
+ border-bottom: 1px solid var(--color-border);
138
+ }
139
+
140
+ .ui-workbench-command-group-shell__nav-link {
141
+ flex: 0 0 auto;
142
+ }
143
+
144
+ .ui-workbench-command-group-shell__content {
145
+ max-height: calc(100vh - 220px);
146
+ }
147
+
148
+ .ui-workbench-command-item {
149
+ grid-template-columns: 22px minmax(0, 1fr);
150
+ }
151
+
152
+ .ui-workbench-command-item__meta {
153
+ grid-column: 2;
154
+ justify-content: flex-start;
155
+ }
156
+ }
@@ -17,6 +17,9 @@ export const WORKBENCH_TOGGLE_PRIMARY_SIDEBAR_COMMAND_ID = 'workbench.togglePrim
17
17
  export const WORKBENCH_EDITOR_SAVE_COMMAND_ID = 'editor.save';
18
18
  export const WORKBENCH_EDITOR_DISCARD_CHANGES_COMMAND_ID = 'editor.discardChanges';
19
19
  export const WORKBENCH_EDITOR_COPY_PATH_COMMAND_ID = 'editor.copyPath';
20
+ export const WORKBENCH_EDITOR_TOGGLE_PINNED_COMMAND_ID = 'editor.togglePinned';
21
+ export const WORKBENCH_EDITOR_SPLIT_RIGHT_COMMAND_ID = 'editor.splitRight';
22
+ export const WORKBENCH_EDITOR_SPLIT_DOWN_COMMAND_ID = 'editor.splitDown';
20
23
  export const WORKBENCH_EDITOR_CLOSE_COMMAND_ID = 'editor.close';
21
24
  export const WORKBENCH_EDITOR_CLOSE_OTHERS_COMMAND_ID = 'editor.closeOthers';
22
25
  export const WORKBENCH_EDITOR_CLOSE_ALL_COMMAND_ID = 'editor.closeAll';
@@ -100,8 +103,7 @@ export interface WorkbenchShellCommandPresetOptions<TActivityId extends string =
100
103
  settingsLabel?: string | undefined;
101
104
  sidebarIcon?: string | undefined;
102
105
  commandOverrides?:
103
- | WorkbenchCommandOverrides<WorkbenchShellCommandContext<TActivityId>>
104
- | undefined;
106
+ WorkbenchCommandOverrides<WorkbenchShellCommandContext<TActivityId>> | undefined;
105
107
  }
106
108
 
107
109
  export interface WorkbenchEditorCommandContext {
@@ -112,6 +114,9 @@ export interface WorkbenchEditorCommandContext {
112
114
  canDeletePath: boolean;
113
115
  canDiscardFile: boolean;
114
116
  canSaveFile: boolean;
117
+ canSplitDown: boolean;
118
+ canSplitRight: boolean;
119
+ canTogglePinned: boolean;
115
120
  closeAll: () => void;
116
121
  closeOthers: () => void;
117
122
  closePath: () => void;
@@ -122,7 +127,11 @@ export interface WorkbenchEditorCommandContext {
122
127
  hasMultipleOpenFiles: boolean;
123
128
  hasOpenFiles: boolean;
124
129
  hasUnsavedChanges: boolean;
130
+ isPinned: boolean;
125
131
  saveFile: () => void;
132
+ splitDown: () => void;
133
+ splitRight: () => void;
134
+ togglePinned: () => void;
126
135
  }
127
136
 
128
137
  export interface WorkbenchWorkspaceCommandContext {
@@ -177,6 +186,7 @@ export function createWorkbenchShellCommands<TActivityId extends string>({
177
186
  label: ({ isPrimarySidebarVisible }) =>
178
187
  isPrimarySidebarVisible ? 'Hide primary sidebar' : 'Show primary sidebar',
179
188
  run: ({ togglePrimarySidebar }) => togglePrimarySidebar(),
189
+ title: 'Toggle primary sidebar',
180
190
  });
181
191
  }
182
192
 
@@ -186,6 +196,7 @@ export function createWorkbenchShellCommands<TActivityId extends string>({
186
196
  icon: settingsIcon,
187
197
  label: settingsLabel,
188
198
  run: ({ openSettings }) => openSettings(),
199
+ title: settingsLabel,
189
200
  });
190
201
  }
191
202
 
@@ -264,6 +275,30 @@ export function createWorkbenchEditorCommands({
264
275
  label: 'Copy path',
265
276
  run: ({ copyPath }) => copyPath(),
266
277
  },
278
+ {
279
+ id: WORKBENCH_EDITOR_TOGGLE_PINNED_COMMAND_ID,
280
+ icon: 'codicon-pinned',
281
+ isEnabled: ({ canTogglePinned, filePath }) => Boolean(filePath && canTogglePinned),
282
+ isVisible: ({ canTogglePinned, filePath }) => Boolean(filePath && canTogglePinned),
283
+ label: ({ isPinned }) => (isPinned ? 'Unpin' : 'Pin'),
284
+ run: ({ togglePinned }) => togglePinned(),
285
+ },
286
+ {
287
+ id: WORKBENCH_EDITOR_SPLIT_RIGHT_COMMAND_ID,
288
+ icon: 'codicon-split-horizontal',
289
+ isEnabled: ({ canSplitRight, filePath }) => Boolean(filePath && canSplitRight),
290
+ isVisible: ({ canSplitRight, filePath }) => Boolean(filePath && canSplitRight),
291
+ label: 'Split Right',
292
+ run: ({ splitRight }) => splitRight(),
293
+ },
294
+ {
295
+ id: WORKBENCH_EDITOR_SPLIT_DOWN_COMMAND_ID,
296
+ icon: 'codicon-split-vertical',
297
+ isEnabled: ({ canSplitDown, filePath }) => Boolean(filePath && canSplitDown),
298
+ isVisible: ({ canSplitDown, filePath }) => Boolean(filePath && canSplitDown),
299
+ label: 'Split Down',
300
+ run: ({ splitDown }) => splitDown(),
301
+ },
267
302
  {
268
303
  id: WORKBENCH_EDITOR_CLOSE_COMMAND_ID,
269
304
  icon: 'codicon-close',
@@ -309,10 +344,35 @@ export function createWorkbenchEditorTabListMenuEntries(): CommandMenuEntry<Work
309
344
 
310
345
  export function createWorkbenchEditorTabMenuEntries(): CommandMenuEntry<WorkbenchEditorCommandContext>[] {
311
346
  return [
347
+ commandMenuEntry<WorkbenchEditorCommandContext>(WORKBENCH_EDITOR_TOGGLE_PINNED_COMMAND_ID, {
348
+ surfaces: [WORKBENCH_COMMAND_SURFACE_EDITOR],
349
+ }),
350
+ commandMenuEntry<WorkbenchEditorCommandContext>(WORKBENCH_EDITOR_SPLIT_RIGHT_COMMAND_ID, {
351
+ surfaces: [WORKBENCH_COMMAND_SURFACE_EDITOR],
352
+ }),
353
+ commandMenuEntry<WorkbenchEditorCommandContext>(WORKBENCH_EDITOR_SPLIT_DOWN_COMMAND_ID, {
354
+ surfaces: [WORKBENCH_COMMAND_SURFACE_EDITOR],
355
+ }),
356
+ commandMenuSeparator('tab-layout-separator'),
312
357
  commandMenuEntry<WorkbenchEditorCommandContext>(WORKBENCH_EDITOR_COPY_PATH_COMMAND_ID, {
313
358
  surfaces: [WORKBENCH_COMMAND_SURFACE_EDITOR],
314
359
  }),
315
360
  commandMenuSeparator('tab-file-separator'),
361
+ ...createWorkbenchStandaloneEditorTabMenuEntries(),
362
+ commandMenuSeparator('tab-danger-separator'),
363
+ commandMenuEntry<WorkbenchEditorCommandContext>(WORKBENCH_EDITOR_DELETE_COMMAND_ID, {
364
+ surfaces: [WORKBENCH_COMMAND_SURFACE_EDITOR],
365
+ }),
366
+ ];
367
+ }
368
+
369
+ /**
370
+ * Close-only tab menu entries for chrome hosts that own tab state without pin,
371
+ * split, copy-path, or delete actions (for example `WorkbenchStandaloneShell`
372
+ * secondary areas using `WorkbenchEditorTabs`).
373
+ */
374
+ export function createWorkbenchStandaloneEditorTabMenuEntries(): CommandMenuEntry<WorkbenchEditorCommandContext>[] {
375
+ return [
316
376
  commandMenuEntry<WorkbenchEditorCommandContext>(WORKBENCH_EDITOR_CLOSE_COMMAND_ID, {
317
377
  surfaces: [WORKBENCH_COMMAND_SURFACE_EDITOR],
318
378
  }),
@@ -322,10 +382,6 @@ export function createWorkbenchEditorTabMenuEntries(): CommandMenuEntry<Workbenc
322
382
  commandMenuEntry<WorkbenchEditorCommandContext>(WORKBENCH_EDITOR_CLOSE_ALL_COMMAND_ID, {
323
383
  surfaces: [WORKBENCH_COMMAND_SURFACE_EDITOR],
324
384
  }),
325
- commandMenuSeparator('tab-danger-separator'),
326
- commandMenuEntry<WorkbenchEditorCommandContext>(WORKBENCH_EDITOR_DELETE_COMMAND_ID, {
327
- surfaces: [WORKBENCH_COMMAND_SURFACE_EDITOR],
328
- }),
329
385
  ];
330
386
  }
331
387
 
@@ -0,0 +1,22 @@
1
+ export { normalizeEditorTabReorderIndex } from '../editor-tabs-dnd';
2
+ export {
3
+ createWorkbenchStandaloneEditorTabCommandContext,
4
+ createWorkbenchStandaloneEditorTabContextMenuItems,
5
+ isWorkbenchEditorTabClosable,
6
+ } from '../editorTabContextMenu';
7
+ export type {
8
+ CreateWorkbenchStandaloneEditorTabCommandContextInput,
9
+ WorkbenchStandaloneEditorTabLike,
10
+ } from '../editorTabContextMenu';
11
+ export { useEditorTabsStripDnd } from '../useEditorTabsStripDnd';
12
+ export type {
13
+ UseEditorTabsStripDndOptions,
14
+ UseEditorTabsStripDndResult,
15
+ } from '../useEditorTabsStripDnd';
16
+ export { useWorkbenchEditorTabContextMenu } from '../useWorkbenchEditorTabContextMenu';
17
+ export type {
18
+ UseWorkbenchEditorTabContextMenuOptions,
19
+ UseWorkbenchEditorTabContextMenuResult,
20
+ } from '../useWorkbenchEditorTabContextMenu';
21
+ export { WorkbenchEditorTabs } from '../WorkbenchEditorTabs';
22
+ export type { WorkbenchEditorTabsProps } from '../WorkbenchEditorTabs';
@@ -0,0 +1,162 @@
1
+ import type { EditorTabDropPosition } from '../primitives/workbench-editor';
2
+
3
+ export const EDITOR_TAB_DRAG_DATA_TYPE = 'application/x-workbench-kit-editor-tab' as const;
4
+
5
+ export interface EditorTabDragPayload {
6
+ readonly groupId: string;
7
+ readonly tabId: string;
8
+ }
9
+
10
+ export interface EditorTabDropTarget {
11
+ readonly position: EditorTabDropPosition;
12
+ readonly tabId: string;
13
+ readonly targetIndex: number;
14
+ }
15
+
16
+ interface EditorDropTargetElement {
17
+ getBoundingClientRect(): Pick<DOMRect, 'left' | 'width'>;
18
+ }
19
+
20
+ interface EditorTabLike {
21
+ readonly id: string;
22
+ }
23
+
24
+ export function readEditorTabDragPayload(
25
+ dataTransfer: Pick<DataTransfer, 'getData'>,
26
+ ): EditorTabDragPayload | null {
27
+ try {
28
+ const rawPayload = dataTransfer.getData(EDITOR_TAB_DRAG_DATA_TYPE);
29
+ if (!rawPayload) {
30
+ return null;
31
+ }
32
+
33
+ const payload = JSON.parse(rawPayload) as Partial<EditorTabDragPayload>;
34
+ if (typeof payload.groupId !== 'string' || typeof payload.tabId !== 'string') {
35
+ return null;
36
+ }
37
+
38
+ return {
39
+ groupId: payload.groupId,
40
+ tabId: payload.tabId,
41
+ };
42
+ } catch {
43
+ return null;
44
+ }
45
+ }
46
+
47
+ export function isEditorTabsScrollerEventTarget(target: EventTarget | null): boolean {
48
+ if (!(target instanceof Element)) {
49
+ return false;
50
+ }
51
+
52
+ if (target.closest('.ui-editor-tabs__tab')) {
53
+ return false;
54
+ }
55
+
56
+ return Boolean(target.closest('.ui-editor-tabs__scroller'));
57
+ }
58
+
59
+ export function resolveEditorTabDropTarget<TTab extends EditorTabLike>({
60
+ clientX,
61
+ draggedTab,
62
+ groupId,
63
+ preferredPosition,
64
+ tabs,
65
+ target,
66
+ targetTabId,
67
+ }: {
68
+ readonly clientX: number;
69
+ readonly draggedTab: EditorTabDragPayload;
70
+ readonly groupId: string;
71
+ readonly preferredPosition?: EditorTabDropPosition | undefined;
72
+ readonly tabs: readonly TTab[];
73
+ readonly target: EditorDropTargetElement;
74
+ readonly targetTabId: string;
75
+ }): EditorTabDropTarget | null {
76
+ const targetTabIndex = tabs.findIndex((tab) => tab.id === targetTabId);
77
+ if (targetTabIndex < 0) {
78
+ return null;
79
+ }
80
+
81
+ const position = preferredPosition ?? getEditorTabDropPosition(target, clientX);
82
+ const targetIndex = position === 'after' ? targetTabIndex + 1 : targetTabIndex;
83
+ if (isEditorTabMoveNoop({ draggedTab, groupId, tabs, targetIndex })) {
84
+ return null;
85
+ }
86
+
87
+ return {
88
+ position,
89
+ tabId: targetTabId,
90
+ targetIndex,
91
+ };
92
+ }
93
+
94
+ export function resolveEditorTabStripDropTarget<TTab extends EditorTabLike>({
95
+ draggedTab,
96
+ groupId,
97
+ tabs,
98
+ }: {
99
+ readonly draggedTab: EditorTabDragPayload;
100
+ readonly groupId: string;
101
+ readonly tabs: readonly TTab[];
102
+ }): EditorTabDropTarget | null {
103
+ const lastTab = tabs[tabs.length - 1];
104
+ if (!lastTab) {
105
+ return null;
106
+ }
107
+
108
+ const targetIndex = tabs.length;
109
+ if (isEditorTabMoveNoop({ draggedTab, groupId, tabs, targetIndex })) {
110
+ return null;
111
+ }
112
+
113
+ return {
114
+ position: 'after',
115
+ tabId: lastTab.id,
116
+ targetIndex,
117
+ };
118
+ }
119
+
120
+ export function isEditorTabMoveNoop<TTab extends EditorTabLike>({
121
+ draggedTab,
122
+ groupId,
123
+ tabs,
124
+ targetIndex,
125
+ }: {
126
+ readonly draggedTab: EditorTabDragPayload;
127
+ readonly groupId: string;
128
+ readonly tabs: readonly TTab[];
129
+ readonly targetIndex: number;
130
+ }): boolean {
131
+ if (draggedTab.groupId !== groupId) {
132
+ return false;
133
+ }
134
+
135
+ const sourceIndex = tabs.findIndex((tab) => tab.id === draggedTab.tabId);
136
+ return sourceIndex >= 0 && (targetIndex === sourceIndex || targetIndex === sourceIndex + 1);
137
+ }
138
+
139
+ export function getEditorTabDropPosition(
140
+ target: EditorDropTargetElement,
141
+ clientX: number,
142
+ ): EditorTabDropPosition {
143
+ const rect = target.getBoundingClientRect();
144
+ if (rect.width <= 0) {
145
+ return 'after';
146
+ }
147
+
148
+ return clientX < rect.left + rect.width / 2 ? 'before' : 'after';
149
+ }
150
+
151
+ export function normalizeEditorTabReorderIndex({
152
+ index,
153
+ sourceIndex,
154
+ tabCount,
155
+ }: {
156
+ index: number;
157
+ sourceIndex: number;
158
+ tabCount: number;
159
+ }): number {
160
+ const clampedIndex = Math.max(0, Math.min(index, tabCount));
161
+ return clampedIndex > sourceIndex ? clampedIndex - 1 : clampedIndex;
162
+ }
@@ -0,0 +1,111 @@
1
+ import {
2
+ createCommandRegistry,
3
+ executeCommand,
4
+ resolveCommandMenuItems,
5
+ } from '@workbench-kit/platform';
6
+
7
+ import type { ContextMenuItem } from '../overlay/ContextMenu';
8
+ import {
9
+ WORKBENCH_COMMAND_SURFACE_EDITOR,
10
+ commandMenuItemsToContextMenuItems,
11
+ createWorkbenchEditorCommands,
12
+ createWorkbenchStandaloneEditorTabMenuEntries,
13
+ type WorkbenchEditorCommandContext,
14
+ } from './commands';
15
+
16
+ const editorCommandRegistry = createCommandRegistry(createWorkbenchEditorCommands());
17
+ const standaloneEditorTabMenuEntries = createWorkbenchStandaloneEditorTabMenuEntries();
18
+
19
+ export interface WorkbenchStandaloneEditorTabLike {
20
+ readonly closable?: boolean | undefined;
21
+ readonly id: string;
22
+ }
23
+
24
+ export function isWorkbenchEditorTabClosable(tab: WorkbenchStandaloneEditorTabLike): boolean {
25
+ return tab.closable !== false;
26
+ }
27
+
28
+ export interface CreateWorkbenchStandaloneEditorTabCommandContextInput {
29
+ readonly onClose: (tabId: string) => void;
30
+ readonly onCloseAll?: (() => void) | undefined;
31
+ readonly onCloseOthers?: ((tabId: string) => void) | undefined;
32
+ readonly tabId: string;
33
+ readonly tabs: readonly WorkbenchStandaloneEditorTabLike[];
34
+ }
35
+
36
+ export function createWorkbenchStandaloneEditorTabCommandContext({
37
+ onClose,
38
+ onCloseAll,
39
+ onCloseOthers,
40
+ tabId,
41
+ tabs,
42
+ }: CreateWorkbenchStandaloneEditorTabCommandContextInput): WorkbenchEditorCommandContext {
43
+ const targetTab = tabs.find((tab) => tab.id === tabId);
44
+ const closableTabIds = tabs.filter(isWorkbenchEditorTabClosable).map((tab) => tab.id);
45
+ const otherClosableTabIds = closableTabIds.filter((id) => id !== tabId);
46
+ const canCloseTarget = Boolean(targetTab && isWorkbenchEditorTabClosable(targetTab));
47
+
48
+ return {
49
+ canCloseAll: closableTabIds.length > 0,
50
+ canCloseOthers: otherClosableTabIds.length > 0,
51
+ canClosePath: canCloseTarget,
52
+ canCopyPath: false,
53
+ canDeletePath: false,
54
+ canDiscardFile: false,
55
+ canSaveFile: false,
56
+ canSplitDown: false,
57
+ canSplitRight: false,
58
+ canTogglePinned: false,
59
+ closeAll: () => {
60
+ if (onCloseAll) {
61
+ onCloseAll();
62
+ return;
63
+ }
64
+ for (const id of closableTabIds) {
65
+ onClose(id);
66
+ }
67
+ },
68
+ closeOthers: () => {
69
+ if (onCloseOthers) {
70
+ onCloseOthers(tabId);
71
+ return;
72
+ }
73
+ for (const id of otherClosableTabIds) {
74
+ onClose(id);
75
+ }
76
+ },
77
+ closePath: () => {
78
+ if (canCloseTarget) {
79
+ onClose(tabId);
80
+ }
81
+ },
82
+ copyPath: () => undefined,
83
+ deletePath: () => undefined,
84
+ discardFile: () => undefined,
85
+ filePath: tabId,
86
+ hasMultipleOpenFiles: tabs.length > 1,
87
+ hasOpenFiles: tabs.length > 0,
88
+ hasUnsavedChanges: false,
89
+ isPinned: false,
90
+ saveFile: () => undefined,
91
+ splitDown: () => undefined,
92
+ splitRight: () => undefined,
93
+ togglePinned: () => undefined,
94
+ };
95
+ }
96
+
97
+ export function createWorkbenchStandaloneEditorTabContextMenuItems(
98
+ input: CreateWorkbenchStandaloneEditorTabCommandContextInput,
99
+ ): ContextMenuItem[] {
100
+ const context = createWorkbenchStandaloneEditorTabCommandContext(input);
101
+
102
+ return commandMenuItemsToContextMenuItems(
103
+ resolveCommandMenuItems({
104
+ context,
105
+ entries: standaloneEditorTabMenuEntries,
106
+ registry: editorCommandRegistry,
107
+ surface: WORKBENCH_COMMAND_SURFACE_EDITOR,
108
+ }),
109
+ (commandId) => executeCommand(editorCommandRegistry, commandId, context),
110
+ );
111
+ }
@@ -0,0 +1,64 @@
1
+ import { clearBrowserStorageByPrefixes, type BrowserStorageKind } from '@workbench-kit/platform';
2
+
3
+ export const DEFAULT_WORKBENCH_STORAGE_PREFIX = 'workbench-kit';
4
+
5
+ export const DEFAULT_WORKBENCH_HARD_RESET_CONFIRM_MESSAGE =
6
+ 'Clears persisted workbench browser storage and reloads the page.\n\nContinue?';
7
+
8
+ export interface WorkbenchHardResetOptions {
9
+ /** Storage key prefixes to remove. Defaults to [DEFAULT_WORKBENCH_STORAGE_PREFIX]. */
10
+ storagePrefixes?: readonly string[];
11
+ /** Which browser storages to scan. Defaults to local + session. */
12
+ storageKinds?: readonly BrowserStorageKind[];
13
+ /** When true (default), asks for confirmation before clearing. */
14
+ confirm?: boolean;
15
+ confirmMessage?: string;
16
+ /** Host hook for in-memory caches before storage is cleared. */
17
+ beforeReset?: () => void | Promise<void>;
18
+ /** Reload after reset. Defaults to true. */
19
+ reload?: boolean;
20
+ }
21
+
22
+ function confirmHardReset(message: string): boolean {
23
+ if (typeof globalThis.confirm !== 'function') {
24
+ return true;
25
+ }
26
+
27
+ return globalThis.confirm(message);
28
+ }
29
+
30
+ function reloadHostPage(): void {
31
+ if (typeof globalThis.location?.reload === 'function') {
32
+ globalThis.location.reload();
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Clears browser storage for the configured prefixes and reloads the host page
38
+ * so workbench state rehydrates from defaults.
39
+ */
40
+ export async function performWorkbenchHardReset(
41
+ options: WorkbenchHardResetOptions = {},
42
+ ): Promise<boolean> {
43
+ const {
44
+ storagePrefixes = [DEFAULT_WORKBENCH_STORAGE_PREFIX],
45
+ storageKinds,
46
+ confirm = true,
47
+ confirmMessage = DEFAULT_WORKBENCH_HARD_RESET_CONFIRM_MESSAGE,
48
+ beforeReset,
49
+ reload = true,
50
+ } = options;
51
+
52
+ if (confirm && !confirmHardReset(confirmMessage)) {
53
+ return false;
54
+ }
55
+
56
+ await beforeReset?.();
57
+ clearBrowserStorageByPrefixes(storagePrefixes, { kinds: storageKinds });
58
+
59
+ if (reload) {
60
+ reloadHostPage();
61
+ }
62
+
63
+ return true;
64
+ }