@nvidia-elements/core 2.23.5 → 2.23.6
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/CHANGELOG.md +6 -0
- package/dist/accordion/accordion2.js +4 -4
- package/dist/alert/alert-group2.js +1 -1
- package/dist/alert/alert2.js +1 -1
- package/dist/avatar/avatar-group2.js +1 -1
- package/dist/avatar/avatar2.js +1 -1
- package/dist/badge/badge2.js +1 -1
- package/dist/breadcrumb/breadcrumb2.js +1 -1
- package/dist/bundles/index.js +7 -7
- package/dist/button/button2.js +1 -1
- package/dist/button-group/button-group2.js +1 -1
- package/dist/card/card2.js +4 -4
- package/dist/chat-message/chat-message2.js +1 -1
- package/dist/checkbox/checkbox-group2.js +1 -1
- package/dist/checkbox/checkbox2.js +1 -1
- package/dist/color/color2.js +1 -1
- package/dist/combobox/combobox2.js +1 -1
- package/dist/copy-button/copy-button2.js +1 -1
- package/dist/custom-elements.json +1000 -229
- package/dist/date/date2.js +1 -1
- package/dist/datetime/datetime2.js +1 -1
- package/dist/dialog/dialog-footer2.js +1 -1
- package/dist/dialog/dialog-header2.js +1 -1
- package/dist/dialog/dialog2.js +1 -1
- package/dist/divider/divider2.js +1 -1
- package/dist/dot/dot2.js +1 -1
- package/dist/drag-handle/drag-handle2.js +1 -1
- package/dist/drawer/drawer-content2.js +1 -1
- package/dist/drawer/drawer-footer2.js +1 -1
- package/dist/drawer/drawer-header2.js +1 -1
- package/dist/drawer/drawer2.js +1 -1
- package/dist/dropdown/dropdown-footer2.js +1 -1
- package/dist/dropdown/dropdown-header2.js +1 -1
- package/dist/dropdown/dropdown2.js +1 -1
- package/dist/dropdown-group/dropdown-group.js +1 -1
- package/dist/dropzone/dropzone2.js +1 -1
- package/dist/file/file2.js +1 -1
- package/dist/format-bytes/format-bytes2.js +1 -1
- package/dist/format-datetime/format-datetime2.js +1 -1
- package/dist/format-number/format-number2.js +1 -1
- package/dist/format-relative-time/format-relative-time2.js +1 -1
- package/dist/format-truncate/format-truncate2.js +1 -1
- package/dist/forms/control/control2.js +1 -1
- package/dist/forms/control-group/control-group2.js +1 -1
- package/dist/forms/control-message/control-message2.js +1 -1
- package/dist/gauge/gauge2.js +1 -1
- package/dist/ghost/ghost2.js +1 -1
- package/dist/grid/cell/cell2.js +1 -1
- package/dist/grid/column/column2.js +1 -1
- package/dist/grid/footer/footer2.js +1 -1
- package/dist/grid/grid2.js +1 -1
- package/dist/grid/header/header2.js +1 -1
- package/dist/grid/placeholder/placeholder2.js +1 -1
- package/dist/grid/row/row2.js +1 -1
- package/dist/icon/icon2.js +1 -1
- package/dist/icon-button/icon-button2.js +1 -1
- package/dist/iframe/iframe2.js +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group2.js +1 -1
- package/dist/input/input2.js +1 -1
- package/dist/joystick/joystick2.js +1 -1
- package/dist/logo/logo2.js +1 -1
- package/dist/menu/menu-group2.js +1 -1
- package/dist/menu/menu-item2.js +1 -1
- package/dist/menu/menu2.js +1 -1
- package/dist/month/month2.js +1 -1
- package/dist/notification/notification-group2.js +1 -1
- package/dist/notification/notification2.js +1 -1
- package/dist/page/page-panel/page-panel-content2.js +1 -1
- package/dist/page/page-panel/page-panel-footer2.js +1 -1
- package/dist/page/page-panel/page-panel-header2.js +1 -1
- package/dist/page/page-panel/page-panel2.js +1 -1
- package/dist/page/page2.js +1 -1
- package/dist/page-header/page-header2.js +1 -1
- package/dist/page-loader/page-loader2.js +1 -1
- package/dist/pagination/pagination2.js +1 -1
- package/dist/panel/panel2.js +4 -4
- package/dist/password/password2.js +1 -1
- package/dist/preferences-input/preferences-input2.js +1 -1
- package/dist/progress-bar/progress-bar2.js +1 -1
- package/dist/progress-dot/progress-dot2.js +1 -1
- package/dist/progress-ring/progress-ring2.js +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
- package/dist/pulse/pulse2.js +1 -1
- package/dist/radio/radio-group2.js +1 -1
- package/dist/radio/radio2.js +1 -1
- package/dist/range/range2.js +1 -1
- package/dist/resize-handle/resize-handle2.js +1 -1
- package/dist/search/search2.js +1 -1
- package/dist/select/select2.js +1 -1
- package/dist/skeleton/skeleton2.js +1 -1
- package/dist/sort-button/sort-button2.js +1 -1
- package/dist/sparkline/sparkline2.js +1 -1
- package/dist/star-rating/star-rating2.js +1 -1
- package/dist/steps/steps2.js +2 -2
- package/dist/switch/switch-group2.js +1 -1
- package/dist/switch/switch2.js +1 -1
- package/dist/tabs/tabs-group2.js +1 -1
- package/dist/tabs/tabs-item-group2.js +1 -1
- package/dist/tabs/tabs2.js +2 -2
- package/dist/tag/tag2.js +1 -1
- package/dist/textarea/textarea2.js +1 -1
- package/dist/time/time2.js +1 -1
- package/dist/toast/toast2.js +1 -1
- package/dist/toggletip/toggletip-footer2.js +1 -1
- package/dist/toggletip/toggletip-header2.js +1 -1
- package/dist/toggletip/toggletip2.js +1 -1
- package/dist/toolbar/toolbar2.js +1 -1
- package/dist/tooltip/tooltip2.js +1 -1
- package/dist/tree/tree-node2.js +1 -1
- package/dist/tree/tree2.js +1 -1
- package/dist/week/week2.js +1 -1
- package/dist/workspace/controllers/workspace-composition.controller.d.ts +4 -1
- package/dist/workspace/controllers/workspace-composition.controller.js +69 -39
- package/dist/workspace/controllers/workspace-composition.controller.js.map +1 -1
- package/dist/workspace/controllers/workspace-rearrange.controller.js +27 -27
- package/dist/workspace/controllers/workspace-rearrange.controller.js.map +1 -1
- package/dist/workspace/controllers/workspace-restoration.controller.js +2 -2
- package/dist/workspace/controllers/workspace-restoration.controller.js.map +1 -1
- package/dist/workspace/panel/panel2.js +2 -2
- package/dist/workspace/panel/panel2.js.map +1 -1
- package/dist/workspace/panel-content/panel-content2.js +1 -1
- package/dist/workspace/panel-footer/panel-footer2.js +1 -1
- package/dist/workspace/panel-header/panel-header2.js +1 -1
- package/dist/workspace/utils/comparison.utils.d.ts +3 -0
- package/dist/workspace/utils/comparison.utils.js +13 -0
- package/dist/workspace/utils/comparison.utils.js.map +1 -0
- package/dist/workspace/utils/evaluation.utils.d.ts +65 -6
- package/dist/workspace/utils/evaluation.utils.js +334 -99
- package/dist/workspace/utils/evaluation.utils.js.map +1 -1
- package/dist/workspace/utils/geometry/allocation.utils.js +15 -13
- package/dist/workspace/utils/geometry/allocation.utils.js.map +1 -1
- package/dist/workspace/utils/geometry/sizing.utils.d.ts +2 -0
- package/dist/workspace/utils/geometry/sizing.utils.js +37 -17
- package/dist/workspace/utils/geometry/sizing.utils.js.map +1 -1
- package/dist/workspace/utils/interaction/boundary.utils.d.ts +2 -2
- package/dist/workspace/utils/interaction/boundary.utils.js +2 -2
- package/dist/workspace/utils/interaction/boundary.utils.js.map +1 -1
- package/dist/workspace/utils/interaction/drag-preview.utils.d.ts +3 -3
- package/dist/workspace/utils/interaction/drag-preview.utils.js.map +1 -1
- package/dist/workspace/utils/interaction/insertion-offers.utils.d.ts +11 -9
- package/dist/workspace/utils/interaction/insertion-offers.utils.js +37 -43
- package/dist/workspace/utils/interaction/insertion-offers.utils.js.map +1 -1
- package/dist/workspace/utils/interaction/placement-decision.utils.d.ts +6 -1
- package/dist/workspace/utils/interaction/placement-decision.utils.js +94 -87
- package/dist/workspace/utils/interaction/placement-decision.utils.js.map +1 -1
- package/dist/workspace/utils/model/layout.utils.d.ts +2 -1
- package/dist/workspace/utils/model/layout.utils.js +12 -10
- package/dist/workspace/utils/model/layout.utils.js.map +1 -1
- package/dist/workspace/utils/model/membership.utils.d.ts +4 -0
- package/dist/workspace/utils/model/membership.utils.js +13 -4
- package/dist/workspace/utils/model/membership.utils.js.map +1 -1
- package/dist/workspace/utils/model/operations.utils.d.ts +1 -0
- package/dist/workspace/utils/model/operations.utils.js +51 -46
- package/dist/workspace/utils/model/operations.utils.js.map +1 -1
- package/dist/workspace/utils/model/projection.utils.d.ts +4 -2
- package/dist/workspace/utils/model/projection.utils.js +49 -40
- package/dist/workspace/utils/model/projection.utils.js.map +1 -1
- package/dist/workspace/utils/model/value.utils.d.ts +4 -3
- package/dist/workspace/utils/model/value.utils.js +15 -50
- package/dist/workspace/utils/model/value.utils.js.map +1 -1
- package/dist/workspace/utils/placement/acquisition-sizing.utils.d.ts +2 -0
- package/dist/workspace/utils/placement/acquisition-sizing.utils.js +30 -22
- package/dist/workspace/utils/placement/acquisition-sizing.utils.js.map +1 -1
- package/dist/workspace/utils/placement/group-insertion.utils.d.ts +19 -13
- package/dist/workspace/utils/placement/group-insertion.utils.js +50 -47
- package/dist/workspace/utils/placement/group-insertion.utils.js.map +1 -1
- package/dist/workspace/utils/placement/planner.utils.d.ts +13 -2
- package/dist/workspace/utils/placement/planner.utils.js +79 -73
- package/dist/workspace/utils/placement/planner.utils.js.map +1 -1
- package/dist/workspace/utils/placement/preparation.utils.d.ts +5 -2
- package/dist/workspace/utils/placement/preparation.utils.js +45 -41
- package/dist/workspace/utils/placement/preparation.utils.js.map +1 -1
- package/dist/workspace/utils/placement/region.utils.js +32 -32
- package/dist/workspace/utils/placement/region.utils.js.map +1 -1
- package/dist/workspace/utils/placement/scope.utils.d.ts +34 -0
- package/dist/workspace/utils/placement/scope.utils.js +155 -0
- package/dist/workspace/utils/placement/scope.utils.js.map +1 -0
- package/dist/workspace/utils/placement/session.utils.d.ts +11 -0
- package/dist/workspace/utils/placement/session.utils.js +78 -0
- package/dist/workspace/utils/placement/session.utils.js.map +1 -0
- package/dist/workspace/utils/placement/split-sizing.utils.d.ts +2 -2
- package/dist/workspace/utils/placement/split-sizing.utils.js +19 -19
- package/dist/workspace/utils/placement/split-sizing.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/composition.utils.d.ts +1 -1
- package/dist/workspace/utils/presentation/composition.utils.js +4 -2
- package/dist/workspace/utils/presentation/composition.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/groups.utils.d.ts +3 -3
- package/dist/workspace/utils/presentation/groups.utils.js +40 -30
- package/dist/workspace/utils/presentation/groups.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/measurements.utils.d.ts +1 -0
- package/dist/workspace/utils/presentation/measurements.utils.js +6 -14
- package/dist/workspace/utils/presentation/measurements.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/offers.utils.d.ts +1 -1
- package/dist/workspace/utils/presentation/offers.utils.js +3 -3
- package/dist/workspace/utils/presentation/offers.utils.js.map +1 -1
- package/dist/workspace/utils/presentation/preview.utils.d.ts +6 -0
- package/dist/workspace/utils/presentation/preview.utils.js +14 -3
- package/dist/workspace/utils/presentation/preview.utils.js.map +1 -1
- package/dist/workspace/workspace.examples.js.map +1 -1
- package/dist/workspace/workspace.examples.json +4 -4
- package/dist/workspace/workspace.js +1 -1
- package/dist/workspace/workspace.js.map +1 -1
- package/dist/workspace/workspace2.js +206 -212
- package/dist/workspace/workspace2.js.map +1 -1
- package/package.json +1 -1
- package/dist/workspace/utils/placement/context.utils.d.ts +0 -36
- package/dist/workspace/utils/placement/context.utils.js +0 -135
- package/dist/workspace/utils/placement/context.utils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace2.js","names":["styles","_decorate","__decorate","workspace_default","i18nDefaults","Workspace","LitElement","_args","#i18nController","I18nController","#value","#restoring","#restoration","WorkspaceRestorationController","#layout","#restore","layout","#composition","#commands","WorkspaceCommandController","#panels","#fullscreen","#getPlacementLayout","source","intent","targetPanelId","#activatePanel","anchor","operation","#close","#move","WorkspaceFullscreenController","findGroup","#getProjectedLayout","#currentLayout","#rearrange","#resize","#measurementController","WorkspaceRearrangeController","#withEvaluation","work","#measurements","#available","#activateSource","group","#dragPreview","preview","#placementCapabilities","#presentedGroups","#boundaries","#latestMeasurements","WorkspaceResizeController","#canResize","#commitResize","WorkspaceMeasurementController","#isCarried","id","panel","#applyMeasurements","change","WorkspaceCompositionController","#evaluationDelegate","useStyles","DragHandle","Ghost","Icon","IconButton","ResizeHandle","Tabs","TabsItem","TabsItemGroup","next","parseWorkspaceValue","value","#contentObserver","#observeContent","records","changed","key","#reconcile","options","command","context","#evaluation","isServer","matchesElementName","child","WorkspacePanel","#presentationClosable","#showResizeHandles","catalogue","record","labels","isWorkspaceCompositionMutation","ids","#setLayout","reconcilePanels","#commit","serializeWorkspaceValue","old","sameSerializedWorkspaceLayout","#focusPanel","opened","openPanel","selectPanel","capabilities","#focusPlacement","closePanel","recoverFocus","shouldFocusAfterWorkspaceClose","item","WorkspaceEvaluation","projectLayout","getAdmissiblePlacementLayout","carried","active","front","getPanelLabel","#renderWorkspace","evaluation","drag","geometry","preserveRecipientSelection","#renderDragPreview","ifDefined","repeat","#renderTabs","#renderResizeHandles","#renderMeasurementProbe","#getCarriedPreviewContent","currentLayout","catalog","contexts","allocateContextProxies","bounds","hint","destination","rect","x","y","point","#renderPlacementHint","getContextKey","getRegionCornerStyle","allocation","kind","shouldEmphasizeReservedDestination","#renderSeamBadges","#renderCarriedPreview","edges","vertical","edge","normal","position","rotation","#renderSplitSeamBadge","#renderInsertSeamBadge","input","right","bottom","px","py","layers","title","measurements","#retainsPreviewSpace","fullscreenSelected","fullscreen","actionWidth","headerHeight","#renderGroupGrip","#renderTabStrip","#renderFullscreenControl","event","width","getAllocatedTabWidth","suffixWidth","#renderTabTrack","entries","#renderTabEntry","index","#selectTab","style","styleMap","close","disabled","selected","#renderHandle","fullscreenable","rearrangeable","property","scopedRegistry"],"sources":["../../src/workspace/workspace.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, isServer, LitElement, type PropertyValues, svg } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport { matchesElementName, type Point, type Rect } from '@nvidia-elements/core/internal';\nimport { scopedRegistry } from '@nvidia-elements/foundations/internal/decorators';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport { I18nController, type I18nDefaults } from '@nvidia-elements/foundations/internal/i18n';\n\nimport { DragHandle } from '@nvidia-elements/core/drag-handle';\nimport { Ghost } from '@nvidia-elements/core/ghost';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport { IconButton } from '@nvidia-elements/core/icon-button';\nimport { ResizeHandle } from '@nvidia-elements/core/resize-handle';\nimport { Tabs, TabsItem, TabsItemGroup } from '@nvidia-elements/core/tabs';\n\nimport { WorkspaceCommandController } from './controllers/workspace-command.controller.js';\nimport { WorkspaceCompositionController } from './controllers/workspace-composition.controller.js';\nimport { WorkspaceFullscreenController } from './controllers/workspace-fullscreen.controller.js';\nimport { WorkspaceMeasurementController } from './controllers/workspace-measurement.controller.js';\nimport { WorkspaceRearrangeController } from './controllers/workspace-rearrange.controller.js';\nimport { WorkspaceResizeController } from './controllers/workspace-resize.controller.js';\nimport { WorkspaceRestorationController } from './controllers/workspace-restoration.controller.js';\nimport {\n closePanel,\n findGroup,\n openPanel,\n projectLayout,\n reconcilePanels,\n selectPanel\n} from './utils/model/operations.utils.js';\nimport {\n parseWorkspaceValue,\n sameSerializedWorkspaceLayout,\n serializeWorkspaceValue\n} from './utils/model/value.utils.js';\nimport { allocateContextProxies, getContextKey } from './utils/placement/context.utils.js';\nimport { getAdmissiblePlacementLayout } from './utils/placement/preparation.utils.js';\nimport {\n focusWorkspacePanel,\n getPanelLabel,\n isWorkspaceCompositionMutation,\n shouldFocusAfterWorkspaceClose\n} from './utils/presentation/composition.utils.js';\nimport { getAllocatedTabWidth, preserveRecipientSelection } from './utils/presentation/groups.utils.js';\nimport { getRegionCornerStyle, shouldEmphasizeReservedDestination } from './utils/presentation/preview.utils.js';\nimport { WorkspaceEvaluation } from './utils/evaluation.utils.js';\n\nimport { WorkspacePanel } from './panel/panel.js';\n\nimport type { WorkspaceRearrangeCapabilities } from './controllers/workspace-rearrange.controller.js';\nimport type { WorkspaceBoundary, WorkspacePlacedRegion } from './utils/geometry/allocation.utils.js';\nimport type { WorkspaceCommandContext, WorkspacePlacementIntent } from './utils/interaction/command.utils.js';\nimport type { WorkspaceDragPreview } from './utils/interaction/drag-preview.utils.js';\nimport type { WorkspaceInsertionOffer } from './utils/interaction/insertion-offers.utils.js';\nimport type { WorkspaceLayout } from './utils/model/layout.utils.js';\nimport type { WorkspacePresentedGroup } from './utils/presentation/groups.utils.js';\nimport type { WorkspaceMeasurementChange, WorkspaceMeasurements } from './utils/presentation/measurements.utils.js';\nimport type { WorkspaceEvaluationDelegate } from './utils/evaluation.utils.js';\n\nimport type { WorkspaceAnimationOptions } from './workspace.types.js';\n\nimport styles from './workspace.css?inline';\n\nconst i18nDefaults = {\n close: 'close',\n move: 'move',\n enterFullscreen: 'enter full screen',\n exitFullscreen: 'exit full screen'\n} satisfies I18nDefaults;\n\n/**\n * @element nve-workspace\n * @description A workspace provides a malleable arrangement of application panels in a restorable layout.\n * @documentation https://nvidia.github.io/elements/docs/elements/workspace/\n * @since 0.0.0\n * @stable false\n * @entrypoint \\@nvidia-elements/core/workspace\n * @command --enter-fullscreen - Present the invoking panel's group in native fullscreen.\n * @command --exit-fullscreen - Exit native fullscreen.\n * @command --toggle-fullscreen - Toggle native fullscreen for the invoking panel's group.\n * @command --open - Open and activate the targeted supplied panel. Repeated activation is silent.\n * @command --close - Close the targeted panel when its workspace is closable.\n * @command --select - Activate an open supplied panel without reopening a closed panel.\n * @command --place - Apply the invoker's typed placement request when rearrangeable; membership changes also require groupable.\n * @slot - Workspace panels with durable IDs and application dropdown groups.\n * @event change - Announces a committed arrangement value after interaction, commands, or reconciliation of newly supplied panels. Read value on the workspace.\n * @event commandavailabilitychange - Command availability may have changed; query relevant commands again.\n * @cssprop --gap - Space between groups as one nonnegative CSS length.\n * @cssprop --border-radius - Corner radius of contained groups.\n * @cssprop --tab-min-width - Smallest tab width before scrolling.\n * @cssprop --tab-border - Border between tabs, after the drag handle, and before group controls without an authored suffix.\n * @cssprop --header-control-size - Size of built-in header buttons and the base drag handle width.\n * @cssprop --header-control-inset - Horizontal spacing around fullscreen and the drag handle.\n * @cssprop --close-button-inset - Space after each panel close control.\n * @cssprop --animation-duration - Duration of coordinated layout and placement transitions.\n * @cssprop --animation-easing - Easing of coordinated layout and placement transitions.\n * @cssprop --gutter-background - Idle separator fill.\n * @cssprop --gutter-hover-background - Separator fill on hover.\n * @csspart tabs - Tab strips.\n * @csspart tabs-item - Panel selection controls.\n * @csspart tab - Alias for panel selection controls.\n * @csspart tabs-item-group - Tab and accessory layouts.\n * @csspart icon-button - Built-in header icon controls.\n * @csspart fullscreen-button - Group fullscreen control.\n * @csspart close-button - Panel closing controls.\n * @csspart resize-handle - Separator control.\n * @csspart ghost - Destination and carried previews.\n * @csspart destination-ghost - Animated insertion cue.\n * @csspart carried-ghost - Pointer-following carried panel previews.\n * @csspart icon - Placement status icons.\n * @csspart blocked-icon - Unavailable placement indicator.\n * @csspart drag-handle - Group movement control.\n */\n@scopedRegistry()\nexport class Workspace extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-workspace',\n version: '0.0.0',\n children: ['nve-workspace-panel', 'nve-dropdown-group']\n };\n\n static elementDefinitions = {\n [DragHandle.metadata.tag]: DragHandle,\n [Ghost.metadata.tag]: Ghost,\n [Icon.metadata.tag]: Icon,\n [IconButton.metadata.tag]: IconButton,\n [ResizeHandle.metadata.tag]: ResizeHandle,\n [Tabs.metadata.tag]: Tabs,\n [TabsItem.metadata.tag]: TabsItem,\n [TabsItemGroup.metadata.tag]: TabsItemGroup\n };\n\n readonly #i18nController: I18nController<this> = new I18nController<this>(this, i18nDefaults);\n\n /** Overrides localized workspace controls. */\n @property({ type: Object, attribute: false }) i18n = this.#i18nController.i18n;\n\n /** Enables separator resizing. */\n @property({ type: Boolean, reflect: true }) resizable = false;\n\n /** Enables moving groups and placement commands. Dragging individual tabs also requires groupable. */\n @property({ type: Boolean, reflect: true }) rearrangeable = false;\n\n /** Enables dragging individual tabs, joining panels, and extracting panels when rearrangeable. */\n @property({ type: Boolean, reflect: true }) groupable = false;\n\n /** Enables native fullscreen commands and one persistent control per group. Turning this off preserves an accepted session and its exit control. Fullscreen does not change the saved arrangement. */\n @property({ type: Boolean, reflect: true }) fullscreenable = false;\n\n /** Radial pointer distance in CSS pixels before a carried source detaches. Captured at gesture press. */\n @property({ type: Number, attribute: 'detach-threshold' }) detachThreshold = 48;\n\n /** Enables closing supplied panels. */\n @property({ type: Boolean, reflect: true }) closable = false;\n\n /** Selects separator constraint behavior. */\n @property({ attribute: 'resize-policy' }) resizePolicy: 'stop' | 'propagate' = 'stop';\n\n /** Selects panel content framing. */\n @property({ reflect: true }) container?: 'inset' | 'flat' | 'full';\n\n /** Versioned JSON arrangement. Assignment restores without emitting change. */\n @property({ type: String })\n get value(): string {\n return this.#value;\n }\n\n set value(value: string) {\n const next = parseWorkspaceValue(value);\n this.#restoration.finish();\n this.#restore(next);\n }\n\n #layout?: WorkspaceLayout;\n #value = '';\n #restoring = false;\n #dragPreview?: WorkspaceDragPreview;\n\n readonly #restoration = new WorkspaceRestorationController(this, {\n getLayout: () => this.#layout,\n applyLayout: layout => this.#restore(layout),\n getTransitionTargets: () => this.#composition.getTransitionTargets()\n });\n\n readonly #commands = new WorkspaceCommandController(this, {\n getState: () => ({\n panels: this.#panels,\n layout: this.#layout\n }),\n isRearrangementAllowed: () => !this.#fullscreen.active,\n isPlacementAvailable: (source, intent) => !!this.#getPlacementLayout(source, intent),\n canEnterFullscreen: targetPanelId => this.#fullscreen.canEnter(targetPanelId),\n canExitFullscreen: () => this.#fullscreen.canExit,\n isFullscreenGroup: targetPanelId => this.#fullscreen.isSelectedGroup(targetPanelId),\n enterFullscreen: targetPanelId => this.#fullscreen.enter(targetPanelId),\n exitFullscreen: () => this.#fullscreen.exit(),\n activatePanel: (anchor, operation) => this.#activatePanel(anchor, operation),\n closePanel: anchor => this.#close(anchor),\n placePanel: (source, intent) => this.#move(source, intent)\n });\n\n readonly #fullscreen = new WorkspaceFullscreenController(this, {\n getGroup: targetPanelId =>\n findGroup(this.#getProjectedLayout(this.#currentLayout).root, targetPanelId)?.panels ?? [],\n cancelInteractions: () => {\n this.#restoration.finish();\n this.#rearrange.cancel();\n this.#resize.cancel();\n },\n invalidateCommandAvailability: () => {\n this.#commands.invalidateAvailability();\n this.#measurementController.invalidate();\n }\n });\n\n readonly #rearrange: WorkspaceRearrangeController = new WorkspaceRearrangeController(this, {\n evaluateWithContext: work => this.#withEvaluation(work),\n isRearrangementAllowed: () => !this.#fullscreen.active && !this.#restoration.active,\n getLayout: () => this.#layout,\n getMeasurements: () => this.#measurements,\n getAvailablePanels: () => this.#available,\n activateSource: (source, group) => this.#activateSource(source, group),\n applyPreview: preview => {\n this.#dragPreview = preview;\n this.requestUpdate();\n },\n commitPlacement: (source, intent, layout) =>\n this.#move(source, intent, { layout, capabilities: this.#placementCapabilities, focus: false })\n });\n\n #presentedGroups: WorkspacePresentedGroup[] = [];\n #boundaries: WorkspaceBoundary[] = [];\n\n #latestMeasurements: WorkspaceMeasurements = {\n gap: 0,\n headerHeight: 0,\n gripWidth: 0,\n actionWidth: 0,\n groupActionWidth: 0,\n tabWidth: 0,\n tabMinWidth: 0,\n width: 0,\n height: 0\n };\n\n readonly #resize: WorkspaceResizeController = new WorkspaceResizeController(this, {\n isEnabled: () => this.#canResize,\n getLayout: () => this.#layout,\n getBoundaries: () => this.#boundaries,\n getAvailablePanels: () => this.#available,\n getPresentation: () => ({\n measurements: this.#measurements,\n rearrangeable: this.#placementCapabilities.rearrangeable,\n closable: this.closable,\n fullscreenable: this.fullscreenable\n }),\n cancelForUser: () => this.#restoration.transition(() => this.#resize.cancel()),\n commitLayout: layout => this.#commitResize(layout)\n });\n\n readonly #measurementController = new WorkspaceMeasurementController(this, {\n getPanels: () => this.#panels,\n isPresented: id =>\n !this.#isCarried(id) && this.#presentedGroups.some(group => group.panels.some(panel => panel.id === id)),\n isCarried: id => !this.#layout?.closed.includes(id) && this.#isCarried(id),\n applyMeasurements: change => this.#applyMeasurements(change)\n });\n\n readonly #composition = new WorkspaceCompositionController(this, {\n getPanels: () => this.#panels,\n getGroups: () => this.#presentedGroups,\n getLayout: () => this.#layout,\n getPreview: () => this.#dragPreview,\n scrollChanged: () => this.#rearrange.refresh()\n });\n\n #contentObserver?: MutationObserver;\n #evaluation?: WorkspaceEvaluation;\n\n readonly #evaluationDelegate: WorkspaceEvaluationDelegate = {\n getCurrentLayout: () => this.#currentLayout,\n getCurrentMeasurements: () => this.#measurements,\n getCurrentPreview: () => this.#dragPreview,\n getFullscreenTarget: () => this.#fullscreen.targetPanelId,\n getResizePreview: () => this.#resize.preview\n };\n\n connectedCallback() {\n super.connectedCallback();\n this.#contentObserver = new MutationObserver(records => this.#observeContent(records));\n this.#contentObserver.observe(this, {\n childList: true,\n characterData: true,\n attributes: true,\n subtree: true,\n attributeFilter: ['id', 'min-width', 'min-height', 'slot']\n });\n }\n\n disconnectedCallback() {\n this.#rearrange.cancel();\n this.#contentObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n protected willUpdate(changed: PropertyValues) {\n super.willUpdate(changed);\n this.#composition.captureFocus();\n\n if (\n ['value', 'fullscreenable', 'closable', 'rearrangeable', 'groupable', 'resizePolicy'].some(key =>\n changed.has(key)\n )\n ) {\n this.#commands.invalidateAvailability();\n }\n if (['fullscreenable', 'closable', 'rearrangeable', 'groupable'].some(key => changed.has(key))) {\n this.#measurementController.invalidate();\n }\n\n this.#reconcile();\n this.#restoring = false;\n }\n\n protected updated() {\n this.#composition.sync();\n this.#commands.flushAvailability();\n }\n\n /** Restores an arrangement with animated geometry while retaining application content. */\n animateTo(value: string, options: WorkspaceAnimationOptions = {}): void {\n const next = parseWorkspaceValue(value);\n this.#restoration.animateTo(next, options);\n }\n\n /** Reports whether a command can change the panel identified by `context.value` in the current arrangement. Native fullscreen admission remains subject to browser permission. */\n isCommandAvailable(command: string, context: WorkspaceCommandContext = {}): boolean {\n return this.#commands.isCommandAvailable(command, context);\n }\n\n get #currentLayout(): WorkspaceLayout {\n return this.#layout ?? { version: 1, root: null, closed: [] };\n }\n\n get #panels(): WorkspacePanel[] {\n if (this.#evaluation) return this.#evaluation.panels;\n return isServer\n ? []\n : [...this.children].filter((child): child is WorkspacePanel => matchesElementName(child, WorkspacePanel));\n }\n\n get #available() {\n return this.#evaluation?.available ?? this.#panels.map(panel => panel.id);\n }\n\n get #measurements(): WorkspaceMeasurements {\n return this.#resize.presentation?.measurements ?? this.#latestMeasurements;\n }\n\n get #placementCapabilities() {\n return this.#rearrange.capabilities ?? { rearrangeable: this.rearrangeable, groupable: this.groupable };\n }\n\n get #presentationClosable() {\n return this.#resize.presentation?.closable ?? this.closable;\n }\n\n get #canResize() {\n return this.resizable && !this.#fullscreen.active;\n }\n\n get #showResizeHandles() {\n return this.#canResize || this.#resize.retainingHandles;\n }\n\n #observeContent(records: MutationRecord[]) {\n const catalogue = records.some(\n record =>\n record.target === this ||\n (record.type === 'attributes' &&\n matchesElementName(record.target as Element, WorkspacePanel) &&\n record.target.parentElement === this)\n );\n const labels = records.some(record => isWorkspaceCompositionMutation(this, record));\n\n if (catalogue) {\n this.#restoration.finish();\n this.#commands.invalidateAvailability();\n this.#resize.cancel();\n this.#rearrange.cancel();\n }\n if (catalogue || labels) {\n this.#measurementController.invalidate();\n this.requestUpdate();\n }\n }\n\n #reconcile() {\n const ids = this.#available;\n if (!ids.every(Boolean) || new Set(ids).size !== ids.length) return;\n if (!this.#layout) {\n if (ids.length) {\n this.#setLayout({ version: 1, root: { type: 'group', panels: ids, active: ids[0]! }, closed: [] });\n }\n return;\n }\n const next = reconcilePanels(this.#layout, ids);\n if (next === this.#layout) return;\n this.#setLayout(next);\n if (!this.#restoring) {\n this.#commit();\n }\n }\n\n #applyMeasurements(change: WorkspaceMeasurementChange) {\n this.#latestMeasurements = change.measurements;\n this.#commands.invalidateAvailability();\n this.requestUpdate();\n this.#resize.handleMeasurementsChange(change);\n this.#restoration.handleMeasurementsChange(change);\n this.#rearrange.handleMeasurementsChange(change);\n }\n\n #setLayout(layout: WorkspaceLayout | undefined) {\n if (layout === this.#layout) {\n return;\n }\n const value = serializeWorkspaceValue(layout);\n this.#layout = layout;\n this.#value = value;\n }\n\n #restore(next: WorkspaceLayout | undefined) {\n this.#rearrange.cancel();\n const old = this.value;\n this.#resize.resetForRestore();\n this.#setLayout(next);\n this.#restoring = true;\n this.requestUpdate('value', old);\n }\n\n #commit() {\n this.#commands.invalidateAvailability();\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n #commitResize(layout: WorkspaceLayout) {\n const changed = !sameSerializedWorkspaceLayout(this.#layout, layout);\n if (changed) {\n this.#setLayout(layout);\n this.#commit();\n } else {\n this.requestUpdate();\n }\n }\n\n #activateSource(source: string[], group: boolean) {\n if (group) return;\n\n const anchor = source.find(id => !this.#layout?.closed.includes(id) && this.#available.includes(id));\n if (!anchor || !this.shadowRoot?.querySelector(`nve-tabs-item[data-panel=\"${CSS.escape(anchor)}\"]`)) return;\n\n this.#activatePanel(anchor, 'select');\n this.#focusPanel(anchor);\n }\n\n #activatePanel(id: string, operation: 'open' | 'select') {\n this.#restoration.finish();\n if (!this.#layout || !this.#panels.some(panel => panel.id === id)) return;\n\n let opened = this.#layout;\n if (operation === 'open') {\n opened = openPanel(this.#layout, id) ?? this.#layout;\n }\n let next = selectPanel(opened, id);\n if (next === undefined && opened !== this.#layout) {\n next = opened;\n }\n if (!next) return;\n\n this.#rearrange.cancel();\n this.#resize.cancel();\n this.#setLayout(next);\n this.#commit();\n }\n\n #selectTab(id: string) {\n if (!this.#rearrange.suppressSelection) {\n this.#activatePanel(id, 'select');\n }\n }\n\n #move(\n source: string[],\n intent: WorkspacePlacementIntent,\n options: { layout?: WorkspaceLayout; capabilities?: WorkspaceRearrangeCapabilities; focus?: boolean } = {}\n ) {\n const capabilities = options.capabilities ?? { rearrangeable: this.rearrangeable, groupable: this.groupable };\n if (!capabilities.rearrangeable || this.#fullscreen.active) {\n return false;\n }\n\n const next = this.#getPlacementLayout(source, intent, {\n candidate: options.layout,\n groupable: capabilities.groupable\n });\n if (!next) {\n return false;\n }\n\n this.#restoration.finish();\n this.#rearrange.cancel();\n this.#resize.cancel();\n this.#setLayout(next);\n this.#commit();\n this.#focusPlacement(source, options);\n return true;\n }\n\n #close(id: string) {\n this.#restoration.finish();\n if (!this.closable || !this.#layout) return;\n const next = closePanel(this.#layout, id);\n if (!next) return;\n const recoverFocus = shouldFocusAfterWorkspaceClose(this, id);\n this.#rearrange.cancel();\n this.#resize.cancel();\n this.#setLayout(next);\n this.#commit();\n const group = this.#presentedGroups.find(item => item.panels.some(panel => panel.id === id));\n if (recoverFocus) {\n this.#focusPanel(group?.panels.find(panel => panel.id !== id)?.id);\n }\n }\n\n #focusPlacement(source: string[], options: { focus?: boolean }) {\n if (options.focus === false) return;\n this.#focusPanel(\n source.find(id => !this.#layout?.closed.includes(id) && this.#panels.some(panel => panel.id === id))\n );\n }\n\n #focusPanel(id?: string) {\n void focusWorkspacePanel(this, { id });\n }\n\n #withEvaluation<T>(work: (evaluation: WorkspaceEvaluation) => T): T {\n if (this.#evaluation) return work(this.#evaluation);\n this.#evaluation = new WorkspaceEvaluation(\n this,\n {\n panels: this.#panels,\n layout: this.#currentLayout,\n source: this.#dragPreview?.source ?? [],\n measurements: this.#measurements,\n policy: this.#resize.policy,\n strip: group => this.#composition.findTabStrip(group)\n },\n this.#evaluationDelegate\n );\n try {\n return work(this.#evaluation);\n } finally {\n this.#evaluation = undefined;\n }\n }\n\n #getProjectedLayout(layout: WorkspaceLayout) {\n if (this.#evaluation) return this.#evaluation.project(layout);\n return projectLayout(layout, this.#available);\n }\n\n #getPlacementLayout(\n source: string[],\n intent: WorkspacePlacementIntent,\n options: { candidate?: WorkspaceLayout; groupable?: boolean } = {}\n ) {\n if (!this.#layout) {\n return undefined;\n }\n return this.#withEvaluation(evaluation =>\n getAdmissiblePlacementLayout({\n evaluation,\n layout: this.#currentLayout,\n measurements: this.#measurements,\n source,\n intent,\n groupable: options.groupable ?? this.groupable,\n candidate: options.candidate\n })\n );\n }\n\n #getCarriedPreviewContent(source: string[]) {\n const carried = source.filter(\n id => !this.#layout?.closed.includes(id) && this.#panels.some(panel => panel.id === id)\n );\n const active = findGroup(this.#layout?.root ?? null, carried[0])?.active;\n const front = active && carried.includes(active) ? active : carried[0];\n return { title: front ? getPanelLabel(this.#panels, front) : '', layers: Math.min(carried.length, 3) };\n }\n\n #isCarried(id: string) {\n return this.#dragPreview?.source.includes(id) ?? false;\n }\n\n #retainsPreviewSpace(preview = this.#dragPreview) {\n return !!preview && 'allocation' in preview && preview.allocation !== 'overlay';\n }\n\n render() {\n return this.#withEvaluation(evaluation => this.#renderWorkspace(evaluation));\n }\n\n #renderWorkspace(evaluation: WorkspaceEvaluation) {\n const drag = this.#dragPreview;\n const geometry = evaluation.presentationGeometry();\n this.#presentedGroups = preserveRecipientSelection(\n geometry.groups,\n this.#layout?.root ?? null,\n this.#dragPreview?.source\n );\n this.#boundaries = geometry.boundaries;\n const preview = this.#renderDragPreview(geometry.regions, evaluation);\n this.#composition.applyPresentation({\n groups: this.#presentedGroups,\n extent: geometry,\n container: this.container,\n measurements: this.#measurements,\n closable: this.#presentationClosable,\n animate: !!drag,\n source: drag?.source ?? [],\n scroll: group => evaluation.scroll(group)\n });\n return html`\n <div\n internal-host\n ?data-resizing=${this.#resize.resizing}\n ?data-fullscreen=${this.#fullscreen.active}\n ?data-rearranging=${!!drag}\n data-preview-allocation=${ifDefined(drag && 'allocation' in drag ? drag.allocation : undefined)}\n style=${`--_minimum-height:${evaluation.minimum(evaluation.project(this.#currentLayout).root).height}px`}>\n <div class=\"viewport\" @scroll=${() => this.#rearrange.refresh()}>\n <div class=\"canvas\" style=${`min-width:${geometry.minimum.width}px;min-height:${geometry.minimum.height}px`}>\n ${repeat(\n this.#presentedGroups,\n group => this.#composition.getGroupIdentity(group),\n group => this.#renderTabs(group)\n )}\n <slot @slotchange=${() => this.requestUpdate()}></slot>\n ${this.#renderResizeHandles()}\n <div class=\"preview-layer\" data-drag-phase=${ifDefined(this.#dragPreview?.phase)}>${preview}</div>\n </div>\n </div>\n ${this.#renderMeasurementProbe()}\n </div>\n `;\n }\n\n #renderDragPreview(allocation: WorkspacePlacedRegion[], evaluation: WorkspaceEvaluation) {\n const preview = this.#dragPreview;\n if (!preview) return null;\n const { x, y } = evaluation.client({ x: 0, y: 0, width: 0, height: 0 });\n const { title, layers } = this.#getCarriedPreviewContent(preview.source);\n const currentLayout = this.#layout ?? { version: 1 as const, root: null, closed: [] };\n const catalog = evaluation.geometry(evaluation.project(currentLayout)).regions;\n const contexts = allocateContextProxies({ catalog, allocation, source: preview.source });\n const bounds = evaluation.bounds();\n const hint = this.#rearrange.getPreviewHint(preview, evaluation);\n const { rect, kind } = preview.cue;\n const destination = { ...rect, x: rect.x - x, y: rect.y - y };\n const point = preview.point;\n return html`\n ${this.#renderPlacementHint(hint, x, y)}${repeat(\n contexts,\n context => context.key,\n context => html`\n <div\n class=\"context-boundary\"\n data-context-boundary=${context.key}\n ?data-active=${preview.context && context.key === getContextKey(preview.context.members)}\n inert aria-hidden=\"true\"\n style=${`left:${context.rect.x}px;top:${context.rect.y}px;width:${context.rect.width}px;height:${context.rect.height}px;${getRegionCornerStyle(context.rect, allocation)}`}></div>\n `\n )}\n <nve-ghost\n class=\"destination\" part=\"ghost destination-ghost\" data-destination-ghost\n ?data-cue-clipped=${rect.width <= 0 || rect.height <= 0}\n data-drag-phase=${preview.phase}\n ?data-drop-blocked=${preview.blocked}\n data-destination-kind=${kind}\n ?data-reserved-placement=${shouldEmphasizeReservedDestination(preview)}\n style=${`transform:translate(${rect.x - x}px,${rect.y - y}px);width:${rect.width}px;height:${rect.height}px;${getRegionCornerStyle(destination, allocation)}`}>\n ${\n preview.blocked\n ? html`\n <nve-icon part=\"icon blocked-icon\" name=\"cancel\" status=\"danger\" size=\"lg\" aria-hidden=\"true\"></nve-icon>\n `\n : null\n }${this.#renderSeamBadges(preview)}\n </nve-ghost>\n ${point ? this.#renderCarriedPreview({ point, x, y, bounds, title, layers }) : null}\n `;\n }\n\n #renderPlacementHint(hint: WorkspaceInsertionOffer | undefined, x: number, y: number) {\n if (!hint) return null;\n\n return html`\n <div\n class=\"order-overlay\"\n data-order-slot=${hint.scope.index}\n data-placement-hint=${hint.kind}\n inert aria-hidden=\"true\"\n style=${`left:${hint.rect.x - x}px;top:${hint.rect.y - y}px;width:${hint.rect.width}px;height:${hint.rect.height}px`}></div>\n `;\n }\n\n #renderSeamBadges(preview: WorkspaceDragPreview | undefined) {\n if (!preview || preview.phase !== 'detached' || preview.blocked || !preview.seams) return null;\n const { kind, edges } = preview.seams;\n return html`\n ${edges.map(edge => {\n const vertical = edge.side === 'left' || edge.side === 'right';\n const normal =\n edge.side === 'left' || edge.side === 'top' ? `-${edge.offset}px` : `calc(100% + ${edge.offset}px)`;\n const position = vertical\n ? `left:${normal};top:${edge.fraction * 100}%`\n : `left:${edge.fraction * 100}%;top:${normal}`;\n const rotation = { right: 0, bottom: 90, left: 180, top: 270 }[edge.side];\n return html`\n <div\n class=\"seam-badge\"\n data-seam-badge=${kind}\n data-seam-side=${edge.side}\n inert aria-hidden=\"true\"\n style=${position}>\n <svg\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n style=${`transform:rotate(${rotation}deg)`}>\n ${kind === 'split' ? this.#renderSplitSeamBadge() : this.#renderInsertSeamBadge()}\n </svg>\n </div>\n `;\n })}\n `;\n }\n\n #renderSplitSeamBadge() {\n return svg`<path d=\"M3 4h9v16H3z\" fill=\"currentColor\" fill-opacity=\".2\" stroke=\"none\"></path><rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"1\"></rect><path d=\"M12 4v16\"></path>`;\n }\n\n #renderInsertSeamBadge() {\n return svg`<rect x=\"2\" y=\"7\" width=\"7\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\".2\"></rect><path d=\"M22 4h-9v16h9\"></path>`;\n }\n\n #renderCarriedPreview(input: { point: Point; x: number; y: number; bounds: Rect; title: string; layers: number }) {\n const { point, x, y, bounds, title, layers } = input;\n const right = bounds.x + bounds.width;\n const bottom = bounds.y + bounds.height;\n const px = Math.max(bounds.x, Math.min(point.x + 12, right));\n const py = Math.max(bounds.y, Math.min(point.y + 12, bottom));\n return html`\n <nve-ghost\n class=\"carried\" part=\"ghost carried-ghost\" data-carried-ghost .layers=${layers}\n style=${`left:${px - x}px;top:${py - y}px;width:max-content;max-width:${Math.max(0, Math.min(240, bounds.width))}px;max-height:${bounds.height}px;transform:translate(min(0px,calc(${right - px}px - 100%)),min(0px,calc(${bottom - py}px - 100%)))`}>${title}</nve-ghost>\n `;\n }\n\n #renderTabs(group: WorkspacePresentedGroup) {\n const measurements = this.#measurements;\n const { headerHeight } = measurements;\n const carried = this.#retainsPreviewSpace() && group.panels.every(panel => this.#isCarried(panel.id));\n const fullscreenSelected = this.#fullscreen.isSelectedGroup(group.active);\n const fullscreen = (this.#resize.presentation?.fullscreenable ?? this.fullscreenable) || fullscreenSelected;\n const actionWidth = fullscreen ? (measurements.groupActionWidth ?? 0) : 0;\n return html`\n <div\n class=\"group-chrome\"\n style=${`left:${group.rect.x}px;top:${group.rect.y}px;width:${group.rect.width}px;height:${group.rect.height}px`}>\n <div\n class=\"tabs\"\n ?data-carried-reservation=${carried}\n ?inert=${carried}\n aria-hidden=${ifDefined(carried ? 'true' : undefined)}\n style=${`height:${headerHeight}px`}>\n ${this.#renderGroupGrip(group)} ${this.#renderTabStrip(group, actionWidth)}\n ${fullscreen ? this.#renderFullscreenControl(group, fullscreenSelected) : null}\n </div>\n </div>\n `;\n }\n\n #renderGroupGrip(group: WorkspacePresentedGroup) {\n const rearrangeable =\n (this.#resize.presentation?.rearrangeable ?? this.#placementCapabilities.rearrangeable) &&\n !this.#fullscreen.active;\n return rearrangeable && group.gripWidth > 0\n ? html`\n <nve-drag-handle\n part=\"drag-handle\"\n data-drag-group=${group.panels[0]?.id ?? ''}\n draggable=\"false\"\n aria-label=${ifDefined(this.i18n.move)}\n @click=${(event: Event) => event.preventDefault()}></nve-drag-handle>\n `\n : null;\n }\n\n #renderTabStrip(group: WorkspacePresentedGroup, actionWidth: number) {\n const width = getAllocatedTabWidth(group, this.#measurements);\n const suffixWidth = this.#measurements.panels?.[group.active]?.suffixWidth ?? 0;\n return html`\n <div\n class=\"tablist\"\n ?data-scrollable=${group.panels.length > 1}\n style=${`width:${Math.max(0, group.rect.width - group.gripWidth - suffixWidth - actionWidth)}px;margin-right:${suffixWidth}px`}\n data-group=${this.#composition.getGroupIdentity(group)}\n @scroll=${(event: Event) => this.#composition.handleScroll(group, event)}>\n ${this.#renderTabTrack(group, width)}\n </div>\n `;\n }\n\n #renderTabTrack(group: WorkspacePresentedGroup, width: number) {\n const entries = repeat(\n group.panels,\n panel => panel.id,\n (panel, index) => this.#renderTabEntry(group, panel, { left: index * width, width })\n );\n return group.tabbed\n ? html`\n <nve-tabs\n part=\"tabs\" class=\"tab-track\"\n @nve-key-change=${(event: CustomEvent<{ activeItem: HTMLElement }>) => {\n const id = event.detail.activeItem.dataset.panel;\n if (id) {\n this.#selectTab(id);\n }\n }}\n style=${`width:${group.panels.length * width}px`}>\n ${entries}\n </nve-tabs>\n `\n : html`\n <div class=\"tab-track\" style=${`width:${group.panels.length * width}px`}>${entries}</div>\n `;\n }\n\n #renderTabEntry(group: WorkspacePresentedGroup, panel: WorkspacePanel, position: { left: number; width: number }) {\n const style = styleMap({\n left: `${position.left}px`,\n width: `${position.width}px`,\n '--height': `${this.#measurements.headerHeight}px`\n });\n const carried = this.#isCarried(panel.id);\n const title = panel.querySelector(':scope > nve-workspace-panel-header')\n ? null\n : html`<span class=\"fallback-title\">${panel.id}</span>`;\n const close = this.#presentationClosable\n ? html`\n <nve-icon-button\n slot=${ifDefined(group.tabbed ? 'suffix' : undefined)}\n part=\"icon-button close-button\" icon-name=\"cancel\" container=\"flat\" size=\"sm\"\n data-close=${panel.id}\n aria-label=${`${this.i18n.close} ${getPanelLabel(this.#panels, panel.id)}`}\n @click=${() => this.#close(panel.id)}></nve-icon-button>\n `\n : null;\n return group.tabbed\n ? html`\n <nve-tabs-item-group\n part=\"tabs-item-group\" class=\"tab-entry\"\n ?data-carried-tab=${carried} ?inert=${carried}\n aria-hidden=${ifDefined(carried ? 'true' : undefined)}\n style=${style}>\n <nve-tabs-item\n part=\"tabs-item tab\"\n data-panel=${panel.id}\n ?selected=${group.active === panel.id}\n aria-label=${panel.id}\n @pointerenter=${() => this.#composition.setHeaderHovered(panel.id, true)}\n @pointerleave=${() => this.#composition.setHeaderHovered(panel.id, false)}\n @click=${() => this.#selectTab(panel.id)}>${title}</nve-tabs-item>\n ${close}\n </nve-tabs-item-group>\n `\n : html`\n <div\n class=\"tab-entry panel-entry\"\n ?data-carried-tab=${carried} ?inert=${carried}\n aria-hidden=${ifDefined(carried ? 'true' : undefined)}\n style=${style}>\n <div class=\"panel-title\" data-panel=${panel.id} aria-hidden=\"true\">${title}</div>\n ${close}\n </div>\n `;\n }\n\n #renderFullscreenControl(group: WorkspacePresentedGroup, selected: boolean) {\n const suffixWidth = this.#measurements.panels?.[group.active]?.suffixWidth ?? 0;\n const disabled = !this.isCommandAvailable('--toggle-fullscreen', { value: group.active });\n return html`\n <div class=\"group-actions\" ?data-authored-suffix=${suffixWidth > 0}>\n <nve-icon-button\n part=\"icon-button fullscreen-button\"\n icon-name=${selected ? 'minimize' : 'maximize'}\n container=\"flat\" size=\"sm\" command=\"--toggle-fullscreen\"\n .commandForElement=${group.panels.find(panel => panel.id === group.active) ?? null}\n ?disabled=${disabled}\n aria-label=${ifDefined(selected ? this.i18n.exitFullscreen : this.i18n.enterFullscreen)}></nve-icon-button>\n </div>\n `;\n }\n\n #renderResizeHandles() {\n if (!this.#showResizeHandles) return null;\n\n return repeat(\n this.#boundaries,\n item => item.key,\n item => this.#renderHandle(item)\n );\n }\n\n #renderHandle(item: WorkspaceBoundary) {\n return html`\n <div\n class=\"gutter\"\n style=${`left:${item.rect.x}px;top:${item.rect.y}px;width:${item.rect.width}px;height:${item.rect.height}px`}>\n <nve-resize-handle\n data-boundary=${item.key}\n part=\"resize-handle\"\n orientation=${item.branch.axis === 'horizontal' ? 'vertical' : 'horizontal'}\n .min=${item.min}\n .max=${item.max}\n .step=${10}\n .value=${item.value}\n @nve-gesture-input=${this.#resize.gesture}\n @toggle=${(event: Event) => event.preventDefault()}\n @input=${(event: Event) => this.#resize.input(event, item)}\n @change=${(event: Event) => this.#resize.change(event, item)}></nve-resize-handle>\n </div>\n `;\n }\n\n #renderMeasurementProbe() {\n const { rearrangeable } = this.#placementCapabilities;\n const fullscreenable =\n this.fullscreenable || this.#presentedGroups.some(group => this.#fullscreen.isSelectedGroup(group.active));\n return html`\n <div class=\"chrome\" data-chrome inert aria-hidden=\"true\">\n <div class=\"gap-probe\"></div>\n <div class=\"tab-min-probe\"></div>\n <div class=\"chrome-header\">\n <nve-tabs part=\"tabs\">\n <nve-tabs-item-group part=\"tabs-item-group\" class=\"tab-entry tab-probe\">\n <nve-tabs-item part=\"tabs-item tab\" tabindex=\"-1\"> </nve-tabs-item>\n ${\n this.closable\n ? html`\n <nve-icon-button\n slot=\"suffix\" part=\"icon-button close-button\" icon-name=\"cancel\" container=\"flat\" size=\"sm\"\n tabindex=\"-1\"></nve-icon-button>\n `\n : null\n }\n </nve-tabs-item-group>\n </nve-tabs>\n ${\n rearrangeable\n ? html`\n <nve-drag-handle part=\"drag-handle\" draggable=\"false\"></nve-drag-handle>\n `\n : null\n }${\n fullscreenable\n ? html`\n <div class=\"group-actions\">\n <nve-icon-button\n part=\"icon-button fullscreen-button\" icon-name=\"maximize\" container=\"flat\" size=\"sm\"\n tabindex=\"-1\"></nve-icon-button>\n </div>\n `\n : null\n }\n </div>\n </div>\n `;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace2.js","names":["styles","_decorate","__decorate","workspace_default","i18nDefaults","Workspace","LitElement","_args","#i18nController","I18nController","#value","#restoring","#evaluationCache","WorkspaceEvaluationCache","#restoration","WorkspaceRestorationController","#layout","#restore","layout","#composition","#commands","WorkspaceCommandController","#panels","#fullscreen","#getPlacementLayout","source","intent","targetPanelId","#activatePanel","anchor","operation","#close","#move","WorkspaceFullscreenController","findGroup","#getProjectedLayout","#currentLayout","#rearrange","#resize","#measurementController","WorkspaceRearrangeController","#withEvaluation","work","#measurements","#available","#activateSource","group","preview","#cachedPreviewBoundaries","#dragPreview","#placementCapabilities","#presentedGroups","#boundaries","#latestMeasurements","WorkspaceResizeController","#canResize","#commitResize","WorkspaceMeasurementController","#isCarried","id","panel","#applyMeasurements","change","WorkspaceCompositionController","kind","#evaluationDelegate","useStyles","DragHandle","Ghost","Icon","IconButton","ResizeHandle","Tabs","TabsItem","TabsItemGroup","next","parseWorkspaceValue","value","changed","key","#reconcile","options","command","context","evaluation","isServer","matchesElementName","child","WorkspacePanel","#presentationClosable","#showResizeHandles","ids","#setLayout","reconcilePanels","#commit","serializeWorkspaceValue","old","sameWorkspaceLayout","#focusPanel","opened","openPanel","selectPanel","capabilities","#focusPlacement","closePanel","recoverFocus","shouldFocusAfterWorkspaceClose","item","current","inputs","projectLayout","getAdmissiblePlacementLayout","panels","carried","active","front","frontPanel","getPanelLabel","#renderWorkspace","drag","geometry","preserveRecipientSelection","#renderDragPreview","ifDefined","repeat","#renderTabs","#renderResizeHandles","#renderMeasurementProbe","eligible","previous","catalogRegions","placedRegions","sourcePanelIds","index","boundaries","preparePreviewBoundaries","activeKey","getPanelMembershipKey","boundary","#getCarriedPreviewContent","#getPreviewBoundaries","bounds","hint","destination","rect","x","y","point","#renderPlacementHint","#renderPreviewBoundaries","shouldEmphasizeReservedDestination","getRegionCornerStyle","#renderSeamBadges","#renderCarriedPreview","edges","vertical","edge","normal","position","rotation","#renderSplitSeamBadge","#renderInsertSeamBadge","input","right","bottom","px","py","layers","title","measurements","#retainsPreviewSpace","fullscreenSelected","fullscreen","actionWidth","headerHeight","#renderGroupGrip","#renderTabStrip","#renderFullscreenControl","event","width","getAllocatedTabWidth","suffixWidth","#renderTabTrack","entries","#renderTabEntry","#selectTab","style","styleMap","close","disabled","selected","#renderHandle","fullscreenable","rearrangeable","property","scopedRegistry"],"sources":["../../src/workspace/workspace.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, isServer, LitElement, type PropertyValues, svg } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport { matchesElementName, type Point, type Rect } from '@nvidia-elements/core/internal';\nimport { scopedRegistry } from '@nvidia-elements/foundations/internal/decorators';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport { I18nController, type I18nDefaults } from '@nvidia-elements/foundations/internal/i18n';\n\nimport { DragHandle } from '@nvidia-elements/core/drag-handle';\nimport { Ghost } from '@nvidia-elements/core/ghost';\nimport { Icon } from '@nvidia-elements/core/icon';\nimport { IconButton } from '@nvidia-elements/core/icon-button';\nimport { ResizeHandle } from '@nvidia-elements/core/resize-handle';\nimport { Tabs, TabsItem, TabsItemGroup } from '@nvidia-elements/core/tabs';\n\nimport { WorkspaceCommandController } from './controllers/workspace-command.controller.js';\nimport { WorkspaceCompositionController } from './controllers/workspace-composition.controller.js';\nimport { WorkspaceFullscreenController } from './controllers/workspace-fullscreen.controller.js';\nimport { WorkspaceMeasurementController } from './controllers/workspace-measurement.controller.js';\nimport { WorkspaceRearrangeController } from './controllers/workspace-rearrange.controller.js';\nimport { WorkspaceResizeController } from './controllers/workspace-resize.controller.js';\nimport { WorkspaceRestorationController } from './controllers/workspace-restoration.controller.js';\nimport { getPanelMembershipKey } from './utils/model/membership.utils.js';\nimport {\n closePanel,\n findGroup,\n openPanel,\n projectLayout,\n reconcilePanels,\n selectPanel\n} from './utils/model/operations.utils.js';\nimport { parseWorkspaceValue, sameWorkspaceLayout, serializeWorkspaceValue } from './utils/model/value.utils.js';\nimport { getAdmissiblePlacementLayout } from './utils/placement/preparation.utils.js';\nimport {\n focusWorkspacePanel,\n getPanelLabel,\n shouldFocusAfterWorkspaceClose\n} from './utils/presentation/composition.utils.js';\nimport { getAllocatedTabWidth, preserveRecipientSelection } from './utils/presentation/groups.utils.js';\nimport {\n getRegionCornerStyle,\n preparePreviewBoundaries,\n shouldEmphasizeReservedDestination\n} from './utils/presentation/preview.utils.js';\nimport { WorkspaceEvaluationCache } from './utils/evaluation.utils.js';\n\nimport { WorkspacePanel } from './panel/panel.js';\n\nimport type { WorkspaceRearrangeCapabilities } from './controllers/workspace-rearrange.controller.js';\nimport type { WorkspaceBoundary, WorkspacePlacedRegion } from './utils/geometry/allocation.utils.js';\nimport type { WorkspaceCommandContext, WorkspacePlacementIntent } from './utils/interaction/command.utils.js';\nimport type { WorkspaceDragPreview } from './utils/interaction/drag-preview.utils.js';\nimport type { WorkspaceInsertionOffer } from './utils/interaction/insertion-offers.utils.js';\nimport type { WorkspaceLayout } from './utils/model/layout.utils.js';\nimport type { WorkspacePresentedGroup } from './utils/presentation/groups.utils.js';\nimport type { WorkspaceMeasurementChange, WorkspaceMeasurements } from './utils/presentation/measurements.utils.js';\nimport type { PreviewBoundary } from './utils/presentation/preview.utils.js';\nimport type { WorkspaceEvaluation, WorkspaceEvaluationDelegate } from './utils/evaluation.utils.js';\n\nimport type { WorkspaceAnimationOptions } from './workspace.types.js';\n\nimport styles from './workspace.css?inline';\n\ninterface CachedPreviewBoundaries {\n catalogRegions: WorkspacePlacedRegion[];\n placedRegions: WorkspacePlacedRegion[];\n sourcePanelIds: string[];\n boundaries: PreviewBoundary[];\n}\n\nconst i18nDefaults = {\n close: 'close',\n move: 'move',\n enterFullscreen: 'enter full screen',\n exitFullscreen: 'exit full screen'\n} satisfies I18nDefaults;\n\n/**\n * @element nve-workspace\n * @description A workspace provides a malleable arrangement of application panels in a restorable layout.\n * @documentation https://nvidia.github.io/elements/docs/elements/workspace/\n * @since 0.0.0\n * @stable false\n * @entrypoint \\@nvidia-elements/core/workspace\n * @command --enter-fullscreen - Present the invoking panel's group in native fullscreen.\n * @command --exit-fullscreen - Exit native fullscreen.\n * @command --toggle-fullscreen - Toggle native fullscreen for the invoking panel's group.\n * @command --open - Open and activate the targeted supplied panel. Repeated activation is silent.\n * @command --close - Close the targeted panel when its workspace is closable.\n * @command --select - Activate an open supplied panel without reopening a closed panel.\n * @command --place - Apply the invoker's typed placement request when rearrangeable; membership changes also require groupable.\n * @slot - Workspace panels with durable IDs and application dropdown groups.\n * @event change - Announces a committed arrangement value after interaction, commands, or reconciliation of newly supplied panels. Read value on the workspace.\n * @event commandavailabilitychange - Command availability may have changed; query relevant commands again.\n * @cssprop --gap - Space between groups as one nonnegative CSS length.\n * @cssprop --border-radius - Corner radius of contained groups.\n * @cssprop --tab-min-width - Smallest tab width before scrolling.\n * @cssprop --tab-border - Border between tabs, after the drag handle, and before group controls without an authored suffix.\n * @cssprop --header-control-size - Size of built-in header buttons and the base drag handle width.\n * @cssprop --header-control-inset - Horizontal spacing around fullscreen and the drag handle.\n * @cssprop --close-button-inset - Space after each panel close control.\n * @cssprop --animation-duration - Duration of coordinated layout and placement transitions.\n * @cssprop --animation-easing - Easing of coordinated layout and placement transitions.\n * @cssprop --gutter-background - Idle separator fill.\n * @cssprop --gutter-hover-background - Separator fill on hover.\n * @csspart tabs - Tab strips.\n * @csspart tabs-item - Panel selection controls.\n * @csspart tab - Alias for panel selection controls.\n * @csspart tabs-item-group - Tab and accessory layouts.\n * @csspart icon-button - Built-in header icon controls.\n * @csspart fullscreen-button - Group fullscreen control.\n * @csspart close-button - Panel closing controls.\n * @csspart resize-handle - Separator control.\n * @csspart ghost - Destination and carried previews.\n * @csspart destination-ghost - Animated insertion cue.\n * @csspart carried-ghost - Pointer-following carried panel previews.\n * @csspart icon - Placement status icons.\n * @csspart blocked-icon - Unavailable placement indicator.\n * @csspart drag-handle - Group movement control.\n */\n@scopedRegistry()\nexport class Workspace extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-workspace',\n version: '0.0.0',\n children: ['nve-workspace-panel', 'nve-dropdown-group']\n };\n\n static elementDefinitions = {\n [DragHandle.metadata.tag]: DragHandle,\n [Ghost.metadata.tag]: Ghost,\n [Icon.metadata.tag]: Icon,\n [IconButton.metadata.tag]: IconButton,\n [ResizeHandle.metadata.tag]: ResizeHandle,\n [Tabs.metadata.tag]: Tabs,\n [TabsItem.metadata.tag]: TabsItem,\n [TabsItemGroup.metadata.tag]: TabsItemGroup\n };\n\n readonly #i18nController: I18nController<this> = new I18nController<this>(this, i18nDefaults);\n\n /** Overrides localized workspace controls. */\n @property({ type: Object, attribute: false }) i18n = this.#i18nController.i18n;\n\n /** Enables separator resizing. */\n @property({ type: Boolean, reflect: true }) resizable = false;\n\n /** Enables moving groups and placement commands. Dragging individual tabs also requires groupable. */\n @property({ type: Boolean, reflect: true }) rearrangeable = false;\n\n /** Enables dragging individual tabs, joining panels, and extracting panels when rearrangeable. */\n @property({ type: Boolean, reflect: true }) groupable = false;\n\n /** Enables native fullscreen commands and one persistent control per group. Turning this off preserves an accepted session and its exit control. Fullscreen does not change the saved arrangement. */\n @property({ type: Boolean, reflect: true }) fullscreenable = false;\n\n /** Radial pointer distance in CSS pixels before a carried source detaches. Captured at gesture press. */\n @property({ type: Number, attribute: 'detach-threshold' }) detachThreshold = 48;\n\n /** Enables closing supplied panels. */\n @property({ type: Boolean, reflect: true }) closable = false;\n\n /** Selects separator constraint behavior. */\n @property({ attribute: 'resize-policy' }) resizePolicy: 'stop' | 'propagate' = 'stop';\n\n /** Selects panel content framing. */\n @property({ reflect: true }) container?: 'inset' | 'flat' | 'full';\n\n /** Versioned JSON arrangement. Assignment restores without emitting change. */\n @property({ type: String })\n get value(): string {\n return this.#value;\n }\n\n set value(value: string) {\n const next = parseWorkspaceValue(value);\n this.#restoration.finish();\n this.#restore(next);\n }\n\n #layout?: WorkspaceLayout;\n #value = '';\n #restoring = false;\n #dragPreview?: WorkspaceDragPreview;\n #cachedPreviewBoundaries?: CachedPreviewBoundaries;\n readonly #evaluationCache = new WorkspaceEvaluationCache(this);\n\n readonly #restoration = new WorkspaceRestorationController(this, {\n getLayout: () => this.#layout,\n applyLayout: layout => this.#restore(layout),\n getTransitionTargets: () => this.#composition.getTransitionTargets()\n });\n\n readonly #commands = new WorkspaceCommandController(this, {\n getState: () => ({\n panels: this.#panels,\n layout: this.#layout\n }),\n isRearrangementAllowed: () => !this.#fullscreen.active,\n isPlacementAvailable: (source, intent) => !!this.#getPlacementLayout(source, intent),\n canEnterFullscreen: targetPanelId => this.#fullscreen.canEnter(targetPanelId),\n canExitFullscreen: () => this.#fullscreen.canExit,\n isFullscreenGroup: targetPanelId => this.#fullscreen.isSelectedGroup(targetPanelId),\n enterFullscreen: targetPanelId => this.#fullscreen.enter(targetPanelId),\n exitFullscreen: () => this.#fullscreen.exit(),\n activatePanel: (anchor, operation) => this.#activatePanel(anchor, operation),\n closePanel: anchor => this.#close(anchor),\n placePanel: (source, intent) => this.#move(source, intent)\n });\n\n readonly #fullscreen = new WorkspaceFullscreenController(this, {\n getGroup: targetPanelId =>\n findGroup(this.#getProjectedLayout(this.#currentLayout).root, targetPanelId)?.panels ?? [],\n cancelInteractions: () => {\n this.#restoration.finish();\n this.#rearrange.cancel();\n this.#resize.cancel();\n },\n invalidateCommandAvailability: () => {\n this.#commands.invalidateAvailability();\n this.#measurementController.invalidate();\n }\n });\n\n readonly #rearrange: WorkspaceRearrangeController = new WorkspaceRearrangeController(this, {\n evaluateWithContext: work => this.#withEvaluation(work),\n isRearrangementAllowed: () => !this.#fullscreen.active && !this.#restoration.active,\n getLayout: () => this.#layout,\n getMeasurements: () => this.#measurements,\n getAvailablePanels: () => this.#available,\n activateSource: (source, group) => this.#activateSource(source, group),\n applyPreview: preview => {\n if (preview?.phase !== 'detached') {\n this.#evaluationCache.clear();\n this.#cachedPreviewBoundaries = undefined;\n }\n this.#dragPreview = preview;\n this.requestUpdate();\n },\n commitPlacement: (source, intent, layout) =>\n this.#move(source, intent, { layout, capabilities: this.#placementCapabilities, focus: false })\n });\n\n #presentedGroups: WorkspacePresentedGroup[] = [];\n #boundaries: WorkspaceBoundary[] = [];\n\n #latestMeasurements: WorkspaceMeasurements = {\n gap: 0,\n headerHeight: 0,\n gripWidth: 0,\n actionWidth: 0,\n groupActionWidth: 0,\n tabWidth: 0,\n tabMinWidth: 0,\n width: 0,\n height: 0\n };\n\n readonly #resize: WorkspaceResizeController = new WorkspaceResizeController(this, {\n isEnabled: () => this.#canResize,\n getLayout: () => this.#layout,\n getBoundaries: () => this.#boundaries,\n getAvailablePanels: () => this.#available,\n getPresentation: () => ({\n measurements: this.#measurements,\n rearrangeable: this.#placementCapabilities.rearrangeable,\n closable: this.closable,\n fullscreenable: this.fullscreenable\n }),\n cancelForUser: () => this.#restoration.transition(() => this.#resize.cancel()),\n commitLayout: layout => this.#commitResize(layout)\n });\n\n readonly #measurementController = new WorkspaceMeasurementController(this, {\n getPanels: () => this.#panels,\n isPresented: id =>\n !this.#isCarried(id) && this.#presentedGroups.some(group => group.panels.some(panel => panel.id === id)),\n isCarried: id => !this.#layout?.closed.includes(id) && this.#isCarried(id),\n applyMeasurements: change => this.#applyMeasurements(change)\n });\n\n readonly #composition = new WorkspaceCompositionController(this, {\n getPanels: () => this.#panels,\n getGroups: () => this.#presentedGroups,\n getLayout: () => this.#layout,\n getPreview: () => this.#dragPreview,\n scrollChanged: () => this.#rearrange.refresh(),\n contentChanged: kind => {\n if (kind === 'panels') {\n this.#restoration.finish();\n this.#commands.invalidateAvailability();\n this.#resize.cancel();\n this.#rearrange.cancel();\n }\n this.#measurementController.invalidate();\n this.requestUpdate();\n }\n });\n\n readonly #evaluationDelegate: WorkspaceEvaluationDelegate = {\n getCurrentLayout: () => this.#currentLayout,\n getCurrentMeasurements: () => this.#measurements,\n getCurrentPreview: () => this.#dragPreview,\n getFullscreenTarget: () => this.#fullscreen.targetPanelId,\n getResizePreview: () => this.#resize.preview\n };\n\n connectedCallback() {\n super.connectedCallback();\n this.#composition.startObserving();\n }\n\n disconnectedCallback() {\n this.#evaluationCache.clear();\n this.#cachedPreviewBoundaries = undefined;\n this.#rearrange.cancel();\n this.#composition.stopObserving();\n super.disconnectedCallback();\n }\n\n protected willUpdate(changed: PropertyValues) {\n super.willUpdate(changed);\n this.#composition.captureFocus();\n\n if (\n ['value', 'fullscreenable', 'closable', 'rearrangeable', 'groupable', 'resizePolicy'].some(key =>\n changed.has(key)\n )\n ) {\n this.#commands.invalidateAvailability();\n }\n if (['fullscreenable', 'closable', 'rearrangeable', 'groupable'].some(key => changed.has(key))) {\n this.#measurementController.invalidate();\n }\n\n this.#reconcile();\n this.#restoring = false;\n }\n\n protected updated() {\n this.#composition.sync();\n this.#commands.flushAvailability();\n }\n\n /** Restores an arrangement with animated geometry while retaining application content. */\n animateTo(value: string, options: WorkspaceAnimationOptions = {}): void {\n const next = parseWorkspaceValue(value);\n this.#restoration.animateTo(next, options);\n }\n\n /** Reports whether a command can change the panel identified by `context.value` in the current arrangement. Native fullscreen admission remains subject to browser permission. */\n isCommandAvailable(command: string, context: WorkspaceCommandContext = {}): boolean {\n return this.#commands.isCommandAvailable(command, context);\n }\n\n get #currentLayout(): WorkspaceLayout {\n return this.#layout ?? { version: 1, root: null, closed: [] };\n }\n\n get #panels(): WorkspacePanel[] {\n const evaluation = this.#evaluationCache.current;\n if (evaluation) return evaluation.panels;\n return isServer\n ? []\n : [...this.children].filter((child): child is WorkspacePanel => matchesElementName(child, WorkspacePanel));\n }\n\n get #available() {\n return this.#evaluationCache.current?.available ?? this.#panels.map(panel => panel.id);\n }\n\n get #measurements(): WorkspaceMeasurements {\n return this.#resize.presentation?.measurements ?? this.#latestMeasurements;\n }\n\n get #placementCapabilities() {\n return this.#rearrange.capabilities ?? { rearrangeable: this.rearrangeable, groupable: this.groupable };\n }\n\n get #presentationClosable() {\n return this.#resize.presentation?.closable ?? this.closable;\n }\n\n get #canResize() {\n return this.resizable && !this.#fullscreen.active;\n }\n\n get #showResizeHandles() {\n return this.#canResize || this.#resize.retainingHandles;\n }\n\n #reconcile() {\n const ids = this.#available;\n if (!ids.every(Boolean) || new Set(ids).size !== ids.length) return;\n if (!this.#layout) {\n if (ids.length) {\n this.#setLayout({ version: 1, root: { type: 'group', panels: ids, active: ids[0]! }, closed: [] });\n }\n return;\n }\n const next = reconcilePanels(this.#layout, ids);\n if (next === this.#layout) return;\n this.#setLayout(next);\n if (!this.#restoring) this.#commit();\n }\n\n #applyMeasurements(change: WorkspaceMeasurementChange) {\n this.#latestMeasurements = change.measurements;\n this.#commands.invalidateAvailability();\n this.requestUpdate();\n this.#resize.handleMeasurementsChange(change);\n this.#restoration.handleMeasurementsChange(change);\n this.#rearrange.handleMeasurementsChange(change);\n }\n\n #setLayout(layout: WorkspaceLayout | undefined) {\n if (layout === this.#layout) return;\n const value = serializeWorkspaceValue(layout);\n this.#layout = layout;\n this.#value = value;\n }\n\n #restore(next: WorkspaceLayout | undefined) {\n this.#rearrange.cancel();\n const old = this.value;\n this.#resize.resetForRestore();\n this.#setLayout(next);\n this.#restoring = true;\n this.requestUpdate('value', old);\n }\n\n #commit() {\n this.#commands.invalidateAvailability();\n this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));\n }\n\n #commitResize(layout: WorkspaceLayout) {\n const changed = !sameWorkspaceLayout(this.#layout, layout);\n if (changed) {\n this.#setLayout(layout);\n this.#commit();\n } else {\n this.requestUpdate();\n }\n }\n\n #activateSource(source: string[], group: boolean) {\n if (group) return;\n\n const anchor = source.find(id => !this.#layout?.closed.includes(id) && this.#available.includes(id));\n if (!anchor || !this.shadowRoot?.querySelector(`nve-tabs-item[data-panel=\"${CSS.escape(anchor)}\"]`)) return;\n\n this.#activatePanel(anchor, 'select');\n this.#focusPanel(anchor);\n }\n\n #activatePanel(id: string, operation: 'open' | 'select') {\n this.#restoration.finish();\n if (!this.#layout || !this.#panels.some(panel => panel.id === id)) return;\n\n let opened = this.#layout;\n if (operation === 'open') {\n opened = openPanel(this.#layout, id) ?? this.#layout;\n }\n let next = selectPanel(opened, id);\n if (next === undefined && opened !== this.#layout) {\n next = opened;\n }\n if (!next) return;\n\n this.#rearrange.cancel();\n this.#resize.cancel();\n this.#setLayout(next);\n this.#commit();\n }\n\n #selectTab(id: string) {\n if (!this.#rearrange.suppressSelection) this.#activatePanel(id, 'select');\n }\n\n #move(\n source: string[],\n intent: WorkspacePlacementIntent,\n options: { layout?: WorkspaceLayout; capabilities?: WorkspaceRearrangeCapabilities; focus?: boolean } = {}\n ) {\n const capabilities = options.capabilities ?? { rearrangeable: this.rearrangeable, groupable: this.groupable };\n if (!capabilities.rearrangeable || this.#fullscreen.active) return false;\n\n const next = this.#getPlacementLayout(source, intent, {\n candidate: options.layout,\n groupable: capabilities.groupable\n });\n if (!next) return false;\n\n this.#restoration.finish();\n this.#rearrange.cancel();\n this.#resize.cancel();\n this.#setLayout(next);\n this.#commit();\n this.#focusPlacement(source, options);\n return true;\n }\n\n #close(id: string) {\n this.#restoration.finish();\n if (!this.closable || !this.#layout) return;\n const next = closePanel(this.#layout, id);\n if (!next) return;\n const recoverFocus = shouldFocusAfterWorkspaceClose(this, id);\n this.#rearrange.cancel();\n this.#resize.cancel();\n this.#setLayout(next);\n this.#commit();\n const group = this.#presentedGroups.find(item => item.panels.some(panel => panel.id === id));\n if (recoverFocus) {\n this.#focusPanel(group?.panels.find(panel => panel.id !== id)?.id);\n }\n }\n\n #focusPlacement(source: string[], options: { focus?: boolean }) {\n if (options.focus === false) return;\n this.#focusPanel(\n source.find(id => !this.#layout?.closed.includes(id) && this.#panels.some(panel => panel.id === id))\n );\n }\n\n #focusPanel(id?: string) {\n void focusWorkspacePanel(this, { id });\n }\n\n #withEvaluation<T>(work: (evaluation: WorkspaceEvaluation) => T): T {\n const current = this.#evaluationCache.current;\n if (current) return work(current);\n const inputs = {\n panels: this.#panels,\n layout: this.#currentLayout,\n source: this.#dragPreview?.source ?? [],\n measurements: this.#measurements,\n policy: this.#resize.policy,\n strip: (group: WorkspacePresentedGroup) => this.#composition.findTabStrip(group)\n };\n return this.#evaluationCache.run(inputs, this.#evaluationDelegate, work);\n }\n\n #getProjectedLayout(layout: WorkspaceLayout) {\n return this.#evaluationCache.current?.project(layout) ?? projectLayout(layout, this.#available);\n }\n\n #getPlacementLayout(\n source: string[],\n intent: WorkspacePlacementIntent,\n options: { candidate?: WorkspaceLayout; groupable?: boolean } = {}\n ) {\n if (!this.#layout) return undefined;\n return this.#withEvaluation(evaluation =>\n getAdmissiblePlacementLayout({\n evaluation,\n layout: this.#currentLayout,\n measurements: this.#measurements,\n source,\n intent,\n groupable: options.groupable ?? this.groupable,\n candidate: options.candidate\n })\n );\n }\n\n #getCarriedPreviewContent(source: string[]) {\n const panels = this.#panels;\n const carried = source.filter(id => !this.#layout?.closed.includes(id) && panels.some(panel => panel.id === id));\n const active = findGroup(this.#layout?.root ?? null, carried[0])?.active;\n const front = active && carried.includes(active) ? active : carried[0];\n const frontPanel = front ? panels.find(panel => panel.id === front) : undefined;\n return { title: frontPanel ? getPanelLabel(frontPanel) : (front ?? ''), layers: Math.min(carried.length, 3) };\n }\n\n #isCarried(id: string) {\n return this.#dragPreview?.source.includes(id) ?? false;\n }\n\n #retainsPreviewSpace(preview = this.#dragPreview) {\n return !!preview && 'allocation' in preview && preview.allocation !== 'overlay';\n }\n\n render() {\n return this.#withEvaluation(evaluation => this.#renderWorkspace(evaluation));\n }\n\n #renderWorkspace(evaluation: WorkspaceEvaluation) {\n const drag = this.#dragPreview;\n const geometry = evaluation.presentationGeometry();\n this.#presentedGroups = preserveRecipientSelection(\n geometry.groups,\n this.#layout?.root ?? null,\n this.#dragPreview?.source\n );\n this.#boundaries = geometry.boundaries;\n const preview = this.#renderDragPreview(geometry.regions, evaluation);\n this.#composition.applyPresentation({\n groups: this.#presentedGroups,\n extent: geometry,\n container: this.container,\n measurements: this.#measurements,\n closable: this.#presentationClosable,\n animate: !!drag,\n source: drag?.source ?? [],\n scroll: group => evaluation.scroll(group)\n });\n return html`\n <div internal-host\n ?data-resizing=${this.#resize.resizing}\n ?data-fullscreen=${this.#fullscreen.active}\n ?data-rearranging=${!!drag}\n data-preview-allocation=${ifDefined(drag && 'allocation' in drag ? drag.allocation : undefined)}\n style=${`--_minimum-height:${evaluation.minimum(evaluation.project(this.#currentLayout).root).height}px`}>\n <div class=\"viewport\" @scroll=${() => this.#rearrange.refresh()}>\n <div class=\"canvas\" style=${`min-width:${geometry.minimum.width}px;min-height:${geometry.minimum.height}px`}>\n ${repeat(\n this.#presentedGroups,\n group => this.#composition.getGroupIdentity(group),\n group => this.#renderTabs(group)\n )}\n <slot @slotchange=${() => this.requestUpdate()}></slot>\n ${this.#renderResizeHandles()}\n <div class=\"preview-layer\" data-drag-phase=${ifDefined(this.#dragPreview?.phase)}>${preview}</div>\n </div>\n </div>\n ${this.#renderMeasurementProbe()}\n </div>\n `;\n }\n\n #getPreviewBoundaries(\n catalogRegions: WorkspacePlacedRegion[],\n placedRegions: WorkspacePlacedRegion[],\n sourcePanelIds: string[]\n ): PreviewBoundary[] {\n const eligible = this.isConnected && this.#dragPreview?.phase === 'detached';\n const previous = this.#cachedPreviewBoundaries;\n if (\n eligible &&\n previous &&\n previous.catalogRegions === catalogRegions &&\n previous.placedRegions === placedRegions &&\n previous.sourcePanelIds.length === sourcePanelIds.length &&\n previous.sourcePanelIds.every((id, index) => id === sourcePanelIds[index])\n )\n return previous.boundaries;\n this.#cachedPreviewBoundaries = undefined;\n const boundaries = preparePreviewBoundaries(catalogRegions, placedRegions, sourcePanelIds);\n if (eligible) {\n this.#cachedPreviewBoundaries = {\n catalogRegions,\n placedRegions,\n sourcePanelIds: sourcePanelIds.slice(),\n boundaries\n };\n }\n return boundaries;\n }\n\n #renderPreviewBoundaries(boundaries: PreviewBoundary[], preview: WorkspaceDragPreview) {\n const activeKey = preview.scope && getPanelMembershipKey(preview.scope.members);\n return repeat(\n boundaries,\n boundary => boundary.key,\n boundary => html`\n <div class=\"scope-boundary\"\n data-scope-boundary=${boundary.key}\n ?data-active=${boundary.key === activeKey}\n inert aria-hidden=\"true\"\n style=${boundary.style}></div>\n `\n );\n }\n\n #renderDragPreview(placedRegions: WorkspacePlacedRegion[], evaluation: WorkspaceEvaluation) {\n const preview = this.#dragPreview;\n if (!preview) return null;\n const { x, y } = evaluation.client({ x: 0, y: 0, width: 0, height: 0 });\n const { title, layers } = this.#getCarriedPreviewContent(preview.source);\n const catalogRegions = evaluation.geometry(evaluation.project(this.#currentLayout)).regions;\n const boundaries = this.#getPreviewBoundaries(catalogRegions, placedRegions, preview.source);\n const bounds = evaluation.bounds();\n const hint = this.#rearrange.getPreviewHint(preview, evaluation);\n const { rect, kind } = preview.cue;\n const destination = { ...rect, x: rect.x - x, y: rect.y - y };\n const point = preview.point;\n return html`\n ${this.#renderPlacementHint(hint, x, y)}${this.#renderPreviewBoundaries(boundaries, preview)}\n <nve-ghost class=\"destination\" part=\"ghost destination-ghost\" data-destination-ghost\n ?data-cue-clipped=${rect.width <= 0 || rect.height <= 0}\n data-drag-phase=${preview.phase}\n ?data-drop-blocked=${preview.blocked}\n data-destination-kind=${kind}\n ?data-reserved-placement=${shouldEmphasizeReservedDestination(preview)}\n style=${`transform:translate(${rect.x - x}px,${rect.y - y}px);width:${rect.width}px;height:${rect.height}px;${getRegionCornerStyle(destination, placedRegions)}`}>\n ${\n preview.blocked\n ? html`\n <nve-icon part=\"icon blocked-icon\" name=\"cancel\" status=\"danger\" size=\"lg\" aria-hidden=\"true\"></nve-icon>\n `\n : null\n }${this.#renderSeamBadges(preview)}\n </nve-ghost>\n ${point ? this.#renderCarriedPreview({ point, x, y, bounds, title, layers }) : null}\n `;\n }\n\n #renderPlacementHint(hint: WorkspaceInsertionOffer | undefined, x: number, y: number) {\n if (!hint) return null;\n\n return html`\n <div class=\"order-overlay\"\n data-insertion-index=${hint.insertion.index}\n data-placement-hint=${hint.kind}\n inert aria-hidden=\"true\"\n style=${`left:${hint.rect.x - x}px;top:${hint.rect.y - y}px;width:${hint.rect.width}px;height:${hint.rect.height}px`}></div>\n `;\n }\n\n #renderSeamBadges(preview: WorkspaceDragPreview | undefined) {\n if (!preview || preview.phase !== 'detached' || preview.blocked || !preview.seams) return null;\n const { kind, edges } = preview.seams;\n return html`\n ${edges.map(edge => {\n const vertical = edge.side === 'left' || edge.side === 'right';\n const normal =\n edge.side === 'left' || edge.side === 'top' ? `-${edge.offset}px` : `calc(100% + ${edge.offset}px)`;\n const position = vertical\n ? `left:${normal};top:${edge.fraction * 100}%`\n : `left:${edge.fraction * 100}%;top:${normal}`;\n const rotation = { right: 0, bottom: 90, left: 180, top: 270 }[edge.side];\n return html`\n <div class=\"seam-badge\"\n data-seam-badge=${kind}\n data-seam-side=${edge.side}\n inert aria-hidden=\"true\"\n style=${position}>\n <svg\n viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n style=${`transform:rotate(${rotation}deg)`}>\n ${kind === 'split' ? this.#renderSplitSeamBadge() : this.#renderInsertSeamBadge()}\n </svg>\n </div>\n `;\n })}\n `;\n }\n\n #renderSplitSeamBadge() {\n return svg`<path d=\"M3 4h9v16H3z\" fill=\"currentColor\" fill-opacity=\".2\" stroke=\"none\"></path><rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"1\"></rect><path d=\"M12 4v16\"></path>`;\n }\n\n #renderInsertSeamBadge() {\n return svg`<rect x=\"2\" y=\"7\" width=\"7\" height=\"10\" rx=\"1\" fill=\"currentColor\" fill-opacity=\".2\"></rect><path d=\"M22 4h-9v16h9\"></path>`;\n }\n\n #renderCarriedPreview(input: { point: Point; x: number; y: number; bounds: Rect; title: string; layers: number }) {\n const { point, x, y, bounds, title, layers } = input;\n const right = bounds.x + bounds.width;\n const bottom = bounds.y + bounds.height;\n const px = Math.max(bounds.x, Math.min(point.x + 12, right));\n const py = Math.max(bounds.y, Math.min(point.y + 12, bottom));\n return html`\n <nve-ghost\n class=\"carried\" part=\"ghost carried-ghost\" data-carried-ghost .layers=${layers}\n style=${`left:${px - x}px;top:${py - y}px;width:max-content;max-width:${Math.max(0, Math.min(240, bounds.width))}px;max-height:${bounds.height}px;transform:translate(min(0px,calc(${right - px}px - 100%)),min(0px,calc(${bottom - py}px - 100%)))`}>${title}</nve-ghost>\n `;\n }\n\n #renderTabs(group: WorkspacePresentedGroup) {\n const measurements = this.#measurements;\n const { headerHeight } = measurements;\n const carried = this.#retainsPreviewSpace() && group.panels.every(panel => this.#isCarried(panel.id));\n const fullscreenSelected = this.#fullscreen.isSelectedGroup(group.active);\n const fullscreen = (this.#resize.presentation?.fullscreenable ?? this.fullscreenable) || fullscreenSelected;\n const actionWidth = fullscreen ? (measurements.groupActionWidth ?? 0) : 0;\n return html`\n <div class=\"group-chrome\"\n style=${`left:${group.rect.x}px;top:${group.rect.y}px;width:${group.rect.width}px;height:${group.rect.height}px`}>\n <div class=\"tabs\"\n ?data-carried-reservation=${carried}\n ?inert=${carried}\n aria-hidden=${ifDefined(carried ? 'true' : undefined)}\n style=${`height:${headerHeight}px`}>\n ${this.#renderGroupGrip(group)} ${this.#renderTabStrip(group, actionWidth)}\n ${fullscreen ? this.#renderFullscreenControl(group, fullscreenSelected) : null}\n </div>\n </div>\n `;\n }\n\n #renderGroupGrip(group: WorkspacePresentedGroup) {\n const rearrangeable =\n (this.#resize.presentation?.rearrangeable ?? this.#placementCapabilities.rearrangeable) &&\n !this.#fullscreen.active;\n return rearrangeable && group.gripWidth > 0\n ? html`\n <nve-drag-handle part=\"drag-handle\"\n data-drag-group=${group.panels[0]?.id ?? ''}\n draggable=\"false\"\n aria-label=${ifDefined(this.i18n.move)}\n @click=${(event: Event) => event.preventDefault()}></nve-drag-handle>\n `\n : null;\n }\n\n #renderTabStrip(group: WorkspacePresentedGroup, actionWidth: number) {\n const width = getAllocatedTabWidth(group, this.#measurements);\n const suffixWidth = this.#measurements.panels?.[group.active]?.suffixWidth ?? 0;\n return html`\n <div class=\"tablist\"\n ?data-scrollable=${group.panels.length > 1}\n style=${`width:${Math.max(0, group.rect.width - group.gripWidth - suffixWidth - actionWidth)}px;margin-right:${suffixWidth}px`}\n data-group=${this.#composition.getGroupIdentity(group)}\n @scroll=${(event: Event) => this.#composition.handleScroll(group, event)}>\n ${this.#renderTabTrack(group, width)}\n </div>\n `;\n }\n\n #renderTabTrack(group: WorkspacePresentedGroup, width: number) {\n const entries = repeat(\n group.panels,\n panel => panel.id,\n (panel, index) => this.#renderTabEntry(group, panel, { left: index * width, width })\n );\n return group.tabbed\n ? html`\n <nve-tabs part=\"tabs\" class=\"tab-track\"\n @nve-key-change=${(event: CustomEvent<{ activeItem: HTMLElement }>) => {\n const id = event.detail.activeItem.dataset.panel;\n if (id) {\n this.#selectTab(id);\n }\n }}\n style=${`width:${group.panels.length * width}px`}>\n ${entries}\n </nve-tabs>\n `\n : html`\n <div class=\"tab-track\" style=${`width:${group.panels.length * width}px`}>${entries}</div>\n `;\n }\n\n #renderTabEntry(group: WorkspacePresentedGroup, panel: WorkspacePanel, position: { left: number; width: number }) {\n const style = styleMap({\n left: `${position.left}px`,\n width: `${position.width}px`,\n '--height': `${this.#measurements.headerHeight}px`\n });\n const carried = this.#isCarried(panel.id);\n const title = panel.querySelector(':scope > nve-workspace-panel-header')\n ? null\n : html`<span class=\"fallback-title\">${panel.id}</span>`;\n const close = this.#presentationClosable\n ? html`\n <nve-icon-button\n slot=${ifDefined(group.tabbed ? 'suffix' : undefined)}\n part=\"icon-button close-button\" icon-name=\"cancel\" container=\"flat\" size=\"sm\"\n data-close=${panel.id}\n aria-label=${`${this.i18n.close} ${getPanelLabel(panel)}`}\n @click=${() => this.#close(panel.id)}></nve-icon-button>\n `\n : null;\n return group.tabbed\n ? html`\n <nve-tabs-item-group part=\"tabs-item-group\" class=\"tab-entry\"\n ?data-carried-tab=${carried} ?inert=${carried}\n aria-hidden=${ifDefined(carried ? 'true' : undefined)}\n style=${style}>\n <nve-tabs-item part=\"tabs-item tab\"\n data-panel=${panel.id}\n ?selected=${group.active === panel.id}\n aria-label=${panel.id}\n @pointerenter=${() => this.#composition.setHeaderHovered(panel.id, true)}\n @pointerleave=${() => this.#composition.setHeaderHovered(panel.id, false)}\n @click=${() => this.#selectTab(panel.id)}>${title}</nve-tabs-item>\n ${close}\n </nve-tabs-item-group>\n `\n : html`\n <div class=\"tab-entry panel-entry\"\n ?data-carried-tab=${carried} ?inert=${carried}\n aria-hidden=${ifDefined(carried ? 'true' : undefined)}\n style=${style}>\n <div class=\"panel-title\" data-panel=${panel.id} aria-hidden=\"true\">${title}</div>\n ${close}\n </div>\n `;\n }\n\n #renderFullscreenControl(group: WorkspacePresentedGroup, selected: boolean) {\n const suffixWidth = this.#measurements.panels?.[group.active]?.suffixWidth ?? 0;\n const disabled = !this.isCommandAvailable('--toggle-fullscreen', { value: group.active });\n return html`\n <div class=\"group-actions\" ?data-authored-suffix=${suffixWidth > 0}>\n <nve-icon-button part=\"icon-button fullscreen-button\"\n icon-name=${selected ? 'minimize' : 'maximize'}\n container=\"flat\" size=\"sm\" command=\"--toggle-fullscreen\"\n .commandForElement=${group.panels.find(panel => panel.id === group.active) ?? null}\n ?disabled=${disabled}\n aria-label=${ifDefined(selected ? this.i18n.exitFullscreen : this.i18n.enterFullscreen)}></nve-icon-button>\n </div>\n `;\n }\n\n #renderResizeHandles() {\n if (!this.#showResizeHandles) return null;\n\n return repeat(\n this.#boundaries,\n item => item.key,\n item => this.#renderHandle(item)\n );\n }\n\n #renderHandle(item: WorkspaceBoundary) {\n return html`\n <div class=\"gutter\"\n style=${`left:${item.rect.x}px;top:${item.rect.y}px;width:${item.rect.width}px;height:${item.rect.height}px`}>\n <nve-resize-handle\n data-boundary=${item.key}\n part=\"resize-handle\"\n orientation=${item.branch.axis === 'horizontal' ? 'vertical' : 'horizontal'}\n .min=${item.min}\n .max=${item.max}\n .step=${10}\n .value=${item.value}\n @nve-gesture-input=${this.#resize.gesture}\n @toggle=${(event: Event) => event.preventDefault()}\n @input=${(event: Event) => this.#resize.input(event, item)}\n @change=${(event: Event) => this.#resize.change(event, item)}></nve-resize-handle>\n </div>\n `;\n }\n\n #renderMeasurementProbe() {\n const { rearrangeable } = this.#placementCapabilities;\n const fullscreenable =\n this.fullscreenable || this.#presentedGroups.some(group => this.#fullscreen.isSelectedGroup(group.active));\n return html`\n <div class=\"chrome\" data-chrome inert aria-hidden=\"true\">\n <div class=\"gap-probe\"></div>\n <div class=\"tab-min-probe\"></div>\n <div class=\"chrome-header\">\n <nve-tabs part=\"tabs\">\n <nve-tabs-item-group part=\"tabs-item-group\" class=\"tab-entry tab-probe\">\n <nve-tabs-item part=\"tabs-item tab\" tabindex=\"-1\"> </nve-tabs-item>\n ${\n this.closable\n ? html`\n <nve-icon-button\n slot=\"suffix\" part=\"icon-button close-button\" icon-name=\"cancel\" container=\"flat\" size=\"sm\"\n tabindex=\"-1\"></nve-icon-button>\n `\n : null\n }\n </nve-tabs-item-group>\n </nve-tabs>\n ${\n rearrangeable\n ? html`\n <nve-drag-handle part=\"drag-handle\" draggable=\"false\"></nve-drag-handle>\n `\n : null\n }${\n fullscreenable\n ? html`\n <div class=\"group-actions\">\n <nve-icon-button\n part=\"icon-button fullscreen-button\" icon-name=\"maximize\" container=\"flat\" size=\"sm\"\n tabindex=\"-1\"></nve-icon-button>\n </div>\n `\n : null\n }\n </div>\n </div>\n `;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4EA,IAAMI,IAAe;CACnB,OAAO;CACP,MAAM;CACN,iBAAiB;CACjB,gBAAgB;AAClB,GA8CaC,IAAN,cAAwBC,EAAW;;EAoLoB,A,aAhKX,KAAAE,KAAA,IAAIC,EAAqB,MAAML,CAAY,GAGvC,KAAA,OAAA,KAAKI,GAAgB,MAGlB,KAAA,YAAA,IAGI,KAAA,gBAAA,IAGJ,KAAA,YAAA,IAGK,KAAA,iBAAA,IAGgB,KAAA,kBAAA,IAGtB,KAAA,WAAA,IAGwB,KAAA,eAAA,QAkBtE,KAAAE,KAAA,IACI,KAAAC,KAAA,IAGe,KAAAC,KAAA,IAAIC,EAAyB,IAAI,GAErC,KAAAC,KAAA,IAAIC,EAA+B,MAAM;GAC/D,iBAAiB,KAAKC;GACtB,cAAa,MAAU,KAAKC,GAASC,CAAM;GAC3C,4BAA4B,KAAKC,GAAa,qBAAqB;EACrE,CAAC,GAEoB,KAAAC,KAAA,IAAIC,EAA2B,MAAM;GACxD,iBAAiB;IACf,QAAQ,KAAKC;IACb,QAAQ,KAAKN;GACf;GACA,8BAA8B,CAAC,KAAKO,GAAY;GAChD,uBAAuB,GAAQ,MAAW,CAAC,CAAC,KAAKC,GAAoBC,GAAQC,CAAM;GACnF,qBAAoB,MAAiB,KAAKH,GAAY,SAASI,CAAa;GAC5E,yBAAyB,KAAKJ,GAAY;GAC1C,oBAAmB,MAAiB,KAAKA,GAAY,gBAAgBI,CAAa;GAClF,kBAAiB,MAAiB,KAAKJ,GAAY,MAAMI,CAAa;GACtE,sBAAsB,KAAKJ,GAAY,KAAK;GAC5C,gBAAgB,GAAQ,MAAc,KAAKK,GAAeC,GAAQC,CAAS;GAC3E,aAAY,MAAU,KAAKC,GAAOF,CAAM;GACxC,aAAa,GAAQ,MAAW,KAAKG,GAAMP,GAAQC,CAAM;EAC3D,CAAC,GAEsB,KAAAH,KAAA,IAAIU,EAA8B,MAAM;GAC7D,WAAU,MACRC,EAAU,KAAKC,GAAoB,KAAKC,EAAc,CAAC,CAAC,MAAMT,CAAa,CAAC,EAAE,UAAU,CAAC;GAC3F,0BAA0B;IAGxB,AAFA,KAAKb,GAAa,OAAO,GACzB,KAAKuB,GAAW,OAAO,GACvB,KAAKC,GAAQ,OAAO;GACtB;GACA,qCAAqC;IAEnC,AADA,KAAKlB,GAAU,uBAAuB,GACtC,KAAKmB,GAAuB,WAAW;GACzC;EACF,CAAC,GAEmD,KAAAF,KAAA,IAAIG,EAA6B,MAAM;GACzF,sBAAqB,MAAQ,KAAKC,GAAgBC,CAAI;GACtD,8BAA8B,CAAC,KAAKnB,GAAY,UAAU,CAAC,KAAKT,GAAa;GAC7E,iBAAiB,KAAKE;GACtB,uBAAuB,KAAK2B;GAC5B,0BAA0B,KAAKC;GAC/B,iBAAiB,GAAQ,MAAU,KAAKC,GAAgBpB,GAAQqB,CAAK;GACrE,eAAc,MAAW;IAMvB,AALIC,GAAS,UAAU,eACrB,KAAKnC,GAAiB,MAAM,GAC5B,KAAKoC,KAA2B,KAAA,IAElC,KAAKC,KAAeF,GACpB,KAAK,cAAc;GACrB;GACA,kBAAkB,GAAQ,GAAQ,MAChC,KAAKf,GAAMP,GAAQC,GAAQ;IAAE;IAAQ,cAAc,KAAKwB;IAAwB,OAAO;GAAM,CAAC;EAClG,CAAC,GAE6C,KAAAC,KAAA,CAAC,GACZ,KAAAC,KAAA,CAAC,GAES,KAAAC,KAAA;GAC3C,KAAK;GACL,cAAc;GACd,WAAW;GACX,aAAa;GACb,kBAAkB;GAClB,UAAU;GACV,aAAa;GACb,OAAO;GACP,QAAQ;EACV,GAE8C,KAAAf,KAAA,IAAIgB,EAA0B,MAAM;GAChF,iBAAiB,KAAKC;GACtB,iBAAiB,KAAKvC;GACtB,qBAAqB,KAAKoC;GAC1B,0BAA0B,KAAKR;GAC/B,wBAAwB;IACtB,cAAc,KAAKD;IACnB,eAAe,KAAKO,GAAuB;IAC3C,UAAU,KAAK;IACf,gBAAgB,KAAK;GACvB;GACA,qBAAqB,KAAKpC,GAAa,iBAAiB,KAAKwB,GAAQ,OAAO,CAAC;GAC7E,eAAc,MAAU,KAAKkB,GAActC,CAAM;EACnD,CAAC,GAEiC,KAAAqB,KAAA,IAAIkB,EAA+B,MAAM;GACzE,iBAAiB,KAAKnC;GACtB,cAAa,MACX,CAAC,KAAKoC,GAAWC,CAAE,KAAK,KAAKR,GAAiB,MAAK,MAASL,EAAM,OAAO,MAAK,MAASc,EAAM,OAAOD,CAAE,CAAC;GACzG,YAAW,MAAM,CAAC,KAAK3C,IAAS,OAAO,SAAS2C,CAAE,KAAK,KAAKD,GAAWC,CAAE;GACzE,oBAAmB,MAAU,KAAKE,GAAmBC,CAAM;EAC7D,CAAC,GAEuB,KAAA3C,KAAA,IAAI4C,EAA+B,MAAM;GAC/D,iBAAiB,KAAKzC;GACtB,iBAAiB,KAAK6B;GACtB,iBAAiB,KAAKnC;GACtB,kBAAkB,KAAKiC;GACvB,qBAAqB,KAAKZ,GAAW,QAAQ;GAC7C,iBAAgB,MAAQ;IAQtB,AAPI2B,MAAS,aACX,KAAKlD,GAAa,OAAO,GACzB,KAAKM,GAAU,uBAAuB,GACtC,KAAKkB,GAAQ,OAAO,GACpB,KAAKD,GAAW,OAAO,IAEzB,KAAKE,GAAuB,WAAW,GACvC,KAAK,cAAc;GACrB;EACF,CAAC,GAE2D,KAAA0B,KAAA;GAC1D,wBAAwB,KAAK7B;GAC7B,8BAA8B,KAAKO;GACnC,yBAAyB,KAAKM;GAC9B,2BAA2B,KAAK1B,GAAY;GAC5C,wBAAwB,KAAKe,GAAQ;EACvC;;;EAzLgB,KAAA,SAAA4B,EAAU,CAAClE,CAAM,CAAC;;;EAEP,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;GACT,UAAU,CAAC,uBAAuB,oBAAoB;EACxD;;;EAE4B,KAAA,qBAAA;IACzBmE,EAAW,SAAS,MAAMA;IAC1BC,EAAM,SAAS,MAAMA;IACrBC,EAAK,SAAS,MAAMA;IACpBC,EAAW,SAAS,MAAMA;IAC1BC,EAAa,SAAS,MAAMA;IAC5BC,EAAK,SAAS,MAAMA;IACpBC,EAAS,SAAS,MAAMA;IACxBC,EAAc,SAAS,MAAMA;EAChC;;CAEA;CA8BA,IACI,QAAgB;EAClB,OAAO,KAAKhE;CACd;CAEA,IAAI,MAAM,GAAe;EACvB,IAAMiE,IAAOC,EAAoBC,CAAK;EAEtC,AADA,KAAK/D,GAAa,OAAO,GACzB,KAAKG,GAAS0D,CAAI;CACpB;CAEA;CACA;CACA;CACA;CACA;CACA;CAEA;CAMA;CAiBA;CAcA;CAmBA;CACA;CAEA;CAYA;CAeA;CAQA;CAkBA;CAQA,oBAAoB;EAElB,AADA,MAAM,kBAAkB,GACxB,KAAKxD,GAAa,eAAe;CACnC;CAEA,uBAAuB;EAKrB,AAJA,KAAKP,GAAiB,MAAM,GAC5B,KAAKoC,KAA2B,KAAA,GAChC,KAAKX,GAAW,OAAO,GACvB,KAAKlB,GAAa,cAAc,GAChC,MAAM,qBAAqB;CAC7B;CAEA,WAAqB,GAAyB;EAgB5C,AAfA,MAAM,WAAW2D,CAAO,GACxB,KAAK3D,GAAa,aAAa,GAG7B;GAAC;GAAS;GAAkB;GAAY;GAAiB;GAAa;EAAc,CAAC,CAAC,MAAK,MACzF2D,EAAQ,IAAIC,CAAG,CACjB,KAEA,KAAK3D,GAAU,uBAAuB,GAEpC;GAAC;GAAkB;GAAY;GAAiB;EAAW,CAAC,CAAC,MAAK,MAAO0D,EAAQ,IAAIC,CAAG,CAAC,KAC3F,KAAKxC,GAAuB,WAAW,GAGzC,KAAKyC,GAAW,GAChB,KAAKrE,KAAa;CACpB;CAEA,UAAoB;EAElB,AADA,KAAKQ,GAAa,KAAK,GACvB,KAAKC,GAAU,kBAAkB;CACnC;CAGA,UAAU,GAAe,IAAqC,CAAC,GAAS;EACtE,IAAMuD,IAAOC,EAAoBC,CAAK;EACtC,KAAK/D,GAAa,UAAU6D,GAAMM,CAAO;CAC3C;CAGA,mBAAmB,GAAiB,IAAmC,CAAC,GAAY;EAClF,OAAO,KAAK7D,GAAU,mBAAmB8D,GAASC,CAAO;CAC3D;CAEA,IAAI/C,KAAkC;EACpC,OAAO,KAAKpB,MAAW;GAAE,SAAS;GAAG,MAAM;GAAM,QAAQ,CAAC;EAAE;CAC9D;CAEA,IAAIM,KAA4B;EAC9B,IAAM8D,IAAa,KAAKxE,GAAiB;EAEzC,OADIwE,IAAmBA,EAAW,SAC3BC,IACH,CAAC,IACD,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,QAAQ,MAAmCC,EAAmBC,GAAOC,CAAc,CAAC;CAC7G;CAEA,IAAI5C,KAAa;EACf,OAAO,KAAKhC,GAAiB,SAAS,aAAa,KAAKU,GAAQ,KAAI,MAASsC,EAAM,EAAE;CACvF;CAEA,IAAIjB,KAAuC;EACzC,OAAO,KAAKL,GAAQ,cAAc,gBAAgB,KAAKe;CACzD;CAEA,IAAIH,KAAyB;EAC3B,OAAO,KAAKb,GAAW,gBAAgB;GAAE,eAAe,KAAK;GAAe,WAAW,KAAK;EAAU;CACxG;CAEA,IAAIoD,KAAwB;EAC1B,OAAO,KAAKnD,GAAQ,cAAc,YAAY,KAAK;CACrD;CAEA,IAAIiB,KAAa;EACf,OAAO,KAAK,aAAa,CAAC,KAAKhC,GAAY;CAC7C;CAEA,IAAImE,KAAqB;EACvB,OAAO,KAAKnC,MAAc,KAAKjB,GAAQ;CACzC;CAEA,KAAa;EACX,IAAMqD,IAAM,KAAK/C;EACjB,IAAI,CAAC+C,EAAI,MAAM,OAAO,KAAK,IAAI,IAAIA,CAAG,CAAC,CAAC,SAASA,EAAI,QAAQ;EAC7D,IAAI,CAAC,KAAK3E,IAAS;GACjB,AAAI2E,EAAI,UACN,KAAKC,GAAW;IAAE,SAAS;IAAG,MAAM;KAAE,MAAM;KAAS,QAAQD;KAAK,QAAQA,EAAI;IAAI;IAAG,QAAQ,CAAC;GAAE,CAAC;GAEnG;EACF;EACA,IAAMhB,IAAOkB,EAAgB,KAAK7E,IAAS2E,CAAG;EAC9C,AAAIhB,MAAS,KAAK3D,OAClB,KAAK4E,GAAWjB,CAAI,GACf,KAAKhE,MAAY,KAAKmF,GAAQ;CACrC;CAEA,GAAmB,GAAoC;EAMrD,AALA,KAAKzC,KAAsBS,EAAO,cAClC,KAAK1C,GAAU,uBAAuB,GACtC,KAAK,cAAc,GACnB,KAAKkB,GAAQ,yBAAyBwB,CAAM,GAC5C,KAAKhD,GAAa,yBAAyBgD,CAAM,GACjD,KAAKzB,GAAW,yBAAyByB,CAAM;CACjD;CAEA,GAAW,GAAqC;EAC9C,IAAI5C,MAAW,KAAKF,IAAS;EAC7B,IAAM6D,IAAQkB,EAAwB7E,CAAM;EAE5C,AADA,KAAKF,KAAUE,GACf,KAAKR,KAASmE;CAChB;CAEA,GAAS,GAAmC;EAC1C,KAAKxC,GAAW,OAAO;EACvB,IAAM2D,IAAM,KAAK;EAIjB,AAHA,KAAK1D,GAAQ,gBAAgB,GAC7B,KAAKsD,GAAWjB,CAAI,GACpB,KAAKhE,KAAa,IAClB,KAAK,cAAc,SAASqF,CAAG;CACjC;CAEA,KAAU;EAER,AADA,KAAK5E,GAAU,uBAAuB,GACtC,KAAK,cAAc,IAAI,MAAM,UAAU;GAAE,SAAS;GAAM,UAAU;EAAK,CAAC,CAAC;CAC3E;CAEA,GAAc,GAAyB;EAErC,AADiB6E,EAAoB,KAAKjF,IAASE,CAAM,IAKvD,KAAK,cAAc,KAHnB,KAAK0E,GAAW1E,CAAM,GACtB,KAAK4E,GAAQ;CAIjB;CAEA,GAAgB,GAAkB,GAAgB;EAChD,IAAIhD,GAAO;EAEX,IAAMjB,IAASJ,EAAO,MAAK,MAAM,CAAC,KAAKT,IAAS,OAAO,SAAS2C,CAAE,KAAK,KAAKf,GAAW,SAASe,CAAE,CAAC;EACnG,AAAK9B,KAAW,KAAK,YAAY,cAAc,6BAA6B,IAAI,OAAOA,CAAM,EAAE,GAAG,MAElG,KAAKD,GAAeC,GAAQ,QAAQ,GACpC,KAAKqE,GAAYrE,CAAM;CACzB;CAEA,GAAe,GAAY,GAA8B;EAEvD,IADA,KAAKf,GAAa,OAAO,GACrB,CAAC,KAAKE,MAAW,CAAC,KAAKM,GAAQ,MAAK,MAASsC,EAAM,OAAOD,CAAE,GAAG;EAEnE,IAAIwC,IAAS,KAAKnF;EAClB,AAAIc,MAAc,WAChB,IAASsE,EAAU,KAAKpF,IAAS2C,CAAE,KAAK,KAAK3C;EAE/C,IAAI2D,IAAO0B,EAAYF,GAAQxC,CAAE;EAIjC,AAHIgB,MAAS,KAAA,KAAawB,MAAW,KAAKnF,OACxC,IAAOmF,IAEJxB,MAEL,KAAKtC,GAAW,OAAO,GACvB,KAAKC,GAAQ,OAAO,GACpB,KAAKsD,GAAWjB,CAAI,GACpB,KAAKmB,GAAQ;CACf;CAEA,GAAW,GAAY;EACrB,AAAK,KAAKzD,GAAW,qBAAmB,KAAKT,GAAe+B,GAAI,QAAQ;CAC1E;CAEA,GACE,GACA,GACA,IAAwG,CAAC,GACzG;EACA,IAAM2C,IAAerB,EAAQ,gBAAgB;GAAE,eAAe,KAAK;GAAe,WAAW,KAAK;EAAU;EAC5G,IAAI,CAACqB,EAAa,iBAAiB,KAAK/E,GAAY,QAAQ,OAAO;EAEnE,IAAMoD,IAAO,KAAKnD,GAAoBC,GAAQC,GAAQ;GACpD,WAAWuD,EAAQ;GACnB,WAAWqB,EAAa;EAC1B,CAAC;EASD,OARK3B,KAEL,KAAK7D,GAAa,OAAO,GACzB,KAAKuB,GAAW,OAAO,GACvB,KAAKC,GAAQ,OAAO,GACpB,KAAKsD,GAAWjB,CAAI,GACpB,KAAKmB,GAAQ,GACb,KAAKS,GAAgB9E,GAAQwD,CAAO,GAC7B,MARW;CASpB;CAEA,GAAO,GAAY;EAEjB,IADA,KAAKnE,GAAa,OAAO,GACrB,CAAC,KAAK,YAAY,CAAC,KAAKE,IAAS;EACrC,IAAM2D,IAAO6B,EAAW,KAAKxF,IAAS2C,CAAE;EACxC,IAAI,CAACgB,GAAM;EACX,IAAM8B,IAAeC,EAA+B,MAAM/C,CAAE;EAI5D,AAHA,KAAKtB,GAAW,OAAO,GACvB,KAAKC,GAAQ,OAAO,GACpB,KAAKsD,GAAWjB,CAAI,GACpB,KAAKmB,GAAQ;EACb,IAAMhD,IAAQ,KAAKK,GAAiB,MAAK,MAAQwD,EAAK,OAAO,MAAK,MAAS/C,EAAM,OAAOD,CAAE,CAAC;EAC3F,AAAI8C,KACF,KAAKP,GAAYpD,GAAO,OAAO,MAAK,MAASc,EAAM,OAAOD,CAAE,CAAC,EAAE,EAAE;CAErE;CAEA,GAAgB,GAAkB,GAA8B;EAC9D,AAAIsB,EAAQ,UAAU,MACtB,KAAKiB,GACHzE,EAAO,MAAK,MAAM,CAAC,KAAKT,IAAS,OAAO,SAAS2C,CAAE,KAAK,KAAKrC,GAAQ,MAAK,MAASsC,EAAM,OAAOD,CAAE,CAAC,CACrG;CACF;CAEA,GAAY,GAAa;EACvB,EAAyB,MAAM,EAAE,MAAG,CAAC;CACvC;CAEA,GAAmB,GAAiD;EAClE,IAAMiD,IAAU,KAAKhG,GAAiB;EACtC,IAAIgG,GAAS,OAAOlE,EAAKkE,CAAO;EAChC,IAAMC,IAAS;GACb,QAAQ,KAAKvF;GACb,QAAQ,KAAKc;GACb,QAAQ,KAAKa,IAAc,UAAU,CAAC;GACtC,cAAc,KAAKN;GACnB,QAAQ,KAAKL,GAAQ;GACrB,QAAQ,MAAmC,KAAKnB,GAAa,aAAa2B,CAAK;EACjF;EACA,OAAO,KAAKlC,GAAiB,IAAIiG,GAAQ,KAAK5C,IAAqBvB,CAAI;CACzE;CAEA,GAAoB,GAAyB;EAC3C,OAAO,KAAK9B,GAAiB,SAAS,QAAQM,CAAM,KAAK4F,EAAc5F,GAAQ,KAAK0B,EAAU;CAChG;CAEA,GACE,GACA,GACA,IAAgE,CAAC,GACjE;EACA,IAAK,KAAK5B,IACV,OAAO,KAAKyB,IAAgB,MAC1BsE,EAA6B;GAC3B;GACA,QAAQ,KAAK3E;GACb,cAAc,KAAKO;GACnB;GACA;GACA,WAAWsC,EAAQ,aAAa,KAAK;GACrC,WAAWA,EAAQ;EACrB,CAAC,CACH;CACF;CAEA,GAA0B,GAAkB;EAC1C,IAAM+B,IAAS,KAAK1F,IACd2F,IAAUxF,EAAO,QAAO,MAAM,CAAC,KAAKT,IAAS,OAAO,SAAS2C,CAAE,KAAKqD,EAAO,MAAK,MAASpD,EAAM,OAAOD,CAAE,CAAC,GACzGuD,IAAShF,EAAU,KAAKlB,IAAS,QAAQ,MAAMiG,EAAQ,EAAE,CAAC,EAAE,QAC5DE,IAAQD,KAAUD,EAAQ,SAASC,CAAM,IAAIA,IAASD,EAAQ,IAC9DG,IAAaD,IAAQH,EAAO,MAAK,MAASpD,EAAM,OAAOuD,CAAK,IAAI,KAAA;EACtE,OAAO;GAAE,OAAOC,IAAaC,EAAcD,CAAU,IAAKD,KAAS;GAAK,QAAQ,KAAK,IAAIF,EAAQ,QAAQ,CAAC;EAAE;CAC9G;CAEA,GAAW,GAAY;EACrB,OAAO,KAAKhE,IAAc,OAAO,SAASU,CAAE,KAAK;CACnD;CAEA,GAAqB,IAAU,KAAKV,IAAc;EAChD,OAAO,CAAC,CAACF,KAAW,gBAAgBA,KAAWA,EAAQ,eAAe;CACxE;CAEA,SAAS;EACP,OAAO,KAAKN,IAAgB,MAAc,KAAK6E,GAAiBlC,CAAU,CAAC;CAC7E;CAEA,GAAiB,GAAiC;EAChD,IAAMmC,IAAO,KAAKtE,IACZuE,IAAWpC,EAAW,qBAAqB;EAMjD,AALA,KAAKjC,KAAmBsE,EACtBD,EAAS,QACT,KAAKxG,IAAS,QAAQ,MACtB,KAAKiC,IAAc,MACrB,GACA,KAAKG,KAAcoE,EAAS;EAC5B,IAAMzE,IAAU,KAAK2E,GAAmBF,EAAS,SAASpC,CAAU;EAWpE,OAVA,KAAKjE,GAAa,kBAAkB;GAClC,QAAQ,KAAKgC;GACb,QAAQqE;GACR,WAAW,KAAK;GAChB,cAAc,KAAK7E;GACnB,UAAU,KAAK8C;GACf,SAAS,CAAC,CAAC8B;GACX,QAAQA,GAAM,UAAU,CAAC;GACzB,SAAQ,MAASnC,EAAW,OAAOtC,CAAK;EAC1C,CAAC,GACM,CAAI,sCAEU,KAAKR,GAAQ,SAAS,sBACpB,KAAKf,GAAY,OAAO,uBACvB,CAAC,CAACgG,EAAK,6BACDI,EAAUJ,KAAQ,gBAAgBA,IAAOA,EAAK,aAAa,KAAA,CAAS,EAAE,WACxF,qBAAqBnC,EAAW,QAAQA,EAAW,QAAQ,KAAKhD,EAAc,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,yCACnE,KAAKC,GAAW,QAAQ,EAAE,+BAClC,aAAamF,EAAS,QAAQ,MAAM,gBAAgBA,EAAS,QAAQ,OAAO,IAAI,IACxGI,EACA,KAAKzE,KACL,MAAS,KAAKhC,GAAa,iBAAiB2B,CAAK,IACjD,MAAS,KAAK+E,IAAY/E,CAAK,CACjC,EAAE,2BACwB,KAAK,cAAc,EAAE,WAC7C,KAAKgF,IAAqB,EAAE,8CACeH,EAAU,KAAK1E,IAAc,KAAK,EAAE,IAAGF,EAAQ,oBAG9F,KAAKgF,IAAwB,EAAE;CAGvC;CAEA,GACE,GACA,GACA,GACmB;EACnB,IAAMC,IAAW,KAAK,eAAe,KAAK/E,IAAc,UAAU,YAC5DgF,IAAW,KAAKjF;EACtB,IACEgF,KACAC,KACAA,EAAS,mBAAmBC,KAC5BD,EAAS,kBAAkBE,KAC3BF,EAAS,eAAe,WAAWG,EAAe,UAClDH,EAAS,eAAe,OAAO,GAAI,MAAUtE,MAAOyE,EAAeC,EAAM,GAEzE,OAAOJ,EAAS;EAClB,KAAKjF,KAA2B,KAAA;EAChC,IAAMsF,IAAaC,EAAyBL,GAAgBC,GAAeC,CAAc;EASzF,OARIJ,MACF,KAAKhF,KAA2B;GAC9B;GACA;GACA,gBAAgBoF,EAAe,MAAM;GACrC;EACF,IAEKE;CACT;CAEA,GAAyB,GAA+B,GAA+B;EACrF,IAAME,IAAYzF,EAAQ,SAAS0F,EAAsB1F,EAAQ,MAAM,OAAO;EAC9E,OAAO6E,EACLU,IACA,MAAYI,EAAS,MACrB,MAAY,CAAI,oDAEQA,EAAS,IAAI,kBACpBA,EAAS,QAAQF,EAAU,oCAElCE,EAAS,MAAM,SAE3B;CACF;CAEA,GAAmB,GAAwC,GAAiC;EAC1F,IAAM3F,IAAU,KAAKE;EACrB,IAAI,CAACF,GAAS,OAAO;EACrB,IAAM,EAAE,MAAG,SAAMqC,EAAW,OAAO;GAAE,GAAG;GAAG,GAAG;GAAG,OAAO;GAAG,QAAQ;EAAE,CAAC,GAChE,EAAE,UAAO,cAAW,KAAKuD,GAA0B5F,EAAQ,MAAM,GACjEmF,IAAiB9C,EAAW,SAASA,EAAW,QAAQ,KAAKhD,EAAc,CAAC,CAAC,CAAC,SAC9EkG,IAAa,KAAKM,GAAsBV,GAAgBC,GAAepF,EAAQ,MAAM,GACrF8F,IAASzD,EAAW,OAAO,GAC3B0D,IAAO,KAAKzG,GAAW,eAAeU,GAASqC,CAAU,GACzD,EAAE,SAAM,YAASrC,EAAQ,KACzBgG,IAAc;GAAE,GAAGC;GAAM,GAAGA,EAAK,IAAIC;GAAG,GAAGD,EAAK,IAAIE;EAAE,GACtDC,IAAQpG,EAAQ;EACtB,OAAO,CAAI,GACP,KAAKqG,GAAqBN,GAAMG,GAAGC,CAAC,IAAI,KAAKG,GAAyBf,GAAYvF,CAAO,EAAE,0GAEvEiG,EAAK,SAAS,KAAKA,EAAK,UAAU,EAAE,qBACtCjG,EAAQ,MAAM,wBACXA,EAAQ,QAAQ,2BACbiB,EAAK,8BACFsF,EAAmCvG,CAAO,EAAE,WAC/D,uBAAuBiG,EAAK,IAAIC,EAAE,KAAKD,EAAK,IAAIE,EAAE,YAAYF,EAAK,MAAM,YAAYA,EAAK,OAAO,KAAKO,EAAqBR,GAAaZ,CAAa,IAAI,IAE/JpF,EAAQ,UACJ,CAAI,8GAGJ,OACH,KAAKyG,GAAkBzG,CAAO,EAAE,cAEnCoG,IAAQ,KAAKM,GAAsB;GAAE;GAAO;GAAG;GAAG;GAAQ;GAAO;EAAO,CAAC,IAAI;CAEnF;CAEA,GAAqB,GAA2C,GAAW,GAAW;EAGpF,OAFKX,IAEE,CAAI,oDAEgBA,EAAK,UAAU,MAAM,yBACtBA,EAAK,KAAK,oCAExB,QAAQA,EAAK,KAAK,IAAIG,EAAE,SAASH,EAAK,KAAK,IAAII,EAAE,WAAWJ,EAAK,KAAK,MAAM,YAAYA,EAAK,KAAK,OAAO,IAAI,YAPvG;CASpB;CAEA,GAAkB,GAA2C;EAC3D,IAAI,CAAC/F,KAAWA,EAAQ,UAAU,cAAcA,EAAQ,WAAW,CAACA,EAAQ,OAAO,OAAO;EAC1F,IAAM,EAAE,SAAM,aAAUA,EAAQ;EAChC,OAAO,CAAI,GACP2G,EAAM,KAAI,MAAQ;GAClB,IAAMC,IAAWC,EAAK,SAAS,UAAUA,EAAK,SAAS,SACjDC,IACJD,EAAK,SAAS,UAAUA,EAAK,SAAS,QAAQ,IAAIA,EAAK,OAAO,MAAM,eAAeA,EAAK,OAAO,MAC3FE,IAAWH,IACb,QAAQE,EAAO,OAAOD,EAAK,WAAW,IAAI,KAC1C,QAAQA,EAAK,WAAW,IAAI,QAAQC,KAClCE,IAAW;IAAE,OAAO;IAAG,QAAQ;IAAI,MAAM;IAAK,KAAK;GAAI,EAAEH,EAAK;GACpE,OAAO,CAAI,4CAEW5F,EAAK,oBACN4F,EAAK,KAAK,oCAEnBE,EAAS,wIAIP,oBAAoBC,EAAS,MAAM,IACzC/F,MAAS,UAAU,KAAKgG,GAAsB,IAAI,KAAKC,GAAuB,EAAE;EAI1F,CAAC;CAEL;CAEA,KAAwB;EACtB,OAAO,CAAG;CACZ;CAEA,KAAyB;EACvB,OAAO,CAAG;CACZ;CAEA,GAAsB,GAA4F;EAChH,IAAM,EAAE,UAAO,MAAG,MAAG,WAAQ,UAAO,cAAWC,GACzCC,IAAQtB,EAAO,IAAIA,EAAO,OAC1BuB,IAASvB,EAAO,IAAIA,EAAO,QAC3BwB,IAAK,KAAK,IAAIxB,EAAO,GAAG,KAAK,IAAIM,EAAM,IAAI,IAAIgB,CAAK,CAAC,GACrDG,IAAK,KAAK,IAAIzB,EAAO,GAAG,KAAK,IAAIM,EAAM,IAAI,IAAIiB,CAAM,CAAC;EAC5D,OAAO,CAAI,qFAEiEG,EAAO,WACvE,QAAQF,IAAKpB,EAAE,SAASqB,IAAKpB,EAAE,iCAAiC,KAAK,IAAI,GAAG,KAAK,IAAI,KAAKL,EAAO,KAAK,CAAC,EAAE,gBAAgBA,EAAO,OAAO,sCAAsCsB,IAAQE,EAAG,2BAA2BD,IAASE,EAAG,cAAc,IAAGE,EAAM;CAEpQ;CAEA,IAAY,GAAgC;EAC1C,IAAMC,IAAe,KAAK9H,IACpB,EAAE,oBAAiB8H,GACnBxD,IAAU,KAAKyD,GAAqB,KAAK5H,EAAM,OAAO,OAAM,MAAS,KAAKY,GAAWE,EAAM,EAAE,CAAC,GAC9F+G,IAAqB,KAAKpJ,GAAY,gBAAgBuB,EAAM,MAAM,GAClE8H,KAAc,KAAKtI,GAAQ,cAAc,kBAAkB,KAAK,mBAAmBqI,GACnFE,IAAcD,IAAcH,EAAa,oBAAoB,IAAK;EACxE,OAAO,CAAI,oCAEC,QAAQ3H,EAAM,KAAK,EAAE,SAASA,EAAM,KAAK,EAAE,WAAWA,EAAM,KAAK,MAAM,YAAYA,EAAM,KAAK,OAAO,IAAI,iDAEnFmE,EAAQ,YAC3BA,EAAQ,iBACHU,EAAUV,IAAU,SAAS,KAAA,CAAS,EAAE,WAC9C,UAAU6D,EAAa,IAAI,IACjC,KAAKC,IAAiBjI,CAAK,EAAE,GAAG,KAAKkI,IAAgBlI,GAAO+H,CAAW,EAAE,GACzED,IAAa,KAAKK,IAAyBnI,GAAO6H,CAAkB,IAAI,KAAK;CAIvF;CAEA,IAAiB,GAAgC;EAI/C,QAFG,KAAKrI,GAAQ,cAAc,iBAAiB,KAAKY,GAAuB,kBACzE,CAAC,KAAK3B,GAAY,UACIuB,EAAM,YAAY,IACtC,CAAI,wDAEkBA,EAAM,OAAO,EAAE,EAAE,MAAM,GAAG,kCAE/B6E,EAAU,KAAK,KAAK,IAAI,EAAE,aAC7B,MAAiBuD,EAAM,eAAe,EAAE,wBAEtD;CACN;CAEA,IAAgB,GAAgC,GAAqB;EACnE,IAAMC,IAAQC,EAAqBtI,GAAO,KAAKH,EAAa,GACtD0I,IAAc,KAAK1I,GAAc,SAASG,EAAM,OAAO,EAAE,eAAe;EAC9E,OAAO,CAAI,0CAEYA,EAAM,OAAO,SAAS,EAAE,WACnC,SAAS,KAAK,IAAI,GAAGA,EAAM,KAAK,QAAQA,EAAM,YAAYuI,IAAcR,CAAW,EAAE,kBAAkBQ,EAAY,IAAI,gBAClH,KAAKlK,GAAa,iBAAiB2B,CAAK,EAAE,cAC5C,MAAiB,KAAK3B,GAAa,aAAa2B,GAAOoI,CAAK,EAAE,IACvE,KAAKI,IAAgBxI,GAAOqI,CAAK,EAAE;CAG3C;CAEA,IAAgB,GAAgC,GAAe;EAC7D,IAAMI,IAAU3D,EACd9E,EAAM,SACN,MAASc,EAAM,KACd,GAAO,MAAU,KAAK4H,IAAgB1I,GAAOc,GAAO;GAAE,MAAMyE,IAAQ8C;GAAO;EAAM,CAAC,CACrF;EACA,OAAOrI,EAAM,SACT,CAAI,6DAEmB,MAAoD;GACrE,IAAMa,IAAKuH,EAAM,OAAO,WAAW,QAAQ;GAC3C,AAAIvH,KACF,KAAK8H,GAAW9H,CAAE;EAEtB,EAAE,WACM,SAASb,EAAM,OAAO,SAASqI,EAAM,IAAI,IAC/CI,EAAQ,eAGd,CAAI,iCAC6B,SAASzI,EAAM,OAAO,SAASqI,EAAM,IAAI,IAAGI,EAAQ;CAE3F;CAEA,IAAgB,GAAgC,GAAuB,GAA2C;EAChH,IAAMG,IAAQC,EAAS;GACrB,MAAM,GAAG7B,EAAS,KAAK;GACvB,OAAO,GAAGA,EAAS,MAAM;GACzB,YAAY,GAAG,KAAKnH,GAAc,aAAa;EACjD,CAAC,GACKsE,IAAU,KAAKvD,GAAWE,EAAM,EAAE,GAClC4G,IAAQ5G,EAAM,cAAc,qCAAqC,IACnE,OACA,CAAI,gCAAgCA,EAAM,GAAG,UAC3CgI,IAAQ,KAAKnG,KACf,CAAI,0BAEOkC,EAAU7E,EAAM,SAAS,WAAW,KAAA,CAAS,EAAE,8FAEzCc,EAAM,GAAG,gBACT,GAAG,KAAK,KAAK,MAAM,GAAGyD,EAAczD,CAAK,IAAI,kBAC3C,KAAK7B,GAAO6B,EAAM,EAAE,EAAE,wBAEzC;EACJ,OAAOd,EAAM,SACT,CAAI,oFAEoBmE,EAAQ,YAAUA,EAAQ,iBAChCU,EAAUV,IAAU,SAAS,KAAA,CAAS,EAAE,WAC9CyE,EAAM,oDAEC9H,EAAM,GAAG,eACVd,EAAM,WAAWc,EAAM,GAAG,gBACzBA,EAAM,GAAG,yBACA,KAAKzC,GAAa,iBAAiByC,EAAM,IAAI,EAAI,EAAE,yBACnD,KAAKzC,GAAa,iBAAiByC,EAAM,IAAI,EAAK,EAAE,kBAC3D,KAAK6H,GAAW7H,EAAM,EAAE,EAAE,IAAG4G,EAAM,kBAClDoB,EAAM,0BAGZ,CAAI,yDAEoB3E,EAAQ,YAAUA,EAAQ,iBAChCU,EAAUV,IAAU,SAAS,KAAA,CAAS,EAAE,WAC9CyE,EAAM,yCACwB9H,EAAM,GAAG,uBAAsB4G,EAAM,QACzEoB,EAAM;CAGlB;CAEA,IAAyB,GAAgC,GAAmB;EAC1E,IAAMP,IAAc,KAAK1I,GAAc,SAASG,EAAM,OAAO,EAAE,eAAe,GACxE+I,IAAW,CAAC,KAAK,mBAAmB,uBAAuB,EAAE,OAAO/I,EAAM,OAAO,CAAC;EACxF,OAAO,CAAI,qDAC0CuI,IAAc,EAAE,qEAEnDS,IAAW,aAAa,WAAW,iFAE1BhJ,EAAM,OAAO,MAAK,MAASc,EAAM,OAAOd,EAAM,MAAM,KAAK,KAAK,eACvE+I,EAAS,gBACRlE,EAAUmE,IAAW,KAAK,KAAK,iBAAiB,KAAK,KAAK,eAAe,EAAE;CAGhG;CAEA,MAAuB;EAGrB,OAFK,KAAKpG,KAEHkC,EACL,KAAKxE,KACL,MAAQuD,EAAK,MACb,MAAQ,KAAKoF,IAAcpF,CAAI,CACjC,IANqC;CAOvC;CAEA,IAAc,GAAyB;EACrC,OAAO,CAAI,8BAEC,QAAQA,EAAK,KAAK,EAAE,SAASA,EAAK,KAAK,EAAE,WAAWA,EAAK,KAAK,MAAM,YAAYA,EAAK,KAAK,OAAO,IAAI,sCAE3FA,EAAK,IAAI,sCAEXA,EAAK,OAAO,SAAS,eAAe,aAAa,aAAa,UACrEA,EAAK,IAAI,UACTA,EAAK,IAAI,WACR,GAAG,YACFA,EAAK,MAAM,wBACC,KAAKrE,GAAQ,QAAQ,cAC/B,MAAiB4I,EAAM,eAAe,EAAE,aACzC,MAAiB,KAAK5I,GAAQ,MAAM4I,GAAOvE,CAAI,EAAE,cAChD,MAAiB,KAAKrE,GAAQ,OAAO4I,GAAOvE,CAAI,EAAE;CAGrE;CAEA,MAA0B;EACxB,IAAM,EAAE,qBAAkB,KAAKzD,IACzB8I,IACJ,KAAK,kBAAkB,KAAK7I,GAAiB,MAAK,MAAS,KAAK5B,GAAY,gBAAgBuB,EAAM,MAAM,CAAC;EAC3G,OAAO,CAAI,sTASC,KAAK,WACD,CAAI,kJAKJ,KACL,mCAIHmJ,IACI,CAAI,6EAGJ,OAEJD,IACI,CAAI,4KAOJ,KACL;CAIT;AACF;AAz0BG/L,EAAA,CAAAiM,EAAS;CAAE,MAAM;CAAQ,WAAW;AAAM,CAAC,CAAA,GAAA7L,EAAA,WAAA,QAAA,KAAA,CAAA,GAG3CJ,EAAA,CAAAiM,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA7L,EAAA,WAAA,aAAA,KAAA,CAAA,GAGzCJ,EAAA,CAAAiM,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA7L,EAAA,WAAA,iBAAA,KAAA,CAAA,GAGzCJ,EAAA,CAAAiM,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA7L,EAAA,WAAA,aAAA,KAAA,CAAA,GAGzCJ,EAAA,CAAAiM,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA7L,EAAA,WAAA,kBAAA,KAAA,CAAA,GAGzCJ,EAAA,CAAAiM,EAAS;CAAE,MAAM;CAAQ,WAAW;AAAmB,CAAC,CAAA,GAAA7L,EAAA,WAAA,mBAAA,KAAA,CAAA,GAGxDJ,EAAA,CAAAiM,EAAS;CAAE,MAAM;CAAS,SAAS;AAAK,CAAC,CAAA,GAAA7L,EAAA,WAAA,YAAA,KAAA,CAAA,GAGzCJ,EAAA,CAAAiM,EAAS,EAAE,WAAW,gBAAgB,CAAC,CAAA,GAAA7L,EAAA,WAAA,gBAAA,KAAA,CAAA,GAGvCJ,EAAA,CAAAiM,EAAS,EAAE,SAAS,GAAK,CAAC,CAAA,GAAA7L,EAAA,WAAA,aAAA,KAAA,CAAA,GAG1BJ,EAAA,CAAAiM,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAA7L,EAAA,WAAA,SAAA,IAAA,GAnD3B,IAAAJ,EAAA,CAAAkM,EAAe,CAAA,GAAA9L,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { Rect } from '@nvidia-elements/core/internal';
|
|
2
|
-
import type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';
|
|
3
|
-
import type { WorkspaceNode } from '../model/layout.utils.js';
|
|
4
|
-
export interface WorkspacePlacementContext {
|
|
5
|
-
kind: 'rail' | 'recipient';
|
|
6
|
-
members: string[];
|
|
7
|
-
}
|
|
8
|
-
export interface WorkspaceContextProxy {
|
|
9
|
-
key: string;
|
|
10
|
-
rect: Rect;
|
|
11
|
-
}
|
|
12
|
-
interface ContextRectInput {
|
|
13
|
-
members: string[];
|
|
14
|
-
allocation: WorkspacePlacedRegion[];
|
|
15
|
-
source: string[];
|
|
16
|
-
}
|
|
17
|
-
export type WorkspaceContextRectResolver = (input: ContextRectInput) => Rect | undefined;
|
|
18
|
-
/** Identifies an operating region independently of path changes or sibling order. */
|
|
19
|
-
export declare function getContextKey(members: string[]): string;
|
|
20
|
-
export declare function createPlacementContext(kind: WorkspacePlacementContext['kind'], node: WorkspaceNode | null, source: string[]): WorkspacePlacementContext;
|
|
21
|
-
/** Includes surviving peers whose computed allocation changes under split constraints. */
|
|
22
|
-
export declare function getAffectedSplitContext(input: {
|
|
23
|
-
baseline: WorkspacePlacedRegion[];
|
|
24
|
-
achieved: WorkspacePlacedRegion[];
|
|
25
|
-
source: string[];
|
|
26
|
-
recipient: string[];
|
|
27
|
-
}): WorkspacePlacementContext;
|
|
28
|
-
/** Seeds operating-region proxies before their selection can change during animation. */
|
|
29
|
-
export declare function allocateContextProxies(input: {
|
|
30
|
-
catalog: WorkspacePlacedRegion[];
|
|
31
|
-
allocation: WorkspacePlacedRegion[];
|
|
32
|
-
source: string[];
|
|
33
|
-
}): WorkspaceContextProxy[];
|
|
34
|
-
export declare function getAllocatedContextRect(input: ContextRectInput): Rect | undefined;
|
|
35
|
-
export declare function createContextRectResolver(): WorkspaceContextRectResolver;
|
|
36
|
-
export {};
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { getPanelIds as e } from "../model/layout.utils.js";
|
|
2
|
-
// src/workspace/utils/placement/context.utils.ts
|
|
3
|
-
function t(e) {
|
|
4
|
-
return JSON.stringify([...e].sort());
|
|
5
|
-
}
|
|
6
|
-
function n(t, n, r) {
|
|
7
|
-
let i = new Set(r);
|
|
8
|
-
return {
|
|
9
|
-
kind: t,
|
|
10
|
-
members: e(n).filter((e) => t === "rail" || !i.has(e))
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
function r(t) {
|
|
14
|
-
let n = new Map(t.achieved.flatMap((e) => e.node.type === "group" ? e.node.panels.map((t) => [t, e.rect]) : [])), r = new Set(t.recipient);
|
|
15
|
-
for (let e of t.baseline) if (e.node.type === "group") for (let a of e.node.panels) {
|
|
16
|
-
if (t.source.includes(a)) continue;
|
|
17
|
-
let o = n.get(a);
|
|
18
|
-
o && i(e.rect, o) && r.add(a);
|
|
19
|
-
}
|
|
20
|
-
let a = t.baseline.filter((t) => {
|
|
21
|
-
let n = e(t.node);
|
|
22
|
-
return [...r].every((e) => n.includes(e));
|
|
23
|
-
}).at(-1);
|
|
24
|
-
return a ? {
|
|
25
|
-
kind: a.node.type === "group" ? "recipient" : "rail",
|
|
26
|
-
members: e(a.node)
|
|
27
|
-
} : {
|
|
28
|
-
kind: "recipient",
|
|
29
|
-
members: t.recipient
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
function i(e, t) {
|
|
33
|
-
return [
|
|
34
|
-
"x",
|
|
35
|
-
"y",
|
|
36
|
-
"width",
|
|
37
|
-
"height"
|
|
38
|
-
].some((n) => Math.abs(e[n] - t[n]) > 1e-6);
|
|
39
|
-
}
|
|
40
|
-
function a(n) {
|
|
41
|
-
let r = new Set(n.source), i = /* @__PURE__ */ new Map();
|
|
42
|
-
for (let a of n.catalog) {
|
|
43
|
-
let n = e(a.node), o = n.filter((e) => !r.has(e));
|
|
44
|
-
if (o.length) for (let e of [n, o]) i.set(t(e), e);
|
|
45
|
-
}
|
|
46
|
-
let a = c(n.allocation);
|
|
47
|
-
return [...i].flatMap(([e, t]) => {
|
|
48
|
-
let n = l({
|
|
49
|
-
members: t,
|
|
50
|
-
geometry: a,
|
|
51
|
-
carried: r
|
|
52
|
-
});
|
|
53
|
-
return n ? [{
|
|
54
|
-
key: e,
|
|
55
|
-
rect: n
|
|
56
|
-
}] : [];
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
function o(e) {
|
|
60
|
-
return l({
|
|
61
|
-
members: e.members,
|
|
62
|
-
geometry: c(e.allocation),
|
|
63
|
-
carried: new Set(e.source)
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
function s() {
|
|
67
|
-
let e = /* @__PURE__ */ new WeakMap();
|
|
68
|
-
return (t) => {
|
|
69
|
-
let n = e.get(t.allocation);
|
|
70
|
-
return n || (n = c(t.allocation), e.set(t.allocation, n)), l({
|
|
71
|
-
members: t.members,
|
|
72
|
-
geometry: n,
|
|
73
|
-
carried: new Set(t.source)
|
|
74
|
-
});
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
function c(n) {
|
|
78
|
-
let r = n.filter((e) => e.node.type === "group"), i = new Map(n.map((e) => [e.key, e])), a = /* @__PURE__ */ new Map();
|
|
79
|
-
for (let t of r) e(t.node).forEach((e) => a.set(e, t.key));
|
|
80
|
-
let o = /* @__PURE__ */ new Map();
|
|
81
|
-
for (let e of n) {
|
|
82
|
-
let n = r.filter((t) => d(t.key, e.key)).map((e) => e.key);
|
|
83
|
-
o.set(t(n), e.rect);
|
|
84
|
-
}
|
|
85
|
-
return {
|
|
86
|
-
leaves: r,
|
|
87
|
-
byKey: i,
|
|
88
|
-
groupByMember: a,
|
|
89
|
-
exact: o
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
function l(n) {
|
|
93
|
-
let { members: r, geometry: i, carried: a } = n, o = new Set(r.flatMap((e) => i.groupByMember.get(e) ?? []));
|
|
94
|
-
if (!o.size) return;
|
|
95
|
-
let s = i.exact.get(t([...o]));
|
|
96
|
-
if (s) return s;
|
|
97
|
-
let c = u([...o]), l = i.byKey.get(c);
|
|
98
|
-
if (l?.node.type !== "split") return;
|
|
99
|
-
let { depth: p, first: m, last: h } = f([...o], c);
|
|
100
|
-
if (i.leaves.filter((e) => {
|
|
101
|
-
let t = Number(e.key.split(".")[p]);
|
|
102
|
-
return d(e.key, c) && t >= m && t <= h;
|
|
103
|
-
}).some((t) => !o.has(t.key) && !e(t.node).every((e) => a.has(e)))) return;
|
|
104
|
-
let g = i.byKey.get(`${c}.${m}`), _ = i.byKey.get(`${c}.${h}`);
|
|
105
|
-
if (g && _) return l.node.axis === "horizontal" ? {
|
|
106
|
-
x: g.rect.x,
|
|
107
|
-
y: l.rect.y,
|
|
108
|
-
width: _.rect.x + _.rect.width - g.rect.x,
|
|
109
|
-
height: l.rect.height
|
|
110
|
-
} : {
|
|
111
|
-
x: l.rect.x,
|
|
112
|
-
y: g.rect.y,
|
|
113
|
-
width: l.rect.width,
|
|
114
|
-
height: _.rect.y + _.rect.height - g.rect.y
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
function u(e) {
|
|
118
|
-
let t = e[0].split(".");
|
|
119
|
-
for (; !e.every((e) => d(e, t.join(".")));) t.pop();
|
|
120
|
-
return t.join(".");
|
|
121
|
-
}
|
|
122
|
-
function d(e, t) {
|
|
123
|
-
return e === t || e.startsWith(`${t}.`);
|
|
124
|
-
}
|
|
125
|
-
function f(e, t) {
|
|
126
|
-
let n = t.split(".").length, r = e.map((e) => Number(e.split(".")[n]));
|
|
127
|
-
return {
|
|
128
|
-
depth: n,
|
|
129
|
-
first: Math.min(...r),
|
|
130
|
-
last: Math.max(...r)
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
export { a as allocateContextProxies, s as createContextRectResolver, n as createPlacementContext, r as getAffectedSplitContext, o as getAllocatedContextRect, t as getContextKey };
|
|
134
|
-
|
|
135
|
-
//# sourceMappingURL=context.utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.utils.js","names":["getContextKey","members","createPlacementContext","carried","source","getPanelIds","node","kind","id","getAffectedSplitContext","achieved","input","region","affected","after","changedRect","candidate","before","key","allocateContextProxies","memberships","full","remaining","geometry","allocationIndex","rect","resolveContextRegion","getAllocatedContextRect","createContextRectResolver","indices","leaves","regions","byKey","groupByMember","leaf","exact","keys","descendant","selected","prefix","commonRegion","parent","childRange","index","depth","first","last","parts"],"sources":["../../../../src/workspace/utils/placement/context.utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Rect } from '@nvidia-elements/core/internal';\n\nimport { getPanelIds } from '../model/layout.utils.js';\n\nimport type { WorkspacePlacedRegion } from '../geometry/allocation.utils.js';\nimport type { WorkspaceNode } from '../model/layout.utils.js';\n\nexport interface WorkspacePlacementContext {\n kind: 'rail' | 'recipient';\n members: string[];\n}\n\nexport interface WorkspaceContextProxy {\n key: string;\n rect: Rect;\n}\n\ninterface ContextRectInput {\n members: string[];\n allocation: WorkspacePlacedRegion[];\n source: string[];\n}\n\nexport type WorkspaceContextRectResolver = (input: ContextRectInput) => Rect | undefined;\n\n/** Identifies an operating region independently of path changes or sibling order. */\nexport function getContextKey(members: string[]): string {\n return JSON.stringify([...members].sort());\n}\n\nexport function createPlacementContext(\n kind: WorkspacePlacementContext['kind'],\n node: WorkspaceNode | null,\n source: string[]\n): WorkspacePlacementContext {\n const carried = new Set(source);\n return { kind, members: getPanelIds(node).filter(id => kind === 'rail' || !carried.has(id)) };\n}\n\n/** Includes surviving peers whose computed allocation changes under split constraints. */\nexport function getAffectedSplitContext(input: {\n baseline: WorkspacePlacedRegion[];\n achieved: WorkspacePlacedRegion[];\n source: string[];\n recipient: string[];\n}): WorkspacePlacementContext {\n const achieved = new Map(\n input.achieved.flatMap(region =>\n region.node.type === 'group' ? region.node.panels.map(id => [id, region.rect] as const) : []\n )\n );\n const affected = new Set(input.recipient);\n for (const region of input.baseline) {\n if (region.node.type !== 'group') continue;\n for (const id of region.node.panels) {\n if (input.source.includes(id)) continue;\n const after = achieved.get(id);\n if (after && changedRect(region.rect, after)) {\n affected.add(id);\n }\n }\n }\n const region = input.baseline\n .filter(candidate => {\n const members = getPanelIds(candidate.node);\n return [...affected].every(id => members.includes(id));\n })\n .at(-1);\n return region\n ? { kind: region.node.type === 'group' ? 'recipient' : 'rail', members: getPanelIds(region.node) }\n : { kind: 'recipient', members: input.recipient };\n}\n\nfunction changedRect(before: Rect, after: Rect) {\n return (['x', 'y', 'width', 'height'] as const).some(key => Math.abs(before[key] - after[key]) > 0.000001);\n}\n\n/** Seeds operating-region proxies before their selection can change during animation. */\nexport function allocateContextProxies(input: {\n catalog: WorkspacePlacedRegion[];\n allocation: WorkspacePlacedRegion[];\n source: string[];\n}): WorkspaceContextProxy[] {\n const carried = new Set(input.source);\n const memberships = new Map<string, string[]>();\n for (const region of input.catalog) {\n const full = getPanelIds(region.node);\n const remaining = full.filter(id => !carried.has(id));\n if (!remaining.length) continue;\n for (const members of [full, remaining]) {\n memberships.set(getContextKey(members), members);\n }\n }\n const geometry = allocationIndex(input.allocation);\n return [...memberships].flatMap(([key, members]) => {\n const rect = resolveContextRegion({ members, geometry, carried });\n return rect ? [{ key, rect }] : [];\n });\n}\n\nexport function getAllocatedContextRect(input: ContextRectInput): Rect | undefined {\n return resolveContextRegion({\n members: input.members,\n geometry: allocationIndex(input.allocation),\n carried: new Set(input.source)\n });\n}\n\nexport function createContextRectResolver(): WorkspaceContextRectResolver {\n const indices = new WeakMap<WorkspacePlacedRegion[], ReturnType<typeof allocationIndex>>();\n return input => {\n let geometry = indices.get(input.allocation);\n if (!geometry) {\n geometry = allocationIndex(input.allocation);\n indices.set(input.allocation, geometry);\n }\n return resolveContextRegion({ members: input.members, geometry, carried: new Set(input.source) });\n };\n}\n\nfunction allocationIndex(regions: WorkspacePlacedRegion[]) {\n const leaves = regions.filter(region => region.node.type === 'group');\n const byKey = new Map(regions.map(region => [region.key, region]));\n const groupByMember = new Map<string, string>();\n for (const leaf of leaves) {\n getPanelIds(leaf.node).forEach(id => groupByMember.set(id, leaf.key));\n }\n const exact = new Map<string, Rect>();\n for (const region of regions) {\n const keys = leaves.filter(leaf => descendant(leaf.key, region.key)).map(leaf => leaf.key);\n exact.set(getContextKey(keys), region.rect);\n }\n return { leaves, byKey, groupByMember, exact };\n}\n\nfunction resolveContextRegion(input: {\n members: string[];\n geometry: ReturnType<typeof allocationIndex>;\n carried: Set<string>;\n}): Rect | undefined {\n const { members, geometry, carried } = input;\n const selected = new Set(members.flatMap(id => geometry.groupByMember.get(id) ?? []));\n if (!selected.size) return undefined;\n const exact = geometry.exact.get(getContextKey([...selected]));\n if (exact) return exact;\n const prefix = commonRegion([...selected]);\n const parent = geometry.byKey.get(prefix);\n if (parent?.node.type !== 'split') return undefined;\n const { depth, first, last } = childRange([...selected], prefix);\n const covered = geometry.leaves.filter(leaf => {\n const index = Number(leaf.key.split('.')[depth]);\n return descendant(leaf.key, prefix) && index >= first && index <= last;\n });\n if (covered.some(leaf => !selected.has(leaf.key) && !getPanelIds(leaf.node).every(id => carried.has(id))))\n return undefined;\n const before = geometry.byKey.get(`${prefix}.${first}`);\n const after = geometry.byKey.get(`${prefix}.${last}`);\n if (!before || !after) return undefined;\n return parent.node.axis === 'horizontal'\n ? {\n x: before.rect.x,\n y: parent.rect.y,\n width: after.rect.x + after.rect.width - before.rect.x,\n height: parent.rect.height\n }\n : {\n x: parent.rect.x,\n y: before.rect.y,\n width: parent.rect.width,\n height: after.rect.y + after.rect.height - before.rect.y\n };\n}\n\nfunction commonRegion(keys: string[]): string {\n const parts = keys[0]!.split('.');\n while (!keys.every(key => descendant(key, parts.join('.')))) {\n parts.pop();\n }\n return parts.join('.');\n}\n\nfunction descendant(key: string, parent: string): boolean {\n return key === parent || key.startsWith(`${parent}.`);\n}\n\nfunction childRange(keys: string[], parent: string) {\n const depth = parent.split('.').length;\n const indices = keys.map(key => Number(key.split('.')[depth]));\n return { depth, first: Math.min(...indices), last: Math.max(...indices) };\n}\n"],"mappings":"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"}
|