@workbench-kit/react 0.0.2-prototype.0.2.6 → 0.0.2-prototype.0.2.8
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.
- package/README.md +87 -0
- package/package.json +20 -18
- package/src/brand/TilepaperAppIcon.tsx +181 -181
- package/src/brand/index.ts +2 -2
- package/src/brand/tilepaper-app-icon-geometry.ts +201 -201
- package/src/icons/WorkbenchIcon.tsx +57 -57
- package/src/icons/WorkbenchIconContext.tsx +25 -25
- package/src/icons/file-icon.ts +154 -154
- package/src/icons/index.ts +17 -17
- package/src/icons/resolveWorkbenchIcon.ts +48 -48
- package/src/icons/types.ts +28 -28
- package/src/index.ts +735 -735
- package/src/jdw/JdwPreview.tsx +195 -195
- package/src/jdw/JdwPreviewViewport.tsx +190 -190
- package/src/jdw/JsonCodeEditorPane.tsx +425 -424
- package/src/jdw/builtins/renderBuiltinWidgetLeaf.tsx +130 -130
- package/src/jdw/createBuiltinJdwRegistry.ts +436 -436
- package/src/jdw/cssRenderBackend.tsx +223 -223
- package/src/jdw/document.ts +35 -35
- package/src/jdw/fixtures/jdw-fixtures.ts +52 -52
- package/src/jdw/fixtures/jdw-sample-screens.ts +524 -524
- package/src/jdw/index.ts +50 -50
- package/src/jdw/jdw-preview-viewport.css +41 -41
- package/src/jdw/parse.ts +1 -1
- package/src/jdw/renderJdw.tsx +73 -73
- package/src/json-config/JsonConfigWorkbench.tsx +313 -313
- package/src/json-config/index.ts +6 -6
- package/src/json-config/json-config-editor-state.ts +42 -42
- package/src/layout/ViewEmptyState.tsx +14 -14
- package/src/layout/WorkbenchCanvas.tsx +956 -956
- package/src/layout/WorkbenchFullscreen.tsx +368 -368
- package/src/layout/WorkbenchLayout.tsx +8 -8
- package/src/layout/WorkbenchLayoutBase.tsx +335 -335
- package/src/layout/WorkbenchMediaPreviewViewport.tsx +122 -122
- package/src/layout/WorkbenchPropertyOverrideLabel.tsx +90 -90
- package/src/layout/WorkbenchPropertyPanel.tsx +633 -633
- package/src/layout/WorkbenchPropertySearch.tsx +51 -51
- package/src/layout/WorkbenchTree.tsx +350 -350
- package/src/layout/canvas/canvas-drag-ghost.css +21 -21
- package/src/layout/canvas/canvas-drag-preview-frame.css +15 -15
- package/src/layout/canvas/canvas-drop-indicator.css +16 -16
- package/src/layout/canvas/canvas-frame-handle.css +37 -37
- package/src/layout/canvas/canvas-frame-surface.css +24 -24
- package/src/layout/canvas/canvas-guide-block.css +17 -17
- package/src/layout/canvas/canvas-guide-layer.css +6 -6
- package/src/layout/canvas/canvas-guide-line.css +22 -22
- package/src/layout/canvas/canvas-item-badge.css +23 -23
- package/src/layout/canvas/canvas-item-frame.css +54 -54
- package/src/layout/canvas/canvas-pane-surface.css +9 -9
- package/src/layout/canvas/canvas-placeholder.css +21 -21
- package/src/layout/canvas/canvas-resize-frame.css +9 -9
- package/src/layout/canvas/canvas-resize-handle.css +74 -74
- package/src/layout/canvas/canvas-resize-preview.css +11 -11
- package/src/layout/canvas/canvas-selection-marquee.css +14 -14
- package/src/layout/canvas/canvas-viewport.css +18 -18
- package/src/layout/canvas/index.css +19 -19
- package/src/layout/canvas/preview-canvas.css +144 -144
- package/src/layout/editor/editor-body.css +9 -9
- package/src/layout/editor/editor-bottom-panel.css +44 -44
- package/src/layout/editor/editor-frame.css +14 -14
- package/src/layout/editor/editor-viewport.css +7 -7
- package/src/layout/editor/floating-menu.css +91 -91
- package/src/layout/editor/index.css +10 -10
- package/src/layout/editor/parse-error.css +9 -9
- package/src/layout/editor/problem-item.css +52 -52
- package/src/layout/editor/problem-list.css +7 -7
- package/src/layout/editor/render-surface.css +13 -13
- package/src/layout/fillScrollContract.ts +49 -49
- package/src/layout/fullscreen/fullscreen-backdrop.css +31 -31
- package/src/layout/fullscreen/fullscreen-button.css +44 -44
- package/src/layout/fullscreen/fullscreen-carousel.css +20 -20
- package/src/layout/fullscreen/fullscreen-content.css +8 -8
- package/src/layout/fullscreen/fullscreen-empty.css +16 -16
- package/src/layout/fullscreen/fullscreen-header.css +77 -77
- package/src/layout/fullscreen/fullscreen-hero.css +41 -41
- package/src/layout/fullscreen/fullscreen-nav-button.css +29 -29
- package/src/layout/fullscreen/fullscreen-option.css +83 -83
- package/src/layout/fullscreen/fullscreen-pill-row.css +6 -6
- package/src/layout/fullscreen/fullscreen-pill.css +10 -10
- package/src/layout/fullscreen/fullscreen-root.css +11 -11
- package/src/layout/fullscreen/index.css +13 -13
- package/src/layout/index.ts +156 -156
- package/src/layout/layout-base/banner.css +32 -32
- package/src/layout/layout-base/center.css +7 -7
- package/src/layout/layout-base/column.css +7 -7
- package/src/layout/layout-base/divider.css +5 -5
- package/src/layout/layout-base/empty.css +12 -12
- package/src/layout/layout-base/fill-scroll.css +36 -36
- package/src/layout/layout-base/fill.css +18 -18
- package/src/layout/layout-base/index.css +13 -13
- package/src/layout/layout-base/pane.css +6 -6
- package/src/layout/layout-base/panel-scroll.css +5 -5
- package/src/layout/layout-base/panel-surface.css +14 -14
- package/src/layout/layout-base/root.css +9 -9
- package/src/layout/layout-base/section-title.css +8 -8
- package/src/layout/layout.css +10 -10
- package/src/layout/layoutHelpers.ts +27 -27
- package/src/layout/media/index.css +2 -2
- package/src/layout/media/media-preview-viewport.css +69 -69
- package/src/layout/panel/Panel.tsx +161 -161
- package/src/layout/panel/TemplateGallery.tsx +90 -90
- package/src/layout/panel/WorkbenchAuthoringShell.tsx +57 -57
- package/src/layout/panel/WorkbenchLabeledPane.tsx +81 -81
- package/src/layout/panel/WorkbenchSidebarStack.tsx +15 -15
- package/src/layout/panel/filter-bar.css +59 -59
- package/src/layout/panel/index.css +7 -7
- package/src/layout/panel/index.ts +70 -70
- package/src/layout/panel/preview-pane.css +63 -63
- package/src/layout/panel/template-gallery.css +131 -131
- package/src/layout/panel/workbench-authoring-shell.css +48 -48
- package/src/layout/panel/workbench-labeled-pane.css +69 -69
- package/src/layout/panel/workbench-sidebar-stack.css +18 -18
- package/src/layout/property/color-input.css +8 -8
- package/src/layout/property/color-row.css +6 -6
- package/src/layout/property/index.css +15 -15
- package/src/layout/property/property-card.css +8 -8
- package/src/layout/property/property-grid.css +24 -24
- package/src/layout/property/property-hint.css +4 -4
- package/src/layout/property/property-inline.css +10 -10
- package/src/layout/property/property-key-value.css +29 -29
- package/src/layout/property/property-override-label.css +34 -34
- package/src/layout/property/property-panel.css +20 -20
- package/src/layout/property/property-row.css +17 -17
- package/src/layout/property/property-search.css +43 -43
- package/src/layout/property/property-section.css +97 -97
- package/src/layout/property/property-stack.css +11 -11
- package/src/layout/property/property-toggle.css +14 -14
- package/src/layout/propertyFieldFilter.ts +84 -84
- package/src/layout/sidebar/SideBarViewFrame.tsx +235 -235
- package/src/layout/sidebar/SideBarViewTabStrip.tsx +60 -60
- package/src/layout/sidebar/SideBarViewTitleMenu.tsx +75 -75
- package/src/layout/sidebar/SidebarActionIconBar.tsx +242 -242
- package/src/layout/sidebar/SidebarSectionNestingContext.tsx +21 -21
- package/src/layout/sidebar/SidebarSlotChrome.tsx +32 -32
- package/src/layout/sidebar/SidebarToolbar.tsx +10 -10
- package/src/layout/sidebar/WorkbenchActionSidebar.tsx +73 -73
- package/src/layout/sidebar/WorkbenchSidebarActions.tsx +328 -328
- package/src/layout/sidebar/WorkbenchSidebarSectionStack.tsx +165 -165
- package/src/layout/sidebar/index.css +5 -5
- package/src/layout/sidebar/index.ts +55 -55
- package/src/layout/sidebar/sidebar-chrome.css +95 -95
- package/src/layout/sidebar/sidebar-section-stack.css +25 -25
- package/src/layout/sidebar/sidebar-section.css +124 -124
- package/src/layout/sidebar/sidebar-view.css +290 -290
- package/src/layout/tree/drag-preview.css +25 -25
- package/src/layout/tree/index.css +10 -10
- package/src/layout/tree/template-glyph.css +96 -96
- package/src/layout/tree/tree-action.css +20 -20
- package/src/layout/tree/tree-drag-overlay.css +13 -13
- package/src/layout/tree/tree-drop-line.css +17 -17
- package/src/layout/tree/tree-drop-zone.css +13 -13
- package/src/layout/tree/tree-expander.css +23 -23
- package/src/layout/tree/tree-item.css +93 -93
- package/src/layout/tree/tree.css +49 -49
- package/src/layout/usePreviewViewport.ts +428 -428
- package/src/modal/ConfirmDialog.tsx +61 -61
- package/src/modal/Modal.tsx +243 -213
- package/src/modal/ModalResizeHandles.tsx +40 -40
- package/src/modal/ModalTitlebar.tsx +86 -86
- package/src/modal/modal.css +291 -291
- package/src/modal/modalContainer.ts +36 -36
- package/src/modal/modalPosition.ts +36 -36
- package/src/modal/modalSize.ts +84 -84
- package/src/modal/modalTypes.ts +13 -13
- package/src/modal/useModalContainerViewport.ts +41 -41
- package/src/modal/useModalDrag.ts +118 -118
- package/src/modal/useModalFocusTrap.ts +142 -0
- package/src/modal/useModalResize.ts +122 -122
- package/src/modal/useModalWindowFrame.ts +122 -122
- package/src/overlay/ContextMenu.tsx +124 -124
- package/src/overlay/clampFixedOverlayPosition.ts +22 -22
- package/src/overlay/context-menu.css +127 -127
- package/src/overlay/index.ts +31 -31
- package/src/overlay/measureAnchoredOverlayPanel.ts +107 -107
- package/src/overlay/overlay.css +2 -2
- package/src/overlay/pointerPassthroughRegion.ts +83 -83
- package/src/overlay/useAnchoredOverlayPanel.ts +222 -222
- package/src/overlay/useClampedFixedOverlayPosition.ts +27 -27
- package/src/overlay/useContextMenuState.ts +59 -59
- package/src/overlay/useFixedOverlayDismiss.ts +49 -49
- package/src/overlay/usePointerPassthroughRegion.ts +87 -87
- package/src/primitives/absolute-box/AbsoluteBox.tsx +46 -46
- package/src/primitives/absolute-box/index.ts +1 -1
- package/src/primitives/badge/Badge.tsx +14 -14
- package/src/primitives/badge/badge.css +20 -20
- package/src/primitives/badge/index.ts +1 -1
- package/src/primitives/button/Button.tsx +45 -45
- package/src/primitives/button/button.css +76 -76
- package/src/primitives/button/index.ts +1 -1
- package/src/primitives/catalog-browse-card/CatalogBrowseCard.tsx +121 -121
- package/src/primitives/catalog-browse-card/catalog-browse-card.css +175 -175
- package/src/primitives/catalog-browse-card/index.ts +1 -1
- package/src/primitives/catalog-browse-pane/CatalogBrowseFacetChips.tsx +59 -59
- package/src/primitives/catalog-browse-pane/CatalogBrowsePane.tsx +360 -360
- package/src/primitives/catalog-browse-pane/catalog-browse-facet-chips.css +8 -8
- package/src/primitives/catalog-browse-pane/catalog-browse-pane.css +84 -84
- package/src/primitives/catalog-browse-pane/filterCatalogBrowseItems.ts +27 -27
- package/src/primitives/catalog-browse-pane/index.ts +3 -3
- package/src/primitives/catalog-filter-overlay/CatalogFilterOverlay.tsx +73 -73
- package/src/primitives/catalog-filter-overlay/catalog-filter-overlay.css +65 -65
- package/src/primitives/catalog-filter-overlay/index.ts +1 -1
- package/src/primitives/checkbox/Checkbox.tsx +40 -40
- package/src/primitives/checkbox/checkbox.css +81 -81
- package/src/primitives/checkbox/index.ts +1 -1
- package/src/primitives/chip/Chip.tsx +43 -43
- package/src/primitives/chip/chip.css +110 -110
- package/src/primitives/chip/index.ts +2 -2
- package/src/primitives/clearable-text-input/ClearableTextInput.tsx +78 -78
- package/src/primitives/clearable-text-input/clearable-text-input.css +15 -15
- package/src/primitives/clearable-text-input/index.ts +1 -1
- package/src/primitives/codicon/Codicon.tsx +20 -20
- package/src/primitives/codicon/index.ts +1 -1
- package/src/primitives/empty-state/EmptyState.tsx +33 -33
- package/src/primitives/empty-state/empty-state.css +20 -20
- package/src/primitives/empty-state/index.ts +1 -1
- package/src/primitives/external-link-button/ExternalLinkButton.tsx +56 -56
- package/src/primitives/external-link-button/index.ts +1 -1
- package/src/primitives/field/Field.tsx +39 -39
- package/src/primitives/field/field.css +51 -51
- package/src/primitives/field/index.ts +1 -1
- package/src/primitives/file-icon/FileIcon.tsx +21 -21
- package/src/primitives/file-icon/index.ts +1 -1
- package/src/primitives/icon-button/IconButton.tsx +37 -37
- package/src/primitives/icon-button/icon-button.css +46 -46
- package/src/primitives/icon-button/index.ts +1 -1
- package/src/primitives/index.ts +265 -265
- package/src/primitives/library-detail-layout/LibraryDetailLayout.tsx +135 -135
- package/src/primitives/library-detail-layout/index.ts +1 -1
- package/src/primitives/library-detail-layout/library-detail-layout.css +169 -169
- package/src/primitives/library-facet-filter-panel/LibraryFacetFilterPanel.tsx +454 -454
- package/src/primitives/library-facet-filter-panel/index.ts +1 -1
- package/src/primitives/library-facet-filter-panel/library-facet-filter-panel.css +205 -205
- package/src/primitives/library-facet-filter-strip/LibraryFacetFilterStrip.tsx +527 -527
- package/src/primitives/library-facet-filter-strip/index.ts +1 -1
- package/src/primitives/library-facet-filter-strip/library-facet-filter-strip.css +31 -31
- package/src/primitives/list/List.tsx +120 -120
- package/src/primitives/list/index.ts +1 -1
- package/src/primitives/list/list-empty-state.css +10 -10
- package/src/primitives/list/list-item.css +93 -93
- package/src/primitives/list/list.css +6 -6
- package/src/primitives/number-input/NumberInput.tsx +235 -235
- package/src/primitives/number-input/index.ts +1 -1
- package/src/primitives/number-input/number-input.css +105 -105
- package/src/primitives/panel-loading/PanelLoading.tsx +29 -29
- package/src/primitives/panel-loading/index.ts +1 -1
- package/src/primitives/panel-loading/panel-loading.css +16 -16
- package/src/primitives/panel-surface/panel-surface.css +77 -77
- package/src/primitives/primitives.css +36 -36
- package/src/primitives/record-media-hero/RecordMediaHero.tsx +81 -81
- package/src/primitives/record-media-hero/index.ts +1 -1
- package/src/primitives/record-media-hero/record-media-hero.css +84 -84
- package/src/primitives/scroll-area/ScrollArea.tsx +200 -200
- package/src/primitives/scroll-area/index.ts +1 -1
- package/src/primitives/scroll-area/scroll-area-overlay.css +69 -69
- package/src/primitives/scroll-area-infinite-load/ScrollAreaInfiniteSentinel.tsx +22 -22
- package/src/primitives/scroll-area-infinite-load/index.ts +2 -2
- package/src/primitives/scroll-area-infinite-load/scroll-area-infinite-sentinel.css +6 -6
- package/src/primitives/scroll-area-infinite-load/useScrollAreaInfiniteLoad.ts +84 -84
- package/src/primitives/searchable-multi-select/SearchableMultiSelect.tsx +378 -378
- package/src/primitives/searchable-multi-select/index.ts +9 -9
- package/src/primitives/searchable-multi-select/overlay.ts +125 -125
- package/src/primitives/searchable-multi-select/searchable-multi-select.css +129 -129
- package/src/primitives/select/Select.tsx +284 -284
- package/src/primitives/select/index.ts +2 -2
- package/src/primitives/select/options.ts +38 -38
- package/src/primitives/select/overlay.ts +82 -82
- package/src/primitives/select/select.app.css +12 -12
- package/src/primitives/select/select.css +177 -177
- package/src/primitives/select/types.ts +18 -18
- package/src/primitives/styles.css +6 -6
- package/src/primitives/tabbed-panels/TabbedPanels.tsx +68 -68
- package/src/primitives/tabbed-panels/index.ts +2 -2
- package/src/primitives/tabbed-panels/tabbed-panels.css +58 -58
- package/src/primitives/text-area/TextArea.tsx +37 -37
- package/src/primitives/text-area/index.ts +1 -1
- package/src/primitives/text-input/TextInput.tsx +34 -34
- package/src/primitives/text-input/index.ts +1 -1
- package/src/primitives/text-input/input.css +54 -54
- package/src/primitives/toolbar/Toolbar.tsx +8 -8
- package/src/primitives/toolbar/index.ts +1 -1
- package/src/primitives/visually-hidden/visually-hidden.css +11 -11
- package/src/primitives/workbench-editor/WorkbenchEditor.tsx +432 -432
- package/src/primitives/workbench-editor/button-group.css +10 -10
- package/src/primitives/workbench-editor/editor-tabs.css +201 -201
- package/src/primitives/workbench-editor/index.ts +1 -1
- package/src/primitives/workbench-editor/resizable-panels.css +53 -53
- package/src/primitives/workbench-editor/segmented-control.css +98 -98
- package/src/primitives/workbench-media-slot/WorkbenchMediaPlaceholder.tsx +25 -25
- package/src/primitives/workbench-media-slot/WorkbenchMediaSlot.tsx +60 -60
- package/src/primitives/workbench-media-slot/index.ts +2 -2
- package/src/primitives/workbench-media-slot/media-slot.css +72 -72
- package/src/primitives/workbench-thumbnail/WorkbenchThumbnail.tsx +38 -38
- package/src/primitives/workbench-thumbnail/index.ts +1 -1
- package/src/primitives/workbench-thumbnail/thumbnail.css +69 -69
- package/src/scrollbars.css +144 -144
- package/src/styles.css +16 -17
- package/src/test-utils/workbenchMonacoMock.tsx +37 -37
- package/src/utils/codicon.ts +17 -17
- package/src/utils/dragMime.ts +89 -89
- package/src/utils/useWorkbenchMediaImage.ts +37 -37
- package/src/widget-asset/WidgetAssetEditor.tsx +142 -142
- package/src/widget-asset/WidgetAssetMetadataForm.tsx +82 -82
- package/src/widget-asset/WidgetAssetModeControls.tsx +42 -42
- package/src/widget-asset/WidgetAssetSourceEditor.tsx +50 -50
- package/src/widget-asset/WidgetAssetWorkbench.tsx +111 -111
- package/src/widget-asset/index.ts +17 -17
- package/src/widget-asset/widget-asset-document.ts +37 -37
- package/src/widget-asset/widget-asset-mode.ts +3 -3
- package/src/widget-studio/builtin-widget-asset-catalog.ts +12 -12
- package/src/widget-studio/create-widget-studio-workspace-editor.tsx +78 -78
- package/src/widget-studio/index.ts +10 -10
- package/src/widget-studio/resolve-widget-studio-asset-catalog.ts +43 -43
- package/src/widget-tree/WidgetAssetPalette.tsx +105 -105
- package/src/widget-tree/WidgetInspectorPanel.tsx +316 -316
- package/src/widget-tree/WidgetSourceEditor.tsx +143 -143
- package/src/widget-tree/WidgetTreeCanvasPreview.tsx +875 -875
- package/src/widget-tree/WidgetTreeLab.tsx +600 -600
- package/src/widget-tree/WidgetTreeModeControls.tsx +73 -73
- package/src/widget-tree/WidgetTreeSidePanel.tsx +39 -39
- package/src/widget-tree/WidgetTreeView.tsx +797 -797
- package/src/widget-tree/WidgetTreeWorkbench.tsx +155 -155
- package/src/widget-tree/WidgetTreeWorkspaceShell.tsx +172 -172
- package/src/widget-tree/demo-registry.ts +32 -32
- package/src/widget-tree/demo-widget-assets.ts +4 -4
- package/src/widget-tree/index.ts +45 -45
- package/src/widget-tree/widget-placement-asset-dnd.ts +35 -35
- package/src/widget-tree/widget-tree-document.ts +14 -14
- package/src/widget-tree/widget-tree-editor-state.ts +40 -40
- package/src/widget-tree/widget-tree-layout.ts +76 -76
- package/src/widget-tree/widget-tree-mode.ts +7 -7
- package/src/widget-tree/widget-tree-play-helpers.ts +85 -85
- package/src/workbench/auth/WorkbenchAuthGate.tsx +61 -61
- package/src/workbench/auth/WorkbenchLoginView.tsx +633 -633
- package/src/workbench/auth/auth-flows.css +440 -440
- package/src/workbench/auth/auth.css +3 -3
- package/src/workbench/auth/index.ts +19 -19
- package/src/workbench/auth/profile-modals.css +115 -115
- package/src/workbench/bootstrap/WorkbenchBootstrapGate.tsx +45 -45
- package/src/workbench/bootstrap/WorkbenchBootstrapView.tsx +100 -100
- package/src/workbench/bootstrap/index.ts +12 -12
- package/src/workbench/bootstrap/useWorkbenchBootstrap.ts +130 -130
- package/src/workbench/chat/ChatCommandProposalCard.tsx +115 -115
- package/src/workbench/chat/ChatComposer.tsx +163 -163
- package/src/workbench/chat/ChatConversationBar.tsx +134 -134
- package/src/workbench/chat/ChatHistoryMenu.tsx +171 -171
- package/src/workbench/chat/ChatHistoryMenuRow.tsx +74 -74
- package/src/workbench/chat/ChatMessageCollapsible.tsx +119 -115
- package/src/workbench/chat/ChatMessageItem.tsx +376 -318
- package/src/workbench/chat/ChatMessageList.tsx +134 -134
- package/src/workbench/chat/ChatPanel.tsx +177 -168
- package/src/workbench/chat/ChatPhasedRunProgress.tsx +275 -202
- package/src/workbench/chat/ChatRenameDialog.tsx +77 -77
- package/src/workbench/chat/chat-conversation.css +273 -273
- package/src/workbench/chat/chat-ui.css +1132 -1124
- package/src/workbench/chat/chat.css +3 -3
- package/src/workbench/chat/chatConversation.ts +46 -46
- package/src/workbench/chat/chatHistoryRowMenuItems.ts +29 -29
- package/src/workbench/chat/chatMessageMeta.tsx +252 -252
- package/src/workbench/chat/chatScroll.ts +22 -22
- package/src/workbench/chat/index.ts +65 -64
- package/src/workbench/chat/slashCommand.ts +26 -26
- package/src/workbench/chat/types.ts +45 -45
- package/src/workbench/chat/useCancelRuntimeOnUnmount.ts +60 -60
- package/src/workbench/chat/useChatPrependPagination.ts +233 -233
- package/src/workbench/chat/useChatRuntimeState.ts +64 -64
- package/src/workbench/chat/useSlashCommandSuggest.ts +154 -154
- package/src/workbench/{WorkbenchModalPortal.tsx → chrome/WorkbenchModalPortal.tsx} +52 -52
- package/src/workbench/{WorkbenchPlatformContext.tsx → chrome/WorkbenchPlatformContext.tsx} +31 -31
- package/src/workbench/chrome/index.css +6 -6
- package/src/workbench/chrome/workbench-chrome.css +4 -0
- package/src/workbench/chrome/workbench-desktop-titlebar.css +60 -60
- package/src/workbench/chrome/workbench-host.css +85 -85
- package/src/workbench/chrome/workbench-layout-regions.css +42 -42
- package/src/workbench/chrome/workbench-platform-chrome.css +142 -142
- package/src/workbench/chrome/workbench-shell-titlebar.css +124 -124
- package/src/workbench/{workbenchModalViewState.ts → chrome/workbenchModalViewState.ts} +52 -52
- package/src/workbench/{workbenchOverlaysContext.tsx → chrome/workbenchOverlaysContext.tsx} +21 -21
- package/src/workbench/{workbenchPlatformChrome.ts → chrome/workbenchPlatformChrome.ts} +40 -40
- package/src/workbench/command-palette/command-palette.css +156 -156
- package/src/workbench/{CommandGroupShell.tsx → commands/CommandGroupShell.tsx} +131 -131
- package/src/workbench/{CommandList.tsx → commands/CommandList.tsx} +167 -167
- package/src/workbench/{CommandPalette.tsx → commands/CommandPalette.tsx} +391 -417
- package/src/workbench/{ConfirmationFlow.tsx → commands/ConfirmationFlow.tsx} +243 -243
- package/src/workbench/{ShortcutCommandBridge.tsx → commands/ShortcutCommandBridge.tsx} +365 -365
- package/src/workbench/{command-execution-policy.ts → commands/command-execution-policy.ts} +61 -61
- package/src/workbench/{command-model.ts → commands/command-model.ts} +279 -275
- package/src/workbench/{commands.ts → commands/commands.ts} +576 -576
- package/src/workbench/{keyboard.ts → commands/keyboard.ts} +53 -53
- package/src/workbench/{workbenchContextMenu.ts → commands/workbenchContextMenu.ts} +18 -18
- package/src/workbench/{WorkbenchEditorTabs.tsx → editor/WorkbenchEditorTabs.tsx} +52 -52
- package/src/workbench/{editor-tabs-dnd.ts → editor/editor-tabs-dnd.ts} +162 -162
- package/src/workbench/{editorTabContextMenu.ts → editor/editorTabContextMenu.ts} +111 -111
- package/src/workbench/{useEditorTabsStripDnd.ts → editor/useEditorTabsStripDnd.ts} +262 -262
- package/src/workbench/{useWorkbenchEditorTabContextMenu.tsx → editor/useWorkbenchEditorTabContextMenu.tsx} +66 -66
- package/src/workbench/editor-tabs/index.ts +22 -22
- package/src/workbench/index.ts +694 -675
- package/src/workbench/management/AccountManagementPanel.tsx +82 -82
- package/src/workbench/management/CommandInspectorPanel.tsx +127 -127
- package/src/workbench/management/CommandManagementPanel.tsx +129 -129
- package/src/workbench/management/CommandManagementSidebar.tsx +318 -318
- package/src/workbench/management/ExtensionManagementPanel.tsx +527 -498
- package/src/workbench/management/ExtensionManagementSidebar.tsx +509 -492
- package/src/workbench/management/IntegrationCommandActions.tsx +78 -78
- package/src/workbench/management/IntegrationSettingsSurface.tsx +290 -290
- package/src/workbench/management/IntegrationsShell.tsx +53 -53
- package/src/workbench/management/KeybindingCaptureField.tsx +142 -142
- package/src/workbench/management/KeybindingManagementPanel.tsx +120 -120
- package/src/workbench/management/LibraryCatalogPickerDialog.tsx +208 -208
- package/src/workbench/management/LibraryFacetFilterDialog.tsx +62 -62
- package/src/workbench/management/ManagementCard.tsx +89 -89
- package/src/workbench/management/ManagementFilterChips.tsx +41 -41
- package/src/workbench/management/ManagementGroup.tsx +56 -56
- package/src/workbench/management/ManagementPanelControls.tsx +43 -43
- package/src/workbench/management/ManagementPanelFrame.tsx +109 -109
- package/src/workbench/management/WorkbenchDialogFrame.tsx +148 -148
- package/src/workbench/management/WorkbenchNotice.tsx +211 -211
- package/src/workbench/management/build-command-management-groups.ts +157 -157
- package/src/workbench/management/command-inspector-uri.ts +26 -26
- package/src/workbench/management/extension-category-display.ts +42 -42
- package/src/workbench/management/extension-install-approval.ts +72 -0
- package/src/workbench/management/format-command-run-state.ts +19 -19
- package/src/workbench/management/index.ts +137 -130
- package/src/workbench/management/integration-command-action.ts +25 -25
- package/src/workbench/management/library-catalog-picker-dialog.css +56 -56
- package/src/workbench/management/library-facet-filter-dialog.css +8 -8
- package/src/workbench/management/management-panel.css +444 -444
- package/src/workbench/management/management.css +4 -4
- package/src/workbench/management/types.ts +139 -126
- package/src/workbench/{MarkdownPreview.tsx → markdown/MarkdownPreview.tsx} +162 -147
- package/src/workbench/markdown/markdownRemarkPlugins.ts +12 -0
- package/src/workbench/markdown/sanitizeMarkdownHref.ts +29 -0
- package/src/workbench/schema/index.ts +47 -47
- package/src/workbench/schema/workbenchDocument.ts +31 -31
- package/src/workbench/schema/workbenchDocumentActions.ts +6 -6
- package/src/workbench/schema/workbenchDocumentAdapter.ts +9 -9
- package/src/workbench/schema/workbenchDocumentPatch.ts +13 -13
- package/src/workbench/schema/workbenchDocumentRenderer.tsx +702 -702
- package/src/workbench/settings/NavigationPanel.tsx +86 -86
- package/src/workbench/settings/SchemaForm.tsx +433 -433
- package/src/workbench/settings/SectionTabPanel.tsx +172 -172
- package/src/workbench/settings/SectionedPanel.tsx +169 -169
- package/src/workbench/settings/StructuredDataForm.tsx +619 -619
- package/src/workbench/settings/StructuredDataSchemaPanel.tsx +811 -811
- package/src/workbench/settings/StructuredDataSchemaPanelEmbed.tsx +21 -21
- package/src/workbench/settings/StructuredDataSchemaPanelFrame.tsx +76 -76
- package/src/workbench/settings/StructuredDataTableView.tsx +127 -127
- package/src/workbench/settings/WorkbenchPanelRegion.tsx +46 -46
- package/src/workbench/settings/WorkbenchSettingsModal.tsx +251 -251
- package/src/workbench/settings/WorkbenchSettingsNav.tsx +57 -57
- package/src/workbench/settings/WorkbenchSettingsSection.tsx +30 -30
- package/src/workbench/settings/extensionSettingsForm.ts +34 -34
- package/src/workbench/settings/index.ts +177 -177
- package/src/workbench/settings/navigation-panel.css +59 -59
- package/src/workbench/settings/panel-region.css +22 -22
- package/src/workbench/settings/schema-form.css +36 -36
- package/src/workbench/settings/schemaFormSettingSpec.ts +177 -177
- package/src/workbench/settings/schemaFormSettingsCategory.tsx +21 -21
- package/src/workbench/settings/section-tab-panel.css +157 -157
- package/src/workbench/settings/sectionScrollSpyDom.ts +139 -139
- package/src/workbench/settings/sectioned-panel.css +162 -162
- package/src/workbench/settings/sectionedPanelScrollSpy.ts +273 -273
- package/src/workbench/settings/settings-responsive.css +58 -58
- package/src/workbench/settings/settings.css +11 -11
- package/src/workbench/settings/settingsCommit.tsx +55 -55
- package/src/workbench/settings/structured-data-form.css +114 -114
- package/src/workbench/settings/structured-data-schema-panel.css +344 -344
- package/src/workbench/settings/structured-data-table-view.css +85 -85
- package/src/workbench/settings/structuredDataFormModel.ts +140 -140
- package/src/workbench/settings/structuredDataSchema.ts +339 -339
- package/src/workbench/settings/structuredDataSchemaDate.ts +197 -197
- package/src/workbench/settings/structuredDataSchemaField.ts +105 -105
- package/src/workbench/settings/structuredDataSchemaSection.ts +74 -74
- package/src/workbench/settings/structuredDataSchemaTable.ts +120 -120
- package/src/workbench/settings/structuredDataSchemaTypes.ts +308 -308
- package/src/workbench/settings/structuredDataSchemaValidation.ts +166 -166
- package/src/workbench/settings/types.ts +16 -16
- package/src/workbench/settings/useSectionScrollSpy.ts +420 -420
- package/src/workbench/settings/workbench-settings-modal.css +273 -273
- package/src/workbench/{ActivityBar.tsx → shell/ActivityBar.tsx} +159 -159
- package/src/workbench/{ArtifactShell.tsx → shell/ArtifactShell.tsx} +397 -397
- package/src/workbench/{SplitView.tsx → shell/SplitView.tsx} +485 -485
- package/src/workbench/{StatusBar.tsx → shell/StatusBar.tsx} +180 -180
- package/src/workbench/{StructuredArtifactEditor.tsx → shell/StructuredArtifactEditor.tsx} +205 -205
- package/src/workbench/{Timeline.tsx → shell/Timeline.tsx} +297 -297
- package/src/workbench/{WorkbenchCanvasShell.defaults.ts → shell/WorkbenchCanvasShell.defaults.ts} +106 -106
- package/src/workbench/{WorkbenchCanvasShell.model.ts → shell/WorkbenchCanvasShell.model.ts} +46 -46
- package/src/workbench/{WorkbenchCanvasShell.tsx → shell/WorkbenchCanvasShell.tsx} +827 -827
- package/src/workbench/{WorkbenchDesktopTitleBar.tsx → shell/WorkbenchDesktopTitleBar.tsx} +126 -126
- package/src/workbench/{WorkbenchShell.tsx → shell/WorkbenchShell.tsx} +192 -192
- package/src/workbench/{WorkbenchShellTitleBarLayoutControls.tsx → shell/WorkbenchShellTitleBarLayoutControls.tsx} +80 -80
- package/src/workbench/{WorkbenchStandaloneShell.tsx → shell/WorkbenchStandaloneShell.tsx} +604 -604
- package/src/workbench/{WorkbenchViewEditor.tsx → shell/WorkbenchViewEditor.tsx} +75 -75
- package/src/workbench/{WorkbenchViewSidebar.tsx → shell/WorkbenchViewSidebar.tsx} +85 -85
- package/src/workbench/{WorkbenchWindowChromeControls.tsx → shell/WorkbenchWindowChromeControls.tsx} +293 -290
- package/src/workbench/shell/activity-bar.css +245 -245
- package/src/workbench/{activityBarOrder.ts → shell/activityBarOrder.ts} +98 -98
- package/src/workbench/{appearanceLabels.ts → shell/appearanceLabels.ts} +28 -28
- package/src/workbench/shell/confirmation-flow.css +87 -87
- package/src/workbench/{hardReset.ts → shell/hardReset.ts} +64 -64
- package/src/workbench/shell/index.css +5 -5
- package/src/workbench/{shell.ts → shell/shell.ts} +152 -146
- package/src/workbench/{shellPresets.ts → shell/shellPresets.ts} +36 -36
- package/src/workbench/{shellState.ts → shell/shellState.ts} +196 -196
- package/src/workbench/{shellViewModel.ts → shell/shellViewModel.ts} +160 -160
- package/src/workbench/{sidebarViewPlacementDnd.ts → shell/sidebarViewPlacementDnd.ts} +61 -61
- package/src/workbench/shell/split-view.css +188 -188
- package/src/workbench/{standalone.ts → shell/standalone.ts} +101 -101
- package/src/workbench/shell/status-bar.css +141 -141
- package/src/workbench/{status.ts → shell/status.ts} +133 -133
- package/src/workbench/{useDeferredWorkbenchMount.ts → shell/useDeferredWorkbenchMount.ts} +71 -71
- package/src/workbench/{useWorkbenchAppearanceDocumentSync.tsx → shell/useWorkbenchAppearanceDocumentSync.tsx} +17 -17
- package/src/workbench/{useWorkbenchSidebarActionBarDnd.ts → shell/useWorkbenchSidebarActionBarDnd.ts} +227 -227
- package/src/workbench/{useWorkbenchSidebarLayout.tsx → shell/useWorkbenchSidebarLayout.tsx} +232 -232
- package/src/workbench/{useWorkbenchSidebarViewPlacementDropZone.ts → shell/useWorkbenchSidebarViewPlacementDropZone.ts} +194 -194
- package/src/workbench/{useWorkbenchStandaloneShellStateSync.tsx → shell/useWorkbenchStandaloneShellStateSync.tsx} +112 -112
- package/src/workbench/{workbenchSidebarLayoutContext.ts → shell/workbenchSidebarLayoutContext.ts} +46 -46
- package/src/workbench/{workbenchStandaloneShellReactContext.tsx → shell/workbenchStandaloneShellReactContext.tsx} +80 -80
- package/src/workbench/{workbenchViewRouteState.ts → shell/workbenchViewRouteState.ts} +151 -151
- package/src/workbench/{WorkbenchThemeProvider.tsx → theme/WorkbenchThemeProvider.tsx} +142 -142
- package/src/workbench/{theme.ts → theme/theme.ts} +50 -50
- package/src/workbench/{themePresets.ts → theme/themePresets.ts} +191 -191
- package/src/workbench/views/action-list.css +144 -144
- package/src/workbench/views/artifact-preview.css +184 -184
- package/src/workbench/views/command-inspector.css +98 -98
- package/src/workbench/views/command-list.css +356 -356
- package/src/workbench/views/commands-sidebar.css +51 -51
- package/src/workbench/views/extensions-sidebar.css +175 -175
- package/src/workbench/views/multi-provider-explorer.css +182 -182
- package/src/workbench/views/search.css +10 -10
- package/src/workbench/views/timeline.css +239 -239
- package/src/workbench/views/view-hosts.css +37 -37
- package/src/workbench/views/view-sidebar.css +21 -21
- package/src/workbench/views/views.css +12 -12
- package/src/workbench/widgets/widget-tree.css +598 -598
- package/src/workbench/widgets/widgets.css +2 -2
- package/src/workbench/workspace/WorkspaceDraftsContext.tsx +99 -99
- package/src/workbench/workspace/WorkspaceEditor.tsx +165 -165
- package/src/workbench/workspace/WorkspaceEditorPanel.tsx +393 -393
- package/src/workbench/workspace/WorkspaceExplorer.tsx +630 -630
- package/src/workbench/workspace/WorkspaceExplorerPanel.tsx +73 -73
- package/src/workbench/workspace/WorkspaceFileIcon.tsx +23 -23
- package/src/workbench/workspace/WorkspaceHighlightedText.tsx +22 -22
- package/src/workbench/workspace/WorkspacePathLabel.tsx +42 -42
- package/src/workbench/workspace/WorkspaceSearchPanel.tsx +116 -116
- package/src/workbench/workspace/WorkspaceSearchResults.tsx +51 -51
- package/src/workbench/workspace/build-workspace-explorer-nodes.ts +44 -44
- package/src/workbench/workspace/createVirtualWorkspaceExplorerPort.ts +141 -141
- package/src/workbench/workspace/explorer-tree-style.ts +18 -18
- package/src/workbench/workspace/index.ts +169 -169
- package/src/workbench/workspace/json-config-workbench.css +57 -57
- package/src/workbench/workspace/mimeType.ts +45 -45
- package/src/workbench/workspace/monaco-panel.css +71 -71
- package/src/workbench/workspace/path.ts +12 -12
- package/src/workbench/workspace/search.ts +6 -6
- package/src/workbench/workspace/tree.ts +1 -1
- package/src/workbench/workspace/types.ts +10 -10
- package/src/workbench/workspace/useVirtualWorkspace.ts +111 -111
- package/src/workbench/workspace/useWorkspaceExplorerController.ts +490 -490
- package/src/workbench/workspace/workspace-editor.css +235 -235
- package/src/workbench/workspace/workspace-explorer-panel.css +33 -33
- package/src/workbench/workspace/workspace.css +5 -5
- package/src/workbench/workspace/workspaceExplorerController.ts +193 -193
- package/src/workbench/workspace/workspaceJsonDiagnostics.ts +84 -83
- package/src/workbench-menu-surfaces.css +57 -57
- package/src/workbench/jdw/jdw-editors.css +0 -4
- package/src/workbench/jdw/jdw.css +0 -2
- package/src/workbench/markdownRemarkPlugins.ts +0 -4
- package/src/workbench/workbench-chrome.css +0 -4
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import { useEffect } from 'react';
|
|
2
|
-
|
|
3
|
-
/** Set on document.body when an editor that handles Ctrl+S has focus. */
|
|
4
|
-
export const WORKBENCH_ACTIVE_EDITOR_SAVE_SHORTCUT_ATTRIBUTE = 'data-active-editor-save-shortcut';
|
|
5
|
-
|
|
6
|
-
interface SaveShortcutEvent {
|
|
7
|
-
ctrlKey: boolean;
|
|
8
|
-
key: string;
|
|
9
|
-
metaKey: boolean;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function isWorkbenchSaveShortcutEvent(event: SaveShortcutEvent): boolean {
|
|
13
|
-
return event.key.toLowerCase() === 's' && (event.ctrlKey || event.metaKey);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function hasWorkbenchModalDialogOpen(): boolean {
|
|
17
|
-
return Boolean(document.querySelector('[role="dialog"][aria-modal="true"]'));
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/** Disables the browser's native right-click context menu globally. */
|
|
21
|
-
export function useWorkbenchNativeContextMenuGuard(): void {
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
const handleContextMenu = (event: MouseEvent) => {
|
|
24
|
-
event.preventDefault();
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
window.addEventListener('contextmenu', handleContextMenu);
|
|
28
|
-
return () => window.removeEventListener('contextmenu', handleContextMenu);
|
|
29
|
-
}, []);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Prevents the browser's native "Save as" dialog on Ctrl+S / Cmd+S everywhere
|
|
34
|
-
* except when an active editor (marked with WORKBENCH_ACTIVE_EDITOR_SAVE_SHORTCUT_ATTRIBUTE)
|
|
35
|
-
* has focus and no modal is open — in that case the editor handles the shortcut itself.
|
|
36
|
-
*/
|
|
37
|
-
export function useWorkbenchNativeSaveGuard(): void {
|
|
38
|
-
useEffect(() => {
|
|
39
|
-
const handleKeyDown = (event: KeyboardEvent) => {
|
|
40
|
-
if (event.defaultPrevented || !isWorkbenchSaveShortcutEvent(event)) return;
|
|
41
|
-
|
|
42
|
-
const editorActive = document.body.hasAttribute(
|
|
43
|
-
WORKBENCH_ACTIVE_EDITOR_SAVE_SHORTCUT_ATTRIBUTE,
|
|
44
|
-
);
|
|
45
|
-
if (editorActive && !hasWorkbenchModalDialogOpen()) return;
|
|
46
|
-
|
|
47
|
-
event.preventDefault();
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
window.addEventListener('keydown', handleKeyDown);
|
|
51
|
-
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
52
|
-
}, []);
|
|
53
|
-
}
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
/** Set on document.body when an editor that handles Ctrl+S has focus. */
|
|
4
|
+
export const WORKBENCH_ACTIVE_EDITOR_SAVE_SHORTCUT_ATTRIBUTE = 'data-active-editor-save-shortcut';
|
|
5
|
+
|
|
6
|
+
interface SaveShortcutEvent {
|
|
7
|
+
ctrlKey: boolean;
|
|
8
|
+
key: string;
|
|
9
|
+
metaKey: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function isWorkbenchSaveShortcutEvent(event: SaveShortcutEvent): boolean {
|
|
13
|
+
return event.key.toLowerCase() === 's' && (event.ctrlKey || event.metaKey);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function hasWorkbenchModalDialogOpen(): boolean {
|
|
17
|
+
return Boolean(document.querySelector('[role="dialog"][aria-modal="true"]'));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Disables the browser's native right-click context menu globally. */
|
|
21
|
+
export function useWorkbenchNativeContextMenuGuard(): void {
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const handleContextMenu = (event: MouseEvent) => {
|
|
24
|
+
event.preventDefault();
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
window.addEventListener('contextmenu', handleContextMenu);
|
|
28
|
+
return () => window.removeEventListener('contextmenu', handleContextMenu);
|
|
29
|
+
}, []);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Prevents the browser's native "Save as" dialog on Ctrl+S / Cmd+S everywhere
|
|
34
|
+
* except when an active editor (marked with WORKBENCH_ACTIVE_EDITOR_SAVE_SHORTCUT_ATTRIBUTE)
|
|
35
|
+
* has focus and no modal is open — in that case the editor handles the shortcut itself.
|
|
36
|
+
*/
|
|
37
|
+
export function useWorkbenchNativeSaveGuard(): void {
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
40
|
+
if (event.defaultPrevented || !isWorkbenchSaveShortcutEvent(event)) return;
|
|
41
|
+
|
|
42
|
+
const editorActive = document.body.hasAttribute(
|
|
43
|
+
WORKBENCH_ACTIVE_EDITOR_SAVE_SHORTCUT_ATTRIBUTE,
|
|
44
|
+
);
|
|
45
|
+
if (editorActive && !hasWorkbenchModalDialogOpen()) return;
|
|
46
|
+
|
|
47
|
+
event.preventDefault();
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
window.addEventListener('keydown', handleKeyDown);
|
|
51
|
+
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
52
|
+
}, []);
|
|
53
|
+
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import type { MouseEvent } from 'react';
|
|
2
|
-
|
|
3
|
-
const NATIVE_CONTEXT_MENU_SELECTOR =
|
|
4
|
-
'input, textarea, select, [contenteditable="true"], .monaco-editor, .workspace-editor__monaco, .cm-editor';
|
|
5
|
-
|
|
6
|
-
export function shouldAllowNativeBrowserContextMenu(target: EventTarget | null): boolean {
|
|
7
|
-
if (!(target instanceof Element)) {
|
|
8
|
-
return false;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return Boolean(target.closest(NATIVE_CONTEXT_MENU_SELECTOR));
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export function suppressNativeBrowserContextMenu(event: MouseEvent<HTMLElement>) {
|
|
15
|
-
if (!shouldAllowNativeBrowserContextMenu(event.target)) {
|
|
16
|
-
event.preventDefault();
|
|
17
|
-
}
|
|
18
|
-
}
|
|
1
|
+
import type { MouseEvent } from 'react';
|
|
2
|
+
|
|
3
|
+
const NATIVE_CONTEXT_MENU_SELECTOR =
|
|
4
|
+
'input, textarea, select, [contenteditable="true"], .monaco-editor, .workspace-editor__monaco, .cm-editor';
|
|
5
|
+
|
|
6
|
+
export function shouldAllowNativeBrowserContextMenu(target: EventTarget | null): boolean {
|
|
7
|
+
if (!(target instanceof Element)) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
return Boolean(target.closest(NATIVE_CONTEXT_MENU_SELECTOR));
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function suppressNativeBrowserContextMenu(event: MouseEvent<HTMLElement>) {
|
|
15
|
+
if (!shouldAllowNativeBrowserContextMenu(event.target)) {
|
|
16
|
+
event.preventDefault();
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { EditorTabs, type EditorTabsProps } from '
|
|
2
|
-
import { useWorkbenchEditorTabContextMenu } from './useWorkbenchEditorTabContextMenu';
|
|
3
|
-
|
|
4
|
-
export interface WorkbenchEditorTabsProps extends EditorTabsProps {
|
|
5
|
-
/**
|
|
6
|
-
* Optional bulk close. Defaults to calling `onClose` for every closable tab.
|
|
7
|
-
*/
|
|
8
|
-
readonly onCloseAll?: (() => void) | undefined;
|
|
9
|
-
/**
|
|
10
|
-
* Optional close-others. Defaults to calling `onClose` for every other closable tab.
|
|
11
|
-
*/
|
|
12
|
-
readonly onCloseOthers?: ((tabId: string) => void) | undefined;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Editor tab strip with a built-in Close / Close others / Close all context menu.
|
|
17
|
-
* Intended for `WorkbenchStandaloneShell` secondary areas that own tab state in the host.
|
|
18
|
-
* Tabs with `closable: false` keep Close disabled and are skipped by Close others / Close all.
|
|
19
|
-
*/
|
|
20
|
-
export function WorkbenchEditorTabs({
|
|
21
|
-
onClose,
|
|
22
|
-
onCloseAll,
|
|
23
|
-
onCloseOthers,
|
|
24
|
-
onSelect,
|
|
25
|
-
onTabContextMenu,
|
|
26
|
-
tabs,
|
|
27
|
-
...props
|
|
28
|
-
}: WorkbenchEditorTabsProps) {
|
|
29
|
-
const tabContextMenu = useWorkbenchEditorTabContextMenu({
|
|
30
|
-
onClose: onClose ?? (() => undefined),
|
|
31
|
-
onCloseAll,
|
|
32
|
-
onCloseOthers,
|
|
33
|
-
onSelectTab: onSelect,
|
|
34
|
-
tabs,
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
return (
|
|
38
|
-
<>
|
|
39
|
-
<EditorTabs
|
|
40
|
-
{...props}
|
|
41
|
-
onClose={onClose}
|
|
42
|
-
onSelect={onSelect}
|
|
43
|
-
onTabContextMenu={(tabId, event) => {
|
|
44
|
-
tabContextMenu.onTabContextMenu(tabId, event);
|
|
45
|
-
onTabContextMenu?.(tabId, event);
|
|
46
|
-
}}
|
|
47
|
-
tabs={tabs}
|
|
48
|
-
/>
|
|
49
|
-
{tabContextMenu.contextMenu}
|
|
50
|
-
</>
|
|
51
|
-
);
|
|
52
|
-
}
|
|
1
|
+
import { EditorTabs, type EditorTabsProps } from '../../primitives/workbench-editor';
|
|
2
|
+
import { useWorkbenchEditorTabContextMenu } from './useWorkbenchEditorTabContextMenu';
|
|
3
|
+
|
|
4
|
+
export interface WorkbenchEditorTabsProps extends EditorTabsProps {
|
|
5
|
+
/**
|
|
6
|
+
* Optional bulk close. Defaults to calling `onClose` for every closable tab.
|
|
7
|
+
*/
|
|
8
|
+
readonly onCloseAll?: (() => void) | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Optional close-others. Defaults to calling `onClose` for every other closable tab.
|
|
11
|
+
*/
|
|
12
|
+
readonly onCloseOthers?: ((tabId: string) => void) | undefined;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Editor tab strip with a built-in Close / Close others / Close all context menu.
|
|
17
|
+
* Intended for `WorkbenchStandaloneShell` secondary areas that own tab state in the host.
|
|
18
|
+
* Tabs with `closable: false` keep Close disabled and are skipped by Close others / Close all.
|
|
19
|
+
*/
|
|
20
|
+
export function WorkbenchEditorTabs({
|
|
21
|
+
onClose,
|
|
22
|
+
onCloseAll,
|
|
23
|
+
onCloseOthers,
|
|
24
|
+
onSelect,
|
|
25
|
+
onTabContextMenu,
|
|
26
|
+
tabs,
|
|
27
|
+
...props
|
|
28
|
+
}: WorkbenchEditorTabsProps) {
|
|
29
|
+
const tabContextMenu = useWorkbenchEditorTabContextMenu({
|
|
30
|
+
onClose: onClose ?? (() => undefined),
|
|
31
|
+
onCloseAll,
|
|
32
|
+
onCloseOthers,
|
|
33
|
+
onSelectTab: onSelect,
|
|
34
|
+
tabs,
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<>
|
|
39
|
+
<EditorTabs
|
|
40
|
+
{...props}
|
|
41
|
+
onClose={onClose}
|
|
42
|
+
onSelect={onSelect}
|
|
43
|
+
onTabContextMenu={(tabId, event) => {
|
|
44
|
+
tabContextMenu.onTabContextMenu(tabId, event);
|
|
45
|
+
onTabContextMenu?.(tabId, event);
|
|
46
|
+
}}
|
|
47
|
+
tabs={tabs}
|
|
48
|
+
/>
|
|
49
|
+
{tabContextMenu.contextMenu}
|
|
50
|
+
</>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
@@ -1,162 +1,162 @@
|
|
|
1
|
-
import type { EditorTabDropPosition } from '
|
|
2
|
-
|
|
3
|
-
export const EDITOR_TAB_DRAG_DATA_TYPE = 'application/x-workbench-kit-editor-tab' as const;
|
|
4
|
-
|
|
5
|
-
export interface EditorTabDragPayload {
|
|
6
|
-
readonly groupId: string;
|
|
7
|
-
readonly tabId: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface EditorTabDropTarget {
|
|
11
|
-
readonly position: EditorTabDropPosition;
|
|
12
|
-
readonly tabId: string;
|
|
13
|
-
readonly targetIndex: number;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
interface EditorDropTargetElement {
|
|
17
|
-
getBoundingClientRect(): Pick<DOMRect, 'left' | 'width'>;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface EditorTabLike {
|
|
21
|
-
readonly id: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function readEditorTabDragPayload(
|
|
25
|
-
dataTransfer: Pick<DataTransfer, 'getData'>,
|
|
26
|
-
): EditorTabDragPayload | null {
|
|
27
|
-
try {
|
|
28
|
-
const rawPayload = dataTransfer.getData(EDITOR_TAB_DRAG_DATA_TYPE);
|
|
29
|
-
if (!rawPayload) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const payload = JSON.parse(rawPayload) as Partial<EditorTabDragPayload>;
|
|
34
|
-
if (typeof payload.groupId !== 'string' || typeof payload.tabId !== 'string') {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return {
|
|
39
|
-
groupId: payload.groupId,
|
|
40
|
-
tabId: payload.tabId,
|
|
41
|
-
};
|
|
42
|
-
} catch {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function isEditorTabsScrollerEventTarget(target: EventTarget | null): boolean {
|
|
48
|
-
if (!(target instanceof Element)) {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (target.closest('.ui-editor-tabs__tab')) {
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
return Boolean(target.closest('.ui-editor-tabs__scroller'));
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export function resolveEditorTabDropTarget<TTab extends EditorTabLike>({
|
|
60
|
-
clientX,
|
|
61
|
-
draggedTab,
|
|
62
|
-
groupId,
|
|
63
|
-
preferredPosition,
|
|
64
|
-
tabs,
|
|
65
|
-
target,
|
|
66
|
-
targetTabId,
|
|
67
|
-
}: {
|
|
68
|
-
readonly clientX: number;
|
|
69
|
-
readonly draggedTab: EditorTabDragPayload;
|
|
70
|
-
readonly groupId: string;
|
|
71
|
-
readonly preferredPosition?: EditorTabDropPosition | undefined;
|
|
72
|
-
readonly tabs: readonly TTab[];
|
|
73
|
-
readonly target: EditorDropTargetElement;
|
|
74
|
-
readonly targetTabId: string;
|
|
75
|
-
}): EditorTabDropTarget | null {
|
|
76
|
-
const targetTabIndex = tabs.findIndex((tab) => tab.id === targetTabId);
|
|
77
|
-
if (targetTabIndex < 0) {
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const position = preferredPosition ?? getEditorTabDropPosition(target, clientX);
|
|
82
|
-
const targetIndex = position === 'after' ? targetTabIndex + 1 : targetTabIndex;
|
|
83
|
-
if (isEditorTabMoveNoop({ draggedTab, groupId, tabs, targetIndex })) {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return {
|
|
88
|
-
position,
|
|
89
|
-
tabId: targetTabId,
|
|
90
|
-
targetIndex,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
export function resolveEditorTabStripDropTarget<TTab extends EditorTabLike>({
|
|
95
|
-
draggedTab,
|
|
96
|
-
groupId,
|
|
97
|
-
tabs,
|
|
98
|
-
}: {
|
|
99
|
-
readonly draggedTab: EditorTabDragPayload;
|
|
100
|
-
readonly groupId: string;
|
|
101
|
-
readonly tabs: readonly TTab[];
|
|
102
|
-
}): EditorTabDropTarget | null {
|
|
103
|
-
const lastTab = tabs[tabs.length - 1];
|
|
104
|
-
if (!lastTab) {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
const targetIndex = tabs.length;
|
|
109
|
-
if (isEditorTabMoveNoop({ draggedTab, groupId, tabs, targetIndex })) {
|
|
110
|
-
return null;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
position: 'after',
|
|
115
|
-
tabId: lastTab.id,
|
|
116
|
-
targetIndex,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
export function isEditorTabMoveNoop<TTab extends EditorTabLike>({
|
|
121
|
-
draggedTab,
|
|
122
|
-
groupId,
|
|
123
|
-
tabs,
|
|
124
|
-
targetIndex,
|
|
125
|
-
}: {
|
|
126
|
-
readonly draggedTab: EditorTabDragPayload;
|
|
127
|
-
readonly groupId: string;
|
|
128
|
-
readonly tabs: readonly TTab[];
|
|
129
|
-
readonly targetIndex: number;
|
|
130
|
-
}): boolean {
|
|
131
|
-
if (draggedTab.groupId !== groupId) {
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const sourceIndex = tabs.findIndex((tab) => tab.id === draggedTab.tabId);
|
|
136
|
-
return sourceIndex >= 0 && (targetIndex === sourceIndex || targetIndex === sourceIndex + 1);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
export function getEditorTabDropPosition(
|
|
140
|
-
target: EditorDropTargetElement,
|
|
141
|
-
clientX: number,
|
|
142
|
-
): EditorTabDropPosition {
|
|
143
|
-
const rect = target.getBoundingClientRect();
|
|
144
|
-
if (rect.width <= 0) {
|
|
145
|
-
return 'after';
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return clientX < rect.left + rect.width / 2 ? 'before' : 'after';
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
export function normalizeEditorTabReorderIndex({
|
|
152
|
-
index,
|
|
153
|
-
sourceIndex,
|
|
154
|
-
tabCount,
|
|
155
|
-
}: {
|
|
156
|
-
index: number;
|
|
157
|
-
sourceIndex: number;
|
|
158
|
-
tabCount: number;
|
|
159
|
-
}): number {
|
|
160
|
-
const clampedIndex = Math.max(0, Math.min(index, tabCount));
|
|
161
|
-
return clampedIndex > sourceIndex ? clampedIndex - 1 : clampedIndex;
|
|
162
|
-
}
|
|
1
|
+
import type { EditorTabDropPosition } from '../../primitives/workbench-editor';
|
|
2
|
+
|
|
3
|
+
export const EDITOR_TAB_DRAG_DATA_TYPE = 'application/x-workbench-kit-editor-tab' as const;
|
|
4
|
+
|
|
5
|
+
export interface EditorTabDragPayload {
|
|
6
|
+
readonly groupId: string;
|
|
7
|
+
readonly tabId: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface EditorTabDropTarget {
|
|
11
|
+
readonly position: EditorTabDropPosition;
|
|
12
|
+
readonly tabId: string;
|
|
13
|
+
readonly targetIndex: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface EditorDropTargetElement {
|
|
17
|
+
getBoundingClientRect(): Pick<DOMRect, 'left' | 'width'>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface EditorTabLike {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function readEditorTabDragPayload(
|
|
25
|
+
dataTransfer: Pick<DataTransfer, 'getData'>,
|
|
26
|
+
): EditorTabDragPayload | null {
|
|
27
|
+
try {
|
|
28
|
+
const rawPayload = dataTransfer.getData(EDITOR_TAB_DRAG_DATA_TYPE);
|
|
29
|
+
if (!rawPayload) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const payload = JSON.parse(rawPayload) as Partial<EditorTabDragPayload>;
|
|
34
|
+
if (typeof payload.groupId !== 'string' || typeof payload.tabId !== 'string') {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
groupId: payload.groupId,
|
|
40
|
+
tabId: payload.tabId,
|
|
41
|
+
};
|
|
42
|
+
} catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function isEditorTabsScrollerEventTarget(target: EventTarget | null): boolean {
|
|
48
|
+
if (!(target instanceof Element)) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (target.closest('.ui-editor-tabs__tab')) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return Boolean(target.closest('.ui-editor-tabs__scroller'));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function resolveEditorTabDropTarget<TTab extends EditorTabLike>({
|
|
60
|
+
clientX,
|
|
61
|
+
draggedTab,
|
|
62
|
+
groupId,
|
|
63
|
+
preferredPosition,
|
|
64
|
+
tabs,
|
|
65
|
+
target,
|
|
66
|
+
targetTabId,
|
|
67
|
+
}: {
|
|
68
|
+
readonly clientX: number;
|
|
69
|
+
readonly draggedTab: EditorTabDragPayload;
|
|
70
|
+
readonly groupId: string;
|
|
71
|
+
readonly preferredPosition?: EditorTabDropPosition | undefined;
|
|
72
|
+
readonly tabs: readonly TTab[];
|
|
73
|
+
readonly target: EditorDropTargetElement;
|
|
74
|
+
readonly targetTabId: string;
|
|
75
|
+
}): EditorTabDropTarget | null {
|
|
76
|
+
const targetTabIndex = tabs.findIndex((tab) => tab.id === targetTabId);
|
|
77
|
+
if (targetTabIndex < 0) {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const position = preferredPosition ?? getEditorTabDropPosition(target, clientX);
|
|
82
|
+
const targetIndex = position === 'after' ? targetTabIndex + 1 : targetTabIndex;
|
|
83
|
+
if (isEditorTabMoveNoop({ draggedTab, groupId, tabs, targetIndex })) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
position,
|
|
89
|
+
tabId: targetTabId,
|
|
90
|
+
targetIndex,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function resolveEditorTabStripDropTarget<TTab extends EditorTabLike>({
|
|
95
|
+
draggedTab,
|
|
96
|
+
groupId,
|
|
97
|
+
tabs,
|
|
98
|
+
}: {
|
|
99
|
+
readonly draggedTab: EditorTabDragPayload;
|
|
100
|
+
readonly groupId: string;
|
|
101
|
+
readonly tabs: readonly TTab[];
|
|
102
|
+
}): EditorTabDropTarget | null {
|
|
103
|
+
const lastTab = tabs[tabs.length - 1];
|
|
104
|
+
if (!lastTab) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const targetIndex = tabs.length;
|
|
109
|
+
if (isEditorTabMoveNoop({ draggedTab, groupId, tabs, targetIndex })) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
position: 'after',
|
|
115
|
+
tabId: lastTab.id,
|
|
116
|
+
targetIndex,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function isEditorTabMoveNoop<TTab extends EditorTabLike>({
|
|
121
|
+
draggedTab,
|
|
122
|
+
groupId,
|
|
123
|
+
tabs,
|
|
124
|
+
targetIndex,
|
|
125
|
+
}: {
|
|
126
|
+
readonly draggedTab: EditorTabDragPayload;
|
|
127
|
+
readonly groupId: string;
|
|
128
|
+
readonly tabs: readonly TTab[];
|
|
129
|
+
readonly targetIndex: number;
|
|
130
|
+
}): boolean {
|
|
131
|
+
if (draggedTab.groupId !== groupId) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const sourceIndex = tabs.findIndex((tab) => tab.id === draggedTab.tabId);
|
|
136
|
+
return sourceIndex >= 0 && (targetIndex === sourceIndex || targetIndex === sourceIndex + 1);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function getEditorTabDropPosition(
|
|
140
|
+
target: EditorDropTargetElement,
|
|
141
|
+
clientX: number,
|
|
142
|
+
): EditorTabDropPosition {
|
|
143
|
+
const rect = target.getBoundingClientRect();
|
|
144
|
+
if (rect.width <= 0) {
|
|
145
|
+
return 'after';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return clientX < rect.left + rect.width / 2 ? 'before' : 'after';
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export function normalizeEditorTabReorderIndex({
|
|
152
|
+
index,
|
|
153
|
+
sourceIndex,
|
|
154
|
+
tabCount,
|
|
155
|
+
}: {
|
|
156
|
+
index: number;
|
|
157
|
+
sourceIndex: number;
|
|
158
|
+
tabCount: number;
|
|
159
|
+
}): number {
|
|
160
|
+
const clampedIndex = Math.max(0, Math.min(index, tabCount));
|
|
161
|
+
return clampedIndex > sourceIndex ? clampedIndex - 1 : clampedIndex;
|
|
162
|
+
}
|