@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,106 @@
1
+ import type { WorkbenchDocument } from './schema';
2
+
3
+ export const DEFAULT_CANVAS_ACTIVITY_ID = 'design' as const;
4
+ export const DEFAULT_CANVAS_THEME = 'dark' as const;
5
+
6
+ export const WORKBENCH_CANVAS_PLACEHOLDER_IMAGE_SRC = `data:image/svg+xml,${encodeURIComponent(
7
+ '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 180"><defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#0f172a"/><stop offset="100%" stop-color="#334155"/></linearGradient></defs><rect width="320" height="180" fill="url(%23g)"/><text x="50%" y="52%" fill="white" font-size="24" text-anchor="middle" font-family="Arial">Image Layer</text></svg>',
8
+ )}`;
9
+
10
+ export const DEFAULT_WORKBENCH_CANVAS_DOCUMENT: WorkbenchDocument = {
11
+ version: '1.0.0',
12
+ schemaVersion: 1,
13
+ pages: [
14
+ {
15
+ id: 'page-shell-canvas',
16
+ name: 'Design',
17
+ width: 1280,
18
+ height: 760,
19
+ background: '#1f2937',
20
+ nodes: [
21
+ {
22
+ id: 'shell-frame',
23
+ type: 'frame',
24
+ name: 'Window',
25
+ layout: { x: 80, y: 60, width: 980, height: 560 },
26
+ style: {
27
+ backgroundColor: '#0f172a',
28
+ borderColor: '#475569',
29
+ borderWidth: 1,
30
+ borderRadius: 12,
31
+ boxShadow: '0 12px 30px rgba(0, 0, 0, 0.45)',
32
+ },
33
+ children: ['tile-1', 'tile-2', 'tile-3'],
34
+ },
35
+ {
36
+ id: 'tile-1',
37
+ type: 'frame',
38
+ name: 'Tile: Header',
39
+ parentId: 'shell-frame',
40
+ layout: { x: 22, y: 18, width: 300, height: 180 },
41
+ style: {
42
+ backgroundColor: '#0ea5e9',
43
+ borderRadius: 10,
44
+ borderColor: '#0284c7',
45
+ borderWidth: 1,
46
+ },
47
+ children: ['tile-1-image', 'tile-1-text'],
48
+ },
49
+ {
50
+ id: 'tile-1-image',
51
+ type: 'image',
52
+ name: 'Image Layer',
53
+ parentId: 'tile-1',
54
+ layout: { x: 12, y: 12, width: 126, height: 90 },
55
+ src: WORKBENCH_CANVAS_PLACEHOLDER_IMAGE_SRC,
56
+ style: {
57
+ borderRadius: 8,
58
+ borderColor: '#0c4a6e',
59
+ borderWidth: 1,
60
+ },
61
+ },
62
+ {
63
+ id: 'tile-1-text',
64
+ type: 'text',
65
+ name: 'Text Layer',
66
+ parentId: 'tile-1',
67
+ layout: { x: 146, y: 36, width: 140, height: 80 },
68
+ content: 'Tile title',
69
+ style: {
70
+ color: '#f8fafc',
71
+ fontSize: 20,
72
+ fontFamily: 'Inter, "Segoe UI", sans-serif',
73
+ fontWeight: 700,
74
+ },
75
+ },
76
+ {
77
+ id: 'tile-2',
78
+ type: 'rectangle',
79
+ name: 'Action Tile',
80
+ parentId: 'shell-frame',
81
+ layout: { x: 336, y: 18, width: 280, height: 180 },
82
+ style: {
83
+ backgroundColor: '#7c3aed',
84
+ borderRadius: 10,
85
+ borderColor: '#6d28d9',
86
+ borderWidth: 1,
87
+ boxShadow: '0 8px 20px rgba(88, 28, 135, 0.45)',
88
+ },
89
+ },
90
+ {
91
+ id: 'tile-3',
92
+ type: 'rectangle',
93
+ name: 'Action Tile 2',
94
+ parentId: 'shell-frame',
95
+ layout: { x: 632, y: 18, width: 280, height: 180 },
96
+ style: {
97
+ backgroundColor: '#f59e0b',
98
+ borderRadius: 10,
99
+ borderColor: '#d97706',
100
+ borderWidth: 1,
101
+ },
102
+ },
103
+ ],
104
+ },
105
+ ],
106
+ };
@@ -0,0 +1,46 @@
1
+ import type { WorkbenchDocumentNode, WorkbenchNodeLayout } from './schema';
2
+
3
+ export interface WorkbenchCanvasLayoutInput {
4
+ readonly height?: string | undefined;
5
+ readonly width?: string | undefined;
6
+ readonly x?: string | undefined;
7
+ readonly y?: string | undefined;
8
+ }
9
+
10
+ export function getWorkbenchCanvasNodeChildren(node: WorkbenchDocumentNode): readonly string[] {
11
+ return 'children' in node ? ((node as { children?: readonly string[] }).children ?? []) : [];
12
+ }
13
+
14
+ export function getWorkbenchCanvasRootNodeIds(nodes: readonly WorkbenchDocumentNode[]): string[] {
15
+ const childIdSet = new Set(nodes.flatMap((node) => getWorkbenchCanvasNodeChildren(node)));
16
+
17
+ return nodes.filter((node) => !node.parentId && !childIdSet.has(node.id)).map((node) => node.id);
18
+ }
19
+
20
+ export function parseWorkbenchCanvasLayoutNumber(value: string | undefined): number | undefined {
21
+ const trimmed = value?.trim() ?? '';
22
+ const numberValue = Number(trimmed);
23
+ if (trimmed === '' || !Number.isFinite(numberValue)) {
24
+ return undefined;
25
+ }
26
+
27
+ return numberValue;
28
+ }
29
+
30
+ export function createWorkbenchCanvasLayoutUpdate(
31
+ currentLayout: WorkbenchNodeLayout | undefined,
32
+ input: WorkbenchCanvasLayoutInput,
33
+ ): Record<string, unknown> {
34
+ const x = parseWorkbenchCanvasLayoutNumber(input.x);
35
+ const y = parseWorkbenchCanvasLayoutNumber(input.y);
36
+ const width = parseWorkbenchCanvasLayoutNumber(input.width);
37
+ const height = parseWorkbenchCanvasLayoutNumber(input.height);
38
+
39
+ return {
40
+ ...(currentLayout ?? {}),
41
+ ...(x !== undefined ? { x } : {}),
42
+ ...(y !== undefined ? { y } : {}),
43
+ ...(width !== undefined ? { width } : {}),
44
+ ...(height !== undefined ? { height } : {}),
45
+ };
46
+ }
@@ -1,9 +1,10 @@
1
1
  import { type CSSProperties, type ReactElement, useEffect, useMemo, useState } from 'react';
2
2
  import { createCommandRegistryFromContributions } from '@workbench-kit/platform';
3
3
  import { integratedShellWorkspaceFiles } from '@workbench-kit/adapters';
4
- import { Button } from '../primitives/Button';
5
- import { TextInput } from '../primitives/TextInput';
6
- import { SideBarViewFrame } from '../layout/SideBarViewFrame';
4
+ import { Button } from '../primitives/button';
5
+ import { TextArea } from '../primitives/text-area';
6
+ import { TextInput } from '../primitives/text-input';
7
+ import { SideBarViewFrame } from '../layout/sidebar';
7
8
  import { createWorkbenchShellCommands } from './commands';
8
9
  import { WorkbenchStandaloneShell } from './WorkbenchStandaloneShell';
9
10
  import type { WorkbenchActivityDescriptor, WorkbenchStandaloneBootstrap } from './standalone';
@@ -19,9 +20,17 @@ import {
19
20
  type WorkbenchDocumentPatchHistoryState,
20
21
  type WorkbenchDocumentPatchResult,
21
22
  } from './schema';
22
-
23
- const DEFAULT_CANVAS_ACTIVITY_ID = 'design';
24
- const DEFAULT_CANVAS_THEME = 'dark';
23
+ import {
24
+ DEFAULT_CANVAS_ACTIVITY_ID,
25
+ DEFAULT_CANVAS_THEME,
26
+ DEFAULT_WORKBENCH_CANVAS_DOCUMENT,
27
+ WORKBENCH_CANVAS_PLACEHOLDER_IMAGE_SRC,
28
+ } from './WorkbenchCanvasShell.defaults';
29
+ import {
30
+ createWorkbenchCanvasLayoutUpdate,
31
+ getWorkbenchCanvasNodeChildren,
32
+ getWorkbenchCanvasRootNodeIds,
33
+ } from './WorkbenchCanvasShell.model';
25
34
 
26
35
  type StudioShellTab = 'source' | 'preview' | 'window' | 'layout' | 'tile' | 'layer';
27
36
 
@@ -32,108 +41,6 @@ type WorkbenchPatchApplyResult = {
32
41
  result: WorkbenchDocumentPatchResult;
33
42
  };
34
43
 
35
- const placeholderImageSrc = `data:image/svg+xml,${encodeURIComponent(
36
- '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 180"><defs><linearGradient id="g" x1="0" y1="0" x2="1" y2="1"><stop offset="0%" stop-color="#0f172a"/><stop offset="100%" stop-color="#334155"/></linearGradient></defs><rect width="320" height="180" fill="url(%23g)"/><text x="50%" y="52%" fill="white" font-size="24" text-anchor="middle" font-family="Arial">Image Layer</text></svg>',
37
- )}`;
38
-
39
- const defaultDocument: WorkbenchDocument = {
40
- version: '1.0.0',
41
- schemaVersion: 1,
42
- pages: [
43
- {
44
- id: 'page-shell-canvas',
45
- name: 'Design',
46
- width: 1280,
47
- height: 760,
48
- background: '#1f2937',
49
- nodes: [
50
- {
51
- id: 'shell-frame',
52
- type: 'frame',
53
- name: 'Window',
54
- layout: { x: 80, y: 60, width: 980, height: 560 },
55
- style: {
56
- backgroundColor: '#0f172a',
57
- borderColor: '#475569',
58
- borderWidth: 1,
59
- borderRadius: 12,
60
- boxShadow: '0 12px 30px rgba(0, 0, 0, 0.45)',
61
- },
62
- children: ['tile-1', 'tile-2', 'tile-3'],
63
- },
64
- {
65
- id: 'tile-1',
66
- type: 'frame',
67
- name: 'Tile: Header',
68
- parentId: 'shell-frame',
69
- layout: { x: 22, y: 18, width: 300, height: 180 },
70
- style: {
71
- backgroundColor: '#0ea5e9',
72
- borderRadius: 10,
73
- borderColor: '#0284c7',
74
- borderWidth: 1,
75
- },
76
- children: ['tile-1-image', 'tile-1-text'],
77
- },
78
- {
79
- id: 'tile-1-image',
80
- type: 'image',
81
- name: 'Image Layer',
82
- parentId: 'tile-1',
83
- layout: { x: 12, y: 12, width: 126, height: 90 },
84
- src: placeholderImageSrc,
85
- style: {
86
- borderRadius: 8,
87
- borderColor: '#0c4a6e',
88
- borderWidth: 1,
89
- },
90
- },
91
- {
92
- id: 'tile-1-text',
93
- type: 'text',
94
- name: 'Text Layer',
95
- parentId: 'tile-1',
96
- layout: { x: 146, y: 36, width: 140, height: 80 },
97
- content: 'Tile title',
98
- style: {
99
- color: '#f8fafc',
100
- fontSize: 20,
101
- fontFamily: 'Inter, "Segoe UI", sans-serif',
102
- fontWeight: 700,
103
- },
104
- },
105
- {
106
- id: 'tile-2',
107
- type: 'rectangle',
108
- name: 'Action Tile',
109
- parentId: 'shell-frame',
110
- layout: { x: 336, y: 18, width: 280, height: 180 },
111
- style: {
112
- backgroundColor: '#7c3aed',
113
- borderRadius: 10,
114
- borderColor: '#6d28d9',
115
- borderWidth: 1,
116
- boxShadow: '0 8px 20px rgba(88, 28, 135, 0.45)',
117
- },
118
- },
119
- {
120
- id: 'tile-3',
121
- type: 'rectangle',
122
- name: 'Action Tile 2',
123
- parentId: 'shell-frame',
124
- layout: { x: 632, y: 18, width: 280, height: 180 },
125
- style: {
126
- backgroundColor: '#f59e0b',
127
- borderRadius: 10,
128
- borderColor: '#d97706',
129
- borderWidth: 1,
130
- },
131
- },
132
- ],
133
- },
134
- ],
135
- };
136
-
137
44
  export interface WorkbenchCanvasShellProps {
138
45
  initialDocument?: WorkbenchDocument;
139
46
  initialTheme?: 'light' | 'dark' | (string & {});
@@ -144,7 +51,7 @@ export interface WorkbenchCanvasShellProps {
144
51
  }
145
52
 
146
53
  export function WorkbenchCanvasShell({
147
- initialDocument = defaultDocument,
54
+ initialDocument = DEFAULT_WORKBENCH_CANVAS_DOCUMENT,
148
55
  initialTheme = DEFAULT_CANVAS_THEME,
149
56
  rootClassName,
150
57
  rootStyle,
@@ -212,18 +119,7 @@ export function WorkbenchCanvasShell({
212
119
  }, [activePage?.nodes]);
213
120
 
214
121
  const rootNodeIds = useMemo(() => {
215
- const childIdSet = new Set(
216
- activePage?.nodes.flatMap((node: WorkbenchDocumentNode) => {
217
- const nodeChildren =
218
- 'children' in node ? (node as { children?: readonly string[] }).children : undefined;
219
- return nodeChildren ?? [];
220
- }) ?? [],
221
- );
222
- return (
223
- activePage?.nodes
224
- .filter((node: WorkbenchDocumentNode) => !node.parentId && !childIdSet.has(node.id))
225
- .map((node: WorkbenchDocumentNode) => node.id) ?? []
226
- );
122
+ return getWorkbenchCanvasRootNodeIds(activePage?.nodes ?? []);
227
123
  }, [activePage?.nodes]);
228
124
 
229
125
  useEffect(() => {
@@ -359,7 +255,7 @@ export function WorkbenchCanvasShell({
359
255
  borderColor: '#94a3b8',
360
256
  borderWidth: 1,
361
257
  },
362
- src: placeholderImageSrc,
258
+ src: WORKBENCH_CANVAS_PLACEHOLDER_IMAGE_SRC,
363
259
  },
364
260
  });
365
261
  return;
@@ -452,22 +348,12 @@ export function WorkbenchCanvasShell({
452
348
  setStatusText('select a node first');
453
349
  return;
454
350
  }
455
- const parseNumber = (value: string) => {
456
- const trimmed = value.trim();
457
- const n = Number(trimmed);
458
- if (trimmed === '' || !Number.isFinite(n)) {
459
- return undefined;
460
- }
461
- return n;
462
- };
463
-
464
- const nextLayout = {
465
- ...(selectedNode.layout ?? {}),
466
- ...(parseNumber(layoutXInput) !== undefined ? { x: parseNumber(layoutXInput) } : {}),
467
- ...(parseNumber(layoutYInput) !== undefined ? { y: parseNumber(layoutYInput) } : {}),
468
- ...(parseNumber(layoutWInput) !== undefined ? { width: parseNumber(layoutWInput) } : {}),
469
- ...(parseNumber(layoutHInput) !== undefined ? { height: parseNumber(layoutHInput) } : {}),
470
- };
351
+ const nextLayout = createWorkbenchCanvasLayoutUpdate(selectedNode.layout, {
352
+ height: layoutHInput,
353
+ width: layoutWInput,
354
+ x: layoutXInput,
355
+ y: layoutYInput,
356
+ });
471
357
 
472
358
  applyAction({
473
359
  action: 'replace-layout',
@@ -555,13 +441,12 @@ export function WorkbenchCanvasShell({
555
441
  return [];
556
442
  }
557
443
 
558
- const children =
559
- 'children' in node ? ((node as { children?: readonly string[] }).children ?? []) : [];
444
+ const children = getWorkbenchCanvasNodeChildren(node);
560
445
  const isSelected = node.id === selectedNodeId;
561
446
  const prefix = `${'\u00a0'.repeat(Math.max(depth - 1, 0) * 2)}${depth > 0 ? '↳ ' : ''}`;
562
447
 
563
448
  const row = (
564
- <button
449
+ <Button
565
450
  key={node.id}
566
451
  onClick={() => selectNode(node.id)}
567
452
  style={{
@@ -592,7 +477,7 @@ export function WorkbenchCanvasShell({
592
477
  {prefix}
593
478
  {node.name}
594
479
  </span>
595
- </button>
480
+ </Button>
596
481
  );
597
482
 
598
483
  return [row, ...children.flatMap((childId: string) => renderNodeRow(childId, depth + 1))];
@@ -656,8 +541,8 @@ export function WorkbenchCanvasShell({
656
541
  <WorkbenchStandaloneShell<StudioShellActivityId>
657
542
  bootstrap={bootstrap}
658
543
  compactStatus={compactStatus}
659
- maxPrimarySidebarSizePercent={44}
660
- minPrimarySidebarSizePercent={18}
544
+ maxPrimarySidebarSizePx={480}
545
+ minPrimarySidebarSizePx={200}
661
546
  getStatusSections={() => [
662
547
  {
663
548
  id: 'main',
@@ -774,13 +659,14 @@ export function WorkbenchCanvasShell({
774
659
  </Button>
775
660
  <span style={{ fontSize: 12, opacity: 0.8 }}>Editing document source</span>
776
661
  </div>
777
- <textarea
662
+ <TextArea
663
+ controlWidth="full"
664
+ resize="none"
778
665
  value={sourceText}
779
666
  onChange={(event) => setSourceText(event.currentTarget.value)}
780
667
  style={{
781
668
  width: '100%',
782
669
  height: '100%',
783
- resize: 'none',
784
670
  background: '#020617',
785
671
  color: '#f8fafc',
786
672
  border: '1px solid rgba(148, 163, 184, 0.3)',
@@ -0,0 +1,126 @@
1
+ import './chrome/workbench-desktop-titlebar.css';
2
+ import type { ReactNode } from 'react';
3
+ import { cx } from '../utils/cx';
4
+ import { useWorkbenchHostPlatform } from './WorkbenchPlatformContext';
5
+ import {
6
+ shouldUseDarwinPlatformChrome,
7
+ WorkbenchWindowChromeControls,
8
+ } from './WorkbenchWindowChromeControls';
9
+ import {
10
+ resolveWorkbenchWindowChromeDataAttributes,
11
+ type WorkbenchWindowChromeMode,
12
+ } from './workbenchPlatformChrome';
13
+
14
+ export interface WorkbenchDesktopWindowControlsProps {
15
+ /** Defaults to `platform` so standalone controls match `WorkbenchDesktopTitleBar`. */
16
+ chrome?: WorkbenchWindowChromeMode | undefined;
17
+ closeLabel?: string | undefined;
18
+ isMaximized: boolean;
19
+ maximizeLabel?: string | undefined;
20
+ minimizeLabel?: string | undefined;
21
+ onClose: () => void;
22
+ onMinimize: () => void;
23
+ onToggleMaximized: () => void;
24
+ restoreLabel?: string | undefined;
25
+ }
26
+
27
+ /**
28
+ * Minimize/maximize/close buttons for a frameless Electron (or similar) window.
29
+ * Pass host IPC callbacks only — kit owns platform chrome markup and placement.
30
+ * Marked `-webkit-app-region: no-drag` in CSS so clicks reach the buttons instead
31
+ * of starting a window drag from the surrounding titlebar.
32
+ */
33
+ export function WorkbenchDesktopWindowControls({
34
+ chrome = 'platform',
35
+ closeLabel = 'Close window',
36
+ isMaximized,
37
+ maximizeLabel = 'Maximize window',
38
+ minimizeLabel = 'Minimize window',
39
+ onClose,
40
+ onMinimize,
41
+ onToggleMaximized,
42
+ restoreLabel = 'Restore window',
43
+ }: WorkbenchDesktopWindowControlsProps) {
44
+ return (
45
+ <WorkbenchWindowChromeControls
46
+ chrome={chrome}
47
+ closeLabel={closeLabel}
48
+ isMaximized={isMaximized}
49
+ maximizeLabel={maximizeLabel}
50
+ minimizeLabel={minimizeLabel}
51
+ restoreLabel={restoreLabel}
52
+ surface="desktop-titlebar"
53
+ onClose={onClose}
54
+ onMinimize={onMinimize}
55
+ onToggleMaximized={onToggleMaximized}
56
+ />
57
+ );
58
+ }
59
+
60
+ export interface WorkbenchDesktopTitleBarProps {
61
+ /** Optional center area, e.g. a command-menu trigger. Omit to leave it empty. */
62
+ centerSlot?: ReactNode | undefined;
63
+ /**
64
+ * `platform` (default): darwin traffic lights / win32 caption buttons via host platform context.
65
+ * `generic`: maximize + close only (modal-like), no OS-specific placement.
66
+ */
67
+ chrome?: WorkbenchWindowChromeMode | undefined;
68
+ className?: string | undefined;
69
+ leading?: ReactNode | undefined;
70
+ trailing?: ReactNode | undefined;
71
+ /**
72
+ * Host-supplied window actions (Electron IPC callbacks). Omit on platforms that keep a native frame.
73
+ * Kit owns chrome markup; the host owns minimize / maximize / close side effects only.
74
+ */
75
+ windowControls?: WorkbenchDesktopWindowControlsProps | undefined;
76
+ }
77
+
78
+ /**
79
+ * Drop-in content for `WorkbenchShellProps.titleBar` when the host window has no native
80
+ * frame (`BrowserWindow({ frame: false })`). The whole bar is `-webkit-app-region: drag`
81
+ * by default; `leading`/`centerSlot`/`trailing` are `no-drag` so their own controls stay
82
+ * clickable.
83
+ */
84
+ export function WorkbenchDesktopTitleBar({
85
+ centerSlot,
86
+ chrome = 'platform',
87
+ className,
88
+ leading,
89
+ trailing,
90
+ windowControls,
91
+ }: WorkbenchDesktopTitleBarProps) {
92
+ const platform = useWorkbenchHostPlatform();
93
+ const useDarwinChrome = shouldUseDarwinPlatformChrome(chrome, platform);
94
+ const chromeAttributes = resolveWorkbenchWindowChromeDataAttributes(chrome);
95
+
96
+ const controls = windowControls ? (
97
+ <WorkbenchWindowChromeControls
98
+ chrome={chrome}
99
+ closeLabel={windowControls.closeLabel ?? 'Close window'}
100
+ isMaximized={windowControls.isMaximized}
101
+ maximizeLabel={windowControls.maximizeLabel ?? 'Maximize window'}
102
+ minimizeLabel={windowControls.minimizeLabel ?? 'Minimize window'}
103
+ restoreLabel={windowControls.restoreLabel ?? 'Restore window'}
104
+ surface="desktop-titlebar"
105
+ onClose={windowControls.onClose}
106
+ onMinimize={windowControls.onMinimize}
107
+ onToggleMaximized={windowControls.onToggleMaximized}
108
+ />
109
+ ) : null;
110
+
111
+ return (
112
+ <div className={cx('ui-workbench-desktop-titlebar', className)} {...(chromeAttributes ?? {})}>
113
+ <div className="ui-workbench-desktop-titlebar__leading">
114
+ {useDarwinChrome ? controls : null}
115
+ {leading}
116
+ </div>
117
+ {centerSlot ? (
118
+ <div className="ui-workbench-desktop-titlebar__center">{centerSlot}</div>
119
+ ) : null}
120
+ <div className="ui-workbench-desktop-titlebar__trailing">
121
+ {trailing}
122
+ {!useDarwinChrome ? controls : null}
123
+ </div>
124
+ </div>
125
+ );
126
+ }
@@ -0,0 +1,52 @@
1
+ import { EditorTabs, type EditorTabsProps } from '../primitives/workbench-editor';
2
+ import { useWorkbenchEditorTabContextMenu } from './useWorkbenchEditorTabContextMenu';
3
+
4
+ export interface WorkbenchEditorTabsProps extends EditorTabsProps {
5
+ /**
6
+ * Optional bulk close. Defaults to calling `onClose` for every closable tab.
7
+ */
8
+ readonly onCloseAll?: (() => void) | undefined;
9
+ /**
10
+ * Optional close-others. Defaults to calling `onClose` for every other closable tab.
11
+ */
12
+ readonly onCloseOthers?: ((tabId: string) => void) | undefined;
13
+ }
14
+
15
+ /**
16
+ * Editor tab strip with a built-in Close / Close others / Close all context menu.
17
+ * Intended for `WorkbenchStandaloneShell` secondary areas that own tab state in the host.
18
+ * Tabs with `closable: false` keep Close disabled and are skipped by Close others / Close all.
19
+ */
20
+ export function WorkbenchEditorTabs({
21
+ onClose,
22
+ onCloseAll,
23
+ onCloseOthers,
24
+ onSelect,
25
+ onTabContextMenu,
26
+ tabs,
27
+ ...props
28
+ }: WorkbenchEditorTabsProps) {
29
+ const tabContextMenu = useWorkbenchEditorTabContextMenu({
30
+ onClose: onClose ?? (() => undefined),
31
+ onCloseAll,
32
+ onCloseOthers,
33
+ onSelectTab: onSelect,
34
+ tabs,
35
+ });
36
+
37
+ return (
38
+ <>
39
+ <EditorTabs
40
+ {...props}
41
+ onClose={onClose}
42
+ onSelect={onSelect}
43
+ onTabContextMenu={(tabId, event) => {
44
+ tabContextMenu.onTabContextMenu(tabId, event);
45
+ onTabContextMenu?.(tabId, event);
46
+ }}
47
+ tabs={tabs}
48
+ />
49
+ {tabContextMenu.contextMenu}
50
+ </>
51
+ );
52
+ }
@@ -0,0 +1,52 @@
1
+ import { useLayoutEffect, useRef, useState, type ReactNode } from 'react';
2
+ import { createPortal } from 'react-dom';
3
+
4
+ import { WORKBENCH_OVERLAYS_CLASS } from '../modal/modalContainer';
5
+ import { useWorkbenchOverlaysContainer } from './workbenchOverlaysContext';
6
+
7
+ export interface WorkbenchModalPortalProps {
8
+ readonly children: ReactNode;
9
+ }
10
+
11
+ type WorkbenchModalPlacement = 'pending' | 'in-place' | 'portal';
12
+
13
+ /**
14
+ * Portals modal chrome into `.ide-workbench-overlays` when the dialog is rendered
15
+ * outside that surface (e.g. via a host state hook). When already mounted inside
16
+ * overlays, children render in place so containment sizing stays correct.
17
+ */
18
+ export function WorkbenchModalPortal({ children }: WorkbenchModalPortalProps): ReactNode {
19
+ const overlaysContainer = useWorkbenchOverlaysContainer();
20
+ const hostRef = useRef<HTMLSpanElement>(null);
21
+ const [placement, setPlacement] = useState<WorkbenchModalPlacement>('pending');
22
+
23
+ useLayoutEffect(() => {
24
+ const host = hostRef.current;
25
+ if (host === null || overlaysContainer === null) {
26
+ setPlacement('pending');
27
+ return;
28
+ }
29
+
30
+ const insideOverlays = host.closest(`.${WORKBENCH_OVERLAYS_CLASS}`) !== null;
31
+ setPlacement(insideOverlays ? 'in-place' : 'portal');
32
+ }, [overlaysContainer]);
33
+
34
+ if (placement === 'portal') {
35
+ return (
36
+ <>
37
+ <span ref={hostRef} aria-hidden className="workbench-modal-portal-host" hidden />
38
+ {createPortal(children, overlaysContainer!)}
39
+ </>
40
+ );
41
+ }
42
+
43
+ if (placement === 'in-place') {
44
+ return (
45
+ <span ref={hostRef} className="workbench-modal-portal-host">
46
+ {children}
47
+ </span>
48
+ );
49
+ }
50
+
51
+ return <span ref={hostRef} aria-hidden className="workbench-modal-portal-host" hidden />;
52
+ }
@@ -0,0 +1,31 @@
1
+ import { createContext, useContext, type ReactNode } from 'react';
2
+
3
+ import {
4
+ resolveWorkbenchHostPlatform,
5
+ type WorkbenchHostPlatform,
6
+ } from './workbenchPlatformChrome';
7
+
8
+ const WorkbenchPlatformContext = createContext<WorkbenchHostPlatform | null>(null);
9
+
10
+ export interface WorkbenchPlatformProviderProps {
11
+ children: ReactNode;
12
+ platform?: WorkbenchHostPlatform | undefined;
13
+ }
14
+
15
+ export function WorkbenchPlatformProvider({
16
+ children,
17
+ platform,
18
+ }: WorkbenchPlatformProviderProps): ReactNode {
19
+ const resolvedPlatform = resolveWorkbenchHostPlatform(platform ?? null);
20
+
21
+ return (
22
+ <WorkbenchPlatformContext.Provider value={resolvedPlatform}>
23
+ {children}
24
+ </WorkbenchPlatformContext.Provider>
25
+ );
26
+ }
27
+
28
+ export function useWorkbenchHostPlatform(): WorkbenchHostPlatform {
29
+ const platformFromContext = useContext(WorkbenchPlatformContext);
30
+ return resolveWorkbenchHostPlatform(platformFromContext);
31
+ }