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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/package.json +31 -23
  2. package/src/brand/TilepaperAppIcon.tsx +181 -0
  3. package/src/brand/index.ts +2 -0
  4. package/src/brand/tilepaper-app-icon-geometry.ts +201 -0
  5. package/src/icons/WorkbenchIcon.tsx +57 -0
  6. package/src/icons/WorkbenchIconContext.tsx +25 -0
  7. package/src/icons/file-icon.ts +154 -0
  8. package/src/icons/index.ts +17 -0
  9. package/src/icons/resolveWorkbenchIcon.ts +48 -0
  10. package/src/icons/types.ts +28 -0
  11. package/src/index.ts +261 -71
  12. package/src/jdw/JdwPreview.tsx +165 -8
  13. package/src/jdw/JdwPreviewViewport.tsx +190 -0
  14. package/src/jdw/JsonCodeEditorPane.tsx +165 -15
  15. package/src/jdw/builtins/renderBuiltinWidgetLeaf.tsx +101 -0
  16. package/src/jdw/createBuiltinJdwRegistry.ts +330 -5
  17. package/src/jdw/cssRenderBackend.tsx +96 -7
  18. package/src/jdw/document.ts +0 -3
  19. package/src/jdw/fixtures/jdw-sample-screens.ts +10 -8
  20. package/src/jdw/index.ts +9 -4
  21. package/src/jdw/jdw-preview-viewport.css +41 -0
  22. package/src/jdw/renderJdw.tsx +49 -8
  23. package/src/json-config/JsonConfigWorkbench.tsx +11 -14
  24. package/src/layout/ViewEmptyState.tsx +14 -0
  25. package/src/layout/WorkbenchCanvas.tsx +113 -6
  26. package/src/layout/WorkbenchLayout.tsx +3 -0
  27. package/src/layout/WorkbenchLayoutBase.tsx +43 -2
  28. package/src/layout/WorkbenchMediaPreviewViewport.tsx +122 -0
  29. package/src/layout/WorkbenchPropertyOverrideLabel.tsx +90 -0
  30. package/src/layout/WorkbenchPropertyPanel.tsx +153 -17
  31. package/src/layout/WorkbenchPropertySearch.tsx +51 -0
  32. package/src/layout/WorkbenchTree.tsx +9 -10
  33. package/src/layout/canvas/canvas-drag-ghost.css +21 -0
  34. package/src/layout/canvas/canvas-drag-preview-frame.css +15 -0
  35. package/src/layout/canvas/canvas-drop-indicator.css +16 -0
  36. package/src/layout/canvas/canvas-frame-handle.css +37 -0
  37. package/src/layout/canvas/canvas-frame-surface.css +24 -0
  38. package/src/layout/canvas/canvas-guide-block.css +17 -0
  39. package/src/layout/canvas/canvas-guide-layer.css +6 -0
  40. package/src/layout/canvas/canvas-guide-line.css +22 -0
  41. package/src/layout/canvas/canvas-item-badge.css +23 -0
  42. package/src/layout/canvas/canvas-item-frame.css +54 -0
  43. package/src/layout/canvas/canvas-pane-surface.css +9 -0
  44. package/src/layout/canvas/canvas-placeholder.css +21 -0
  45. package/src/layout/canvas/canvas-resize-frame.css +9 -0
  46. package/src/layout/canvas/canvas-resize-handle.css +74 -0
  47. package/src/layout/canvas/canvas-resize-preview.css +11 -0
  48. package/src/layout/canvas/canvas-selection-marquee.css +14 -0
  49. package/src/layout/canvas/canvas-viewport.css +18 -0
  50. package/src/layout/canvas/index.css +19 -0
  51. package/src/layout/canvas/preview-canvas.css +144 -0
  52. package/src/layout/editor/editor-body.css +9 -0
  53. package/src/layout/editor/editor-bottom-panel.css +44 -0
  54. package/src/layout/editor/editor-frame.css +14 -0
  55. package/src/layout/editor/editor-viewport.css +7 -0
  56. package/src/layout/editor/floating-menu.css +91 -0
  57. package/src/layout/editor/index.css +10 -0
  58. package/src/layout/editor/parse-error.css +9 -0
  59. package/src/layout/editor/problem-item.css +52 -0
  60. package/src/layout/editor/problem-list.css +7 -0
  61. package/src/layout/editor/render-surface.css +13 -0
  62. package/src/layout/fillScrollContract.ts +49 -0
  63. package/src/layout/fullscreen/fullscreen-backdrop.css +31 -0
  64. package/src/layout/fullscreen/fullscreen-button.css +44 -0
  65. package/src/layout/fullscreen/fullscreen-carousel.css +20 -0
  66. package/src/layout/fullscreen/fullscreen-content.css +8 -0
  67. package/src/layout/fullscreen/fullscreen-empty.css +16 -0
  68. package/src/layout/fullscreen/fullscreen-header.css +77 -0
  69. package/src/layout/fullscreen/fullscreen-hero.css +41 -0
  70. package/src/layout/fullscreen/fullscreen-nav-button.css +29 -0
  71. package/src/layout/fullscreen/fullscreen-option.css +83 -0
  72. package/src/layout/fullscreen/fullscreen-pill-row.css +6 -0
  73. package/src/layout/fullscreen/fullscreen-pill.css +10 -0
  74. package/src/layout/fullscreen/fullscreen-root.css +11 -0
  75. package/src/layout/fullscreen/index.css +13 -0
  76. package/src/layout/index.ts +156 -0
  77. package/src/layout/layout-base/banner.css +32 -0
  78. package/src/layout/layout-base/center.css +7 -0
  79. package/src/layout/layout-base/column.css +7 -0
  80. package/src/layout/layout-base/divider.css +5 -0
  81. package/src/layout/layout-base/empty.css +12 -0
  82. package/src/layout/layout-base/fill-scroll.css +36 -0
  83. package/src/layout/layout-base/fill.css +18 -0
  84. package/src/layout/layout-base/index.css +13 -0
  85. package/src/layout/layout-base/pane.css +6 -0
  86. package/src/layout/layout-base/panel-scroll.css +5 -0
  87. package/src/layout/layout-base/panel-surface.css +14 -0
  88. package/src/layout/layout-base/root.css +9 -0
  89. package/src/layout/layout-base/section-title.css +8 -0
  90. package/src/layout/layout.css +10 -0
  91. package/src/layout/layoutHelpers.ts +4 -2
  92. package/src/layout/media/index.css +2 -0
  93. package/src/layout/media/media-preview-viewport.css +69 -0
  94. package/src/layout/{Panel.tsx → panel/Panel.tsx} +29 -40
  95. package/src/layout/panel/TemplateGallery.tsx +90 -0
  96. package/src/layout/panel/WorkbenchAuthoringShell.tsx +57 -0
  97. package/src/layout/panel/WorkbenchLabeledPane.tsx +81 -0
  98. package/src/layout/panel/WorkbenchSidebarStack.tsx +15 -0
  99. package/src/layout/panel/filter-bar.css +59 -0
  100. package/src/layout/panel/index.css +7 -0
  101. package/src/layout/panel/index.ts +70 -0
  102. package/src/layout/panel/preview-pane.css +63 -0
  103. package/src/layout/panel/template-gallery.css +131 -0
  104. package/src/layout/panel/workbench-authoring-shell.css +48 -0
  105. package/src/layout/panel/workbench-labeled-pane.css +69 -0
  106. package/src/layout/panel/workbench-sidebar-stack.css +18 -0
  107. package/src/layout/property/color-input.css +8 -0
  108. package/src/layout/property/color-row.css +6 -0
  109. package/src/layout/property/index.css +15 -0
  110. package/src/layout/property/property-card.css +8 -0
  111. package/src/layout/property/property-grid.css +24 -0
  112. package/src/layout/property/property-hint.css +4 -0
  113. package/src/layout/property/property-inline.css +10 -0
  114. package/src/layout/property/property-key-value.css +29 -0
  115. package/src/layout/property/property-override-label.css +34 -0
  116. package/src/layout/property/property-panel.css +20 -0
  117. package/src/layout/property/property-row.css +17 -0
  118. package/src/layout/property/property-search.css +43 -0
  119. package/src/layout/property/property-section.css +97 -0
  120. package/src/layout/property/property-stack.css +11 -0
  121. package/src/layout/property/property-toggle.css +14 -0
  122. package/src/layout/propertyFieldFilter.ts +84 -0
  123. package/src/layout/sidebar/SideBarViewFrame.tsx +235 -0
  124. package/src/layout/sidebar/SideBarViewTabStrip.tsx +60 -0
  125. package/src/layout/sidebar/SideBarViewTitleMenu.tsx +75 -0
  126. package/src/layout/sidebar/SidebarActionIconBar.tsx +242 -0
  127. package/src/layout/sidebar/SidebarSectionNestingContext.tsx +21 -0
  128. package/src/layout/sidebar/SidebarSlotChrome.tsx +32 -0
  129. package/src/layout/sidebar/SidebarToolbar.tsx +10 -0
  130. package/src/layout/sidebar/WorkbenchActionSidebar.tsx +73 -0
  131. package/src/layout/{WorkbenchSidebarActions.tsx → sidebar/WorkbenchSidebarActions.tsx} +105 -51
  132. package/src/layout/sidebar/WorkbenchSidebarSectionStack.tsx +165 -0
  133. package/src/layout/sidebar/index.css +5 -0
  134. package/src/layout/sidebar/index.ts +55 -0
  135. package/src/layout/sidebar/sidebar-chrome.css +95 -0
  136. package/src/layout/sidebar/sidebar-section-stack.css +25 -0
  137. package/src/layout/sidebar/sidebar-section.css +124 -0
  138. package/src/layout/sidebar/sidebar-view.css +290 -0
  139. package/src/layout/tree/drag-preview.css +25 -0
  140. package/src/layout/tree/index.css +10 -0
  141. package/src/layout/tree/template-glyph.css +96 -0
  142. package/src/layout/tree/tree-action.css +20 -0
  143. package/src/layout/tree/tree-drag-overlay.css +13 -0
  144. package/src/layout/tree/tree-drop-line.css +17 -0
  145. package/src/layout/tree/tree-drop-zone.css +13 -0
  146. package/src/layout/tree/tree-expander.css +23 -0
  147. package/src/layout/tree/tree-item.css +93 -0
  148. package/src/layout/tree/tree.css +49 -0
  149. package/src/layout/usePreviewViewport.ts +428 -0
  150. package/src/modal/ConfirmDialog.tsx +1 -1
  151. package/src/modal/Modal.tsx +148 -305
  152. package/src/modal/ModalResizeHandles.tsx +40 -0
  153. package/src/modal/ModalTitlebar.tsx +86 -0
  154. package/src/modal/modal.css +291 -0
  155. package/src/modal/modalContainer.ts +36 -0
  156. package/src/modal/modalPosition.ts +36 -0
  157. package/src/modal/modalSize.ts +84 -0
  158. package/src/modal/modalTypes.ts +13 -0
  159. package/src/modal/useModalContainerViewport.ts +41 -0
  160. package/src/modal/useModalDrag.ts +118 -0
  161. package/src/modal/useModalResize.ts +122 -0
  162. package/src/modal/useModalWindowFrame.ts +122 -0
  163. package/src/overlay/ContextMenu.tsx +28 -50
  164. package/src/overlay/clampFixedOverlayPosition.ts +22 -0
  165. package/src/overlay/context-menu.css +127 -0
  166. package/src/overlay/index.ts +31 -0
  167. package/src/overlay/measureAnchoredOverlayPanel.ts +107 -0
  168. package/src/overlay/overlay.css +2 -0
  169. package/src/overlay/pointerPassthroughRegion.ts +83 -0
  170. package/src/overlay/useAnchoredOverlayPanel.ts +222 -0
  171. package/src/overlay/useClampedFixedOverlayPosition.ts +27 -0
  172. package/src/overlay/useContextMenuState.ts +59 -0
  173. package/src/overlay/useFixedOverlayDismiss.ts +49 -0
  174. package/src/overlay/usePointerPassthroughRegion.ts +85 -0
  175. package/src/primitives/{AbsoluteBox.tsx → absolute-box/AbsoluteBox.tsx} +1 -1
  176. package/src/primitives/absolute-box/index.ts +1 -0
  177. package/src/primitives/{Badge.tsx → badge/Badge.tsx} +4 -2
  178. package/src/primitives/badge/badge.css +20 -0
  179. package/src/primitives/badge/index.ts +1 -0
  180. package/src/primitives/{Button.tsx → button/Button.tsx} +3 -2
  181. package/src/primitives/button/button.css +76 -0
  182. package/src/primitives/button/index.ts +1 -0
  183. package/src/primitives/catalog-browse-card/CatalogBrowseCard.tsx +121 -0
  184. package/src/primitives/catalog-browse-card/catalog-browse-card.css +175 -0
  185. package/src/primitives/catalog-browse-card/index.ts +1 -0
  186. package/src/primitives/catalog-browse-pane/CatalogBrowseFacetChips.tsx +59 -0
  187. package/src/primitives/catalog-browse-pane/CatalogBrowsePane.tsx +360 -0
  188. package/src/primitives/catalog-browse-pane/catalog-browse-facet-chips.css +8 -0
  189. package/src/primitives/catalog-browse-pane/catalog-browse-pane.css +84 -0
  190. package/src/primitives/catalog-browse-pane/filterCatalogBrowseItems.ts +27 -0
  191. package/src/primitives/catalog-browse-pane/index.ts +3 -0
  192. package/src/primitives/catalog-filter-overlay/CatalogFilterOverlay.tsx +73 -0
  193. package/src/primitives/catalog-filter-overlay/catalog-filter-overlay.css +65 -0
  194. package/src/primitives/catalog-filter-overlay/index.ts +1 -0
  195. package/src/primitives/checkbox/Checkbox.tsx +40 -0
  196. package/src/primitives/checkbox/checkbox.css +81 -0
  197. package/src/primitives/checkbox/index.ts +1 -0
  198. package/src/primitives/chip/Chip.tsx +43 -0
  199. package/src/primitives/chip/chip.css +110 -0
  200. package/src/primitives/chip/index.ts +2 -0
  201. package/src/primitives/clearable-text-input/ClearableTextInput.tsx +78 -0
  202. package/src/primitives/clearable-text-input/clearable-text-input.css +15 -0
  203. package/src/primitives/clearable-text-input/index.ts +1 -0
  204. package/src/primitives/codicon/Codicon.tsx +20 -0
  205. package/src/primitives/codicon/index.ts +1 -0
  206. package/src/primitives/{EmptyState.tsx → empty-state/EmptyState.tsx} +9 -3
  207. package/src/primitives/empty-state/empty-state.css +20 -0
  208. package/src/primitives/empty-state/index.ts +1 -0
  209. package/src/primitives/external-link-button/ExternalLinkButton.tsx +56 -0
  210. package/src/primitives/external-link-button/index.ts +1 -0
  211. package/src/primitives/{Field.tsx → field/Field.tsx} +2 -1
  212. package/src/primitives/field/field.css +51 -0
  213. package/src/primitives/field/index.ts +1 -0
  214. package/src/primitives/file-icon/FileIcon.tsx +21 -0
  215. package/src/primitives/file-icon/index.ts +1 -0
  216. package/src/primitives/{IconButton.tsx → icon-button/IconButton.tsx} +6 -4
  217. package/src/primitives/icon-button/icon-button.css +46 -0
  218. package/src/primitives/icon-button/index.ts +1 -0
  219. package/src/primitives/index.ts +210 -50
  220. package/src/primitives/library-detail-layout/LibraryDetailLayout.tsx +135 -0
  221. package/src/primitives/library-detail-layout/index.ts +1 -0
  222. package/src/primitives/library-detail-layout/library-detail-layout.css +169 -0
  223. package/src/primitives/library-facet-filter-panel/LibraryFacetFilterPanel.tsx +454 -0
  224. package/src/primitives/library-facet-filter-panel/index.ts +1 -0
  225. package/src/primitives/library-facet-filter-panel/library-facet-filter-panel.css +205 -0
  226. package/src/primitives/library-facet-filter-strip/LibraryFacetFilterStrip.tsx +527 -0
  227. package/src/primitives/library-facet-filter-strip/index.ts +1 -0
  228. package/src/primitives/library-facet-filter-strip/library-facet-filter-strip.css +31 -0
  229. package/src/primitives/{List.tsx → list/List.tsx} +15 -6
  230. package/src/primitives/list/index.ts +1 -0
  231. package/src/primitives/list/list-empty-state.css +10 -0
  232. package/src/primitives/list/list-item.css +93 -0
  233. package/src/primitives/list/list.css +6 -0
  234. package/src/primitives/number-input/NumberInput.tsx +235 -0
  235. package/src/primitives/number-input/index.ts +1 -0
  236. package/src/primitives/number-input/number-input.css +105 -0
  237. package/src/primitives/panel-loading/PanelLoading.tsx +29 -0
  238. package/src/primitives/panel-loading/index.ts +1 -0
  239. package/src/primitives/panel-loading/panel-loading.css +16 -0
  240. package/src/primitives/panel-surface/panel-surface.css +77 -0
  241. package/src/primitives/primitives.css +36 -0
  242. package/src/primitives/record-media-hero/RecordMediaHero.tsx +81 -0
  243. package/src/primitives/record-media-hero/index.ts +1 -0
  244. package/src/primitives/record-media-hero/record-media-hero.css +84 -0
  245. package/src/primitives/scroll-area/ScrollArea.tsx +200 -0
  246. package/src/primitives/scroll-area/index.ts +1 -0
  247. package/src/primitives/scroll-area/scroll-area-overlay.css +69 -0
  248. package/src/primitives/scroll-area-infinite-load/ScrollAreaInfiniteSentinel.tsx +22 -0
  249. package/src/primitives/scroll-area-infinite-load/index.ts +2 -0
  250. package/src/primitives/scroll-area-infinite-load/scroll-area-infinite-sentinel.css +6 -0
  251. package/src/primitives/scroll-area-infinite-load/useScrollAreaInfiniteLoad.ts +84 -0
  252. package/src/primitives/searchable-multi-select/SearchableMultiSelect.tsx +378 -0
  253. package/src/primitives/searchable-multi-select/index.ts +9 -0
  254. package/src/primitives/searchable-multi-select/overlay.ts +125 -0
  255. package/src/primitives/searchable-multi-select/searchable-multi-select.css +129 -0
  256. package/src/primitives/select/Select.tsx +21 -3
  257. package/src/primitives/select/overlay.ts +23 -4
  258. package/src/primitives/select/select.app.css +5 -2
  259. package/src/primitives/select/select.css +49 -12
  260. package/src/primitives/styles.css +3 -952
  261. package/src/primitives/tabbed-panels/TabbedPanels.tsx +68 -0
  262. package/src/primitives/tabbed-panels/index.ts +2 -0
  263. package/src/primitives/tabbed-panels/tabbed-panels.css +58 -0
  264. package/src/primitives/{TextArea.tsx → text-area/TextArea.tsx} +2 -1
  265. package/src/primitives/text-area/index.ts +1 -0
  266. package/src/primitives/{TextInput.tsx → text-input/TextInput.tsx} +2 -1
  267. package/src/primitives/text-input/index.ts +1 -0
  268. package/src/primitives/text-input/input.css +54 -0
  269. package/src/primitives/{Toolbar.tsx → toolbar/Toolbar.tsx} +1 -1
  270. package/src/primitives/toolbar/index.ts +1 -0
  271. package/src/primitives/visually-hidden/visually-hidden.css +11 -0
  272. package/src/primitives/{WorkbenchEditor.tsx → workbench-editor/WorkbenchEditor.tsx} +81 -43
  273. package/src/primitives/workbench-editor/button-group.css +10 -0
  274. package/src/primitives/workbench-editor/editor-tabs.css +201 -0
  275. package/src/primitives/workbench-editor/index.ts +1 -0
  276. package/src/primitives/workbench-editor/resizable-panels.css +53 -0
  277. package/src/primitives/workbench-editor/segmented-control.css +98 -0
  278. package/src/primitives/workbench-media-slot/WorkbenchMediaPlaceholder.tsx +25 -0
  279. package/src/primitives/workbench-media-slot/WorkbenchMediaSlot.tsx +60 -0
  280. package/src/primitives/workbench-media-slot/index.ts +2 -0
  281. package/src/primitives/workbench-media-slot/media-slot.css +72 -0
  282. package/src/primitives/workbench-thumbnail/WorkbenchThumbnail.tsx +38 -0
  283. package/src/primitives/workbench-thumbnail/index.ts +1 -0
  284. package/src/primitives/workbench-thumbnail/thumbnail.css +69 -0
  285. package/src/scrollbars.css +77 -2
  286. package/src/styles.css +14 -7735
  287. package/src/test-utils/workbenchMonacoMock.tsx +37 -0
  288. package/src/utils/dragMime.ts +89 -0
  289. package/src/utils/useWorkbenchMediaImage.ts +37 -0
  290. package/src/widget-asset/WidgetAssetEditor.tsx +9 -7
  291. package/src/widget-asset/WidgetAssetModeControls.tsx +1 -1
  292. package/src/widget-asset/WidgetAssetWorkbench.tsx +5 -6
  293. package/src/widget-studio/create-widget-studio-workspace-editor.tsx +1 -2
  294. package/src/widget-studio/index.ts +4 -1
  295. package/src/widget-studio/resolve-widget-studio-asset-catalog.ts +27 -10
  296. package/src/widget-tree/WidgetAssetPalette.tsx +35 -7
  297. package/src/widget-tree/WidgetInspectorPanel.tsx +53 -3
  298. package/src/widget-tree/WidgetSourceEditor.tsx +90 -3
  299. package/src/widget-tree/WidgetTreeCanvasPreview.tsx +875 -0
  300. package/src/widget-tree/WidgetTreeLab.tsx +411 -83
  301. package/src/widget-tree/WidgetTreeModeControls.tsx +30 -1
  302. package/src/widget-tree/WidgetTreeSidePanel.tsx +24 -34
  303. package/src/widget-tree/WidgetTreeView.tsx +711 -11
  304. package/src/widget-tree/WidgetTreeWorkbench.tsx +59 -15
  305. package/src/widget-tree/WidgetTreeWorkspaceShell.tsx +26 -8
  306. package/src/widget-tree/index.ts +22 -4
  307. package/src/widget-tree/widget-placement-asset-dnd.ts +35 -0
  308. package/src/widget-tree/widget-tree-document.ts +3 -9
  309. package/src/widget-tree/widget-tree-editor-state.ts +40 -0
  310. package/src/widget-tree/widget-tree-layout.ts +48 -3
  311. package/src/widget-tree/widget-tree-play-helpers.ts +69 -58
  312. package/src/workbench/ActivityBar.tsx +128 -21
  313. package/src/workbench/ArtifactShell.tsx +8 -8
  314. package/src/workbench/CommandGroupShell.tsx +131 -0
  315. package/src/workbench/CommandList.tsx +167 -0
  316. package/src/workbench/CommandPalette.tsx +194 -596
  317. package/src/workbench/ConfirmationFlow.tsx +3 -5
  318. package/src/workbench/MarkdownPreview.tsx +8 -12
  319. package/src/workbench/ShortcutCommandBridge.tsx +1 -4
  320. package/src/workbench/SplitView.tsx +385 -36
  321. package/src/workbench/StatusBar.tsx +4 -2
  322. package/src/workbench/StructuredArtifactEditor.tsx +3 -3
  323. package/src/workbench/Timeline.tsx +2 -7
  324. package/src/workbench/WorkbenchCanvasShell.defaults.ts +106 -0
  325. package/src/workbench/WorkbenchCanvasShell.model.ts +46 -0
  326. package/src/workbench/WorkbenchCanvasShell.tsx +32 -146
  327. package/src/workbench/WorkbenchDesktopTitleBar.tsx +126 -0
  328. package/src/workbench/WorkbenchEditorTabs.tsx +52 -0
  329. package/src/workbench/WorkbenchModalPortal.tsx +52 -0
  330. package/src/workbench/WorkbenchPlatformContext.tsx +31 -0
  331. package/src/workbench/WorkbenchShell.tsx +144 -26
  332. package/src/workbench/WorkbenchShellTitleBarLayoutControls.tsx +80 -0
  333. package/src/workbench/WorkbenchStandaloneShell.tsx +327 -41
  334. package/src/workbench/WorkbenchThemeProvider.tsx +142 -0
  335. package/src/workbench/WorkbenchViewEditor.tsx +75 -0
  336. package/src/workbench/WorkbenchViewSidebar.tsx +85 -0
  337. package/src/workbench/WorkbenchWindowChromeControls.tsx +290 -0
  338. package/src/workbench/activityBarOrder.ts +98 -0
  339. package/src/workbench/appearanceLabels.ts +28 -0
  340. package/src/workbench/auth/WorkbenchLoginView.tsx +4 -6
  341. package/src/workbench/auth/auth-flows.css +440 -0
  342. package/src/workbench/auth/auth.css +3 -0
  343. package/src/workbench/auth/profile-modals.css +115 -0
  344. package/src/workbench/bootstrap/WorkbenchBootstrapGate.tsx +45 -0
  345. package/src/workbench/bootstrap/WorkbenchBootstrapView.tsx +100 -0
  346. package/src/workbench/bootstrap/index.ts +12 -0
  347. package/src/workbench/bootstrap/useWorkbenchBootstrap.ts +130 -0
  348. package/src/workbench/chat/ChatCommandProposalCard.tsx +115 -0
  349. package/src/workbench/chat/ChatComposer.tsx +32 -34
  350. package/src/workbench/chat/ChatConversationBar.tsx +134 -0
  351. package/src/workbench/chat/ChatHistoryMenu.tsx +171 -0
  352. package/src/workbench/chat/ChatHistoryMenuRow.tsx +74 -0
  353. package/src/workbench/chat/ChatMessageCollapsible.tsx +115 -0
  354. package/src/workbench/chat/ChatMessageItem.tsx +293 -19
  355. package/src/workbench/chat/ChatMessageList.tsx +109 -24
  356. package/src/workbench/chat/ChatPanel.tsx +132 -19
  357. package/src/workbench/chat/ChatPhasedRunProgress.tsx +202 -0
  358. package/src/workbench/chat/ChatRenameDialog.tsx +77 -0
  359. package/src/workbench/chat/chat-conversation.css +273 -0
  360. package/src/workbench/chat/chat-ui.css +1124 -0
  361. package/src/workbench/chat/chat.css +3 -0
  362. package/src/workbench/chat/chatConversation.ts +46 -0
  363. package/src/workbench/chat/chatHistoryRowMenuItems.ts +29 -0
  364. package/src/workbench/chat/chatMessageMeta.tsx +252 -0
  365. package/src/workbench/chat/chatScroll.ts +22 -0
  366. package/src/workbench/chat/index.ts +47 -1
  367. package/src/workbench/chat/slashCommand.ts +5 -7
  368. package/src/workbench/chat/types.ts +35 -0
  369. package/src/workbench/chat/useCancelRuntimeOnUnmount.ts +60 -0
  370. package/src/workbench/chat/useChatPrependPagination.ts +233 -0
  371. package/src/workbench/chat/useChatRuntimeState.ts +3 -15
  372. package/src/workbench/chat/useSlashCommandSuggest.ts +76 -23
  373. package/src/workbench/chrome/index.css +6 -0
  374. package/src/workbench/chrome/workbench-desktop-titlebar.css +60 -0
  375. package/src/workbench/chrome/workbench-host.css +85 -0
  376. package/src/workbench/chrome/workbench-layout-regions.css +42 -0
  377. package/src/workbench/chrome/workbench-platform-chrome.css +142 -0
  378. package/src/workbench/chrome/workbench-shell-titlebar.css +124 -0
  379. package/src/workbench/command-execution-policy.ts +61 -0
  380. package/src/workbench/command-model.ts +275 -0
  381. package/src/workbench/command-palette/command-palette.css +156 -0
  382. package/src/workbench/commands.ts +62 -6
  383. package/src/workbench/editor-tabs/index.ts +22 -0
  384. package/src/workbench/editor-tabs-dnd.ts +162 -0
  385. package/src/workbench/editorTabContextMenu.ts +111 -0
  386. package/src/workbench/hardReset.ts +64 -0
  387. package/src/workbench/index.ts +234 -2
  388. package/src/workbench/jdw/jdw-editors.css +4 -0
  389. package/src/workbench/jdw/jdw.css +2 -0
  390. package/src/workbench/management/AccountManagementPanel.tsx +82 -0
  391. package/src/workbench/management/CommandInspectorPanel.tsx +127 -0
  392. package/src/workbench/management/CommandManagementPanel.tsx +129 -0
  393. package/src/workbench/management/CommandManagementSidebar.tsx +318 -0
  394. package/src/workbench/management/ExtensionManagementPanel.tsx +498 -0
  395. package/src/workbench/management/ExtensionManagementSidebar.tsx +492 -0
  396. package/src/workbench/management/IntegrationCommandActions.tsx +78 -0
  397. package/src/workbench/management/IntegrationSettingsSurface.tsx +290 -0
  398. package/src/workbench/management/IntegrationsShell.tsx +53 -0
  399. package/src/workbench/management/KeybindingCaptureField.tsx +142 -0
  400. package/src/workbench/management/KeybindingManagementPanel.tsx +120 -0
  401. package/src/workbench/management/LibraryCatalogPickerDialog.tsx +208 -0
  402. package/src/workbench/management/LibraryFacetFilterDialog.tsx +62 -0
  403. package/src/workbench/management/ManagementCard.tsx +89 -0
  404. package/src/workbench/management/ManagementFilterChips.tsx +41 -0
  405. package/src/workbench/management/ManagementGroup.tsx +56 -0
  406. package/src/workbench/management/ManagementPanelControls.tsx +43 -0
  407. package/src/workbench/management/ManagementPanelFrame.tsx +109 -0
  408. package/src/workbench/management/WorkbenchDialogFrame.tsx +148 -0
  409. package/src/workbench/management/WorkbenchNotice.tsx +211 -0
  410. package/src/workbench/management/build-command-management-groups.ts +157 -0
  411. package/src/workbench/management/command-inspector-uri.ts +26 -0
  412. package/src/workbench/management/extension-category-display.ts +42 -0
  413. package/src/workbench/management/format-command-run-state.ts +19 -0
  414. package/src/workbench/management/index.ts +130 -0
  415. package/src/workbench/management/integration-command-action.ts +25 -0
  416. package/src/workbench/management/library-catalog-picker-dialog.css +56 -0
  417. package/src/workbench/management/library-facet-filter-dialog.css +8 -0
  418. package/src/workbench/management/management-panel.css +444 -0
  419. package/src/workbench/management/management.css +4 -0
  420. package/src/workbench/management/types.ts +126 -0
  421. package/src/workbench/markdownRemarkPlugins.ts +4 -0
  422. package/src/workbench/schema/index.ts +0 -1
  423. package/src/workbench/settings/NavigationPanel.tsx +41 -2
  424. package/src/workbench/settings/SchemaForm.tsx +20 -7
  425. package/src/workbench/settings/SectionTabPanel.tsx +172 -0
  426. package/src/workbench/settings/SectionedPanel.tsx +40 -286
  427. package/src/workbench/settings/StructuredDataForm.tsx +106 -26
  428. package/src/workbench/settings/StructuredDataSchemaPanel.tsx +345 -93
  429. package/src/workbench/settings/StructuredDataTableView.tsx +2 -2
  430. package/src/workbench/settings/WorkbenchPanelRegion.tsx +1 -1
  431. package/src/workbench/settings/WorkbenchSettingsModal.tsx +116 -62
  432. package/src/workbench/settings/WorkbenchSettingsNav.tsx +3 -3
  433. package/src/workbench/settings/extensionSettingsForm.ts +34 -0
  434. package/src/workbench/settings/index.ts +36 -1
  435. package/src/workbench/settings/navigation-panel.css +59 -0
  436. package/src/workbench/settings/panel-region.css +3 -2
  437. package/src/workbench/settings/schema-form.css +36 -0
  438. package/src/workbench/settings/schemaFormSettingSpec.ts +177 -0
  439. package/src/workbench/settings/schemaFormSettingsCategory.tsx +21 -0
  440. package/src/workbench/settings/section-tab-panel.css +157 -0
  441. package/src/workbench/settings/sectionScrollSpyDom.ts +139 -0
  442. package/src/workbench/settings/sectioned-panel.css +162 -0
  443. package/src/workbench/settings/sectionedPanelScrollSpy.ts +158 -28
  444. package/src/workbench/settings/settings-responsive.css +58 -0
  445. package/src/workbench/settings/settings.css +11 -0
  446. package/src/workbench/settings/settingsCommit.tsx +55 -0
  447. package/src/workbench/settings/structured-data-form.css +114 -0
  448. package/src/workbench/settings/structured-data-schema-panel.css +33 -19
  449. package/src/workbench/settings/structuredDataFormModel.ts +140 -0
  450. package/src/workbench/settings/structuredDataSchema.ts +111 -658
  451. package/src/workbench/settings/structuredDataSchemaDate.ts +197 -0
  452. package/src/workbench/settings/structuredDataSchemaField.ts +105 -0
  453. package/src/workbench/settings/structuredDataSchemaSection.ts +74 -0
  454. package/src/workbench/settings/structuredDataSchemaTable.ts +120 -0
  455. package/src/workbench/settings/structuredDataSchemaTypes.ts +308 -0
  456. package/src/workbench/settings/structuredDataSchemaValidation.ts +166 -0
  457. package/src/workbench/settings/useSectionScrollSpy.ts +420 -0
  458. package/src/workbench/settings/workbench-settings-modal.css +273 -0
  459. package/src/workbench/shell/activity-bar.css +245 -0
  460. package/src/workbench/shell/confirmation-flow.css +87 -0
  461. package/src/workbench/shell/index.css +5 -0
  462. package/src/workbench/shell/split-view.css +188 -0
  463. package/src/workbench/shell/status-bar.css +141 -0
  464. package/src/workbench/shell.ts +133 -2
  465. package/src/workbench/shellPresets.ts +36 -0
  466. package/src/workbench/shellState.ts +16 -23
  467. package/src/workbench/shellViewModel.ts +160 -0
  468. package/src/workbench/sidebarViewPlacementDnd.ts +61 -0
  469. package/src/workbench/standalone.ts +9 -9
  470. package/src/workbench/status.ts +10 -6
  471. package/src/workbench/theme.ts +8 -2
  472. package/src/workbench/themePresets.ts +191 -0
  473. package/src/workbench/useDeferredWorkbenchMount.ts +71 -0
  474. package/src/workbench/useEditorTabsStripDnd.ts +262 -0
  475. package/src/workbench/useWorkbenchAppearanceDocumentSync.tsx +17 -0
  476. package/src/workbench/useWorkbenchEditorTabContextMenu.tsx +66 -0
  477. package/src/workbench/useWorkbenchSidebarActionBarDnd.ts +227 -0
  478. package/src/workbench/useWorkbenchSidebarLayout.tsx +232 -0
  479. package/src/workbench/useWorkbenchSidebarViewPlacementDropZone.ts +194 -0
  480. package/src/workbench/useWorkbenchStandaloneShellStateSync.tsx +112 -0
  481. package/src/workbench/views/action-list.css +144 -0
  482. package/src/workbench/views/artifact-preview.css +184 -0
  483. package/src/workbench/views/command-inspector.css +98 -0
  484. package/src/workbench/views/command-list.css +356 -0
  485. package/src/workbench/views/commands-sidebar.css +51 -0
  486. package/src/workbench/views/extensions-sidebar.css +175 -0
  487. package/src/workbench/views/multi-provider-explorer.css +182 -0
  488. package/src/workbench/views/search.css +10 -0
  489. package/src/workbench/views/timeline.css +239 -0
  490. package/src/workbench/views/view-hosts.css +37 -0
  491. package/src/workbench/views/view-sidebar.css +21 -0
  492. package/src/workbench/views/views.css +12 -0
  493. package/src/workbench/widgets/widget-tree.css +598 -0
  494. package/src/workbench/widgets/widgets.css +2 -0
  495. package/src/workbench/workbench-chrome.css +4 -0
  496. package/src/workbench/workbenchContextMenu.ts +18 -0
  497. package/src/workbench/workbenchModalViewState.ts +52 -0
  498. package/src/workbench/workbenchOverlaysContext.tsx +21 -0
  499. package/src/workbench/workbenchPlatformChrome.ts +40 -0
  500. package/src/workbench/workbenchSidebarLayoutContext.ts +46 -0
  501. package/src/workbench/workbenchStandaloneShellReactContext.tsx +80 -0
  502. package/src/workbench/workbenchViewRouteState.ts +151 -0
  503. package/src/workbench/workspace/WorkspaceDraftsContext.tsx +59 -71
  504. package/src/workbench/workspace/WorkspaceEditor.tsx +27 -123
  505. package/src/workbench/workspace/WorkspaceEditorPanel.tsx +67 -8
  506. package/src/workbench/workspace/WorkspaceExplorer.tsx +149 -51
  507. package/src/workbench/workspace/WorkspaceExplorerPanel.tsx +73 -0
  508. package/src/workbench/workspace/WorkspaceFileIcon.tsx +4 -160
  509. package/src/workbench/workspace/WorkspacePathLabel.tsx +42 -0
  510. package/src/workbench/workspace/WorkspaceSearchPanel.tsx +18 -15
  511. package/src/workbench/workspace/WorkspaceSearchResults.tsx +6 -2
  512. package/src/workbench/workspace/build-workspace-explorer-nodes.ts +44 -0
  513. package/src/workbench/workspace/createVirtualWorkspaceExplorerPort.ts +141 -0
  514. package/src/workbench/workspace/explorer-tree-style.ts +18 -0
  515. package/src/workbench/workspace/index.ts +45 -32
  516. package/src/workbench/workspace/json-config-workbench.css +57 -0
  517. package/src/workbench/workspace/monaco-panel.css +71 -0
  518. package/src/workbench/workspace/path.ts +2 -0
  519. package/src/workbench/workspace/useWorkspaceExplorerController.ts +490 -0
  520. package/src/workbench/workspace/workspace-editor.css +235 -0
  521. package/src/workbench/workspace/workspace-explorer-panel.css +33 -0
  522. package/src/workbench/workspace/workspace.css +5 -0
  523. package/src/workbench/workspace/workspaceExplorerController.ts +193 -0
  524. package/src/workbench/workspace/workspaceJsonDiagnostics.ts +2 -2
  525. package/src/workbench-menu-surfaces.css +57 -0
  526. package/src/jdw/builtins/renderBuiltinWidgetNode.tsx +0 -126
  527. package/src/layout/SideBarViewFrame.tsx +0 -367
  528. package/src/primitives/Checkbox.tsx +0 -21
  529. package/src/primitives/NumberInput.tsx +0 -38
  530. package/src/primitives/ScrollArea.tsx +0 -42
  531. package/src/primitives/Select.tsx +0 -1
  532. package/src/primitives/StatusBar.tsx +0 -46
  533. package/src/primitives/WorkbenchChrome.tsx +0 -424
  534. package/src/workbench/workspace/MultiProviderExplorer.tsx +0 -625
@@ -1,5 +1,34 @@
1
1
  export const WORKBENCH_SECTIONED_PANEL_SCROLL_SPY_OFFSET = 24;
2
+ export const WORKBENCH_SECTIONED_PANEL_SCROLL_SPY_ACTIVE_LINE_BIAS = 20;
2
3
  export const WORKBENCH_SECTIONED_PANEL_SCROLL_THRESHOLD = 2;
4
+ /** Fixed-duration programmatic section scroll (smooth tab/nav clicks). */
5
+ export const WORKBENCH_SECTIONED_PANEL_PROGRAMMATIC_SCROLL_SETTLE_MS_SMOOTH = 700;
6
+ export const WORKBENCH_SECTIONED_PANEL_PROGRAMMATIC_SCROLL_SETTLE_MS_INSTANT = 0;
7
+
8
+ export function resolveWorkbenchSectionedPanelProgrammaticScrollSettleMs(
9
+ behavior: ScrollBehavior = 'smooth',
10
+ ): number {
11
+ return behavior === 'smooth'
12
+ ? WORKBENCH_SECTIONED_PANEL_PROGRAMMATIC_SCROLL_SETTLE_MS_SMOOTH
13
+ : WORKBENCH_SECTIONED_PANEL_PROGRAMMATIC_SCROLL_SETTLE_MS_INSTANT;
14
+ }
15
+
16
+ export function resolveWorkbenchSectionedPanelClampedScrollTarget({
17
+ clientSize,
18
+ scrollSize,
19
+ targetScrollPosition,
20
+ }: {
21
+ clientSize: number;
22
+ scrollSize: number;
23
+ targetScrollPosition: number;
24
+ }): number {
25
+ const maxScroll = Math.max(0, scrollSize - clientSize);
26
+ return Math.min(Math.max(0, targetScrollPosition), maxScroll);
27
+ }
28
+
29
+ export const WORKBENCH_SECTIONED_PANEL_INTERSECTION_THRESHOLDS = [0, 0.25, 0.5, 0.75, 1] as const;
30
+
31
+ export type WorkbenchSectionedPanelScrollSpyAxis = 'vertical' | 'horizontal';
3
32
 
4
33
  export interface WorkbenchSectionedPanelIntersectionEntry {
5
34
  intersectionRatio: number;
@@ -9,43 +38,108 @@ export interface WorkbenchSectionedPanelIntersectionEntry {
9
38
 
10
39
  export interface WorkbenchSectionedPanelScrollPosition {
11
40
  anchorId: string;
12
- top: number;
41
+ /** Section start along the active scroll axis (top or left). */
42
+ start: number;
43
+ /** Section end along the active scroll axis (bottom or right). */
44
+ end: number;
45
+ }
46
+
47
+ export interface WorkbenchSectionedPanelScrollMetrics {
48
+ clientSize: number;
49
+ scrollPosition: number;
50
+ scrollSize: number;
51
+ }
52
+
53
+ export function readWorkbenchSectionedPanelScrollMetrics(
54
+ element: HTMLElement,
55
+ axis: WorkbenchSectionedPanelScrollSpyAxis = 'vertical',
56
+ ): WorkbenchSectionedPanelScrollMetrics {
57
+ if (axis === 'horizontal') {
58
+ return {
59
+ clientSize: element.clientWidth,
60
+ scrollSize: element.scrollWidth,
61
+ scrollPosition: element.scrollLeft,
62
+ };
63
+ }
64
+
65
+ return {
66
+ clientSize: element.clientHeight,
67
+ scrollSize: element.scrollHeight,
68
+ scrollPosition: element.scrollTop,
69
+ };
13
70
  }
14
71
 
15
72
  export function isWorkbenchSectionedPanelScrollable({
16
- clientHeight,
17
- scrollHeight,
73
+ axis = 'vertical',
74
+ clientSize,
75
+ scrollSize,
18
76
  threshold = WORKBENCH_SECTIONED_PANEL_SCROLL_THRESHOLD,
19
77
  }: {
20
- clientHeight: number;
21
- scrollHeight: number;
22
- threshold?: number;
78
+ axis?: WorkbenchSectionedPanelScrollSpyAxis | undefined;
79
+ clientSize: number;
80
+ scrollSize: number;
81
+ threshold?: number | undefined;
23
82
  }): boolean {
24
- return scrollHeight > clientHeight + threshold;
83
+ void axis;
84
+ return scrollSize > clientSize + threshold;
25
85
  }
26
86
 
87
+ export function isWorkbenchSectionedPanelAtScrollStart({
88
+ scrollPosition,
89
+ startThreshold = WORKBENCH_SECTIONED_PANEL_SCROLL_THRESHOLD,
90
+ }: {
91
+ scrollPosition: number;
92
+ startThreshold?: number | undefined;
93
+ }): boolean {
94
+ return scrollPosition <= startThreshold;
95
+ }
96
+
97
+ export function isWorkbenchSectionedPanelAtScrollEnd({
98
+ bottomThreshold = WORKBENCH_SECTIONED_PANEL_SCROLL_THRESHOLD,
99
+ clientSize,
100
+ scrollPosition,
101
+ scrollSize,
102
+ }: {
103
+ bottomThreshold?: number | undefined;
104
+ clientSize: number;
105
+ scrollPosition: number;
106
+ scrollSize: number;
107
+ }): boolean {
108
+ return scrollPosition + clientSize >= scrollSize - bottomThreshold;
109
+ }
110
+
111
+ /** @deprecated Use `isWorkbenchSectionedPanelAtScrollStart`. */
27
112
  export function isWorkbenchSectionedPanelAtScrollTop({
28
113
  scrollTop,
29
114
  topThreshold = WORKBENCH_SECTIONED_PANEL_SCROLL_THRESHOLD,
30
115
  }: {
31
116
  scrollTop: number;
32
- topThreshold?: number;
117
+ topThreshold?: number | undefined;
33
118
  }): boolean {
34
- return scrollTop <= topThreshold;
119
+ return isWorkbenchSectionedPanelAtScrollStart({
120
+ scrollPosition: scrollTop,
121
+ startThreshold: topThreshold,
122
+ });
35
123
  }
36
124
 
125
+ /** @deprecated Use `isWorkbenchSectionedPanelAtScrollEnd`. */
37
126
  export function isWorkbenchSectionedPanelAtScrollBottom({
38
127
  bottomThreshold = WORKBENCH_SECTIONED_PANEL_SCROLL_THRESHOLD,
39
128
  clientHeight,
40
129
  scrollHeight,
41
130
  scrollTop,
42
131
  }: {
43
- bottomThreshold?: number;
132
+ bottomThreshold?: number | undefined;
44
133
  clientHeight: number;
45
134
  scrollHeight: number;
46
135
  scrollTop: number;
47
136
  }): boolean {
48
- return scrollTop + clientHeight >= scrollHeight - bottomThreshold;
137
+ return isWorkbenchSectionedPanelAtScrollEnd({
138
+ bottomThreshold,
139
+ clientSize: clientHeight,
140
+ scrollPosition: scrollTop,
141
+ scrollSize: scrollHeight,
142
+ });
49
143
  }
50
144
 
51
145
  export function resolveWorkbenchSectionedPanelActiveAnchorFromIntersection({
@@ -79,20 +173,22 @@ export function resolveWorkbenchSectionedPanelActiveAnchorFromIntersection({
79
173
  }
80
174
 
81
175
  export function resolveWorkbenchSectionedPanelActiveAnchorFromScroll({
176
+ activeLineBias = WORKBENCH_SECTIONED_PANEL_SCROLL_SPY_ACTIVE_LINE_BIAS,
82
177
  anchorOrder,
83
- clientHeight,
178
+ clientSize,
84
179
  fallbackAnchorId,
85
180
  offset = WORKBENCH_SECTIONED_PANEL_SCROLL_SPY_OFFSET,
86
- scrollHeight,
87
- scrollTop,
181
+ scrollPosition,
182
+ scrollSize,
88
183
  sectionPositions,
89
184
  }: {
185
+ activeLineBias?: number | undefined;
90
186
  anchorOrder: readonly string[];
91
- clientHeight: number;
187
+ clientSize: number;
92
188
  fallbackAnchorId?: string | undefined;
93
- offset?: number;
94
- scrollHeight: number;
95
- scrollTop: number;
189
+ offset?: number | undefined;
190
+ scrollPosition: number;
191
+ scrollSize: number;
96
192
  sectionPositions: readonly WorkbenchSectionedPanelScrollPosition[];
97
193
  }): string | undefined {
98
194
  if (sectionPositions.length === 0) return fallbackAnchorId;
@@ -100,25 +196,25 @@ export function resolveWorkbenchSectionedPanelActiveAnchorFromScroll({
100
196
  const firstAnchorId = anchorOrder[0];
101
197
  const lastAnchorId = anchorOrder[anchorOrder.length - 1];
102
198
 
103
- if (isWorkbenchSectionedPanelAtScrollTop({ scrollTop })) {
199
+ if (isWorkbenchSectionedPanelAtScrollStart({ scrollPosition })) {
104
200
  return firstAnchorId ?? fallbackAnchorId;
105
201
  }
106
202
 
107
203
  if (
108
- isWorkbenchSectionedPanelAtScrollBottom({
109
- clientHeight,
110
- scrollHeight,
111
- scrollTop,
204
+ isWorkbenchSectionedPanelAtScrollEnd({
205
+ clientSize,
206
+ scrollPosition,
207
+ scrollSize,
112
208
  })
113
209
  ) {
114
210
  return lastAnchorId ?? fallbackAnchorId;
115
211
  }
116
212
 
117
- const activeLine = scrollTop + offset;
118
- let nextActive = fallbackAnchorId;
213
+ const activeLine = scrollPosition + offset + activeLineBias;
214
+ let nextActive = sectionPositions[0]?.anchorId ?? fallbackAnchorId;
119
215
 
120
216
  for (const section of sectionPositions) {
121
- if (section.top <= activeLine) {
217
+ if (section.start <= activeLine) {
122
218
  nextActive = section.anchorId;
123
219
  }
124
220
  }
@@ -126,18 +222,52 @@ export function resolveWorkbenchSectionedPanelActiveAnchorFromScroll({
126
222
  return nextActive ?? fallbackAnchorId;
127
223
  }
128
224
 
225
+ export function shouldPreserveNavClickActiveAnchor({
226
+ pinnedScrollPosition,
227
+ pinnedScrollSize,
228
+ scrollPosition,
229
+ scrollSize,
230
+ threshold = WORKBENCH_SECTIONED_PANEL_SCROLL_THRESHOLD,
231
+ }: {
232
+ pinnedScrollPosition: number;
233
+ pinnedScrollSize: number;
234
+ scrollPosition: number;
235
+ scrollSize: number;
236
+ threshold?: number | undefined;
237
+ }): boolean {
238
+ return (
239
+ Math.abs(scrollPosition - pinnedScrollPosition) <= threshold && scrollSize === pinnedScrollSize
240
+ );
241
+ }
242
+
243
+ export function resolveWorkbenchSectionedPanelScrollTarget({
244
+ offset = WORKBENCH_SECTIONED_PANEL_SCROLL_SPY_OFFSET,
245
+ sectionStart,
246
+ }: {
247
+ offset?: number | undefined;
248
+ sectionStart: number;
249
+ }): number {
250
+ return Math.max(0, sectionStart - offset);
251
+ }
252
+
253
+ /** @deprecated Use `resolveWorkbenchSectionedPanelScrollTarget`. */
129
254
  export function resolveWorkbenchSectionedPanelScrollTop({
130
255
  offset = WORKBENCH_SECTIONED_PANEL_SCROLL_SPY_OFFSET,
131
256
  sectionTop,
132
257
  }: {
133
- offset?: number;
258
+ offset?: number | undefined;
134
259
  sectionTop: number;
135
260
  }): number {
136
- return Math.max(0, sectionTop - offset);
261
+ return resolveWorkbenchSectionedPanelScrollTarget({ offset, sectionStart: sectionTop });
137
262
  }
138
263
 
139
264
  export function createWorkbenchSectionedPanelIntersectionRootMargin(
140
265
  offset = WORKBENCH_SECTIONED_PANEL_SCROLL_SPY_OFFSET,
266
+ axis: WorkbenchSectionedPanelScrollSpyAxis = 'vertical',
141
267
  ) {
268
+ if (axis === 'horizontal') {
269
+ return `0px -55% 0px -${offset}px`;
270
+ }
271
+
142
272
  return `-${offset}px 0px -55% 0px`;
143
273
  }
@@ -0,0 +1,58 @@
1
+ @media (max-width: 760px) {
2
+ .workbench-settings-modal {
3
+ --ui-modal-max-width: 100vw;
4
+ --ui-modal-max-height: 100vh;
5
+ }
6
+
7
+ .ui-workbench-navigation-panel,
8
+ .ui-workbench-navigation-panel[data-has-nav='true'] {
9
+ grid-template-columns: minmax(0, 1fr);
10
+ grid-template-rows: auto minmax(0, 1fr);
11
+ }
12
+
13
+ .ui-workbench-navigation-panel__nav {
14
+ height: auto;
15
+ border-right: 0;
16
+ border-bottom: 1px solid var(--color-border);
17
+ }
18
+
19
+ .ui-workbench-navigation-panel__nav-scroll.ui-scroll-area--vertical {
20
+ overflow-x: auto;
21
+ overflow-y: hidden;
22
+ }
23
+
24
+ .workbench-settings-sidebar {
25
+ flex-direction: row;
26
+ padding: 8px 12px;
27
+ border-bottom: 0;
28
+ }
29
+
30
+ .workbench-settings-nav-item {
31
+ width: auto;
32
+ flex: 0 0 auto;
33
+ }
34
+
35
+ .workbench-settings-content > .ui-workbench-navigation-panel__content-scroll > * {
36
+ padding-inline: var(--workbench-panel-padding-inline-compact);
37
+ }
38
+
39
+ .ui-workbench-sectioned-panel__nav {
40
+ display: flex;
41
+ padding: 8px 0;
42
+ }
43
+
44
+ .ui-workbench-section-tab-panel__scroll,
45
+ .ui-workbench-sectioned-panel__scroll {
46
+ padding-left: var(--workbench-panel-padding-inline-compact);
47
+ }
48
+
49
+ .ui-workbench-structured-data-form__section {
50
+ max-width: none;
51
+ padding: var(--workbench-panel-padding-block-start)
52
+ var(--workbench-panel-padding-inline-compact) var(--workbench-panel-padding-block-end);
53
+ }
54
+
55
+ .ui-workbench-structured-data-form__actions {
56
+ padding-inline: 12px;
57
+ }
58
+ }
@@ -0,0 +1,11 @@
1
+ /* workbench/settings feature styles — Plan A import hub */
2
+ @import './navigation-panel.css';
3
+ @import './sectioned-panel.css';
4
+ @import './section-tab-panel.css';
5
+ @import './structured-data-schema-panel.css';
6
+ @import './structured-data-table-view.css';
7
+ @import './panel-region.css';
8
+ @import './schema-form.css';
9
+ @import './structured-data-form.css';
10
+ @import './workbench-settings-modal.css';
11
+ @import './settings-responsive.css';
@@ -0,0 +1,55 @@
1
+ import { createContext, useContext, type ReactNode } from 'react';
2
+
3
+ /**
4
+ * How settings edits are committed from {@link WorkbenchSettingsModal}.
5
+ *
6
+ * - `explicit` (default): host footer Apply/Cancel (or form actions) remain; commit on submit.
7
+ * - `immediate`: hide the modal footer; emit {@link WorkbenchSettingsPreferenceChange} on each edit
8
+ * (VS Code–style apply-on-change). Category content should persist via `onPreferenceChange`
9
+ * or {@link useWorkbenchSettingsCommit}.
10
+ */
11
+ export type WorkbenchSettingsCommitMode = 'explicit' | 'immediate';
12
+
13
+ export interface WorkbenchSettingsPreferenceChange {
14
+ /** Active settings category id when the change was emitted. */
15
+ categoryId: string;
16
+ /** Preference or field key. */
17
+ key: string;
18
+ /** New value for the key. */
19
+ value: unknown;
20
+ /** Active scope id when the modal exposes scopes. */
21
+ scopeId?: string;
22
+ }
23
+
24
+ export interface WorkbenchSettingsCommitContextValue {
25
+ categoryId: string;
26
+ commitMode: WorkbenchSettingsCommitMode;
27
+ onPreferenceChange?: ((change: WorkbenchSettingsPreferenceChange) => void) | undefined;
28
+ scopeId: string;
29
+ }
30
+
31
+ const WorkbenchSettingsCommitContext = createContext<WorkbenchSettingsCommitContextValue | null>(
32
+ null,
33
+ );
34
+
35
+ export function WorkbenchSettingsCommitProvider({
36
+ children,
37
+ value,
38
+ }: {
39
+ children: ReactNode;
40
+ value: WorkbenchSettingsCommitContextValue;
41
+ }) {
42
+ return (
43
+ <WorkbenchSettingsCommitContext.Provider value={value}>
44
+ {children}
45
+ </WorkbenchSettingsCommitContext.Provider>
46
+ );
47
+ }
48
+
49
+ /**
50
+ * Reads the active settings commit contract from {@link WorkbenchSettingsModal}.
51
+ * Returns `null` when rendered outside the modal.
52
+ */
53
+ export function useWorkbenchSettingsCommit(): WorkbenchSettingsCommitContextValue | null {
54
+ return useContext(WorkbenchSettingsCommitContext);
55
+ }
@@ -0,0 +1,114 @@
1
+ .ui-workbench-structured-data-form {
2
+ min-width: 0;
3
+ min-height: 0;
4
+ height: 100%;
5
+ display: grid;
6
+ grid-template-rows: minmax(0, 1fr) auto;
7
+ }
8
+
9
+ .ui-workbench-structured-data-form__panel {
10
+ min-height: 0;
11
+ }
12
+
13
+ .ui-workbench-structured-data-form__section {
14
+ max-width: 860px;
15
+ padding: var(--workbench-panel-padding-block-start) var(--workbench-panel-padding-inline)
16
+ var(--workbench-panel-padding-block-end) 0;
17
+ }
18
+
19
+ .ui-workbench-structured-data-form__section + .ui-workbench-structured-data-form__section {
20
+ border-top: 1px solid var(--color-border);
21
+ }
22
+
23
+ .ui-workbench-structured-data-form__section h2 {
24
+ margin: 0;
25
+ color: var(--color-text);
26
+ font-weight: 600;
27
+ letter-spacing: 0;
28
+ }
29
+
30
+ .ui-workbench-structured-data-form__section h2 {
31
+ font-size: 1.2rem;
32
+ line-height: 1.25;
33
+ }
34
+
35
+ .ui-workbench-structured-data-form__section > p {
36
+ max-width: 680px;
37
+ margin: 8px 0 18px;
38
+ color: var(--color-text-muted);
39
+ font-size: var(--font-size-sm);
40
+ line-height: 1.5;
41
+ }
42
+
43
+ .ui-workbench-structured-data-form__fields {
44
+ max-width: 680px;
45
+ display: flex;
46
+ flex-direction: column;
47
+ gap: 2px;
48
+ }
49
+
50
+ .ui-workbench-structured-data-form__field .ui-field {
51
+ margin-bottom: 14px;
52
+ }
53
+
54
+ .ui-workbench-structured-data-form__field[data-field-type='checkbox'] .ui-field {
55
+ margin-bottom: 10px;
56
+ }
57
+
58
+ .ui-workbench-structured-data-form__array-field.ui-field {
59
+ margin-bottom: 14px;
60
+ }
61
+
62
+ .ui-workbench-structured-data-form__array {
63
+ display: grid;
64
+ gap: 8px;
65
+ }
66
+
67
+ .ui-workbench-structured-data-form__array-row {
68
+ display: grid;
69
+ grid-template-columns: minmax(0, 1fr) auto;
70
+ align-items: center;
71
+ gap: 8px;
72
+ }
73
+
74
+ .ui-workbench-structured-data-form__array-empty {
75
+ color: var(--color-text-muted);
76
+ font-size: var(--font-size-sm);
77
+ }
78
+
79
+ .ui-workbench-structured-data-form__error {
80
+ margin: -8px 0 14px;
81
+ color: var(--color-danger);
82
+ font-size: var(--font-size-xs);
83
+ line-height: 1.4;
84
+ }
85
+
86
+ .ui-workbench-structured-data-form__warning {
87
+ margin: -8px 0 14px;
88
+ color: var(--color-warning);
89
+ font-size: var(--font-size-xs);
90
+ line-height: 1.4;
91
+ }
92
+
93
+ .ui-workbench-structured-data-schema-field-input--invalid :is(.ui-input, .ui-select, .ui-textarea) {
94
+ border-color: var(--color-warning);
95
+ }
96
+
97
+ .ui-workbench-structured-data-form__table-section {
98
+ margin-top: 24px;
99
+ }
100
+
101
+ .ui-workbench-structured-data-form__actions {
102
+ display: flex;
103
+ align-items: center;
104
+ justify-content: flex-end;
105
+ gap: 8px;
106
+ padding: 12px 16px;
107
+ border-top: 1px solid var(--color-border);
108
+ background: var(--color-bg);
109
+ }
110
+
111
+ .ui-workbench-structured-data-form[data-readonly='true']
112
+ .ui-workbench-structured-data-form__actions {
113
+ opacity: 0.82;
114
+ }
@@ -104,19 +104,19 @@
104
104
  gap: 6px;
105
105
  }
106
106
 
107
- .ui-workbench-sectioned-panel.ui-workbench-structured-data-schema-panel--fill {
107
+ .ui-workbench-structured-data-schema-panel--fill {
108
108
  min-height: 0;
109
109
  height: 100%;
110
110
  }
111
111
 
112
112
  .ui-workbench-sectioned-panel.ui-workbench-structured-data-schema-panel--fill
113
113
  .ui-workbench-sectioned-panel__nav-links {
114
- padding-top: 12px;
114
+ padding-top: 0;
115
115
  }
116
116
 
117
- .ui-workbench-sectioned-panel.ui-workbench-structured-data-schema-panel--fill
117
+ .ui-workbench-structured-data-schema-panel--fill
118
118
  .ui-workbench-structured-data-schema-panel__section:first-child {
119
- padding-top: 12px;
119
+ padding-top: 30px;
120
120
  }
121
121
 
122
122
  .ui-workbench-structured-data-schema-panel__section {
@@ -126,13 +126,15 @@
126
126
  scroll-margin-top: 12px;
127
127
  }
128
128
 
129
- .ui-workbench-sectioned-panel__scroll
129
+ .ui-workbench-structured-data-schema-panel
130
+ :is(.ui-workbench-section-tab-panel__scroll, .ui-workbench-sectioned-panel__scroll)
130
131
  .ui-workbench-structured-data-schema-panel__section
131
132
  + .ui-workbench-structured-data-schema-panel__section {
132
133
  border-top: 1px solid var(--color-border);
133
134
  }
134
135
 
135
- .ui-workbench-sectioned-panel__scroll
136
+ .ui-workbench-structured-data-schema-panel
137
+ :is(.ui-workbench-section-tab-panel__scroll, .ui-workbench-sectioned-panel__scroll)
136
138
  .ui-workbench-structured-data-schema-panel__section:last-child {
137
139
  padding-bottom: 16px;
138
140
  }
@@ -229,20 +231,18 @@
229
231
  line-height: 1.45;
230
232
  }
231
233
 
232
- .ui-workbench-sectioned-panel.ui-workbench-structured-data-schema-panel[data-readonly='true']
234
+ .ui-workbench-structured-data-schema-panel[data-readonly='true']
233
235
  :is(.ui-input, .ui-select, .ui-textarea),
234
- .ui-workbench-sectioned-panel.ui-workbench-structured-data-schema-panel
236
+ .ui-workbench-structured-data-schema-panel
235
237
  :is(.ui-input:disabled, .ui-select:disabled, .ui-textarea:disabled),
236
- .ui-workbench-sectioned-panel.ui-workbench-structured-data-schema-panel
237
- :is(.ui-input[readonly], .ui-textarea[readonly]) {
238
+ .ui-workbench-structured-data-schema-panel :is(.ui-input[readonly], .ui-textarea[readonly]) {
238
239
  color: var(--color-text-muted);
239
240
  background: var(--color-surface);
240
241
  }
241
242
 
242
- .ui-workbench-sectioned-panel.ui-workbench-structured-data-schema-panel[data-readonly='true']
243
+ .ui-workbench-structured-data-schema-panel[data-readonly='true']
243
244
  :is(.ui-input, .ui-select, .ui-textarea):focus,
244
- .ui-workbench-sectioned-panel.ui-workbench-structured-data-schema-panel
245
- :is(.ui-input[readonly], .ui-textarea[readonly]):focus {
245
+ .ui-workbench-structured-data-schema-panel :is(.ui-input[readonly], .ui-textarea[readonly]):focus {
246
246
  border-color: var(--color-border);
247
247
  outline: none;
248
248
  }
@@ -269,13 +269,12 @@
269
269
  display: grid;
270
270
  grid-auto-columns: minmax(124px, 1fr);
271
271
  grid-auto-flow: column;
272
- align-items: start;
273
- border-bottom: 1px solid var(--color-border);
272
+ align-items: stretch;
274
273
  color: var(--color-text-muted);
275
274
  font-size: 12px;
276
275
  }
277
276
 
278
- .ui-workbench-structured-data-schema-panel__table-row:last-child {
277
+ .ui-workbench-structured-data-schema-panel__table-row:last-child > span {
279
278
  border-bottom: 0;
280
279
  }
281
280
 
@@ -286,19 +285,25 @@
286
285
  color: var(--color-text);
287
286
  background: var(--color-surface);
288
287
  font-weight: 600;
289
- box-shadow: 0 1px 0 var(--color-border);
290
288
  }
291
289
 
292
290
  .ui-workbench-structured-data-schema-panel__table-row--head > span {
291
+ min-height: 36px;
292
+ align-content: center;
293
293
  color: var(--color-text-subtle);
294
294
  }
295
295
 
296
296
  .ui-workbench-structured-data-schema-panel__table-row > span {
297
+ box-sizing: border-box;
297
298
  min-width: 0;
298
- display: flex;
299
- align-items: center;
299
+ min-height: 44px;
300
+ display: grid;
301
+ align-content: start;
302
+ gap: 5px;
300
303
  padding: 8px;
301
304
  border-right: 1px solid var(--color-border);
305
+ border-bottom: 1px solid var(--color-border);
306
+ overflow-wrap: anywhere;
302
307
  }
303
308
 
304
309
  .ui-workbench-structured-data-schema-panel__table-row > span:last-child {
@@ -308,10 +313,19 @@
308
313
  .ui-workbench-structured-data-schema-panel__table-row
309
314
  > span
310
315
  :is(.ui-input, .ui-select, .ui-textarea) {
316
+ width: 100%;
311
317
  min-height: 26px;
312
318
  font-size: 12px;
313
319
  }
314
320
 
321
+ .ui-workbench-structured-data-schema-panel__table-row
322
+ > span
323
+ :is(.ui-workbench-structured-data-form__error, .ui-workbench-structured-data-form__warning) {
324
+ margin: 0;
325
+ font-size: 12px;
326
+ line-height: 1.35;
327
+ }
328
+
315
329
  .ui-workbench-structured-data-schema-panel__table-actions {
316
330
  display: flex;
317
331
  justify-content: center;