@workbench-kit/react 0.0.2-prototype.0.1.4 → 0.0.2-prototype.0.2.11

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 (548) hide show
  1. package/README.md +87 -0
  2. package/package.json +37 -27
  3. package/src/brand/TilepaperAppIcon.tsx +181 -0
  4. package/src/brand/index.ts +2 -0
  5. package/src/brand/tilepaper-app-icon-geometry.ts +201 -0
  6. package/src/icons/WorkbenchIcon.tsx +57 -0
  7. package/src/icons/WorkbenchIconContext.tsx +25 -0
  8. package/src/icons/file-icon.ts +154 -0
  9. package/src/icons/index.ts +17 -0
  10. package/src/icons/resolveWorkbenchIcon.ts +48 -0
  11. package/src/icons/types.ts +28 -0
  12. package/src/index.ts +292 -88
  13. package/src/jdw/JdwPreview.tsx +165 -8
  14. package/src/jdw/JdwPreviewViewport.tsx +190 -0
  15. package/src/jdw/JsonCodeEditorPane.tsx +172 -21
  16. package/src/jdw/builtins/renderBuiltinWidgetLeaf.tsx +101 -0
  17. package/src/jdw/createBuiltinJdwRegistry.ts +330 -5
  18. package/src/jdw/cssRenderBackend.tsx +96 -7
  19. package/src/jdw/document.ts +0 -3
  20. package/src/jdw/fixtures/jdw-sample-screens.ts +10 -8
  21. package/src/jdw/index.ts +9 -4
  22. package/src/jdw/jdw-preview-viewport.css +41 -0
  23. package/src/jdw/renderJdw.tsx +49 -8
  24. package/src/json-config/JsonConfigWorkbench.tsx +12 -15
  25. package/src/layout/ViewEmptyState.tsx +14 -0
  26. package/src/layout/WorkbenchCanvas.tsx +113 -6
  27. package/src/layout/WorkbenchLayout.tsx +3 -0
  28. package/src/layout/WorkbenchLayoutBase.tsx +43 -2
  29. package/src/layout/WorkbenchMediaPreviewViewport.tsx +122 -0
  30. package/src/layout/WorkbenchPropertyOverrideLabel.tsx +90 -0
  31. package/src/layout/WorkbenchPropertyPanel.tsx +153 -17
  32. package/src/layout/WorkbenchPropertySearch.tsx +51 -0
  33. package/src/layout/WorkbenchTree.tsx +9 -10
  34. package/src/layout/canvas/canvas-drag-ghost.css +21 -0
  35. package/src/layout/canvas/canvas-drag-preview-frame.css +15 -0
  36. package/src/layout/canvas/canvas-drop-indicator.css +16 -0
  37. package/src/layout/canvas/canvas-frame-handle.css +37 -0
  38. package/src/layout/canvas/canvas-frame-surface.css +24 -0
  39. package/src/layout/canvas/canvas-guide-block.css +17 -0
  40. package/src/layout/canvas/canvas-guide-layer.css +6 -0
  41. package/src/layout/canvas/canvas-guide-line.css +22 -0
  42. package/src/layout/canvas/canvas-item-badge.css +23 -0
  43. package/src/layout/canvas/canvas-item-frame.css +54 -0
  44. package/src/layout/canvas/canvas-pane-surface.css +9 -0
  45. package/src/layout/canvas/canvas-placeholder.css +21 -0
  46. package/src/layout/canvas/canvas-resize-frame.css +9 -0
  47. package/src/layout/canvas/canvas-resize-handle.css +74 -0
  48. package/src/layout/canvas/canvas-resize-preview.css +11 -0
  49. package/src/layout/canvas/canvas-selection-marquee.css +14 -0
  50. package/src/layout/canvas/canvas-viewport.css +18 -0
  51. package/src/layout/canvas/index.css +19 -0
  52. package/src/layout/canvas/preview-canvas.css +144 -0
  53. package/src/layout/editor/editor-body.css +9 -0
  54. package/src/layout/editor/editor-bottom-panel.css +44 -0
  55. package/src/layout/editor/editor-frame.css +14 -0
  56. package/src/layout/editor/editor-viewport.css +7 -0
  57. package/src/layout/editor/floating-menu.css +91 -0
  58. package/src/layout/editor/index.css +10 -0
  59. package/src/layout/editor/parse-error.css +9 -0
  60. package/src/layout/editor/problem-item.css +52 -0
  61. package/src/layout/editor/problem-list.css +7 -0
  62. package/src/layout/editor/render-surface.css +13 -0
  63. package/src/layout/fillScrollContract.ts +49 -0
  64. package/src/layout/fullscreen/fullscreen-backdrop.css +31 -0
  65. package/src/layout/fullscreen/fullscreen-button.css +44 -0
  66. package/src/layout/fullscreen/fullscreen-carousel.css +20 -0
  67. package/src/layout/fullscreen/fullscreen-content.css +8 -0
  68. package/src/layout/fullscreen/fullscreen-empty.css +16 -0
  69. package/src/layout/fullscreen/fullscreen-header.css +77 -0
  70. package/src/layout/fullscreen/fullscreen-hero.css +41 -0
  71. package/src/layout/fullscreen/fullscreen-nav-button.css +29 -0
  72. package/src/layout/fullscreen/fullscreen-option.css +83 -0
  73. package/src/layout/fullscreen/fullscreen-pill-row.css +6 -0
  74. package/src/layout/fullscreen/fullscreen-pill.css +10 -0
  75. package/src/layout/fullscreen/fullscreen-root.css +11 -0
  76. package/src/layout/fullscreen/index.css +13 -0
  77. package/src/layout/index.ts +165 -0
  78. package/src/layout/layout-base/banner.css +32 -0
  79. package/src/layout/layout-base/center.css +7 -0
  80. package/src/layout/layout-base/column.css +7 -0
  81. package/src/layout/layout-base/divider.css +5 -0
  82. package/src/layout/layout-base/empty.css +12 -0
  83. package/src/layout/layout-base/fill-scroll.css +36 -0
  84. package/src/layout/layout-base/fill.css +18 -0
  85. package/src/layout/layout-base/index.css +13 -0
  86. package/src/layout/layout-base/pane.css +6 -0
  87. package/src/layout/layout-base/panel-scroll.css +5 -0
  88. package/src/layout/layout-base/panel-surface.css +14 -0
  89. package/src/layout/layout-base/root.css +9 -0
  90. package/src/layout/layout-base/section-title.css +8 -0
  91. package/src/layout/layout.css +10 -0
  92. package/src/layout/layoutHelpers.ts +4 -2
  93. package/src/layout/media/index.css +2 -0
  94. package/src/layout/media/media-preview-viewport.css +69 -0
  95. package/src/layout/{Panel.tsx → panel/Panel.tsx} +29 -40
  96. package/src/layout/panel/TemplateGallery.tsx +90 -0
  97. package/src/layout/panel/WorkbenchAuthoringShell.tsx +57 -0
  98. package/src/layout/panel/WorkbenchLabeledPane.tsx +81 -0
  99. package/src/layout/panel/WorkbenchSidebarStack.tsx +15 -0
  100. package/src/layout/panel/filter-bar.css +59 -0
  101. package/src/layout/panel/index.css +7 -0
  102. package/src/layout/panel/index.ts +70 -0
  103. package/src/layout/panel/preview-pane.css +63 -0
  104. package/src/layout/panel/template-gallery.css +131 -0
  105. package/src/layout/panel/workbench-authoring-shell.css +48 -0
  106. package/src/layout/panel/workbench-labeled-pane.css +69 -0
  107. package/src/layout/panel/workbench-sidebar-stack.css +18 -0
  108. package/src/layout/property/color-input.css +8 -0
  109. package/src/layout/property/color-row.css +6 -0
  110. package/src/layout/property/index.css +15 -0
  111. package/src/layout/property/property-card.css +8 -0
  112. package/src/layout/property/property-grid.css +24 -0
  113. package/src/layout/property/property-hint.css +4 -0
  114. package/src/layout/property/property-inline.css +10 -0
  115. package/src/layout/property/property-key-value.css +29 -0
  116. package/src/layout/property/property-override-label.css +34 -0
  117. package/src/layout/property/property-panel.css +20 -0
  118. package/src/layout/property/property-row.css +17 -0
  119. package/src/layout/property/property-search.css +43 -0
  120. package/src/layout/property/property-section.css +97 -0
  121. package/src/layout/property/property-stack.css +11 -0
  122. package/src/layout/property/property-toggle.css +14 -0
  123. package/src/layout/propertyFieldFilter.ts +84 -0
  124. package/src/layout/sidebar/SideBarTree.tsx +301 -0
  125. package/src/layout/sidebar/SideBarViewFrame.tsx +235 -0
  126. package/src/layout/sidebar/SideBarViewTabStrip.tsx +60 -0
  127. package/src/layout/sidebar/SideBarViewTitleMenu.tsx +75 -0
  128. package/src/layout/sidebar/SidebarActionIconBar.tsx +242 -0
  129. package/src/layout/sidebar/SidebarSectionNestingContext.tsx +21 -0
  130. package/src/layout/sidebar/SidebarSlotChrome.tsx +32 -0
  131. package/src/layout/sidebar/SidebarToolbar.tsx +10 -0
  132. package/src/layout/sidebar/WorkbenchActionSidebar.tsx +73 -0
  133. package/src/layout/{WorkbenchSidebarActions.tsx → sidebar/WorkbenchSidebarActions.tsx} +105 -51
  134. package/src/layout/sidebar/WorkbenchSidebarSectionStack.tsx +165 -0
  135. package/src/layout/sidebar/index.css +5 -0
  136. package/src/layout/sidebar/index.ts +68 -0
  137. package/src/layout/sidebar/sidebar-chrome.css +95 -0
  138. package/src/layout/sidebar/sidebar-section-stack.css +25 -0
  139. package/src/layout/sidebar/sidebar-section.css +124 -0
  140. package/src/layout/sidebar/sidebar-view.css +290 -0
  141. package/src/layout/tree/drag-preview.css +25 -0
  142. package/src/layout/tree/index.css +10 -0
  143. package/src/layout/tree/template-glyph.css +96 -0
  144. package/src/layout/tree/tree-action.css +20 -0
  145. package/src/layout/tree/tree-drag-overlay.css +13 -0
  146. package/src/layout/tree/tree-drop-line.css +17 -0
  147. package/src/layout/tree/tree-drop-zone.css +13 -0
  148. package/src/layout/tree/tree-expander.css +23 -0
  149. package/src/layout/tree/tree-item.css +93 -0
  150. package/src/layout/tree/tree.css +49 -0
  151. package/src/layout/usePreviewViewport.ts +428 -0
  152. package/src/modal/ConfirmDialog.tsx +1 -1
  153. package/src/modal/Modal.tsx +184 -311
  154. package/src/modal/ModalResizeHandles.tsx +40 -0
  155. package/src/modal/ModalTitlebar.tsx +86 -0
  156. package/src/modal/modal.css +291 -0
  157. package/src/modal/modalContainer.ts +36 -0
  158. package/src/modal/modalPosition.ts +36 -0
  159. package/src/modal/modalSize.ts +84 -0
  160. package/src/modal/modalTypes.ts +13 -0
  161. package/src/modal/useModalContainerViewport.ts +41 -0
  162. package/src/modal/useModalDrag.ts +118 -0
  163. package/src/modal/useModalFocusTrap.ts +142 -0
  164. package/src/modal/useModalResize.ts +122 -0
  165. package/src/modal/useModalWindowFrame.ts +122 -0
  166. package/src/overlay/ContextMenu.tsx +139 -54
  167. package/src/overlay/clampFixedOverlayPosition.ts +22 -0
  168. package/src/overlay/context-menu.css +129 -0
  169. package/src/overlay/index.ts +31 -0
  170. package/src/overlay/measureAnchoredOverlayPanel.ts +107 -0
  171. package/src/overlay/overlay.css +2 -0
  172. package/src/overlay/pointerPassthroughRegion.ts +83 -0
  173. package/src/overlay/useAnchoredOverlayPanel.ts +222 -0
  174. package/src/overlay/useClampedFixedOverlayPosition.ts +27 -0
  175. package/src/overlay/useContextMenuState.ts +59 -0
  176. package/src/overlay/useFixedOverlayDismiss.ts +49 -0
  177. package/src/overlay/usePointerPassthroughRegion.ts +87 -0
  178. package/src/primitives/{AbsoluteBox.tsx → absolute-box/AbsoluteBox.tsx} +5 -5
  179. package/src/primitives/absolute-box/index.ts +1 -0
  180. package/src/primitives/{Badge.tsx → badge/Badge.tsx} +4 -2
  181. package/src/primitives/badge/badge.css +20 -0
  182. package/src/primitives/badge/index.ts +1 -0
  183. package/src/primitives/{Button.tsx → button/Button.tsx} +7 -6
  184. package/src/primitives/button/button.css +76 -0
  185. package/src/primitives/button/index.ts +1 -0
  186. package/src/primitives/catalog-browse-card/CatalogBrowseCard.tsx +121 -0
  187. package/src/primitives/catalog-browse-card/catalog-browse-card.css +175 -0
  188. package/src/primitives/catalog-browse-card/index.ts +1 -0
  189. package/src/primitives/catalog-browse-pane/CatalogBrowseFacetChips.tsx +59 -0
  190. package/src/primitives/catalog-browse-pane/CatalogBrowsePane.tsx +360 -0
  191. package/src/primitives/catalog-browse-pane/catalog-browse-facet-chips.css +8 -0
  192. package/src/primitives/catalog-browse-pane/catalog-browse-pane.css +84 -0
  193. package/src/primitives/catalog-browse-pane/filterCatalogBrowseItems.ts +27 -0
  194. package/src/primitives/catalog-browse-pane/index.ts +3 -0
  195. package/src/primitives/catalog-filter-overlay/CatalogFilterOverlay.tsx +73 -0
  196. package/src/primitives/catalog-filter-overlay/catalog-filter-overlay.css +65 -0
  197. package/src/primitives/catalog-filter-overlay/index.ts +1 -0
  198. package/src/primitives/checkbox/Checkbox.tsx +40 -0
  199. package/src/primitives/checkbox/checkbox.css +81 -0
  200. package/src/primitives/checkbox/index.ts +1 -0
  201. package/src/primitives/chip/Chip.tsx +43 -0
  202. package/src/primitives/chip/chip.css +110 -0
  203. package/src/primitives/chip/index.ts +2 -0
  204. package/src/primitives/clearable-text-input/ClearableTextInput.tsx +78 -0
  205. package/src/primitives/clearable-text-input/clearable-text-input.css +15 -0
  206. package/src/primitives/clearable-text-input/index.ts +1 -0
  207. package/src/primitives/codicon/Codicon.tsx +20 -0
  208. package/src/primitives/codicon/index.ts +1 -0
  209. package/src/primitives/{EmptyState.tsx → empty-state/EmptyState.tsx} +9 -3
  210. package/src/primitives/empty-state/empty-state.css +20 -0
  211. package/src/primitives/empty-state/index.ts +1 -0
  212. package/src/primitives/external-link-button/ExternalLinkButton.tsx +56 -0
  213. package/src/primitives/external-link-button/index.ts +1 -0
  214. package/src/primitives/{Field.tsx → field/Field.tsx} +2 -1
  215. package/src/primitives/field/field.css +51 -0
  216. package/src/primitives/field/index.ts +1 -0
  217. package/src/primitives/file-icon/FileIcon.tsx +21 -0
  218. package/src/primitives/file-icon/index.ts +1 -0
  219. package/src/primitives/{IconButton.tsx → icon-button/IconButton.tsx} +7 -5
  220. package/src/primitives/icon-button/icon-button.css +46 -0
  221. package/src/primitives/icon-button/index.ts +1 -0
  222. package/src/primitives/index.ts +215 -50
  223. package/src/primitives/library-detail-layout/LibraryDetailLayout.tsx +249 -0
  224. package/src/primitives/library-detail-layout/index.ts +6 -0
  225. package/src/primitives/library-detail-layout/library-detail-layout.css +226 -0
  226. package/src/primitives/library-detail-layout/resolve-hero-cover-media.ts +80 -0
  227. package/src/primitives/library-facet-filter-panel/LibraryFacetFilterPanel.tsx +454 -0
  228. package/src/primitives/library-facet-filter-panel/index.ts +1 -0
  229. package/src/primitives/library-facet-filter-panel/library-facet-filter-panel.css +205 -0
  230. package/src/primitives/library-facet-filter-strip/LibraryFacetFilterStrip.tsx +527 -0
  231. package/src/primitives/library-facet-filter-strip/index.ts +1 -0
  232. package/src/primitives/library-facet-filter-strip/library-facet-filter-strip.css +31 -0
  233. package/src/primitives/{List.tsx → list/List.tsx} +15 -6
  234. package/src/primitives/list/index.ts +1 -0
  235. package/src/primitives/list/list-empty-state.css +10 -0
  236. package/src/primitives/list/list-item.css +93 -0
  237. package/src/primitives/list/list.css +6 -0
  238. package/src/primitives/number-input/NumberInput.tsx +235 -0
  239. package/src/primitives/number-input/index.ts +1 -0
  240. package/src/primitives/number-input/number-input.css +105 -0
  241. package/src/primitives/panel-loading/PanelLoading.tsx +29 -0
  242. package/src/primitives/panel-loading/index.ts +1 -0
  243. package/src/primitives/panel-loading/panel-loading.css +16 -0
  244. package/src/primitives/panel-surface/panel-surface.css +77 -0
  245. package/src/primitives/primitives.css +36 -0
  246. package/src/primitives/record-media-hero/RecordMediaHero.tsx +85 -0
  247. package/src/primitives/record-media-hero/index.ts +1 -0
  248. package/src/primitives/record-media-hero/record-media-hero.css +84 -0
  249. package/src/primitives/scroll-area/ScrollArea.tsx +200 -0
  250. package/src/primitives/scroll-area/index.ts +1 -0
  251. package/src/primitives/scroll-area/scroll-area-overlay.css +69 -0
  252. package/src/primitives/scroll-area-infinite-load/ScrollAreaInfiniteSentinel.tsx +22 -0
  253. package/src/primitives/scroll-area-infinite-load/index.ts +2 -0
  254. package/src/primitives/scroll-area-infinite-load/scroll-area-infinite-sentinel.css +6 -0
  255. package/src/primitives/scroll-area-infinite-load/useScrollAreaInfiniteLoad.ts +84 -0
  256. package/src/primitives/searchable-multi-select/SearchableMultiSelect.tsx +378 -0
  257. package/src/primitives/searchable-multi-select/index.ts +9 -0
  258. package/src/primitives/searchable-multi-select/overlay.ts +125 -0
  259. package/src/primitives/searchable-multi-select/searchable-multi-select.css +129 -0
  260. package/src/primitives/select/Select.tsx +21 -3
  261. package/src/primitives/select/overlay.ts +23 -4
  262. package/src/primitives/select/select.app.css +5 -2
  263. package/src/primitives/select/select.css +49 -12
  264. package/src/primitives/styles.css +3 -952
  265. package/src/primitives/tabbed-panels/TabbedPanels.tsx +68 -0
  266. package/src/primitives/tabbed-panels/index.ts +2 -0
  267. package/src/primitives/tabbed-panels/tabbed-panels.css +58 -0
  268. package/src/primitives/{TextArea.tsx → text-area/TextArea.tsx} +3 -2
  269. package/src/primitives/text-area/index.ts +1 -0
  270. package/src/primitives/{TextInput.tsx → text-input/TextInput.tsx} +3 -2
  271. package/src/primitives/text-input/index.ts +1 -0
  272. package/src/primitives/text-input/input.css +54 -0
  273. package/src/primitives/{Toolbar.tsx → toolbar/Toolbar.tsx} +1 -1
  274. package/src/primitives/toolbar/index.ts +1 -0
  275. package/src/primitives/visually-hidden/visually-hidden.css +11 -0
  276. package/src/primitives/{WorkbenchEditor.tsx → workbench-editor/WorkbenchEditor.tsx} +81 -43
  277. package/src/primitives/workbench-editor/button-group.css +10 -0
  278. package/src/primitives/workbench-editor/editor-tabs.css +201 -0
  279. package/src/primitives/workbench-editor/index.ts +1 -0
  280. package/src/primitives/workbench-editor/resizable-panels.css +53 -0
  281. package/src/primitives/workbench-editor/segmented-control.css +98 -0
  282. package/src/primitives/workbench-media-slot/WorkbenchMediaPlaceholder.tsx +25 -0
  283. package/src/primitives/workbench-media-slot/WorkbenchMediaSlot.tsx +66 -0
  284. package/src/primitives/workbench-media-slot/index.ts +2 -0
  285. package/src/primitives/workbench-media-slot/media-slot.css +72 -0
  286. package/src/primitives/workbench-thumbnail/WorkbenchThumbnail.tsx +38 -0
  287. package/src/primitives/workbench-thumbnail/index.ts +1 -0
  288. package/src/primitives/workbench-thumbnail/thumbnail.css +69 -0
  289. package/src/scrollbars.css +77 -2
  290. package/src/styles.css +13 -7735
  291. package/src/test-utils/workbenchMonacoMock.tsx +37 -0
  292. package/src/utils/dragMime.ts +89 -0
  293. package/src/utils/useWorkbenchMediaImage.ts +37 -0
  294. package/src/widget-asset/WidgetAssetEditor.tsx +9 -7
  295. package/src/widget-asset/WidgetAssetModeControls.tsx +1 -1
  296. package/src/widget-asset/WidgetAssetWorkbench.tsx +5 -6
  297. package/src/widget-studio/create-widget-studio-workspace-editor.tsx +1 -2
  298. package/src/widget-studio/index.ts +4 -1
  299. package/src/widget-studio/resolve-widget-studio-asset-catalog.ts +27 -10
  300. package/src/widget-tree/WidgetAssetPalette.tsx +35 -7
  301. package/src/widget-tree/WidgetInspectorPanel.tsx +53 -3
  302. package/src/widget-tree/WidgetSourceEditor.tsx +90 -3
  303. package/src/widget-tree/WidgetTreeCanvasPreview.tsx +875 -0
  304. package/src/widget-tree/WidgetTreeLab.tsx +411 -83
  305. package/src/widget-tree/WidgetTreeModeControls.tsx +30 -1
  306. package/src/widget-tree/WidgetTreeSidePanel.tsx +24 -34
  307. package/src/widget-tree/WidgetTreeView.tsx +711 -11
  308. package/src/widget-tree/WidgetTreeWorkbench.tsx +59 -15
  309. package/src/widget-tree/WidgetTreeWorkspaceShell.tsx +28 -10
  310. package/src/widget-tree/index.ts +22 -4
  311. package/src/widget-tree/widget-placement-asset-dnd.ts +35 -0
  312. package/src/widget-tree/widget-tree-document.ts +3 -9
  313. package/src/widget-tree/widget-tree-editor-state.ts +40 -0
  314. package/src/widget-tree/widget-tree-layout.ts +48 -3
  315. package/src/widget-tree/widget-tree-play-helpers.ts +69 -58
  316. package/src/workbench/auth/WorkbenchLoginView.tsx +4 -6
  317. package/src/workbench/auth/auth-flows.css +440 -0
  318. package/src/workbench/auth/auth.css +3 -0
  319. package/src/workbench/auth/profile-modals.css +115 -0
  320. package/src/workbench/bootstrap/WorkbenchBootstrapGate.tsx +45 -0
  321. package/src/workbench/bootstrap/WorkbenchBootstrapView.tsx +100 -0
  322. package/src/workbench/bootstrap/index.ts +12 -0
  323. package/src/workbench/bootstrap/useWorkbenchBootstrap.ts +130 -0
  324. package/src/workbench/chat/ChatCommandProposalCard.tsx +115 -0
  325. package/src/workbench/chat/ChatComposer.tsx +32 -34
  326. package/src/workbench/chat/ChatConversationBar.tsx +134 -0
  327. package/src/workbench/chat/ChatHistoryMenu.tsx +171 -0
  328. package/src/workbench/chat/ChatHistoryMenuRow.tsx +74 -0
  329. package/src/workbench/chat/ChatMessageCollapsible.tsx +119 -0
  330. package/src/workbench/chat/ChatMessageItem.tsx +351 -19
  331. package/src/workbench/chat/ChatMessageList.tsx +109 -24
  332. package/src/workbench/chat/ChatPanel.tsx +141 -19
  333. package/src/workbench/chat/ChatPhasedRunProgress.tsx +275 -0
  334. package/src/workbench/chat/ChatRenameDialog.tsx +77 -0
  335. package/src/workbench/chat/chat-conversation.css +273 -0
  336. package/src/workbench/chat/chat-ui.css +1132 -0
  337. package/src/workbench/chat/chat.css +3 -0
  338. package/src/workbench/chat/chatConversation.ts +46 -0
  339. package/src/workbench/chat/chatHistoryRowMenuItems.ts +29 -0
  340. package/src/workbench/chat/chatMessageMeta.tsx +252 -0
  341. package/src/workbench/chat/chatScroll.ts +22 -0
  342. package/src/workbench/chat/index.ts +48 -1
  343. package/src/workbench/chat/slashCommand.ts +5 -7
  344. package/src/workbench/chat/types.ts +35 -0
  345. package/src/workbench/chat/useCancelRuntimeOnUnmount.ts +60 -0
  346. package/src/workbench/chat/useChatPrependPagination.ts +233 -0
  347. package/src/workbench/chat/useChatRuntimeState.ts +3 -15
  348. package/src/workbench/chat/useSlashCommandSuggest.ts +77 -24
  349. package/src/workbench/chrome/WorkbenchModalPortal.tsx +52 -0
  350. package/src/workbench/chrome/WorkbenchPlatformContext.tsx +31 -0
  351. package/src/workbench/chrome/index.css +6 -0
  352. package/src/workbench/chrome/workbench-chrome.css +4 -0
  353. package/src/workbench/chrome/workbench-desktop-titlebar.css +60 -0
  354. package/src/workbench/chrome/workbench-host.css +85 -0
  355. package/src/workbench/chrome/workbench-layout-regions.css +42 -0
  356. package/src/workbench/chrome/workbench-platform-chrome.css +142 -0
  357. package/src/workbench/chrome/workbench-shell-titlebar.css +124 -0
  358. package/src/workbench/chrome/workbenchModalViewState.ts +52 -0
  359. package/src/workbench/chrome/workbenchOverlaysContext.tsx +21 -0
  360. package/src/workbench/chrome/workbenchPlatformChrome.ts +40 -0
  361. package/src/workbench/command-palette/command-palette.css +156 -0
  362. package/src/workbench/commands/CommandGroupShell.tsx +131 -0
  363. package/src/workbench/commands/CommandList.tsx +167 -0
  364. package/src/workbench/commands/CommandPalette.tsx +391 -0
  365. package/src/workbench/{ConfirmationFlow.tsx → commands/ConfirmationFlow.tsx} +6 -8
  366. package/src/workbench/{ShortcutCommandBridge.tsx → commands/ShortcutCommandBridge.tsx} +1 -4
  367. package/src/workbench/commands/command-execution-policy.ts +61 -0
  368. package/src/workbench/commands/command-model.ts +279 -0
  369. package/src/workbench/{commands.ts → commands/commands.ts} +63 -7
  370. package/src/workbench/commands/workbenchContextMenu.ts +18 -0
  371. package/src/workbench/editor/WorkbenchEditorTabs.tsx +52 -0
  372. package/src/workbench/editor/editor-tabs-dnd.ts +162 -0
  373. package/src/workbench/editor/editorTabContextMenu.ts +111 -0
  374. package/src/workbench/editor/useEditorTabsStripDnd.ts +262 -0
  375. package/src/workbench/editor/useWorkbenchEditorTabContextMenu.tsx +66 -0
  376. package/src/workbench/editor-tabs/index.ts +22 -0
  377. package/src/workbench/index.ts +288 -37
  378. package/src/workbench/management/AccountManagementPanel.tsx +82 -0
  379. package/src/workbench/management/CommandInspectorPanel.tsx +127 -0
  380. package/src/workbench/management/CommandManagementPanel.tsx +129 -0
  381. package/src/workbench/management/CommandManagementSidebar.tsx +318 -0
  382. package/src/workbench/management/ExtensionManagementPanel.tsx +527 -0
  383. package/src/workbench/management/ExtensionManagementSidebar.tsx +509 -0
  384. package/src/workbench/management/IntegrationCommandActions.tsx +78 -0
  385. package/src/workbench/management/IntegrationSettingsSurface.tsx +290 -0
  386. package/src/workbench/management/IntegrationsShell.tsx +53 -0
  387. package/src/workbench/management/KeybindingCaptureField.tsx +142 -0
  388. package/src/workbench/management/KeybindingManagementPanel.tsx +120 -0
  389. package/src/workbench/management/LibraryCatalogPickerDialog.tsx +208 -0
  390. package/src/workbench/management/LibraryFacetFilterDialog.tsx +62 -0
  391. package/src/workbench/management/ManagementCard.tsx +89 -0
  392. package/src/workbench/management/ManagementFilterChips.tsx +41 -0
  393. package/src/workbench/management/ManagementGroup.tsx +56 -0
  394. package/src/workbench/management/ManagementPanelControls.tsx +43 -0
  395. package/src/workbench/management/ManagementPanelFrame.tsx +109 -0
  396. package/src/workbench/management/WorkbenchDialogFrame.tsx +148 -0
  397. package/src/workbench/management/WorkbenchNotice.tsx +211 -0
  398. package/src/workbench/management/build-command-management-groups.ts +157 -0
  399. package/src/workbench/management/command-inspector-uri.ts +26 -0
  400. package/src/workbench/management/createWorkbenchNotify.tsx +88 -0
  401. package/src/workbench/management/extension-category-display.ts +42 -0
  402. package/src/workbench/management/extension-install-approval.ts +72 -0
  403. package/src/workbench/management/format-command-run-state.ts +19 -0
  404. package/src/workbench/management/index.ts +144 -0
  405. package/src/workbench/management/integration-command-action.ts +25 -0
  406. package/src/workbench/management/library-catalog-picker-dialog.css +56 -0
  407. package/src/workbench/management/library-facet-filter-dialog.css +8 -0
  408. package/src/workbench/management/management-panel.css +444 -0
  409. package/src/workbench/management/management.css +32 -0
  410. package/src/workbench/management/types.ts +139 -0
  411. package/src/workbench/management/useWorkbenchNotify.ts +10 -0
  412. package/src/workbench/{MarkdownPreview.tsx → markdown/MarkdownPreview.tsx} +26 -15
  413. package/src/workbench/markdown/markdownRemarkPlugins.ts +12 -0
  414. package/src/workbench/markdown/sanitizeMarkdownHref.ts +29 -0
  415. package/src/workbench/schema/index.ts +0 -1
  416. package/src/workbench/settings/NavigationPanel.tsx +41 -2
  417. package/src/workbench/settings/SchemaForm.tsx +20 -7
  418. package/src/workbench/settings/SectionTabPanel.tsx +172 -0
  419. package/src/workbench/settings/SectionedPanel.tsx +40 -286
  420. package/src/workbench/settings/StructuredDataForm.tsx +106 -26
  421. package/src/workbench/settings/StructuredDataSchemaPanel.tsx +345 -93
  422. package/src/workbench/settings/StructuredDataTableView.tsx +2 -2
  423. package/src/workbench/settings/WorkbenchPanelRegion.tsx +1 -1
  424. package/src/workbench/settings/WorkbenchSettingsModal.tsx +116 -62
  425. package/src/workbench/settings/WorkbenchSettingsNav.tsx +3 -3
  426. package/src/workbench/settings/extensionSettingsForm.ts +34 -0
  427. package/src/workbench/settings/index.ts +36 -1
  428. package/src/workbench/settings/navigation-panel.css +59 -0
  429. package/src/workbench/settings/panel-region.css +3 -2
  430. package/src/workbench/settings/schema-form.css +36 -0
  431. package/src/workbench/settings/schemaFormSettingSpec.ts +177 -0
  432. package/src/workbench/settings/schemaFormSettingsCategory.tsx +21 -0
  433. package/src/workbench/settings/section-tab-panel.css +157 -0
  434. package/src/workbench/settings/sectionScrollSpyDom.ts +139 -0
  435. package/src/workbench/settings/sectioned-panel.css +162 -0
  436. package/src/workbench/settings/sectionedPanelScrollSpy.ts +158 -28
  437. package/src/workbench/settings/settings-responsive.css +58 -0
  438. package/src/workbench/settings/settings.css +11 -0
  439. package/src/workbench/settings/settingsCommit.tsx +55 -0
  440. package/src/workbench/settings/structured-data-form.css +114 -0
  441. package/src/workbench/settings/structured-data-schema-panel.css +33 -19
  442. package/src/workbench/settings/structuredDataFormModel.ts +140 -0
  443. package/src/workbench/settings/structuredDataSchema.ts +111 -658
  444. package/src/workbench/settings/structuredDataSchemaDate.ts +197 -0
  445. package/src/workbench/settings/structuredDataSchemaField.ts +105 -0
  446. package/src/workbench/settings/structuredDataSchemaSection.ts +74 -0
  447. package/src/workbench/settings/structuredDataSchemaTable.ts +120 -0
  448. package/src/workbench/settings/structuredDataSchemaTypes.ts +308 -0
  449. package/src/workbench/settings/structuredDataSchemaValidation.ts +166 -0
  450. package/src/workbench/settings/useSectionScrollSpy.ts +420 -0
  451. package/src/workbench/settings/workbench-settings-modal.css +273 -0
  452. package/src/workbench/shell/ActivityBar.tsx +159 -0
  453. package/src/workbench/{ArtifactShell.tsx → shell/ArtifactShell.tsx} +30 -30
  454. package/src/workbench/shell/SplitView.tsx +485 -0
  455. package/src/workbench/{StatusBar.tsx → shell/StatusBar.tsx} +10 -8
  456. package/src/workbench/{StructuredArtifactEditor.tsx → shell/StructuredArtifactEditor.tsx} +9 -9
  457. package/src/workbench/{Timeline.tsx → shell/Timeline.tsx} +19 -24
  458. package/src/workbench/shell/WorkbenchCanvasShell.defaults.ts +106 -0
  459. package/src/workbench/shell/WorkbenchCanvasShell.model.ts +46 -0
  460. package/src/workbench/{WorkbenchCanvasShell.tsx → shell/WorkbenchCanvasShell.tsx} +34 -148
  461. package/src/workbench/shell/WorkbenchDesktopTitleBar.tsx +126 -0
  462. package/src/workbench/shell/WorkbenchShell.tsx +192 -0
  463. package/src/workbench/shell/WorkbenchShellTitleBarLayoutControls.tsx +80 -0
  464. package/src/workbench/shell/WorkbenchStandaloneShell.tsx +604 -0
  465. package/src/workbench/shell/WorkbenchViewEditor.tsx +75 -0
  466. package/src/workbench/shell/WorkbenchViewSidebar.tsx +85 -0
  467. package/src/workbench/shell/WorkbenchWindowChromeControls.tsx +293 -0
  468. package/src/workbench/shell/activity-bar.css +245 -0
  469. package/src/workbench/shell/activityBarOrder.ts +98 -0
  470. package/src/workbench/shell/appearanceLabels.ts +28 -0
  471. package/src/workbench/shell/confirmation-flow.css +87 -0
  472. package/src/workbench/shell/hardReset.ts +64 -0
  473. package/src/workbench/shell/index.css +5 -0
  474. package/src/workbench/shell/shell.ts +152 -0
  475. package/src/workbench/shell/shellPresets.ts +36 -0
  476. package/src/workbench/{shellState.ts → shell/shellState.ts} +16 -23
  477. package/src/workbench/shell/shellViewModel.ts +160 -0
  478. package/src/workbench/shell/sidebarViewPlacementDnd.ts +61 -0
  479. package/src/workbench/shell/split-view.css +188 -0
  480. package/src/workbench/{standalone.ts → shell/standalone.ts} +11 -11
  481. package/src/workbench/shell/status-bar.css +141 -0
  482. package/src/workbench/{status.ts → shell/status.ts} +10 -6
  483. package/src/workbench/shell/useDeferredWorkbenchMount.ts +71 -0
  484. package/src/workbench/shell/useWorkbenchAppearanceDocumentSync.tsx +17 -0
  485. package/src/workbench/shell/useWorkbenchSidebarActionBarDnd.ts +227 -0
  486. package/src/workbench/shell/useWorkbenchSidebarLayout.tsx +232 -0
  487. package/src/workbench/shell/useWorkbenchSidebarViewPlacementDropZone.ts +194 -0
  488. package/src/workbench/shell/useWorkbenchStandaloneShellStateSync.tsx +112 -0
  489. package/src/workbench/shell/workbenchSidebarLayoutContext.ts +46 -0
  490. package/src/workbench/shell/workbenchStandaloneShellReactContext.tsx +80 -0
  491. package/src/workbench/shell/workbenchViewRouteState.ts +151 -0
  492. package/src/workbench/theme/WorkbenchThemeProvider.tsx +142 -0
  493. package/src/workbench/{theme.ts → theme/theme.ts} +9 -3
  494. package/src/workbench/theme/themePresets.ts +192 -0
  495. package/src/workbench/views/action-list.css +144 -0
  496. package/src/workbench/views/artifact-preview.css +184 -0
  497. package/src/workbench/views/command-inspector.css +98 -0
  498. package/src/workbench/views/command-list.css +356 -0
  499. package/src/workbench/views/commands-sidebar.css +51 -0
  500. package/src/workbench/views/extensions-sidebar.css +175 -0
  501. package/src/workbench/views/multi-provider-explorer.css +182 -0
  502. package/src/workbench/views/search.css +10 -0
  503. package/src/workbench/views/timeline.css +239 -0
  504. package/src/workbench/views/view-hosts.css +37 -0
  505. package/src/workbench/views/view-sidebar.css +21 -0
  506. package/src/workbench/views/views.css +12 -0
  507. package/src/workbench/widgets/widget-tree.css +598 -0
  508. package/src/workbench/widgets/widgets.css +2 -0
  509. package/src/workbench/workspace/WorkspaceDraftsContext.tsx +59 -71
  510. package/src/workbench/workspace/WorkspaceEditor.tsx +27 -123
  511. package/src/workbench/workspace/WorkspaceEditorPanel.tsx +68 -9
  512. package/src/workbench/workspace/WorkspaceExplorer.tsx +252 -53
  513. package/src/workbench/workspace/WorkspaceExplorerPanel.tsx +73 -0
  514. package/src/workbench/workspace/WorkspaceFileIcon.tsx +4 -160
  515. package/src/workbench/workspace/WorkspacePathLabel.tsx +42 -0
  516. package/src/workbench/workspace/WorkspaceSearchPanel.tsx +18 -15
  517. package/src/workbench/workspace/WorkspaceSearchResults.tsx +6 -2
  518. package/src/workbench/workspace/build-workspace-explorer-nodes.ts +44 -0
  519. package/src/workbench/workspace/createVirtualWorkspaceExplorerPort.ts +141 -0
  520. package/src/workbench/workspace/explorer-tree-style.ts +18 -0
  521. package/src/workbench/workspace/index.ts +45 -32
  522. package/src/workbench/workspace/json-config-workbench.css +57 -0
  523. package/src/workbench/workspace/monaco-panel.css +71 -0
  524. package/src/workbench/workspace/path.ts +2 -0
  525. package/src/workbench/workspace/useWorkspaceExplorerController.ts +490 -0
  526. package/src/workbench/workspace/workspace-editor.css +235 -0
  527. package/src/workbench/workspace/workspace-explorer-panel.css +33 -0
  528. package/src/workbench/workspace/workspace.css +5 -0
  529. package/src/workbench/workspace/workspaceExplorerController.ts +193 -0
  530. package/src/workbench/workspace/workspaceExplorerKeyboard.ts +109 -0
  531. package/src/workbench/workspace/workspaceJsonDiagnostics.ts +8 -7
  532. package/src/workbench-menu-surfaces.css +57 -0
  533. package/src/jdw/builtins/renderBuiltinWidgetNode.tsx +0 -126
  534. package/src/layout/SideBarViewFrame.tsx +0 -367
  535. package/src/primitives/Checkbox.tsx +0 -21
  536. package/src/primitives/NumberInput.tsx +0 -38
  537. package/src/primitives/ScrollArea.tsx +0 -42
  538. package/src/primitives/Select.tsx +0 -1
  539. package/src/primitives/StatusBar.tsx +0 -46
  540. package/src/primitives/WorkbenchChrome.tsx +0 -424
  541. package/src/workbench/ActivityBar.tsx +0 -52
  542. package/src/workbench/CommandPalette.tsx +0 -819
  543. package/src/workbench/SplitView.tsx +0 -136
  544. package/src/workbench/WorkbenchShell.tsx +0 -74
  545. package/src/workbench/WorkbenchStandaloneShell.tsx +0 -318
  546. package/src/workbench/shell.ts +0 -15
  547. package/src/workbench/workspace/MultiProviderExplorer.tsx +0 -625
  548. /package/src/workbench/{keyboard.ts → commands/keyboard.ts} +0 -0
@@ -0,0 +1,90 @@
1
+ import type { JSX, ReactNode } from 'react';
2
+
3
+ import type { WorkbenchIconInput } from '../icons/types';
4
+ import { Badge } from '../primitives/badge';
5
+ import { Button } from '../primitives/button';
6
+ import { IconButton } from '../primitives/icon-button';
7
+ import { cx } from '../utils/cx';
8
+
9
+ export type WorkbenchPropertyOverrideResetAppearance = 'icon' | 'text';
10
+
11
+ export interface WorkbenchPropertyOverrideLabelProps {
12
+ readonly label: ReactNode;
13
+ readonly overridden: boolean;
14
+ readonly onReset?: () => void;
15
+ /** Storybook defaults OK; hosts should pass i18n strings. */
16
+ readonly customBadgeLabel?: string;
17
+ readonly defaultBadgeLabel?: string;
18
+ /**
19
+ * Accessible name for the Reset control. Used as `IconButton` label when
20
+ * `resetAppearance` is `"icon"`, or as visible button text when `"text"`.
21
+ */
22
+ readonly resetLabel?: string;
23
+ /** Dense inspectors default to icon; use `"text"` when the label must stay visible. */
24
+ readonly resetAppearance?: WorkbenchPropertyOverrideResetAppearance;
25
+ /** Codicon / host icon for icon Reset. Default `codicon-discard`. */
26
+ readonly resetIcon?: WorkbenchIconInput;
27
+ readonly className?: string;
28
+ }
29
+
30
+ /**
31
+ * Sparse-override inspector label chrome: Custom/Default badge + optional Reset.
32
+ * Compose into `Field label={...}` — hosts own override detection and reset writes.
33
+ */
34
+ export function WorkbenchPropertyOverrideLabel({
35
+ className,
36
+ customBadgeLabel = 'Custom',
37
+ defaultBadgeLabel = 'Default',
38
+ label,
39
+ onReset,
40
+ overridden,
41
+ resetAppearance = 'icon',
42
+ resetIcon = 'codicon-discard',
43
+ resetLabel = 'Reset',
44
+ }: WorkbenchPropertyOverrideLabelProps): JSX.Element {
45
+ const showReset = overridden && onReset != null;
46
+
47
+ return (
48
+ <span className={cx('ui-workbench-property-override-label', className)}>
49
+ <span className="ui-workbench-property-override-label__main">
50
+ <span className="ui-workbench-property-override-label__text">{label}</span>
51
+ <Badge
52
+ className="ui-workbench-property-override-label__badge"
53
+ data-ui-workbench-property-override-badge={overridden ? 'custom' : 'default'}
54
+ variant={overridden ? 'accent' : 'muted'}
55
+ >
56
+ {overridden ? customBadgeLabel : defaultBadgeLabel}
57
+ </Badge>
58
+ </span>
59
+ {showReset ? (
60
+ resetAppearance === 'text' ? (
61
+ <Button
62
+ className="ui-workbench-property-override-label__reset"
63
+ compact
64
+ data-ui-workbench-property-override-reset="true"
65
+ data-ui-workbench-property-override-reset-appearance="text"
66
+ type="button"
67
+ onClick={() => {
68
+ onReset();
69
+ }}
70
+ >
71
+ {resetLabel}
72
+ </Button>
73
+ ) : (
74
+ <IconButton
75
+ className="ui-workbench-property-override-label__reset"
76
+ compact
77
+ data-ui-workbench-property-override-reset="true"
78
+ data-ui-workbench-property-override-reset-appearance="icon"
79
+ icon={resetIcon}
80
+ label={resetLabel}
81
+ type="button"
82
+ onClick={() => {
83
+ onReset();
84
+ }}
85
+ />
86
+ )
87
+ ) : null}
88
+ </span>
89
+ );
90
+ }
@@ -1,13 +1,14 @@
1
- import type { ComponentPropsWithRef, ReactNode } from 'react';
2
- import { Button } from '../primitives/Button';
3
- import type { ButtonProps } from '../primitives/Button';
4
- import { Checkbox } from '../primitives/Checkbox';
5
- import { Field } from '../primitives/Field';
6
- import type { FieldProps } from '../primitives/Field';
7
- import { NumberInput } from '../primitives/NumberInput';
8
- import { Select } from '../primitives/Select';
9
- import { TextInput } from '../primitives/TextInput';
10
- import type { ControlWidth } from '../primitives/TextInput';
1
+ import { useId, useState, type ComponentPropsWithRef, type ReactNode } from 'react';
2
+ import { Button } from '../primitives/button';
3
+ import type { ButtonProps } from '../primitives/button';
4
+ import { Checkbox } from '../primitives/checkbox';
5
+ import { Field } from '../primitives/field';
6
+ import type { FieldProps } from '../primitives/field';
7
+ import { NumberInput } from '../primitives/number-input';
8
+ import { Select } from '../primitives/select';
9
+ import { TextInput } from '../primitives/text-input';
10
+ import type { ControlWidth } from '../primitives/text-input';
11
+ import { cxCodicon } from '../utils/codicon';
11
12
  import { cx } from '../utils/cx';
12
13
 
13
14
  export type WorkbenchPropertyRowProps = FieldProps;
@@ -28,17 +29,22 @@ export interface WorkbenchPropertyTextRowProps extends Omit<WorkbenchPropertyRow
28
29
  export function WorkbenchPropertyTextRow({
29
30
  controlWidth = 'full',
30
31
  disabled,
32
+ htmlFor,
31
33
  onValueChange,
32
34
  placeholder,
33
35
  readOnly,
34
36
  value,
35
37
  ...props
36
38
  }: WorkbenchPropertyTextRowProps) {
39
+ const generatedId = useId();
40
+ const inputId = htmlFor ?? generatedId;
41
+
37
42
  return (
38
- <WorkbenchPropertyRow {...props}>
43
+ <WorkbenchPropertyRow htmlFor={inputId} {...props}>
39
44
  <TextInput
40
45
  controlWidth={controlWidth}
41
46
  disabled={disabled}
47
+ id={inputId}
42
48
  placeholder={placeholder}
43
49
  readOnly={readOnly}
44
50
  value={value}
@@ -64,6 +70,7 @@ export interface WorkbenchPropertyNumberRowProps extends Omit<
64
70
  export function WorkbenchPropertyNumberRow({
65
71
  controlWidth = 'full',
66
72
  disabled,
73
+ htmlFor,
67
74
  max,
68
75
  min,
69
76
  onValueChange,
@@ -71,11 +78,15 @@ export function WorkbenchPropertyNumberRow({
71
78
  value,
72
79
  ...props
73
80
  }: WorkbenchPropertyNumberRowProps) {
81
+ const generatedId = useId();
82
+ const inputId = htmlFor ?? generatedId;
83
+
74
84
  return (
75
- <WorkbenchPropertyRow {...props}>
85
+ <WorkbenchPropertyRow htmlFor={inputId} {...props}>
76
86
  <NumberInput
77
87
  controlWidth={controlWidth}
78
88
  disabled={disabled}
89
+ id={inputId}
79
90
  max={max}
80
91
  min={min}
81
92
  step={step}
@@ -179,16 +190,21 @@ export interface WorkbenchPropertySelectRowProps<TValue extends string = string>
179
190
  export function WorkbenchPropertySelectRow<TValue extends string = string>({
180
191
  controlWidth = 'full',
181
192
  disabled,
193
+ htmlFor,
182
194
  onValueChange,
183
195
  options,
184
196
  value,
185
197
  ...props
186
198
  }: WorkbenchPropertySelectRowProps<TValue>) {
199
+ const generatedId = useId();
200
+ const inputId = htmlFor ?? generatedId;
201
+
187
202
  return (
188
- <WorkbenchPropertyRow {...props}>
203
+ <WorkbenchPropertyRow htmlFor={inputId} {...props}>
189
204
  <Select
190
205
  controlWidth={controlWidth}
191
206
  disabled={disabled}
207
+ id={inputId}
192
208
  value={value ?? options[0]?.value ?? ''}
193
209
  onValueChange={(next) => onValueChange(next as TValue)}
194
210
  >
@@ -287,6 +303,7 @@ export function WorkbenchPropertyCheckboxRow({
287
303
  }
288
304
 
289
305
  export interface WorkbenchPropertyPanelProps extends ComponentPropsWithRef<'div'> {
306
+ children?: ReactNode;
290
307
  empty?: boolean;
291
308
  }
292
309
 
@@ -313,12 +330,27 @@ export function WorkbenchSectionTitle({ className, ...props }: WorkbenchSectionT
313
330
  return <div className={cx('ui-workbench-section-title', className)} {...props} />;
314
331
  }
315
332
 
333
+ export type WorkbenchPropertySectionLevel = 'category' | 'group';
334
+
316
335
  export interface WorkbenchPropertySectionProps extends Omit<
317
336
  ComponentPropsWithRef<'section'>,
318
337
  'title'
319
338
  > {
320
339
  actions?: ReactNode;
321
340
  bodyClassName?: string;
341
+ children?: ReactNode;
342
+ /** When true, the header becomes a disclosure control with a chevron. */
343
+ collapsible?: boolean;
344
+ /** Controlled collapsed state. Use with `onCollapsedChange`. */
345
+ collapsed?: boolean;
346
+ /** Uncontrolled initial collapsed state when `collapsed` is omitted. */
347
+ defaultCollapsed?: boolean;
348
+ /**
349
+ * Visual hierarchy for inspector categories vs nested groups.
350
+ * `category` is the default caps-style section; `group` is quieter.
351
+ */
352
+ level?: WorkbenchPropertySectionLevel;
353
+ onCollapsedChange?: (collapsed: boolean) => void;
322
354
  title?: ReactNode;
323
355
  }
324
356
 
@@ -327,23 +359,88 @@ export function WorkbenchPropertySection({
327
359
  bodyClassName,
328
360
  children,
329
361
  className,
362
+ collapsible = false,
363
+ collapsed,
364
+ defaultCollapsed = false,
365
+ id,
366
+ level = 'category',
367
+ onCollapsedChange,
330
368
  title,
331
369
  ...props
332
370
  }: WorkbenchPropertySectionProps) {
371
+ const generatedId = useId();
372
+ const sectionId = id ?? generatedId;
373
+ const headingId = `${sectionId}-heading`;
374
+ const contentId = `${sectionId}-content`;
375
+ const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(defaultCollapsed);
376
+ const resolvedCollapsed = collapsed ?? uncontrolledCollapsed;
377
+ const showHeader = Boolean(title || actions || collapsible);
378
+
379
+ const handleToggle = () => {
380
+ if (!collapsible) {
381
+ return;
382
+ }
383
+
384
+ const nextCollapsed = !resolvedCollapsed;
385
+ if (collapsed === undefined) {
386
+ setUncontrolledCollapsed(nextCollapsed);
387
+ }
388
+ onCollapsedChange?.(nextCollapsed);
389
+ };
390
+
333
391
  return (
334
- <section className={cx('ui-workbench-property-section', className)} {...props}>
335
- {title || actions ? (
392
+ <section
393
+ id={id}
394
+ aria-labelledby={title ? headingId : undefined}
395
+ className={cx(
396
+ 'ui-workbench-property-section',
397
+ collapsible && 'ui-workbench-property-section--collapsible',
398
+ resolvedCollapsed && 'ui-workbench-property-section--collapsed',
399
+ className,
400
+ )}
401
+ data-level={level}
402
+ {...props}
403
+ >
404
+ {showHeader ? (
336
405
  <div className="ui-workbench-property-section__header">
337
- {title ? <WorkbenchSectionTitle>{title}</WorkbenchSectionTitle> : null}
406
+ {collapsible && title ? (
407
+ <button
408
+ aria-controls={contentId}
409
+ aria-expanded={!resolvedCollapsed}
410
+ className="ui-workbench-property-section__toggle"
411
+ type="button"
412
+ onClick={handleToggle}
413
+ >
414
+ <i
415
+ aria-hidden="true"
416
+ className={cxCodicon(
417
+ resolvedCollapsed ? 'chevron-right' : 'chevron-down',
418
+ 'ui-workbench-property-section__chevron',
419
+ )}
420
+ />
421
+ <span id={headingId} className="ui-workbench-section-title">
422
+ {title}
423
+ </span>
424
+ </button>
425
+ ) : title ? (
426
+ <WorkbenchSectionTitle id={headingId}>{title}</WorkbenchSectionTitle>
427
+ ) : null}
338
428
  {actions ? <div className="ui-workbench-property-section__actions">{actions}</div> : null}
339
429
  </div>
340
430
  ) : null}
341
- <div className={cx('ui-workbench-property-section__body', bodyClassName)}>{children}</div>
431
+ <div
432
+ id={collapsible ? contentId : undefined}
433
+ className={cx('ui-workbench-property-section__body', bodyClassName)}
434
+ hidden={collapsible ? resolvedCollapsed : undefined}
435
+ >
436
+ {children}
437
+ </div>
342
438
  </section>
343
439
  );
344
440
  }
345
441
 
346
442
  export interface WorkbenchPropertyStackProps extends ComponentPropsWithRef<'div'> {
443
+ children?: ReactNode;
347
444
  gap?: 'xs' | 'sm' | 'md' | 'lg';
348
445
  }
349
446
 
@@ -376,6 +473,45 @@ export function WorkbenchPropertyGrid({
376
473
  );
377
474
  }
378
475
 
476
+ export interface WorkbenchMetricGridItem {
477
+ id?: string | undefined;
478
+ label: ReactNode;
479
+ value: ReactNode;
480
+ }
481
+
482
+ export type WorkbenchMetricGridEntry = WorkbenchMetricGridItem | readonly [ReactNode, ReactNode];
483
+
484
+ export interface WorkbenchMetricGridProps extends Omit<WorkbenchPropertyGridProps, 'children'> {
485
+ items: readonly WorkbenchMetricGridEntry[];
486
+ }
487
+
488
+ export function WorkbenchMetricGrid({
489
+ columns,
490
+ gap = 'md',
491
+ items,
492
+ ...props
493
+ }: WorkbenchMetricGridProps) {
494
+ return (
495
+ <WorkbenchPropertyGrid columns={columns ?? (items.length > 3 ? 3 : 2)} gap={gap} {...props}>
496
+ {items.map((item, index) => {
497
+ const metric = isWorkbenchMetricGridTuple(item)
498
+ ? { key: index, label: item[0], value: item[1] }
499
+ : { key: item.id ?? index, label: item.label, value: item.value };
500
+
501
+ return (
502
+ <WorkbenchPropertyKeyValue key={metric.key} name={metric.label} value={metric.value} />
503
+ );
504
+ })}
505
+ </WorkbenchPropertyGrid>
506
+ );
507
+ }
508
+
509
+ function isWorkbenchMetricGridTuple(
510
+ item: WorkbenchMetricGridEntry,
511
+ ): item is readonly [ReactNode, ReactNode] {
512
+ return Array.isArray(item);
513
+ }
514
+
379
515
  export interface WorkbenchPropertyInlineProps extends ComponentPropsWithRef<'div'> {
380
516
  justify?: 'start' | 'between';
381
517
  }
@@ -0,0 +1,51 @@
1
+ import type { ComponentPropsWithoutRef } from 'react';
2
+
3
+ import { FilterBar, FilterBarRow } from './panel';
4
+ import { ClearableTextInput } from '../primitives/clearable-text-input';
5
+ import { cx } from '../utils/cx';
6
+
7
+ export interface WorkbenchPropertySearchProps extends Omit<
8
+ ComponentPropsWithoutRef<'div'>,
9
+ 'children' | 'onChange'
10
+ > {
11
+ /** Accessible name for the search input. Defaults to "Search properties". */
12
+ 'aria-label'?: string;
13
+ clearLabel?: string;
14
+ onValueChange: (value: string) => void;
15
+ placeholder?: string;
16
+ value: string;
17
+ }
18
+
19
+ /**
20
+ * Declared-first inspector search chrome.
21
+ * Pair with `filterWorkbenchPropertyFields` — hosts own the field manifest.
22
+ */
23
+ export function WorkbenchPropertySearch({
24
+ 'aria-label': ariaLabel = 'Search properties',
25
+ className,
26
+ clearLabel = 'Clear',
27
+ onValueChange,
28
+ placeholder = 'Search properties',
29
+ value,
30
+ ...props
31
+ }: WorkbenchPropertySearchProps) {
32
+ return (
33
+ <FilterBar
34
+ className={cx('ui-workbench-property-search', className)}
35
+ data-ui-workbench-property-search-bar="true"
36
+ {...props}
37
+ >
38
+ <FilterBarRow data-columns="search">
39
+ <ClearableTextInput
40
+ aria-label={ariaLabel}
41
+ clearLabel={clearLabel}
42
+ controlWidth="full"
43
+ data-ui-workbench-property-search="true"
44
+ placeholder={placeholder}
45
+ value={value}
46
+ onValueChange={onValueChange}
47
+ />
48
+ </FilterBarRow>
49
+ </FilterBar>
50
+ );
51
+ }
@@ -1,12 +1,13 @@
1
1
  import { forwardRef } from 'react';
2
2
  import type { ComponentPropsWithRef, CSSProperties, ReactNode } from 'react';
3
- import { IconButton } from '../primitives/IconButton';
4
- import type { IconButtonProps } from '../primitives/IconButton';
3
+ import { IconButton } from '../primitives/icon-button';
4
+ import type { IconButtonProps } from '../primitives/icon-button';
5
5
  import { cxCodicon } from '../utils/codicon';
6
6
  import { cx } from '../utils/cx';
7
7
  import { toLengthValue, workbenchTreeIndentOffset } from './layoutHelpers';
8
8
 
9
9
  export interface WorkbenchTreeProps extends ComponentPropsWithRef<'div'> {
10
+ children?: ReactNode;
10
11
  indentSize?: number | string;
11
12
  rowHeight?: number | string;
12
13
  }
@@ -38,6 +39,7 @@ export type WorkbenchTreeInteraction = 'default' | 'draggable' | 'dragging';
38
39
 
39
40
  export interface WorkbenchTreeItemProps extends ComponentPropsWithRef<'div'> {
40
41
  actions?: ReactNode;
42
+ children?: ReactNode;
41
43
  control?: ReactNode;
42
44
  depth?: number;
43
45
  icon?: ReactNode;
@@ -185,6 +187,7 @@ export function WorkbenchTreeActionButton({
185
187
  }
186
188
 
187
189
  export interface WorkbenchTreeDropLineProps extends ComponentPropsWithRef<'div'> {
190
+ children?: ReactNode;
188
191
  position: 'above' | 'below';
189
192
  }
190
193
 
@@ -204,6 +207,7 @@ export function WorkbenchTreeDropLine({
204
207
  }
205
208
 
206
209
  export interface WorkbenchTreeDropZoneProps extends ComponentPropsWithRef<'div'> {
210
+ children?: ReactNode;
207
211
  depth?: number;
208
212
  empty?: boolean;
209
213
  highlighted?: boolean;
@@ -235,6 +239,7 @@ export const WorkbenchTreeDropZone = forwardRef<HTMLDivElement, WorkbenchTreeDro
235
239
  );
236
240
 
237
241
  export interface WorkbenchTreeDragOverlayProps extends ComponentPropsWithRef<'div'> {
242
+ children?: ReactNode;
238
243
  rowHeight?: number | string;
239
244
  }
240
245
 
@@ -261,6 +266,7 @@ export function WorkbenchTreeDragOverlay({
261
266
  }
262
267
 
263
268
  export interface WorkbenchDragPreviewProps extends ComponentPropsWithRef<'div'> {
269
+ children?: ReactNode;
264
270
  maxWidth?: number | string;
265
271
  offset?: number | string;
266
272
  x: number | string;
@@ -293,14 +299,7 @@ export function WorkbenchDragPreview({
293
299
  }
294
300
 
295
301
  export type WorkbenchTemplateGlyphIcon =
296
- | 'badge'
297
- | 'color'
298
- | 'flex'
299
- | 'frame'
300
- | 'grid'
301
- | 'image'
302
- | 'list'
303
- | 'text';
302
+ 'badge' | 'color' | 'flex' | 'frame' | 'grid' | 'image' | 'list' | 'text';
304
303
 
305
304
  export interface WorkbenchTemplateGlyphProps extends ComponentPropsWithRef<'span'> {
306
305
  accent: string;
@@ -0,0 +1,21 @@
1
+ .ui-workbench-canvas-drag-ghost {
2
+ position: fixed;
3
+ left: var(--ui-workbench-canvas-drag-ghost-x, 0);
4
+ top: var(--ui-workbench-canvas-drag-ghost-y, 0);
5
+ z-index: var(--ui-workbench-canvas-drag-ghost-z-index, 2000);
6
+ width: var(--ui-workbench-canvas-drag-ghost-width, auto);
7
+ height: var(--ui-workbench-canvas-drag-ghost-height, auto);
8
+ overflow: hidden;
9
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.6);
10
+ opacity: var(--ui-workbench-canvas-drag-ghost-opacity, 0.82);
11
+ pointer-events: none;
12
+ transform: scale(var(--ui-workbench-canvas-drag-ghost-scale, 1.06));
13
+ transform-origin: center center;
14
+ }
15
+
16
+ .ui-workbench-canvas-drag-ghost__content {
17
+ width: var(--ui-workbench-canvas-drag-ghost-content-width, auto);
18
+ height: var(--ui-workbench-canvas-drag-ghost-content-height, auto);
19
+ transform: scale(var(--ui-workbench-canvas-drag-ghost-content-scale, 1));
20
+ transform-origin: 0 0;
21
+ }
@@ -0,0 +1,15 @@
1
+ .ui-workbench-canvas-drag-preview-frame {
2
+ box-sizing: border-box;
3
+ position: absolute;
4
+ left: var(--ui-workbench-canvas-drag-preview-frame-x, 0);
5
+ top: var(--ui-workbench-canvas-drag-preview-frame-y, 0);
6
+ z-index: var(--ui-workbench-canvas-drag-preview-frame-z-index, 1000);
7
+ width: var(--ui-workbench-canvas-drag-preview-frame-width, auto);
8
+ height: var(--ui-workbench-canvas-drag-preview-frame-height, auto);
9
+ overflow: hidden;
10
+ border: 1px dashed var(--vscode-focusBorder, var(--color-focus-border));
11
+ opacity: var(--ui-workbench-canvas-drag-preview-frame-opacity, 0.82);
12
+ pointer-events: none;
13
+ transform: var(--ui-workbench-canvas-drag-preview-frame-transform, none);
14
+ transform-origin: center center;
15
+ }
@@ -0,0 +1,16 @@
1
+ .ui-workbench-canvas-drop-indicator {
2
+ box-sizing: border-box;
3
+ position: absolute;
4
+ left: var(--ui-workbench-canvas-drop-indicator-x, 0);
5
+ top: var(--ui-workbench-canvas-drop-indicator-y, 0);
6
+ z-index: var(--ui-workbench-canvas-drop-indicator-z-index, 1);
7
+ width: var(--ui-workbench-canvas-drop-indicator-width, auto);
8
+ height: var(--ui-workbench-canvas-drop-indicator-height, auto);
9
+ background: color-mix(
10
+ in srgb,
11
+ var(--vscode-focusBorder, var(--color-focus-border)) 8%,
12
+ transparent
13
+ );
14
+ border: 1px dashed var(--vscode-focusBorder, var(--color-focus-border));
15
+ pointer-events: none;
16
+ }
@@ -0,0 +1,37 @@
1
+ .ui-workbench-canvas-frame-handle {
2
+ box-sizing: border-box;
3
+ position: absolute;
4
+ top: 0;
5
+ left: 0;
6
+ z-index: 10;
7
+ display: flex;
8
+ width: 100%;
9
+ height: 18px;
10
+ align-items: center;
11
+ padding: 0 8px;
12
+ color: var(--vscode-descriptionForeground, var(--color-text-muted));
13
+ background: color-mix(
14
+ in srgb,
15
+ var(--vscode-titleBar-activeBackground, var(--panel-bg, var(--color-bg))) 72%,
16
+ transparent
17
+ );
18
+ border-bottom: 1px solid var(--vscode-panel-border, var(--color-border));
19
+ cursor: grab;
20
+ font-size: var(--font-size-xs);
21
+ font-weight: 500;
22
+ letter-spacing: 0;
23
+ line-height: 18px;
24
+ touch-action: none;
25
+ user-select: none;
26
+ }
27
+
28
+ .ui-workbench-canvas-frame-handle:active {
29
+ cursor: grabbing;
30
+ }
31
+
32
+ .ui-workbench-canvas-frame-handle__label {
33
+ min-width: 0;
34
+ overflow: hidden;
35
+ text-overflow: ellipsis;
36
+ white-space: nowrap;
37
+ }
@@ -0,0 +1,24 @@
1
+ .ui-workbench-canvas-frame-surface {
2
+ position: absolute;
3
+ box-sizing: border-box;
4
+ left: var(--ui-workbench-canvas-frame-left, auto);
5
+ top: var(--ui-workbench-canvas-frame-top, auto);
6
+ right: var(--ui-workbench-canvas-frame-right, auto);
7
+ bottom: var(--ui-workbench-canvas-frame-bottom, auto);
8
+ width: var(--ui-workbench-canvas-frame-width, auto);
9
+ height: var(--ui-workbench-canvas-frame-height, auto);
10
+ opacity: var(--ui-workbench-canvas-frame-opacity, 1);
11
+ transform: var(--ui-workbench-canvas-frame-transform, none);
12
+ background: color-mix(in srgb, var(--vscode-editor-background, var(--color-bg)) 42%, transparent);
13
+ border: 1px solid var(--vscode-panel-border, var(--color-border));
14
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);
15
+ }
16
+
17
+ .ui-workbench-canvas-frame-surface[data-selected='true'] {
18
+ outline: 1px solid var(--vscode-focusBorder, var(--color-focus-border));
19
+ outline-offset: 2px;
20
+ }
21
+
22
+ .ui-workbench-canvas-frame-surface[data-transient='true'] {
23
+ transition: none;
24
+ }
@@ -0,0 +1,17 @@
1
+ .ui-workbench-canvas-guide-block {
2
+ position: absolute;
3
+ left: var(--ui-workbench-canvas-guide-block-x, 0);
4
+ top: var(--ui-workbench-canvas-guide-block-y, 0);
5
+ z-index: var(--ui-workbench-canvas-guide-block-z-index, 5);
6
+ width: var(--ui-workbench-canvas-guide-block-width, auto);
7
+ height: var(--ui-workbench-canvas-guide-block-height, auto);
8
+ pointer-events: none;
9
+ }
10
+
11
+ .ui-workbench-canvas-guide-block[data-tone='padding'] {
12
+ background: var(--ui-workbench-canvas-guide-padding, rgba(255, 82, 130, 0.18));
13
+ }
14
+
15
+ .ui-workbench-canvas-guide-block[data-tone='gap'] {
16
+ background: var(--ui-workbench-canvas-guide-gap, rgba(100, 180, 255, 0.18));
17
+ }
@@ -0,0 +1,6 @@
1
+ .ui-workbench-canvas-guide-layer {
2
+ position: absolute;
3
+ inset: 0;
4
+ z-index: 1001;
5
+ pointer-events: none;
6
+ }
@@ -0,0 +1,22 @@
1
+ .ui-workbench-canvas-guide-line {
2
+ position: absolute;
3
+ background: var(--vscode-focusBorder, var(--color-focus-border));
4
+ }
5
+
6
+ .ui-workbench-canvas-guide-line[data-source='object'] {
7
+ background: var(--ui-workbench-canvas-guide-object, #ef4444);
8
+ }
9
+
10
+ .ui-workbench-canvas-guide-line[data-axis='x'] {
11
+ left: var(--ui-workbench-canvas-guide-line-position, 0);
12
+ top: var(--ui-workbench-canvas-guide-line-start, 0);
13
+ width: 1px;
14
+ height: var(--ui-workbench-canvas-guide-line-length, 1px);
15
+ }
16
+
17
+ .ui-workbench-canvas-guide-line[data-axis='y'] {
18
+ left: var(--ui-workbench-canvas-guide-line-start, 0);
19
+ top: var(--ui-workbench-canvas-guide-line-position, 0);
20
+ width: var(--ui-workbench-canvas-guide-line-length, 1px);
21
+ height: 1px;
22
+ }
@@ -0,0 +1,23 @@
1
+ .ui-workbench-canvas-item-badge {
2
+ position: absolute;
3
+ top: 2px;
4
+ left: 2px;
5
+ z-index: 110;
6
+ padding: 2px 4px;
7
+ color: var(--vscode-badge-foreground, #fff);
8
+ background: var(--vscode-badge-background, var(--color-accent));
9
+ border-radius: 3px;
10
+ font-family: var(--vscode-font-family, var(--font-family, system-ui, sans-serif));
11
+ font-size: 9px;
12
+ font-weight: 600;
13
+ line-height: 1;
14
+ pointer-events: none;
15
+ }
16
+
17
+ .ui-workbench-canvas-item-badge[data-selected='false'] {
18
+ background: color-mix(in srgb, var(--vscode-badge-background, var(--color-accent)) 58%, #000);
19
+ }
20
+
21
+ .ui-workbench-canvas-item-badge[data-selected='true'] {
22
+ background: var(--ui-workbench-canvas-selection-color, #0d99ff);
23
+ }