@tutti-os/workbench-surface 0.0.42 → 0.0.44
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/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/store/commands.ts","../src/core/types.ts","../src/core/geometry.ts","../src/core/stack.ts","../src/core/reducer.ts","../src/store/subscribe.ts","../src/store/createWorkbenchStore.ts","../src/store/createWorkbenchController.ts","../src/host/WorkbenchHost.tsx","../src/mission-control/WorkbenchMissionControlOverlay.tsx","../src/mission-control/layoutDock.ts","../src/mission-control/useWorkbenchMissionControlPresence.ts","../src/mission-control/useWorkbenchMissionControlState.ts","../src/mission-control/layout.ts","../src/react/WorkbenchSurface.tsx","../src/react/WorkbenchDockFrame.tsx","../src/core/selectors.ts","../src/react/WorkbenchProvider.tsx","../src/react/dockNodeSelectors.ts","../src/react/hooks/useWorkbenchSelector.ts","../src/react/WorkbenchNodeLayer.tsx","../src/react/WorkbenchWindowFrame.tsx","../src/react/WorkbenchWindowTrafficLights.tsx","../src/react/WorkbenchWindowFullscreenToggle.tsx","../src/react/hooks/useWorkbenchDrag.ts","../src/react/hooks/useWorkbenchSnap.ts","../src/react/hooks/workbenchSnapTarget.ts","../src/react/hooks/useWorkbenchResize.ts","../src/react/windowHeader.ts","../src/react/renderedNodeIds.ts","../src/react/hooks/useWorkbenchShortcuts.ts","../src/react/hooks/workbenchShortcutIntent.ts","../src/react/hooks/useWorkbenchSurfaceSize.ts","../src/react/useWorkbenchGenieAnimation.tsx","../src/react/genieAnimation.ts","../src/host/hostConfig.ts","../src/host/useWorkbenchHostRuntime.ts","../src/store/createDerivedSnapshotGetter.ts","../src/host/activations.ts","../src/host/missionControlAdapter.ts","../src/core/snapshot.ts","../src/core/placement.ts","../src/host/nodeIdentity.ts","../src/host/sessionState.ts","../src/host/externalState.ts","../src/host/snapshotSanitizer.ts","../src/host/session.ts","../src/host/useWorkbenchHostSurfaceRenderers.tsx","../src/host/WorkbenchHostDock.tsx","../src/host/dockEntries.ts","../src/host/dockMagnification.ts","../src/host/dockScrollState.ts","../src/host/minimizedDockSlots.ts","../src/host/minimizedDockStackPromotion.ts","../src/host/minimizedDockRestoreIntent.ts","../src/host/WorkbenchHostDockPopup.tsx","../src/host/minimizedStackScroll.ts","../src/host/windowActions.ts","../src/host/hostNodeContext.ts","../src/host/WorkbenchHostWindowActions.tsx"],"sourcesContent":["import type {\n WorkbenchFrame,\n WorkbenchLayoutPreset,\n WorkbenchNode,\n WorkbenchNodeSizeConstraints,\n WorkbenchQuickLayoutTarget,\n WorkbenchLayoutConstraintsInput,\n WorkbenchSize,\n WorkbenchSnapTarget,\n WorkbenchState\n} from \"../core/types.ts\";\nimport type { WorkbenchStore } from \"./types.ts\";\n\nexport interface WorkbenchCommands<TData = unknown> {\n replaceState(state: Partial<WorkbenchState<TData>>): void;\n replaceNodes(nodes: WorkbenchNode<TData>[]): void;\n openNode(node: WorkbenchNode<TData>): void;\n closeNode(nodeID: string): void;\n focusNode(nodeID: string): void;\n minimizeNode(nodeID: string): void;\n restoreNode(nodeID: string): void;\n enterFullscreen(nodeID: string): void;\n exitFullscreen(nodeID: string): void;\n applyQuickLayout(nodeID: string, target: WorkbenchQuickLayoutTarget): void;\n applyLayoutPreset(nodeIDs: string[], preset: WorkbenchLayoutPreset): void;\n applyVisibleLayoutPreset(preset: WorkbenchLayoutPreset): void;\n applyActiveSnapTarget(nodeID: string): void;\n applySnapTarget(nodeID: string, snapTarget: WorkbenchSnapTarget): void;\n dragNode(nodeID: string, frame: WorkbenchFrame): void;\n moveNode(nodeID: string, frame: WorkbenchFrame): void;\n resizeNode(nodeID: string, frame: WorkbenchFrame): void;\n setActiveDragNode(nodeID: string | null): void;\n setActiveResizeNode(nodeID: string | null): void;\n setActiveSnapTarget(snapTarget: WorkbenchSnapTarget): void;\n setSurfaceSize(size: WorkbenchSize): void;\n setLayoutConstraints(constraints: WorkbenchLayoutConstraintsInput): void;\n setNodeSizeConstraints(\n nodeID: string,\n sizeConstraints: WorkbenchNodeSizeConstraints | null\n ): void;\n}\n\nexport function createWorkbenchCommands<TData>(\n store: WorkbenchStore<TData>\n): WorkbenchCommands<TData> {\n return {\n replaceState(state) {\n store.dispatch({ type: \"replaceState\", state });\n },\n replaceNodes(nodes) {\n store.dispatch({ type: \"replaceNodes\", nodes });\n },\n openNode(node) {\n store.dispatch({ type: \"openNode\", node });\n },\n closeNode(nodeID) {\n store.dispatch({ type: \"closeNode\", nodeID });\n },\n focusNode(nodeID) {\n store.dispatch({ type: \"focusNode\", nodeID });\n },\n minimizeNode(nodeID) {\n store.dispatch({ type: \"minimizeNode\", nodeID });\n },\n restoreNode(nodeID) {\n store.dispatch({ type: \"restoreNode\", nodeID });\n },\n enterFullscreen(nodeID) {\n store.dispatch({ type: \"enterFullscreen\", nodeID });\n },\n exitFullscreen(nodeID) {\n store.dispatch({ type: \"exitFullscreen\", nodeID });\n },\n applyQuickLayout(nodeID, target) {\n store.dispatch({ type: \"applyQuickLayout\", nodeID, target });\n },\n applyLayoutPreset(nodeIDs, preset) {\n store.dispatch({ type: \"applyLayoutPreset\", nodeIDs, preset });\n },\n applyVisibleLayoutPreset(preset) {\n store.dispatch({ type: \"applyVisibleLayoutPreset\", preset });\n },\n applyActiveSnapTarget(nodeID) {\n store.dispatch({ type: \"applyActiveSnapTarget\", nodeID });\n },\n applySnapTarget(nodeID, snapTarget) {\n store.dispatch({ type: \"applySnapTarget\", nodeID, snapTarget });\n },\n dragNode(nodeID, frame) {\n store.dispatch({ type: \"dragNode\", nodeID, frame });\n },\n moveNode(nodeID, frame) {\n store.dispatch({ type: \"moveNode\", nodeID, frame });\n },\n resizeNode(nodeID, frame) {\n store.dispatch({ type: \"resizeNode\", nodeID, frame });\n },\n setActiveDragNode(nodeID) {\n store.dispatch({ type: \"setActiveDragNode\", nodeID });\n },\n setActiveResizeNode(nodeID) {\n store.dispatch({ type: \"setActiveResizeNode\", nodeID });\n },\n setActiveSnapTarget(snapTarget) {\n store.dispatch({ type: \"setActiveSnapTarget\", snapTarget });\n },\n setSurfaceSize(size) {\n store.dispatch({ type: \"setSurfaceSize\", size });\n },\n setLayoutConstraints(constraints) {\n store.dispatch({ type: \"setLayoutConstraints\", constraints });\n },\n setNodeSizeConstraints(nodeID, sizeConstraints) {\n store.dispatch({\n type: \"setNodeSizeConstraints\",\n nodeID,\n sizeConstraints\n });\n }\n };\n}\n","import type {\n WorkbenchFrame as WorkbenchSnapshotFrame,\n WorkbenchSnapshotDisplayModeV1\n} from \"@tutti-os/workbench-snapshot\";\n\nexport interface WorkbenchSize {\n width: number;\n height: number;\n}\n\nexport type WorkbenchFrame = WorkbenchSnapshotFrame;\n\nexport interface WorkbenchSafeArea {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport type WorkbenchDisplayMode = WorkbenchSnapshotDisplayModeV1;\nexport type WorkbenchSnapTarget =\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | null;\nexport type WorkbenchQuickLayoutTarget =\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"center\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\nexport type WorkbenchLayoutPreset =\n | { kind: \"balanced\" }\n | { kind: \"row\" }\n | { kind: \"column\" };\nexport type WorkbenchResizeHandle =\n | \"north\"\n | \"east\"\n | \"south\"\n | \"west\"\n | \"north-east\"\n | \"north-west\"\n | \"south-east\"\n | \"south-west\";\n\nexport interface WorkbenchNode<TData = unknown> {\n id: string;\n kind: string;\n title: string;\n frame: WorkbenchFrame;\n displayMode: WorkbenchDisplayMode;\n restoreFrame: WorkbenchFrame | null;\n isMinimized: boolean;\n minimizedAtUnixMs?: number | null;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n data: TData;\n}\n\nexport interface WorkbenchNodeSizeConstraints {\n minWidth?: number;\n minHeight?: number;\n}\n\nexport interface WorkbenchState<TData = unknown> {\n nodes: WorkbenchNode<TData>[];\n nodeStack: string[];\n activeDragNodeId: string | null;\n activeResizeNodeId: string | null;\n activeSnapTarget: WorkbenchSnapTarget;\n surfaceSize: WorkbenchSize;\n layoutConstraints: WorkbenchLayoutConstraints;\n}\n\nexport interface WorkbenchLayoutConstraints {\n minWidth: number;\n minHeight: number;\n surfacePadding: number;\n safeArea: WorkbenchSafeArea;\n}\n\nexport interface WorkbenchLayoutConstraintsInput extends Partial<\n Omit<WorkbenchLayoutConstraints, \"safeArea\">\n> {\n safeArea?: Partial<WorkbenchSafeArea>;\n}\n\nexport const defaultWorkbenchSafeArea: WorkbenchSafeArea = {\n top: 52,\n right: 0,\n bottom: 88,\n left: 0\n};\n\nexport const defaultWorkbenchLayoutConstraints: WorkbenchLayoutConstraints = {\n minWidth: 280,\n minHeight: 160,\n surfacePadding: 0,\n safeArea: defaultWorkbenchSafeArea\n};\n\nexport const defaultWorkbenchSurfaceSize: WorkbenchSize = {\n width: 1024,\n height: 720\n};\n","import {\n defaultWorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchLayoutPreset,\n type WorkbenchLayoutConstraints,\n type WorkbenchLayoutConstraintsInput,\n type WorkbenchNodeSizeConstraints,\n type WorkbenchQuickLayoutTarget,\n type WorkbenchSafeArea,\n type WorkbenchSize,\n type WorkbenchSnapTarget\n} from \"./types.ts\";\n\nexport const WORKBENCH_MIN_VISIBLE_PX = 40;\nexport const WORKBENCH_LAYOUT_PRESET_GAP_PX = 12;\nexport const WORKBENCH_EDGE_SNAP_THRESHOLD_PX = 24;\n\nexport function normalizeWorkbenchLayoutConstraints(\n constraints: WorkbenchLayoutConstraintsInput = {}\n): WorkbenchLayoutConstraints {\n return {\n minWidth:\n constraints.minWidth ?? defaultWorkbenchLayoutConstraints.minWidth,\n minHeight:\n constraints.minHeight ?? defaultWorkbenchLayoutConstraints.minHeight,\n surfacePadding:\n constraints.surfacePadding ??\n defaultWorkbenchLayoutConstraints.surfacePadding,\n safeArea: normalizeWorkbenchSafeArea(constraints.safeArea)\n };\n}\n\nexport function normalizeWorkbenchSafeArea(\n safeArea: Partial<WorkbenchSafeArea> = {}\n): WorkbenchSafeArea {\n return {\n top: Math.max(0, safeArea.top ?? 0),\n right: Math.max(0, safeArea.right ?? 0),\n bottom: Math.max(0, safeArea.bottom ?? 0),\n left: Math.max(0, safeArea.left ?? 0)\n };\n}\n\nexport function getWorkbenchLayoutFrame(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const width = Math.max(\n normalized.minWidth,\n surfaceSize.width - normalized.safeArea.left - normalized.safeArea.right\n );\n const height = Math.max(\n normalized.minHeight,\n surfaceSize.height - normalized.safeArea.top - normalized.safeArea.bottom\n );\n\n return {\n x: normalized.safeArea.left,\n y: normalized.safeArea.top,\n width,\n height\n };\n}\n\nexport function clampWorkbenchRect(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const frame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n const width = clamp(\n rect.width,\n normalized.minWidth,\n Math.max(normalized.minWidth, frame.width - normalized.surfacePadding * 2)\n );\n const height = clamp(\n rect.height,\n normalized.minHeight,\n Math.max(normalized.minHeight, frame.height - normalized.surfacePadding * 2)\n );\n const maxX = Math.max(\n frame.x + normalized.surfacePadding,\n frame.x + frame.width - width - normalized.surfacePadding\n );\n const maxY = Math.max(\n frame.y + normalized.surfacePadding,\n frame.y + frame.height - height - normalized.surfacePadding\n );\n\n return {\n x: clamp(rect.x, frame.x + normalized.surfacePadding, maxX),\n y: clamp(rect.y, frame.y + normalized.surfacePadding, maxY),\n width,\n height\n };\n}\n\nexport function clampWorkbenchRectToVisibleArea(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n minVisiblePx = WORKBENCH_MIN_VISIBLE_PX,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const visibleFrame = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const sizedRect = clampWorkbenchRect(\n {\n ...rect,\n x: visibleFrame.x,\n y: visibleFrame.y\n },\n surfaceSize,\n normalized\n );\n const minVisibleX = Math.min(minVisiblePx, visibleFrame.width);\n const minVisibleY = Math.min(minVisiblePx, visibleFrame.height);\n const minX = visibleFrame.x + minVisibleX - sizedRect.width;\n const maxX = visibleFrame.x + visibleFrame.width - minVisibleX;\n const minY = visibleFrame.y + minVisibleY - sizedRect.height;\n const maxY = visibleFrame.y + visibleFrame.height - minVisibleY;\n\n return {\n ...sizedRect,\n x: Math.round(clamp(rect.x, minX, maxX)),\n y: Math.round(clamp(rect.y, minY, maxY))\n };\n}\n\nexport function clampWorkbenchDragRect(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const layoutFrame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n const visibleRect = clampWorkbenchRectToVisibleArea(\n rect,\n surfaceSize,\n normalized,\n WORKBENCH_MIN_VISIBLE_PX\n );\n\n return {\n ...visibleRect,\n y: Math.max(layoutFrame.y + normalized.surfacePadding, visibleRect.y)\n };\n}\n\nexport function getWorkbenchFullscreenRect(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const fullscreenSafeArea = {\n ...normalized.safeArea,\n bottom: 0,\n left: 0\n };\n return {\n x: fullscreenSafeArea.left + normalized.surfacePadding,\n y: fullscreenSafeArea.top + normalized.surfacePadding,\n width: Math.max(\n normalized.minWidth,\n surfaceSize.width -\n fullscreenSafeArea.left -\n fullscreenSafeArea.right -\n normalized.surfacePadding * 2\n ),\n height: Math.max(\n normalized.minHeight,\n surfaceSize.height -\n fullscreenSafeArea.top -\n fullscreenSafeArea.bottom -\n normalized.surfacePadding * 2\n )\n };\n}\n\nexport function getWorkbenchSnapRect(\n snapTarget: WorkbenchSnapTarget,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame | null {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const full = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const halfWidth = Math.round(full.width / 2);\n const halfHeight = Math.round(full.height / 2);\n const clampSnapRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n\n switch (snapTarget) {\n case \"left\":\n return clampSnapRect({ ...full, width: halfWidth });\n case \"right\":\n return clampSnapRect({\n ...full,\n x: full.x + full.width - halfWidth,\n width: halfWidth\n });\n case \"top\":\n return clampSnapRect(full);\n case \"bottom\":\n return clampSnapRect({\n ...full,\n y: full.y + full.height - halfHeight,\n height: halfHeight\n });\n case \"top-left\":\n return clampSnapRect({ ...full, width: halfWidth, height: halfHeight });\n case \"top-right\":\n return clampSnapRect({\n ...full,\n x: full.x + full.width - halfWidth,\n width: halfWidth,\n height: halfHeight\n });\n case \"bottom-left\":\n return clampSnapRect({\n ...full,\n y: full.y + full.height - halfHeight,\n width: halfWidth,\n height: halfHeight\n });\n case \"bottom-right\":\n return clampSnapRect({\n ...full,\n x: full.x + full.width - halfWidth,\n y: full.y + full.height - halfHeight,\n width: halfWidth,\n height: halfHeight\n });\n case null:\n return null;\n }\n}\n\nexport function getWorkbenchQuickLayoutRect(\n target: WorkbenchQuickLayoutTarget,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const full = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const halfWidth = Math.round(full.width / 2);\n const halfHeight = Math.round(full.height / 2);\n const clampQuickLayoutRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n\n switch (target) {\n case \"left\":\n return clampQuickLayoutRect({\n ...full,\n width: Math.round(full.width / 4)\n });\n case \"right\": {\n const width = Math.round(full.width / 4);\n return clampQuickLayoutRect({\n ...full,\n x: full.x + full.width - width,\n width\n });\n }\n case \"top\":\n return clampQuickLayoutRect({\n ...full,\n height: Math.round(full.height / 2)\n });\n case \"bottom\": {\n return clampQuickLayoutRect({\n ...full,\n y: full.y + full.height - halfHeight,\n height: halfHeight\n });\n }\n case \"center\": {\n const width = Math.round(full.width * 0.72);\n const height = Math.round(full.height * 0.72);\n return clampQuickLayoutRect({\n x: full.x + Math.round((full.width - width) / 2),\n y: full.y + Math.round((full.height - height) / 2),\n width,\n height\n });\n }\n case \"top-left\":\n return clampQuickLayoutRect({\n ...full,\n width: halfWidth,\n height: halfHeight\n });\n case \"top-right\":\n return clampQuickLayoutRect({\n ...full,\n x: full.x + full.width - halfWidth,\n width: halfWidth,\n height: halfHeight\n });\n case \"bottom-left\":\n return clampQuickLayoutRect({\n ...full,\n y: full.y + full.height - halfHeight,\n width: halfWidth,\n height: halfHeight\n });\n case \"bottom-right\":\n return clampQuickLayoutRect({\n ...full,\n x: full.x + full.width - halfWidth,\n y: full.y + full.height - halfHeight,\n width: halfWidth,\n height: halfHeight\n });\n }\n}\n\nfunction resolveWorkbenchRectConstraints(\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchLayoutConstraints {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n return {\n ...normalized,\n minHeight: Math.max(\n normalized.minHeight,\n normalizeNodeMinimum(sizeConstraints?.minHeight)\n ),\n minWidth: Math.max(\n normalized.minWidth,\n normalizeNodeMinimum(sizeConstraints?.minWidth)\n )\n };\n}\n\nfunction normalizeNodeMinimum(value: number | undefined): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : 0;\n}\n\nexport function getWorkbenchLayoutPresetFrames(\n itemCount: number,\n preset: WorkbenchLayoutPreset,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n if (itemCount <= 0) {\n return [];\n }\n\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const frame = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n switch (preset.kind) {\n case \"balanced\":\n return getBalancedLayoutFrames(itemCount, frame, normalized);\n case \"row\":\n return getGridLayoutFrames(itemCount, itemCount, frame, normalized);\n case \"column\":\n return getSingleColumnLayoutFrames(itemCount, frame, normalized);\n }\n}\n\nfunction getWorkbenchSafeLayoutRect(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const frame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n return {\n x: frame.x + normalized.surfacePadding,\n y: frame.y + normalized.surfacePadding,\n width: Math.max(\n normalized.minWidth,\n frame.width - normalized.surfacePadding * 2\n ),\n height: Math.max(\n normalized.minHeight,\n frame.height - normalized.surfacePadding * 2\n )\n };\n}\n\nexport function inferWorkbenchSnapTarget(\n dragPoint: Pick<WorkbenchFrame, \"x\" | \"y\">,\n surfaceSize: WorkbenchSize,\n threshold = 0,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchSnapTarget {\n const frame = getWorkbenchLayoutFrame(surfaceSize, constraints);\n const crossesLeft =\n threshold > 0\n ? dragPoint.x <= frame.x + threshold\n : dragPoint.x < frame.x || (frame.x === 0 && dragPoint.x <= 0);\n const crossesRight =\n threshold > 0\n ? dragPoint.x >= frame.x + frame.width - threshold\n : dragPoint.x > frame.x + frame.width ||\n (frame.x + frame.width === surfaceSize.width &&\n dragPoint.x >= surfaceSize.width);\n const crossesTop =\n threshold > 0\n ? dragPoint.y <= frame.y + threshold\n : dragPoint.y < frame.y || (frame.y === 0 && dragPoint.y <= 0);\n const crossesBottom =\n threshold > 0\n ? dragPoint.y >= frame.y + frame.height - threshold\n : dragPoint.y > frame.y + frame.height ||\n (frame.y + frame.height === surfaceSize.height &&\n dragPoint.y >= surfaceSize.height);\n\n if (crossesTop && crossesLeft) {\n return \"top-left\";\n }\n if (crossesTop && crossesRight) {\n return \"top-right\";\n }\n if (crossesBottom && crossesLeft) {\n return \"bottom-left\";\n }\n if (crossesBottom && crossesRight) {\n return \"bottom-right\";\n }\n if (crossesTop) {\n return \"top\";\n }\n if (crossesBottom) {\n return \"bottom\";\n }\n if (crossesLeft) {\n return \"left\";\n }\n if (crossesRight) {\n return \"right\";\n }\n return null;\n}\n\nexport function rectsEqual(\n left: WorkbenchFrame,\n right: WorkbenchFrame\n): boolean {\n return (\n left.x === right.x &&\n left.y === right.y &&\n left.width === right.width &&\n left.height === right.height\n );\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction getGridLayoutFrames(\n itemCount: number,\n columns: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n const rows = Math.ceil(itemCount / columns);\n const horizontalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, columns - 1);\n const verticalGap = WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, rows - 1);\n const cellWidth = Math.floor((frame.width - horizontalGap) / columns);\n const cellHeight = Math.floor((frame.height - verticalGap) / rows);\n\n if (cellWidth < constraints.minWidth || cellHeight < constraints.minHeight) {\n return null;\n }\n\n const contentHeight =\n rows * cellHeight + (rows - 1) * WORKBENCH_LAYOUT_PRESET_GAP_PX;\n let index = 0;\n const frames: WorkbenchFrame[] = [];\n\n for (let rowIndex = 0; rowIndex < rows; rowIndex += 1) {\n const remaining = itemCount - index;\n const itemsInRow = Math.min(columns, remaining);\n const rowWidth =\n itemsInRow * cellWidth +\n Math.max(0, itemsInRow - 1) * WORKBENCH_LAYOUT_PRESET_GAP_PX;\n const rowX = frame.x + Math.round((frame.width - rowWidth) / 2);\n const rowY =\n frame.y +\n Math.round((frame.height - contentHeight) / 2) +\n rowIndex * (cellHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX);\n\n for (let columnIndex = 0; columnIndex < itemsInRow; columnIndex += 1) {\n frames.push({\n x: rowX + columnIndex * (cellWidth + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n y: rowY,\n width: cellWidth,\n height: cellHeight\n });\n index += 1;\n }\n }\n\n return frames;\n}\n\nfunction getBalancedLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n if (itemCount === 1) {\n return [frame];\n }\n\n if (itemCount === 2) {\n return getGridLayoutFrames(itemCount, 2, frame, constraints);\n }\n\n if (itemCount >= 4) {\n return getBestBalancedGridLayoutFrames(itemCount, frame, constraints);\n }\n\n const gap = WORKBENCH_LAYOUT_PRESET_GAP_PX;\n const primaryWidth = Math.floor((frame.width - gap) * 0.58);\n const secondaryWidth = frame.width - gap - primaryWidth;\n\n if (\n primaryWidth < constraints.minWidth ||\n secondaryWidth < constraints.minWidth\n ) {\n return null;\n }\n\n const secondaryCount = itemCount - 1;\n const verticalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, secondaryCount - 1);\n const secondaryHeight = Math.floor(\n (frame.height - verticalGap) / secondaryCount\n );\n\n if (secondaryHeight < constraints.minHeight) {\n return null;\n }\n\n const frames: WorkbenchFrame[] = [\n {\n x: frame.x,\n y: frame.y,\n width: primaryWidth,\n height: frame.height\n }\n ];\n\n const secondaryX = frame.x + primaryWidth + gap;\n for (let index = 0; index < secondaryCount; index += 1) {\n frames.push({\n x: secondaryX,\n y: frame.y + index * (secondaryHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n width: secondaryWidth,\n height: secondaryHeight\n });\n }\n\n return frames;\n}\n\nfunction getBestBalancedGridLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n let best: {\n columns: number;\n emptySlots: number;\n frames: WorkbenchFrame[];\n shapeDistance: number;\n } | null = null;\n\n for (let columns = 2; columns <= itemCount; columns += 1) {\n const rows = Math.ceil(itemCount / columns);\n const frames = getGridLayoutFrames(itemCount, columns, frame, constraints);\n if (!frames) {\n continue;\n }\n\n const candidate = {\n columns,\n emptySlots: rows * columns - itemCount,\n frames,\n shapeDistance: Math.abs(columns - rows)\n };\n\n if (\n !best ||\n candidate.shapeDistance < best.shapeDistance ||\n (candidate.shapeDistance === best.shapeDistance &&\n candidate.emptySlots < best.emptySlots) ||\n (candidate.shapeDistance === best.shapeDistance &&\n candidate.emptySlots === best.emptySlots &&\n candidate.columns < best.columns)\n ) {\n best = candidate;\n }\n }\n\n return best?.frames ?? null;\n}\n\nfunction getSingleColumnLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n const verticalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, itemCount - 1);\n const cellHeight = Math.floor((frame.height - verticalGap) / itemCount);\n\n if (cellHeight < constraints.minHeight) {\n return null;\n }\n\n const frames: WorkbenchFrame[] = [];\n for (let index = 0; index < itemCount; index += 1) {\n frames.push({\n x: frame.x,\n y: frame.y + index * (cellHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n width: frame.width,\n height: cellHeight\n });\n }\n\n return frames;\n}\n","import type { WorkbenchNode } from \"./types.ts\";\n\nexport function normalizeWorkbenchStack(\n nodes: readonly WorkbenchNode[],\n stack: readonly string[]\n): string[] {\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const normalized = Array.from(new Set(stack)).filter((id) => nodeIDs.has(id));\n\n for (const node of nodes) {\n if (!normalized.includes(node.id)) {\n normalized.push(node.id);\n }\n }\n\n return normalized;\n}\n\nexport function focusWorkbenchStack(\n stack: readonly string[],\n nodeID: string\n): string[] {\n return [...stack.filter((id) => id !== nodeID), nodeID];\n}\n\nexport function removeFromWorkbenchStack(\n stack: readonly string[],\n nodeID: string\n): string[] {\n return stack.filter((id) => id !== nodeID);\n}\n\nexport function orderWorkbenchNodesForRender<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n stack: readonly string[]\n): WorkbenchNode<TData>[] {\n const order = new Map(stack.map((id, index) => [id, index]));\n return [...nodes].sort(\n (left, right) =>\n (order.get(left.id) ?? Number.MAX_SAFE_INTEGER) -\n (order.get(right.id) ?? Number.MAX_SAFE_INTEGER)\n );\n}\n","import type { WorkbenchAction } from \"./actions.ts\";\nimport {\n clampWorkbenchDragRect,\n clampWorkbenchRect,\n clampWorkbenchRectToVisibleArea,\n getWorkbenchFullscreenRect,\n getWorkbenchLayoutPresetFrames,\n getWorkbenchQuickLayoutRect,\n getWorkbenchSnapRect,\n normalizeWorkbenchLayoutConstraints,\n rectsEqual\n} from \"./geometry.ts\";\nimport {\n focusWorkbenchStack,\n normalizeWorkbenchStack,\n removeFromWorkbenchStack\n} from \"./stack.ts\";\nimport {\n defaultWorkbenchSurfaceSize,\n defaultWorkbenchLayoutConstraints,\n type WorkbenchLayoutPreset,\n type WorkbenchNode,\n type WorkbenchState\n} from \"./types.ts\";\n\nexport function createWorkbenchInitialState<TData = unknown>(\n partial: Partial<WorkbenchState<TData>> = {}\n): WorkbenchState<TData> {\n const nodes = partial.nodes ?? [];\n return {\n nodes,\n nodeStack: normalizeWorkbenchStack(nodes, partial.nodeStack ?? []),\n activeDragNodeId: partial.activeDragNodeId ?? null,\n activeResizeNodeId: partial.activeResizeNodeId ?? null,\n activeSnapTarget: partial.activeSnapTarget ?? null,\n surfaceSize: partial.surfaceSize ?? defaultWorkbenchSurfaceSize,\n layoutConstraints: normalizeWorkbenchLayoutConstraints(\n partial.layoutConstraints ?? defaultWorkbenchLayoutConstraints\n )\n };\n}\n\nexport function reduceWorkbenchState<TData>(\n state: WorkbenchState<TData>,\n action: WorkbenchAction<TData>\n): WorkbenchState<TData> {\n switch (action.type) {\n case \"replaceState\": {\n const nextState = createWorkbenchInitialState({\n ...state,\n ...action.state\n });\n if (\n state.nodes === nextState.nodes &&\n state.nodeStack === nextState.nodeStack &&\n state.activeDragNodeId === nextState.activeDragNodeId &&\n state.activeResizeNodeId === nextState.activeResizeNodeId &&\n state.activeSnapTarget === nextState.activeSnapTarget &&\n state.surfaceSize === nextState.surfaceSize &&\n layoutConstraintsEqual(\n state.layoutConstraints,\n nextState.layoutConstraints\n )\n ) {\n return state;\n }\n return nextState;\n }\n\n case \"replaceNodes\": {\n const nodeStack = normalizeWorkbenchStack(action.nodes, state.nodeStack);\n if (state.nodes === action.nodes && state.nodeStack === nodeStack) {\n return state;\n }\n return { ...state, nodes: action.nodes, nodeStack };\n }\n\n case \"openNode\": {\n const existing = state.nodes.some((node) => node.id === action.node.id);\n const nodes = existing\n ? state.nodes.map((node) =>\n node.id === action.node.id ? action.node : node\n )\n : [...state.nodes, action.node];\n return {\n ...state,\n nodes,\n nodeStack: focusWorkbenchStack(\n normalizeWorkbenchStack(nodes, state.nodeStack),\n action.node.id\n )\n };\n }\n\n case \"closeNode\":\n if (!state.nodes.some((node) => node.id === action.nodeID)) {\n return state;\n }\n return {\n ...state,\n nodes: state.nodes.filter((node) => node.id !== action.nodeID),\n nodeStack: removeFromWorkbenchStack(state.nodeStack, action.nodeID)\n };\n\n case \"focusNode\":\n if (!state.nodes.some((node) => node.id === action.nodeID)) {\n return state;\n }\n return {\n ...state,\n nodes: state.nodes.map((node) =>\n node.id === action.nodeID\n ? { ...node, isMinimized: false, minimizedAtUnixMs: null }\n : node\n ),\n nodeStack: focusWorkbenchStack(state.nodeStack, action.nodeID)\n };\n\n case \"minimizeNode\":\n return updateNode(state, action.nodeID, (node) =>\n node.isMinimized\n ? node\n : {\n ...node,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n }\n );\n\n case \"restoreNode\":\n return updateNode(state, action.nodeID, (node) =>\n node.isMinimized\n ? { ...node, isMinimized: false, minimizedAtUnixMs: null }\n : node\n );\n\n case \"enterFullscreen\":\n return updateNode(state, action.nodeID, (node) => {\n if (node.displayMode === \"fullscreen\") {\n return node;\n }\n return {\n ...node,\n displayMode: \"fullscreen\",\n restoreFrame: node.frame,\n isMinimized: false,\n minimizedAtUnixMs: null,\n frame: getWorkbenchFullscreenRect(\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n )\n };\n });\n\n case \"exitFullscreen\":\n return updateNode(state, action.nodeID, (node) => {\n if (node.displayMode !== \"fullscreen\") {\n return node;\n }\n return {\n ...node,\n displayMode: \"floating\",\n frame: node.restoreFrame ?? node.frame,\n restoreFrame: null\n };\n });\n\n case \"applyQuickLayout\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = getWorkbenchQuickLayoutRect(\n action.target,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (\n node.displayMode === \"floating\" &&\n !node.isMinimized &&\n node.restoreFrame === null &&\n rectsEqual(node.frame, frame)\n ) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\" as const,\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n case \"applyLayoutPreset\":\n return applyLayoutPresetToNodes(state, action.nodeIDs, action.preset);\n\n case \"applyVisibleLayoutPreset\":\n return applyLayoutPresetToNodes(\n state,\n state.nodes.filter((node) => !node.isMinimized).map((node) => node.id),\n action.preset\n );\n\n case \"applyActiveSnapTarget\":\n case \"applySnapTarget\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = getWorkbenchSnapRect(\n action.type === \"applySnapTarget\"\n ? action.snapTarget\n : state.activeSnapTarget,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (!frame) {\n return node;\n }\n if (\n node.displayMode === \"floating\" &&\n !node.isMinimized &&\n node.restoreFrame === null &&\n rectsEqual(node.frame, frame)\n ) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n case \"dragNode\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = clampWorkbenchDragRect(\n action.frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (rectsEqual(node.frame, frame)) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame:\n node.displayMode === \"fullscreen\" ? node.restoreFrame : null\n };\n });\n\n case \"moveNode\":\n case \"resizeNode\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = clampWorkbenchRect(\n action.frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (rectsEqual(node.frame, frame)) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame:\n node.displayMode === \"fullscreen\" ? node.restoreFrame : null\n };\n });\n\n case \"setActiveDragNode\":\n if (state.activeDragNodeId === action.nodeID) {\n return state;\n }\n return { ...state, activeDragNodeId: action.nodeID };\n\n case \"setActiveResizeNode\":\n if (state.activeResizeNodeId === action.nodeID) {\n return state;\n }\n return { ...state, activeResizeNodeId: action.nodeID };\n\n case \"setActiveSnapTarget\":\n if (state.activeSnapTarget === action.snapTarget) {\n return state;\n }\n return { ...state, activeSnapTarget: action.snapTarget };\n\n case \"setSurfaceSize\":\n if (\n state.surfaceSize.width === action.size.width &&\n state.surfaceSize.height === action.size.height\n ) {\n return state;\n }\n return {\n ...state,\n surfaceSize: action.size,\n nodes: state.nodes.map((node) =>\n node.displayMode === \"fullscreen\"\n ? {\n ...node,\n frame: getWorkbenchFullscreenRect(\n action.size,\n state.layoutConstraints,\n node.sizeConstraints\n )\n }\n : {\n ...node,\n frame: clampWorkbenchRectToVisibleArea(\n node.frame,\n action.size,\n state.layoutConstraints,\n undefined,\n node.sizeConstraints\n )\n }\n )\n };\n\n case \"setLayoutConstraints\": {\n const constraints = normalizeWorkbenchLayoutConstraints({\n ...state.layoutConstraints,\n ...action.constraints,\n safeArea: {\n ...state.layoutConstraints.safeArea,\n ...action.constraints.safeArea\n }\n });\n if (\n state.layoutConstraints.minWidth === constraints.minWidth &&\n state.layoutConstraints.minHeight === constraints.minHeight &&\n state.layoutConstraints.surfacePadding === constraints.surfacePadding &&\n state.layoutConstraints.safeArea.top === constraints.safeArea.top &&\n state.layoutConstraints.safeArea.right === constraints.safeArea.right &&\n state.layoutConstraints.safeArea.bottom ===\n constraints.safeArea.bottom &&\n state.layoutConstraints.safeArea.left === constraints.safeArea.left\n ) {\n return state;\n }\n return {\n ...state,\n layoutConstraints: constraints,\n nodes: state.nodes.map((node) =>\n node.displayMode === \"fullscreen\"\n ? {\n ...node,\n frame: getWorkbenchFullscreenRect(\n state.surfaceSize,\n constraints,\n node.sizeConstraints\n )\n }\n : {\n ...node,\n frame: clampWorkbenchRectToVisibleArea(\n node.frame,\n state.surfaceSize,\n constraints,\n undefined,\n node.sizeConstraints\n ),\n restoreFrame: node.restoreFrame\n ? clampWorkbenchRectToVisibleArea(\n node.restoreFrame,\n state.surfaceSize,\n constraints,\n undefined,\n node.sizeConstraints\n )\n : null\n }\n )\n };\n }\n\n case \"setNodeSizeConstraints\":\n return updateNode(state, action.nodeID, (node) => {\n if (\n sizeConstraintsEqual(node.sizeConstraints, action.sizeConstraints)\n ) {\n return node;\n }\n const frame =\n node.displayMode === \"fullscreen\"\n ? getWorkbenchFullscreenRect(\n state.surfaceSize,\n state.layoutConstraints,\n action.sizeConstraints\n )\n : clampWorkbenchRectToVisibleArea(\n node.frame,\n state.surfaceSize,\n state.layoutConstraints,\n undefined,\n action.sizeConstraints\n );\n const restoreFrame = node.restoreFrame\n ? clampWorkbenchRectToVisibleArea(\n node.restoreFrame,\n state.surfaceSize,\n state.layoutConstraints,\n undefined,\n action.sizeConstraints\n )\n : null;\n return {\n ...node,\n frame,\n restoreFrame,\n sizeConstraints: action.sizeConstraints\n };\n });\n }\n}\n\nfunction layoutConstraintsEqual(\n left: WorkbenchState[\"layoutConstraints\"],\n right: WorkbenchState[\"layoutConstraints\"]\n): boolean {\n return (\n left.minWidth === right.minWidth &&\n left.minHeight === right.minHeight &&\n left.surfacePadding === right.surfacePadding &&\n left.safeArea.top === right.safeArea.top &&\n left.safeArea.right === right.safeArea.right &&\n left.safeArea.bottom === right.safeArea.bottom &&\n left.safeArea.left === right.safeArea.left\n );\n}\n\nfunction sizeConstraintsEqual(\n left: WorkbenchNode[\"sizeConstraints\"],\n right: WorkbenchNode[\"sizeConstraints\"]\n): boolean {\n return (\n (left?.minWidth ?? null) === (right?.minWidth ?? null) &&\n (left?.minHeight ?? null) === (right?.minHeight ?? null)\n );\n}\n\nfunction updateNode<TData>(\n state: WorkbenchState<TData>,\n nodeID: string,\n update: (node: WorkbenchNode<TData>) => WorkbenchNode<TData>\n): WorkbenchState<TData> {\n let changed = false;\n const nodes = state.nodes.map((node) => {\n if (node.id !== nodeID) {\n return node;\n }\n\n const nextNode = update(node);\n changed = changed || nextNode !== node;\n return nextNode;\n });\n\n if (!changed) {\n return state;\n }\n\n return {\n ...state,\n nodes,\n nodeStack: focusWorkbenchStack(state.nodeStack, nodeID)\n };\n}\n\nfunction applyLayoutPresetToNodes<TData>(\n state: WorkbenchState<TData>,\n inputNodeIDs: readonly string[],\n preset: WorkbenchLayoutPreset\n): WorkbenchState<TData> {\n const nodeIDs = uniqueKnownNodeIDs(state.nodes, inputNodeIDs);\n if (nodeIDs.length === 0) {\n return state;\n }\n\n const frames = getWorkbenchLayoutPresetFrames(\n nodeIDs.length,\n preset,\n state.surfaceSize,\n state.layoutConstraints\n );\n if (!frames) {\n return state;\n }\n\n const frameByNodeID = new Map(\n nodeIDs.map((nodeID, index) => [nodeID, frames[index]] as const)\n );\n const nodes: WorkbenchNode<TData>[] = state.nodes.map((node) => {\n const frame = frameByNodeID.get(node.id);\n if (!frame) {\n return node;\n }\n const nextFrame = clampWorkbenchRect(\n frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n return {\n ...node,\n frame: nextFrame,\n displayMode: \"floating\" as const,\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n let nodeStack = state.nodeStack;\n for (const nodeID of nodeIDs) {\n nodeStack = focusWorkbenchStack(nodeStack, nodeID);\n }\n\n return { ...state, nodes, nodeStack };\n}\n\nfunction uniqueKnownNodeIDs<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n nodeIDs: readonly string[]\n): string[] {\n const knownNodeIDs = new Set(nodes.map((node) => node.id));\n const orderedNodeIDs: string[] = [];\n\n for (const nodeID of nodeIDs) {\n if (!knownNodeIDs.has(nodeID) || orderedNodeIDs.includes(nodeID)) {\n continue;\n }\n orderedNodeIDs.push(nodeID);\n }\n\n return orderedNodeIDs;\n}\n","import type { WorkbenchListener, WorkbenchUnsubscribe } from \"./types.ts\";\n\nexport function createWorkbenchSubscriptionSet() {\n const listeners = new Set<WorkbenchListener>();\n\n return {\n subscribe(listener: WorkbenchListener): WorkbenchUnsubscribe {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n notify(): void {\n for (const listener of listeners) {\n listener();\n }\n }\n };\n}\n","import type { WorkbenchAction } from \"../core/actions.ts\";\nimport {\n createWorkbenchInitialState,\n reduceWorkbenchState\n} from \"../core/reducer.ts\";\nimport type { WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchSubscriptionSet } from \"./subscribe.ts\";\nimport type { WorkbenchDebugDiagnostics, WorkbenchStore } from \"./types.ts\";\n\nexport function createWorkbenchStore<TData = unknown>(\n initialState: Partial<WorkbenchState<TData>> = {},\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics } = {}\n): WorkbenchStore<TData> {\n let state = createWorkbenchInitialState(initialState);\n const subscriptions = createWorkbenchSubscriptionSet();\n\n return {\n getSnapshot() {\n return state;\n },\n subscribe(listener) {\n return subscriptions.subscribe(listener);\n },\n dispatch(action: WorkbenchAction<TData>) {\n const nextState = reduceWorkbenchState(state, action);\n if (nextState === state) {\n return;\n }\n\n logWorkbenchFrameChanges(action, state, nextState, options);\n state = nextState;\n subscriptions.notify();\n }\n };\n}\n\nfunction logWorkbenchFrameChanges<TData>(\n action: WorkbenchAction<TData>,\n previousState: WorkbenchState<TData>,\n nextState: WorkbenchState<TData>,\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics }\n): void {\n if (!options.debugDiagnostics?.isEnabled()) {\n return;\n }\n\n const previousNodesByID = new Map(\n previousState.nodes.map((node) => [node.id, node])\n );\n const changes = nextState.nodes\n .map((node) => {\n const previousNode = previousNodesByID.get(node.id);\n if (!previousNode) {\n return {\n id: node.id,\n kind: \"opened\",\n nextFrame: node.frame\n };\n }\n if (\n previousNode.frame.x === node.frame.x &&\n previousNode.frame.y === node.frame.y &&\n previousNode.frame.width === node.frame.width &&\n previousNode.frame.height === node.frame.height\n ) {\n return null;\n }\n return {\n id: node.id,\n kind: \"frame-changed\",\n nextFrame: node.frame,\n previousFrame: previousNode.frame\n };\n })\n .filter((change): change is NonNullable<typeof change> => change !== null);\n\n if (changes.length === 0) {\n return;\n }\n\n console.info(\"[workbench:frame]\", {\n action: summarizeWorkbenchAction(action),\n changes,\n nextSurfaceSize: nextState.surfaceSize,\n previousSurfaceSize: previousState.surfaceSize\n });\n void Promise.resolve(\n options.debugDiagnostics.log?.({\n details: {\n action: summarizeWorkbenchAction(action),\n changes,\n nextSurfaceSize: nextState.surfaceSize,\n previousSurfaceSize: previousState.surfaceSize\n },\n event: \"frame-changed\",\n level: \"info\",\n source: \"workbench-frame\"\n })\n ).catch(() => undefined);\n}\n\nfunction summarizeWorkbenchAction<TData>(\n action: WorkbenchAction<TData>\n): Record<string, unknown> {\n switch (action.type) {\n case \"replaceState\":\n return {\n type: action.type,\n nodeCount: action.state.nodes?.length,\n nodeStack: action.state.nodeStack,\n surfaceSize: action.state.surfaceSize\n };\n case \"replaceNodes\":\n return {\n type: action.type,\n nodeIDs: action.nodes.map((node) => node.id)\n };\n case \"openNode\":\n return {\n type: action.type,\n frame: action.node.frame,\n nodeID: action.node.id\n };\n case \"dragNode\":\n case \"moveNode\":\n case \"resizeNode\":\n return {\n type: action.type,\n frame: action.frame,\n nodeID: action.nodeID\n };\n case \"setSurfaceSize\":\n return {\n type: action.type,\n size: action.size\n };\n case \"setLayoutConstraints\":\n return {\n type: action.type,\n constraints: action.constraints\n };\n case \"applyQuickLayout\":\n return {\n type: action.type,\n nodeID: action.nodeID,\n target: action.target\n };\n case \"applyLayoutPreset\":\n return {\n type: action.type,\n nodeIDs: action.nodeIDs,\n preset: action.preset\n };\n case \"applyVisibleLayoutPreset\":\n return {\n type: action.type,\n preset: action.preset\n };\n case \"applySnapTarget\":\n return {\n type: action.type,\n nodeID: action.nodeID,\n snapTarget: action.snapTarget\n };\n default:\n return \"nodeID\" in action\n ? { type: action.type, nodeID: action.nodeID }\n : { type: action.type };\n }\n}\n","import type { WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchCommands } from \"./commands.ts\";\nimport { createWorkbenchStore } from \"./createWorkbenchStore.ts\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"./types.ts\";\n\nexport function createWorkbenchController<TData = unknown>(\n initialState: Partial<WorkbenchState<TData>> = {},\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics } = {}\n): WorkbenchController<TData> {\n const store = createWorkbenchStore(initialState, options);\n\n return {\n ...store,\n commands: createWorkbenchCommands(store)\n };\n}\n","import { useMemo } from \"react\";\nimport {\n WorkbenchMissionControlBackdrop,\n WorkbenchMissionControlOverlay\n} from \"../mission-control/WorkbenchMissionControlOverlay.tsx\";\nimport { useWorkbenchMissionControlPresence } from \"../mission-control/useWorkbenchMissionControlPresence.ts\";\nimport { useWorkbenchMissionControlState } from \"../mission-control/useWorkbenchMissionControlState.ts\";\nimport { WorkbenchSurface } from \"../react/WorkbenchSurface.tsx\";\nimport {\n resolveWorkbenchHostDockEntries,\n resolveWorkbenchHostRuntimeConfig\n} from \"./hostConfig.ts\";\nimport type { WorkbenchHostNodeData, WorkbenchHostProps } from \"./types.ts\";\nimport { useWorkbenchHostRuntime } from \"./useWorkbenchHostRuntime.ts\";\nimport { useWorkbenchHostSurfaceRenderers } from \"./useWorkbenchHostSurfaceRenderers.tsx\";\n\nconst noop = () => {};\n\nexport function WorkbenchHost({\n captureNodePreviewImage,\n className,\n contributions,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockEntries,\n dockStateSource,\n externalStateSource,\n i18n,\n layoutConstraints,\n missionControl,\n minimizeAnimation,\n nodes,\n onDockEntryAction,\n onDockEntryClick,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onMissionControlRequestOpen,\n onNodeCloseRequest,\n projectedNodes,\n renderBottomChrome,\n renderTopChrome,\n snapshotRepository,\n shortcutsEnabled,\n wallpaper,\n windowManagement,\n workspaceId\n}: WorkbenchHostProps) {\n const hostRuntimeConfig = useMemo(\n () =>\n resolveWorkbenchHostRuntimeConfig({\n contributions,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest\n }),\n [\n contributions,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest\n ]\n );\n const hostDockEntries = useMemo(\n () =>\n resolveWorkbenchHostDockEntries({\n contributions,\n dockEntries\n }),\n [contributions, dockEntries]\n );\n const missionControlMode = missionControl?.mode ?? null;\n const missionControlNodeIds = missionControl?.nodeIds;\n const missionControlClose = missionControl?.onRequestClose ?? noop;\n const missionControlEnabled =\n missionControlMode !== null || onMissionControlAdapterReady !== undefined;\n const {\n chromeContext,\n externalStateRevision,\n hostI18n,\n hostSession,\n isHydrating,\n missionControlI18n,\n missionControlAdapter,\n nodeDefinitionByType,\n windowChromeI18n\n } = useWorkbenchHostRuntime({\n debugDiagnostics,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n i18n,\n missionControlEnabled,\n nodes: hostRuntimeConfig.nodes,\n onHandleReady,\n onLaunchRequest: hostRuntimeConfig.onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest: hostRuntimeConfig.onNodeCloseRequest,\n projectedNodes,\n snapshotRepository,\n workspaceId\n });\n const surfaceRenderers = useWorkbenchHostSurfaceRenderers({\n captureNodePreviewImage,\n chromeContext,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockStateSource,\n dockEntries: hostDockEntries,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n externalStateRevision,\n hostI18n,\n hostSession,\n nodeDefinitionByType,\n onDockEntryAction,\n onDockEntryClick,\n onMissionControlRequestOpen,\n renderBottomChrome,\n renderTopChrome,\n workspaceId\n });\n const missionControlState = useWorkbenchMissionControlState({\n adapter: missionControlAdapter,\n mode: missionControlMode,\n nodeIds: missionControlNodeIds,\n onRequestClose: missionControlClose\n });\n const missionControlPresence =\n useWorkbenchMissionControlPresence(missionControlState);\n const missionControlRenderedState = missionControlPresence.state;\n\n return (\n <WorkbenchSurface<WorkbenchHostNodeData>\n className={className}\n captureNodePreviewImage={surfaceRenderers.captureNodePreviewImage}\n controller={hostSession.controller}\n debugDiagnostics={debugDiagnostics}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={!isHydrating}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPresence.phase}\n minimizeAnimation={minimizeAnimation}\n presentation={missionControlState?.presentation ?? null}\n renderBackdrop={\n missionControlRenderedState\n ? () => (\n <WorkbenchMissionControlBackdrop\n onExitTransitionComplete={() =>\n missionControlPresence.completeExitTransition()\n }\n phase={missionControlPresence.phase}\n />\n )\n : undefined\n }\n renderBottomChrome={surfaceRenderers.renderBottomChrome}\n renderDock={surfaceRenderers.renderDock}\n renderNode={surfaceRenderers.renderNode}\n renderNodeGeniePreview={surfaceRenderers.renderNodeGeniePreview}\n renderOverlay={\n missionControlRenderedState\n ? () => (\n <WorkbenchMissionControlOverlay\n i18n={missionControlI18n}\n phase={missionControlPresence.phase}\n state={missionControlRenderedState}\n />\n )\n : undefined\n }\n renderTopChrome={surfaceRenderers.renderTopChrome}\n renderWindowActions={surfaceRenderers.renderWindowActions}\n renderWindowHeader={surfaceRenderers.renderWindowHeader}\n shouldKeepMinimizedNodeMounted={\n surfaceRenderers.shouldKeepMinimizedNodeMounted\n }\n resolveDockPreviewCacheKey={surfaceRenderers.resolveDockPreviewCacheKey}\n resolveFullscreenHeaderMode={surfaceRenderers.resolveFullscreenHeaderMode}\n resolveWindowSurfaceLayer={surfaceRenderers.resolveWindowSurfaceLayer}\n resolveWindowZIndex={surfaceRenderers.resolveWindowZIndex}\n resolveDockAnchorKey={surfaceRenderers.resolveDockAnchorKey}\n shortcutsEnabled={shortcutsEnabled}\n shouldCaptureNodePreviewImage={\n surfaceRenderers.shouldCaptureNodePreviewImage\n }\n wallpaper={wallpaper}\n windowManagement={windowManagement}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={surfaceRenderers.windowChromeMode}\n />\n );\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type ComponentType,\n type TransitionEvent\n} from \"react\";\nimport {\n AppWindowIcon,\n Button,\n GridHorizontalLinedIcon,\n GridVerticalLinedIcon,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport {\n shouldShowWorkbenchMissionControlLayoutHint,\n shouldShowWorkbenchMissionControlLayoutPreset,\n shouldShowWorkbenchMissionControlNoAvailableLayoutMessage\n} from \"./layoutDock.ts\";\nimport type { WorkbenchMissionControlState } from \"./useWorkbenchMissionControlState.ts\";\nimport type { WorkbenchMissionControlPhase } from \"./useWorkbenchMissionControlPresence.ts\";\nimport type { WorkbenchMissionControlI18nRuntime } from \"./workbenchMissionControlI18n.ts\";\n\nexport interface WorkbenchMissionControlBackdropProps {\n className?: string;\n onExitTransitionComplete?: () => void;\n phase: WorkbenchMissionControlPhase;\n}\n\nexport function WorkbenchMissionControlBackdrop({\n className,\n onExitTransitionComplete,\n phase\n}: WorkbenchMissionControlBackdropProps) {\n return (\n <div\n aria-hidden\n className={[\"workbench-mission-control-backdrop\", className]\n .filter(Boolean)\n .join(\" \")}\n data-phase={phase}\n onTransitionEnd={(event: TransitionEvent<HTMLDivElement>) => {\n if (\n phase !== \"closing\" ||\n event.target !== event.currentTarget ||\n event.propertyName !== \"opacity\"\n ) {\n return;\n }\n onExitTransitionComplete?.();\n }}\n />\n );\n}\n\nexport interface WorkbenchMissionControlOverlayProps {\n i18n: WorkbenchMissionControlI18nRuntime;\n phase: WorkbenchMissionControlPhase;\n state: WorkbenchMissionControlState;\n}\n\nexport function WorkbenchMissionControlOverlay({\n i18n,\n phase,\n state\n}: WorkbenchMissionControlOverlayProps) {\n const layoutDockContentRef = useRef<HTMLDivElement | null>(null);\n const [layoutDockWidth, setLayoutDockWidth] = useState<number | null>(null);\n const layoutPresets: Array<{\n icon: ComponentType<IconProps>;\n key: \"balanced\" | \"row\" | \"column\";\n label: string;\n preset: { kind: \"balanced\" } | { kind: \"row\" } | { kind: \"column\" };\n }> = [\n {\n icon: AppWindowIcon,\n key: \"balanced\" as const,\n label: i18n.t(\"presets.balanced\"),\n preset: { kind: \"balanced\" } as const\n },\n {\n icon: GridHorizontalLinedIcon,\n key: \"row\" as const,\n label: i18n.t(\"presets.row\"),\n preset: { kind: \"row\" } as const\n },\n {\n icon: GridVerticalLinedIcon,\n key: \"column\" as const,\n label: i18n.t(\"presets.column\"),\n preset: { kind: \"column\" } as const\n }\n ].filter((option) =>\n shouldShowWorkbenchMissionControlLayoutPreset(\n state.selectedCount,\n option.preset\n )\n );\n const showLayoutSelectionHint = shouldShowWorkbenchMissionControlLayoutHint(\n state.selectedCount\n );\n const hasUsableLayoutPreset = layoutPresets.some((option) =>\n state.canUsePreset(option.preset)\n );\n const showNoAvailableLayoutMessage =\n shouldShowWorkbenchMissionControlNoAvailableLayoutMessage(\n state.selectedCount,\n hasUsableLayoutPreset\n );\n\n useLayoutEffect(() => {\n const element = layoutDockContentRef.current;\n if (!element) {\n return;\n }\n const computedStyle = window.getComputedStyle(element.parentElement!);\n const horizontalChrome =\n Number.parseFloat(computedStyle.paddingLeft) +\n Number.parseFloat(computedStyle.paddingRight) +\n Number.parseFloat(computedStyle.borderLeftWidth) +\n Number.parseFloat(computedStyle.borderRightWidth);\n setLayoutDockWidth(element.scrollWidth + horizontalChrome);\n }, [\n i18n,\n layoutPresets.length,\n showLayoutSelectionHint,\n showNoAvailableLayoutMessage,\n state.selectedCount\n ]);\n\n return (\n <div\n className=\"workbench-mission-control pointer-events-none absolute inset-0 z-[1100] overflow-hidden\"\n data-phase={phase}\n >\n {state.mode === \"layout\" ? (\n <div className=\"workbench-mission-control__footer-shell pointer-events-none absolute inset-x-0 bottom-0 flex justify-center px-6 pb-6\">\n <div\n className=\"workbench-mission-control__layout-dock desktop-dock-plate pointer-events-auto\"\n style={\n layoutDockWidth === null ? undefined : { width: layoutDockWidth }\n }\n onClick={(event) => event.stopPropagation()}\n >\n <div\n ref={layoutDockContentRef}\n className=\"workbench-mission-control__layout-dock-content\"\n >\n {showLayoutSelectionHint ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"layoutSelectionHint\")}\n </span>\n ) : showNoAvailableLayoutMessage ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"noAvailableLayout\")}\n </span>\n ) : (\n <div className=\"flex items-end gap-2\">\n {layoutPresets.map((option) => {\n const canApply = state.canApplyPreset(option.preset);\n const LayoutIcon = option.icon;\n\n return (\n <Button\n key={option.key}\n aria-label={option.label}\n className=\"workbench-mission-control__layout-dock-button\"\n data-layout-key={option.key}\n disabled={!canApply}\n size=\"icon\"\n title={option.label}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => state.applyPreset(option.preset)}\n >\n <LayoutIcon\n aria-hidden\n className=\"workbench-mission-control__layout-glyph\"\n />\n </Button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n","import type { WorkbenchLayoutPreset } from \"../core/types.ts\";\n\nexport function shouldShowWorkbenchMissionControlLayoutHint(\n selectedCount: number\n): boolean {\n return selectedCount < 2;\n}\n\nexport function shouldShowWorkbenchMissionControlNoAvailableLayoutMessage(\n selectedCount: number,\n hasUsablePreset: boolean\n): boolean {\n return selectedCount >= 2 && !hasUsablePreset;\n}\n\nexport function shouldShowWorkbenchMissionControlLayoutPreset(\n selectedCount: number,\n preset: WorkbenchLayoutPreset\n): boolean {\n if (selectedCount === 2) {\n return preset.kind !== \"balanced\";\n }\n\n if (selectedCount >= 4) {\n return preset.kind === \"balanced\";\n }\n\n return true;\n}\n","import { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport type { WorkbenchMissionControlState } from \"./useWorkbenchMissionControlState.ts\";\n\nexport type WorkbenchMissionControlPhase =\n | \"closed\"\n | \"entering\"\n | \"open\"\n | \"closing\";\n\nexport interface WorkbenchMissionControlPresence {\n completeExitTransition(): void;\n phase: WorkbenchMissionControlPhase;\n state: WorkbenchMissionControlState | null;\n}\n\nexport function useWorkbenchMissionControlPresence(\n state: WorkbenchMissionControlState | null\n): WorkbenchMissionControlPresence {\n const [renderedState, setRenderedState] =\n useState<WorkbenchMissionControlState | null>(state);\n const [phase, setPhase] = useState<WorkbenchMissionControlPhase>(\n state ? \"open\" : \"closed\"\n );\n const phaseRef = useRef<WorkbenchMissionControlPhase>(\n state ? \"open\" : \"closed\"\n );\n const enterFrameRef = useRef<number | null>(null);\n const setPresencePhase = useCallback(\n (nextPhase: WorkbenchMissionControlPhase) => {\n phaseRef.current = nextPhase;\n setPhase(nextPhase);\n },\n []\n );\n const completeExitTransition = useCallback(() => {\n if (phaseRef.current !== \"closing\") {\n return;\n }\n setRenderedState(null);\n setPresencePhase(\"closed\");\n }, [setPresencePhase]);\n\n useLayoutEffect(() => {\n if (enterFrameRef.current !== null) {\n window.cancelAnimationFrame(enterFrameRef.current);\n enterFrameRef.current = null;\n }\n\n if (state) {\n setRenderedState(state);\n if (phaseRef.current === \"closed\" || phaseRef.current === \"closing\") {\n setPresencePhase(\"entering\");\n }\n enterFrameRef.current = window.requestAnimationFrame(() => {\n setPresencePhase(\"open\");\n enterFrameRef.current = null;\n });\n\n return () => {\n if (enterFrameRef.current !== null) {\n window.cancelAnimationFrame(enterFrameRef.current);\n enterFrameRef.current = null;\n }\n };\n }\n\n if (renderedState === null) {\n setPresencePhase(\"closed\");\n return undefined;\n }\n\n setPresencePhase(\"closing\");\n return undefined;\n }, [renderedState, setPresencePhase, state]);\n\n return {\n completeExitTransition,\n phase,\n state: renderedState\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useExternalStoreSnapshot,\n type ExternalStoreSnapshotSource\n} from \"@tutti-os/ui-react-hooks\";\nimport {\n defaultWorkbenchLayoutConstraints,\n defaultWorkbenchSurfaceSize,\n type WorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchLayoutPreset,\n type WorkbenchSize\n} from \"../core/types.ts\";\nimport { getWorkbenchLayoutPresetFrames } from \"../core/geometry.ts\";\nimport type { WorkbenchSurfacePresentation } from \"../react/types.ts\";\nimport {\n orderWorkbenchNodesForMissionControl,\n resolveWorkbenchMissionControlPreviewLayout\n} from \"./layout.ts\";\nimport type {\n WorkbenchMissionControlAdapter,\n WorkbenchMissionControlMode\n} from \"./types.ts\";\n\nconst missionControlStagePaddingX = 24;\nconst missionControlStageTop = 64;\nconst missionControlStageBottom = 104;\nconst inactiveMissionControlSnapshotSource: ExternalStoreSnapshotSource<null> =\n {\n getSnapshot() {\n return null;\n },\n subscribe() {\n return () => {};\n }\n };\n\nexport interface WorkbenchMissionControlState {\n applyPreset(preset: WorkbenchLayoutPreset): void;\n canApplyPreset(preset: WorkbenchLayoutPreset): boolean;\n canUsePreset(preset: WorkbenchLayoutPreset): boolean;\n mode: WorkbenchMissionControlMode;\n presentation: WorkbenchSurfacePresentation;\n selectedCount: number;\n}\n\nexport function useWorkbenchMissionControlState<TData>({\n adapter,\n mode,\n nodeIds,\n onRequestClose\n}: {\n adapter: WorkbenchMissionControlAdapter<TData> | null;\n mode: WorkbenchMissionControlMode | null;\n nodeIds?: readonly string[];\n onRequestClose: () => void;\n}): WorkbenchMissionControlState | null {\n const isActive = mode !== null && adapter !== null;\n const snapshot = useExternalStoreSnapshot(\n isActive\n ? {\n getSnapshot() {\n return adapter.getSnapshot();\n },\n subscribe(listener) {\n return adapter.subscribe(listener);\n }\n }\n : inactiveMissionControlSnapshotSource\n );\n const layoutConstraints: WorkbenchLayoutConstraints =\n snapshot?.layoutConstraints ?? defaultWorkbenchLayoutConstraints;\n const surfaceSize: WorkbenchSize =\n snapshot?.surfaceSize ?? defaultWorkbenchSurfaceSize;\n const scopedNodeIdSet = useMemo(\n () => (nodeIds === undefined ? null : new Set(nodeIds)),\n [nodeIds]\n );\n const visibleNodes = useMemo(() => {\n const nextVisibleNodes = snapshot?.visibleNodes ?? [];\n if (scopedNodeIdSet === null) {\n return nextVisibleNodes;\n }\n return nextVisibleNodes.filter((node) => scopedNodeIdSet.has(node.id));\n }, [scopedNodeIdSet, snapshot?.visibleNodes]);\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (mode === null) {\n return;\n }\n setSelectedNodeIds([]);\n }, [mode]);\n\n useEffect(() => {\n if (mode !== null && visibleNodes.length === 0) {\n onRequestClose();\n }\n }, [mode, onRequestClose, visibleNodes.length]);\n\n const orderedNodes = useMemo(\n () => (isActive ? orderWorkbenchNodesForMissionControl(visibleNodes) : []),\n [isActive, visibleNodes]\n );\n const orderedSelectedNodeIds = useMemo(\n () =>\n orderedNodes\n .map((node) => node.id)\n .filter((nodeId) => selectedNodeIds.includes(nodeId)),\n [orderedNodes, selectedNodeIds]\n );\n\n const previewFrame = useMemo<WorkbenchFrame>(\n () =>\n isActive\n ? {\n x: missionControlStagePaddingX,\n y: missionControlStageTop,\n width: Math.max(\n 240,\n surfaceSize.width - missionControlStagePaddingX * 2\n ),\n height: Math.max(\n 180,\n surfaceSize.height -\n missionControlStageTop -\n missionControlStageBottom\n )\n }\n : {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n },\n [isActive, surfaceSize]\n );\n const previewItems = useMemo(\n () =>\n isActive\n ? resolveWorkbenchMissionControlPreviewLayout({\n container: previewFrame,\n nodes: orderedNodes\n })\n : [],\n [isActive, orderedNodes, previewFrame]\n );\n const canUsePreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) =>\n orderedSelectedNodeIds.length < 2\n ? true\n : getWorkbenchLayoutPresetFrames(\n orderedSelectedNodeIds.length,\n nextPreset,\n surfaceSize,\n layoutConstraints\n ) !== null,\n [layoutConstraints, orderedSelectedNodeIds.length, surfaceSize]\n );\n const canApplyPreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) =>\n mode === \"layout\" &&\n orderedSelectedNodeIds.length >= 2 &&\n canUsePreset(nextPreset),\n [canUsePreset, mode, orderedSelectedNodeIds.length]\n );\n const applyActivationAndClose = useCallback(\n (nodeId: string) => {\n const nextAdapter = adapter;\n if (!nextAdapter) {\n return;\n }\n const nextSnapshot = nextAdapter.getSnapshot();\n if (!nextSnapshot.visibleNodes.some((node) => node.id === nodeId)) {\n return;\n }\n onRequestClose();\n window.requestAnimationFrame(() => {\n nextAdapter.focusNode(nodeId);\n });\n },\n [adapter, onRequestClose]\n );\n const applyLayoutAndClose = useCallback(\n (nodeIds: string[], nextPreset: WorkbenchLayoutPreset) => {\n if (!adapter || nodeIds.length < 2) {\n return;\n }\n onRequestClose();\n window.requestAnimationFrame(() => {\n adapter.applyLayoutPreset(nodeIds, nextPreset);\n });\n },\n [adapter, onRequestClose]\n );\n const onPreviewPress = useCallback(\n (nodeId: string) => {\n if (mode === null) {\n return;\n }\n if (mode === \"activate\") {\n applyActivationAndClose(nodeId);\n return;\n }\n\n setSelectedNodeIds((current) =>\n current.includes(nodeId)\n ? current.filter((entry) => entry !== nodeId)\n : [...current, nodeId]\n );\n },\n [applyActivationAndClose, mode]\n );\n const selectedNodeIdSet = useMemo(\n () => new Set(selectedNodeIds),\n [selectedNodeIds]\n );\n const applyPreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) => {\n if (!canApplyPreset(nextPreset)) {\n return;\n }\n applyLayoutAndClose(orderedSelectedNodeIds, nextPreset);\n },\n [applyLayoutAndClose, canApplyPreset, orderedSelectedNodeIds]\n );\n\n const presentation = useMemo<WorkbenchSurfacePresentation | null>(\n () =>\n mode === null\n ? null\n : {\n frameByNodeId: new Map(\n previewItems.map((item) => [item.node.id, item.frame])\n ),\n interaction: {\n mode,\n onBackdropPress: onRequestClose,\n onNodePress: onPreviewPress,\n selectedNodeIds: selectedNodeIdSet\n },\n mode: \"mission-control\",\n visibleNodeIds: new Set(orderedNodes.map((node) => node.id))\n },\n [\n mode,\n onPreviewPress,\n onRequestClose,\n orderedNodes,\n previewItems,\n selectedNodeIdSet\n ]\n );\n\n useEffect(() => {\n if (mode === null) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onRequestClose();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [mode, onRequestClose]);\n\n if (mode === null || presentation === null) {\n return null;\n }\n\n return {\n applyPreset,\n canApplyPreset,\n canUsePreset,\n mode,\n presentation,\n selectedCount: orderedSelectedNodeIds.length\n };\n}\n","import type { WorkbenchFrame, WorkbenchNode } from \"../core/types.ts\";\n\nexport const WORKBENCH_MISSION_CONTROL_GAP_PX = 20;\n\nexport interface WorkbenchMissionControlPreviewLayoutItem<TData = unknown> {\n frame: WorkbenchFrame;\n node: WorkbenchNode<TData>;\n}\n\nexport function orderWorkbenchNodesForMissionControl<TData>(\n nodes: readonly WorkbenchNode<TData>[]\n): WorkbenchNode<TData>[] {\n return [...nodes].sort((left, right) => {\n const topDelta = left.frame.y - right.frame.y;\n if (Math.abs(topDelta) > 24) {\n return topDelta;\n }\n\n const leftDelta = left.frame.x - right.frame.x;\n if (leftDelta !== 0) {\n return leftDelta;\n }\n\n return left.id.localeCompare(right.id);\n });\n}\n\nexport function resolveWorkbenchMissionControlPreviewLayout<TData>(input: {\n container: WorkbenchFrame;\n gap?: number;\n nodes: readonly WorkbenchNode<TData>[];\n}): WorkbenchMissionControlPreviewLayoutItem<TData>[] {\n const nodes = orderWorkbenchNodesForMissionControl(input.nodes);\n if (nodes.length === 0) {\n return [];\n }\n\n const gap = input.gap ?? WORKBENCH_MISSION_CONTROL_GAP_PX;\n const container = input.container;\n const scale = resolveBestPreviewScale(nodes, container, gap);\n if (scale <= 0) {\n return [];\n }\n const rows = packNodesIntoRows(nodes, container.width, gap, scale);\n if (rows.length === 0) {\n return [];\n }\n\n const totalHeight =\n rows.reduce((sum, row) => sum + row.height, 0) +\n Math.max(0, rows.length - 1) * gap;\n const startY = container.y + (container.height - totalHeight) / 2;\n const layout: WorkbenchMissionControlPreviewLayoutItem<TData>[] = [];\n let cursorY = startY;\n\n rows.forEach((row) => {\n let cursorX = container.x + (container.width - row.width) / 2;\n\n row.items.forEach((item) => {\n layout.push({\n frame: {\n x: cursorX,\n y: cursorY + (row.height - item.height) / 2,\n width: item.width,\n height: item.height\n },\n node: item.node\n });\n cursorX += item.width + gap;\n });\n\n cursorY += row.height + gap;\n });\n\n return layout;\n}\n\nfunction resolveBestPreviewScale<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n container: WorkbenchFrame,\n gap: number\n): number {\n if (container.width <= 0 || container.height <= 0) {\n return 0;\n }\n\n let lowerBound = 0;\n let upperBound = 1;\n\n while (\n scaleFitsInsideContainer(\n nodes,\n container.width,\n container.height,\n gap,\n upperBound\n )\n ) {\n lowerBound = upperBound;\n upperBound *= 2;\n\n if (upperBound > 64) {\n return lowerBound;\n }\n }\n\n for (let iteration = 0; iteration < 20; iteration += 1) {\n const next = (lowerBound + upperBound) / 2;\n\n if (\n scaleFitsInsideContainer(\n nodes,\n container.width,\n container.height,\n gap,\n next\n )\n ) {\n lowerBound = next;\n } else {\n upperBound = next;\n }\n }\n\n return lowerBound;\n}\n\nfunction scaleFitsInsideContainer<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n containerWidth: number,\n containerHeight: number,\n gap: number,\n scale: number\n): boolean {\n if (scale <= 0) {\n return false;\n }\n\n const rows = packNodesIntoRows(nodes, containerWidth, gap, scale);\n if (rows.length === 0) {\n return false;\n }\n\n const totalHeight =\n rows.reduce((sum, row) => sum + row.height, 0) +\n Math.max(0, rows.length - 1) * gap;\n return totalHeight <= containerHeight;\n}\n\nfunction packNodesIntoRows<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n containerWidth: number,\n gap: number,\n scale: number\n): PackedPreviewRow<TData>[] {\n const rows: PackedPreviewRow<TData>[] = [];\n let currentRow: PackedPreviewRow<TData> | null = null;\n\n const commitCurrentRow = () => {\n if (currentRow && currentRow.items.length > 0) {\n rows.push(currentRow);\n }\n };\n\n for (const node of nodes) {\n const width = Math.max(1, node.frame.width * scale);\n const height = Math.max(1, node.frame.height * scale);\n\n if (width > containerWidth) {\n return [];\n }\n\n if (!currentRow) {\n currentRow = {\n height,\n items: [{ height, node, width }],\n width\n };\n continue;\n }\n\n const nextWidth = currentRow.width + gap + width;\n if (nextWidth > containerWidth) {\n commitCurrentRow();\n currentRow = {\n height,\n items: [{ height, node, width }],\n width\n };\n continue;\n }\n\n currentRow.items.push({ height, node, width });\n currentRow.width = nextWidth;\n currentRow.height = Math.max(currentRow.height, height);\n }\n\n commitCurrentRow();\n\n return rows;\n}\n\ninterface PackedPreviewRow<TData> {\n height: number;\n items: Array<{\n height: number;\n node: WorkbenchNode<TData>;\n width: number;\n }>;\n width: number;\n}\n","import {\n useCallback,\n useEffect,\n type CSSProperties,\n type ReactNode\n} from \"react\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type {\n WorkbenchLayoutConstraintsInput,\n WorkbenchNode\n} from \"../core/types.ts\";\nimport { WorkbenchDockFrame } from \"./WorkbenchDockFrame.tsx\";\nimport { WorkbenchNodeLayer } from \"./WorkbenchNodeLayer.tsx\";\nimport {\n WorkbenchProvider,\n useWorkbenchController\n} from \"./WorkbenchProvider.tsx\";\nimport type { WorkbenchDebugDiagnostics } from \"../store/types.ts\";\nimport { useWorkbenchShortcuts } from \"./hooks/useWorkbenchShortcuts.ts\";\nimport type { WorkbenchWindowManagementShortcutPreset } from \"./hooks/workbenchShortcutIntent.ts\";\nimport { useWorkbenchSurfaceSize } from \"./hooks/useWorkbenchSurfaceSize.ts\";\nimport { useWorkbenchGenieAnimation } from \"./useWorkbenchGenieAnimation.tsx\";\nimport type { WorkbenchNodeGeniePreviewRenderer } from \"./useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockContext,\n WorkbenchDockPlacement,\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchMinimizeAnimation,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\n WorkbenchResolveWindowSurfaceLayer,\n WorkbenchResolveWindowZIndex,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\n\nexport interface WorkbenchSurfaceProps<TData = unknown> {\n captureNodePreviewImage?: (\n node: WorkbenchNode<TData>\n ) => Promise<string | null> | string | null;\n className?: string;\n controller: WorkbenchController<TData>;\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchDockPlacement;\n interactive?: boolean;\n layoutConstraints?: WorkbenchLayoutConstraintsInput;\n missionControlPhase?: \"closed\" | \"entering\" | \"open\" | \"closing\";\n minimizeAnimation?: WorkbenchMinimizeAnimation;\n presentation?: WorkbenchSurfacePresentation | null;\n renderBackdrop?: () => ReactNode;\n renderBottomChrome?: () => ReactNode;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n renderNode: WorkbenchRenderNode<TData>;\n renderNodeGeniePreview?: WorkbenchNodeGeniePreviewRenderer<TData>;\n renderOverlay?: () => ReactNode;\n renderTopChrome?: () => ReactNode;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n resolveWindowSurfaceLayer?: WorkbenchResolveWindowSurfaceLayer<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shortcutsEnabled?: boolean;\n shouldCaptureNodePreviewImage?: (node: WorkbenchNode<TData>) => boolean;\n wallpaper?: WorkbenchSurfaceWallpaper;\n windowManagement?: WorkbenchWindowManagementConfig;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport interface WorkbenchWindowManagementConfig {\n edgeSnapEnabled?: boolean;\n shortcutPreset?: WorkbenchWindowManagementShortcutPreset | null;\n}\n\nexport type WorkbenchSurfaceWallpaperFit =\n | \"contain\"\n | \"cover\"\n | \"stretch\"\n | \"center\";\n\nexport interface WorkbenchSurfaceWallpaper {\n appearance?: \"dark\" | \"light\";\n fit?: WorkbenchSurfaceWallpaperFit;\n position?: string;\n url: string;\n}\n\nexport function WorkbenchSurface<TData>({\n captureNodePreviewImage,\n className,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n interactive,\n layoutConstraints,\n missionControlPhase,\n minimizeAnimation,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveWindowSurfaceLayer,\n resolveWindowZIndex,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n shouldCaptureNodePreviewImage,\n wallpaper,\n windowManagement,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchSurfaceProps<TData>) {\n return (\n <WorkbenchProvider controller={controller}>\n <WorkbenchSurfaceInner\n captureNodePreviewImage={captureNodePreviewImage}\n className={className}\n debugDiagnostics={debugDiagnostics}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={interactive}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPhase}\n minimizeAnimation={minimizeAnimation}\n presentation={presentation}\n renderBackdrop={renderBackdrop}\n renderBottomChrome={renderBottomChrome}\n renderDock={renderDock}\n renderNode={renderNode}\n renderNodeGeniePreview={renderNodeGeniePreview}\n renderOverlay={renderOverlay}\n renderTopChrome={renderTopChrome}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n resolveWindowSurfaceLayer={resolveWindowSurfaceLayer}\n resolveWindowZIndex={resolveWindowZIndex}\n resolveDockAnchorKey={resolveDockAnchorKey}\n resolveDockPreviewCacheKey={resolveDockPreviewCacheKey}\n shortcutsEnabled={shortcutsEnabled}\n shouldCaptureNodePreviewImage={shouldCaptureNodePreviewImage}\n wallpaper={wallpaper}\n windowManagement={windowManagement}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n </WorkbenchProvider>\n );\n}\n\nfunction WorkbenchSurfaceInner<TData>({\n captureNodePreviewImage,\n className,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n interactive = true,\n layoutConstraints,\n missionControlPhase,\n minimizeAnimation,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveWindowSurfaceLayer,\n resolveWindowZIndex,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n shouldCaptureNodePreviewImage,\n wallpaper,\n windowManagement,\n windowChromeMode,\n windowChromeI18n\n}: Omit<WorkbenchSurfaceProps<TData>, \"controller\">) {\n const controller = useWorkbenchController<TData>();\n const onSizeChange = useCallback(\n (size: { width: number; height: number }) => {\n controller.commands.setSurfaceSize(size);\n },\n [controller]\n );\n const ref = useWorkbenchSurfaceSize<HTMLDivElement>(onSizeChange);\n const genie = useWorkbenchGenieAnimation({\n captureNodePreviewImage,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n minimizeAnimation,\n renderNodeGeniePreview,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shouldCaptureNodePreviewImage\n });\n useWorkbenchShortcuts<TData>({\n enabled: (shortcutsEnabled ?? true) && interactive,\n windowManagementShortcutPreset: windowManagement?.shortcutPreset ?? null\n });\n useEffect(() => {\n if (!layoutConstraints) {\n return;\n }\n controller.commands.setLayoutConstraints(layoutConstraints);\n }, [controller, layoutConstraints]);\n const wallpaperStyle: CSSProperties | undefined = wallpaper\n ? {\n backgroundImage: `url(${JSON.stringify(wallpaper.url)})`,\n backgroundPosition: wallpaper.position ?? \"center\",\n backgroundSize: resolveWorkbenchSurfaceWallpaperBackgroundSize(\n wallpaper.fit ?? \"cover\"\n )\n }\n : undefined;\n\n return (\n <div\n ref={ref}\n className={[\"workbench-surface\", className].filter(Boolean).join(\" \")}\n data-mission-control-phase={missionControlPhase ?? \"closed\"}\n data-presentation-mode={presentation?.mode ?? \"default\"}\n data-workbench-interactive={interactive ? \"true\" : \"false\"}\n >\n {wallpaper ? (\n <div\n className=\"workbench-surface__wallpaper\"\n style={wallpaperStyle}\n aria-hidden\n />\n ) : null}\n {renderTopChrome ? (\n <div className=\"workbench-surface__top-chrome\">{renderTopChrome()}</div>\n ) : null}\n {renderBackdrop ? renderBackdrop() : null}\n <WorkbenchNodeLayer\n genie={genie}\n interactive={interactive}\n presentation={presentation}\n renderNode={renderNode}\n edgeSnapEnabled={windowManagement?.edgeSnapEnabled === true}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n resolveWindowSurfaceLayer={resolveWindowSurfaceLayer}\n resolveWindowZIndex={resolveWindowZIndex}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n <WorkbenchDockFrame\n dockPlacement={dockPlacement}\n genie={genie}\n interactive={interactive}\n renderDock={renderDock}\n />\n {renderBottomChrome ? (\n <div className=\"workbench-surface__bottom-chrome\">\n {renderBottomChrome()}\n </div>\n ) : null}\n {renderOverlay ? renderOverlay() : null}\n {genie.genieLayer}\n </div>\n );\n}\n\nfunction resolveWorkbenchSurfaceWallpaperBackgroundSize(\n fit: WorkbenchSurfaceWallpaperFit\n): string {\n switch (fit) {\n case \"contain\":\n return \"contain\";\n case \"cover\":\n return \"cover\";\n case \"stretch\":\n return \"100% 100%\";\n case \"center\":\n return \"auto\";\n }\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport {\n selectFocusedWorkbenchNode,\n selectFullscreenNodeToExitBeforeDockLaunch\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchDockContext, WorkbenchDockPlacement } from \"./types.ts\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { createWorkbenchDockNodesSelector } from \"./dockNodeSelectors.ts\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\n\nexport interface WorkbenchDockFrameProps<TData = unknown> {\n dockPlacement?: WorkbenchDockPlacement;\n genie: WorkbenchGenieController<TData>;\n interactive?: boolean;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n}\n\nexport function WorkbenchDockFrame<TData>({\n dockPlacement = \"bottom\",\n genie,\n interactive = true,\n renderDock\n}: WorkbenchDockFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const selectDockNodes = useMemo(\n () => createWorkbenchDockNodesSelector<TData>(),\n []\n );\n const hasFullscreenNode = useWorkbenchSelector((state) =>\n state.nodes.some(\n (node) => node.displayMode === \"fullscreen\" && !node.isMinimized\n )\n );\n const nodes = useWorkbenchSelector<TData, readonly WorkbenchNode<TData>[]>(\n selectDockNodes\n );\n const minimizedNodesWithPending = useMemo(\n () =>\n mergePendingMinimizedDockNode(\n nodes.filter((node) => node.isMinimized),\n genie.pendingMinimizedNode\n ),\n [genie.pendingMinimizedNode, nodes]\n );\n const minimizedNodes = useMemo(\n () => minimizedNodesWithPending.filter((node) => node.isMinimized),\n [minimizedNodesWithPending]\n );\n const focusedNodeId = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id ?? null\n );\n\n if (!renderDock && minimizedNodes.length === 0) {\n return null;\n }\n\n return (\n <>\n {hasFullscreenNode ? (\n <div\n className=\"workbench-dock-frame__immersive-hover-zone\"\n data-dock-placement={dockPlacement}\n aria-hidden\n />\n ) : null}\n <div\n className=\"workbench-dock-frame\"\n data-dock-placement={dockPlacement}\n data-immersive-state={hasFullscreenNode ? \"hidden\" : \"disabled\"}\n >\n {renderDock\n ? renderDock({\n controller,\n focusedNodeId,\n genie: {\n launchNodeFromAnchor: (anchorKey, nodeID, launch) => {\n const fullscreenNode = interactive\n ? selectFullscreenNodeToExitBeforeDockLaunch(\n controller.getSnapshot(),\n nodeID\n )\n : null;\n if (fullscreenNode) {\n controller.commands.exitFullscreen(fullscreenNode.id);\n }\n genie.launchNodeFromAnchor(anchorKey, nodeID, launch);\n },\n registerDockAnchor: (anchorKey, element) => {\n genie.registerDockAnchor(anchorKey, element);\n },\n shouldAnimateMinimizedDockEnter: (nodeID) => {\n return genie.shouldAnimateMinimizedDockEnter(nodeID);\n },\n isPendingMinimizedDockNode: (nodeID) => {\n return genie.isPendingMinimizedDockNode(nodeID);\n }\n },\n minimizedNodes,\n nodes\n })\n : null}\n </div>\n </>\n );\n}\n\nfunction mergePendingMinimizedDockNode<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n pendingNode: WorkbenchNode<TData> | null\n): readonly WorkbenchNode<TData>[] {\n if (!pendingNode) {\n return nodes;\n }\n\n const existingNode = nodes.find((node) => node.id === pendingNode.id);\n if (existingNode?.isMinimized) {\n return nodes;\n }\n\n return [...nodes.filter((node) => node.id !== pendingNode.id), pendingNode];\n}\n","import { getWorkbenchSnapRect } from \"./geometry.ts\";\nimport { orderWorkbenchNodesForRender } from \"./stack.ts\";\nimport type { WorkbenchFrame, WorkbenchNode, WorkbenchState } from \"./types.ts\";\n\nexport function selectVisibleWorkbenchNodes<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData>[] {\n return state.nodes.filter((node) => !node.isMinimized);\n}\n\nexport function selectFocusedWorkbenchNode<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData> | null {\n const focusedID = state.nodeStack.at(-1);\n return state.nodes.find((node) => node.id === focusedID) ?? null;\n}\n\nexport function selectFocusedVisibleWorkbenchNode<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData> | null {\n const nodeByID = new Map(state.nodes.map((node) => [node.id, node]));\n for (let index = state.nodeStack.length - 1; index >= 0; index -= 1) {\n const node = nodeByID.get(state.nodeStack[index] ?? \"\");\n if (node && !node.isMinimized) {\n return node;\n }\n }\n return state.nodes.find((node) => !node.isMinimized) ?? null;\n}\n\nexport function selectFullscreenNodeToExitBeforeDockLaunch<TData>(\n state: WorkbenchState<TData>,\n targetNodeID?: string\n): WorkbenchNode<TData> | null {\n const nodeByID = new Map(state.nodes.map((node) => [node.id, node]));\n const isVisibleFullscreenNode = (\n node: WorkbenchNode<TData> | undefined\n ): node is WorkbenchNode<TData> => {\n return (\n node !== undefined &&\n node.displayMode === \"fullscreen\" &&\n !node.isMinimized\n );\n };\n\n let target: WorkbenchNode<TData> | undefined;\n for (let index = state.nodeStack.length - 1; index >= 0; index -= 1) {\n const stackedNode = nodeByID.get(state.nodeStack[index] ?? \"\");\n if (isVisibleFullscreenNode(stackedNode)) {\n target = stackedNode;\n break;\n }\n }\n target ??= state.nodes.find(isVisibleFullscreenNode);\n\n if (!target || target.id === targetNodeID) {\n return null;\n }\n return target;\n}\n\nexport function selectOrderedWorkbenchNodes<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData>[] {\n return orderWorkbenchNodesForRender(\n selectVisibleWorkbenchNodes(state),\n state.nodeStack\n );\n}\n\nexport function selectWorkbenchNodeZIndex(\n state: WorkbenchState,\n nodeID: string\n): number {\n const index = state.nodeStack.indexOf(nodeID);\n return index < 0 ? 1 : index + 1;\n}\n\nexport function selectWorkbenchSnapPreviewRect(\n state: WorkbenchState\n): WorkbenchFrame | null {\n return getWorkbenchSnapRect(\n state.activeSnapTarget,\n state.surfaceSize,\n state.layoutConstraints\n );\n}\n","import { createContext, useContext, type PropsWithChildren } from \"react\";\nimport type { WorkbenchController } from \"../store/types.ts\";\n\nconst WorkbenchContext = createContext<WorkbenchController | null>(null);\n\nexport interface WorkbenchProviderProps<\n TData = unknown\n> extends PropsWithChildren {\n controller: WorkbenchController<TData>;\n}\n\nexport function WorkbenchProvider<TData>({\n children,\n controller\n}: WorkbenchProviderProps<TData>) {\n return (\n <WorkbenchContext.Provider value={controller}>\n {children}\n </WorkbenchContext.Provider>\n );\n}\n\nexport function useWorkbenchController<\n TData = unknown\n>(): WorkbenchController<TData> {\n const controller = useContext(WorkbenchContext);\n if (!controller) {\n throw new Error(\"WorkbenchProvider is missing.\");\n }\n return controller as WorkbenchController<TData>;\n}\n","import type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\n\nexport function createWorkbenchDockNodesSelector<TData>(): (\n state: WorkbenchState<TData>\n) => readonly WorkbenchNode<TData>[] {\n let previousNodes: readonly WorkbenchNode<TData>[] | null = null;\n\n return (state) => {\n if (\n previousNodes &&\n areWorkbenchDockNodesEqual(previousNodes, state.nodes)\n ) {\n return previousNodes;\n }\n\n previousNodes = state.nodes;\n return state.nodes;\n };\n}\n\nfunction areWorkbenchDockNodesEqual<TData>(\n previousNodes: readonly WorkbenchNode<TData>[],\n nextNodes: readonly WorkbenchNode<TData>[]\n): boolean {\n if (previousNodes.length !== nextNodes.length) {\n return false;\n }\n\n return previousNodes.every((previousNode, index) => {\n const nextNode = nextNodes[index];\n return (\n nextNode !== undefined &&\n previousNode.id === nextNode.id &&\n previousNode.kind === nextNode.kind &&\n previousNode.title === nextNode.title &&\n previousNode.displayMode === nextNode.displayMode &&\n previousNode.isMinimized === nextNode.isMinimized &&\n previousNode.minimizedAtUnixMs === nextNode.minimizedAtUnixMs &&\n previousNode.frame.width === nextNode.frame.width &&\n previousNode.frame.height === nextNode.frame.height &&\n previousNode.data === nextNode.data\n );\n });\n}\n","import { useExternalStoreSelector } from \"@tutti-os/ui-react-hooks\";\nimport type { WorkbenchState } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchSelector<TData, TResult>(\n selector: (state: WorkbenchState<TData>) => TResult\n): TResult {\n const controller = useWorkbenchController<TData>();\n return useExternalStoreSelector(controller, selector);\n}\n","import { Fragment, memo, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n selectFocusedWorkbenchNode,\n selectWorkbenchNodeZIndex,\n selectWorkbenchSnapPreviewRect\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\n WorkbenchResolveWindowSurfaceLayer,\n WorkbenchResolveWindowZIndex,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { WorkbenchWindowFrame } from \"./WorkbenchWindowFrame.tsx\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport { createRenderedWorkbenchNodeIDsSelector } from \"./renderedNodeIds.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\nimport { resolveWorkbenchWindowChromeMode } from \"./windowHeader.ts\";\n\nexport interface WorkbenchNodeLayerProps<TData = unknown> {\n genie: WorkbenchGenieController<TData>;\n edgeSnapEnabled?: boolean;\n interactive?: boolean;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n resolveWindowSurfaceLayer?: WorkbenchResolveWindowSurfaceLayer<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport function WorkbenchNodeLayer<TData>({\n genie,\n edgeSnapEnabled = false,\n interactive = true,\n presentation,\n renderNode,\n shouldKeepMinimizedNodeMounted,\n renderWindowActions,\n renderWindowHeader,\n resolveFullscreenHeaderMode,\n resolveWindowSurfaceLayer,\n resolveWindowZIndex,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchNodeLayerProps<TData>) {\n const selectRenderedNodeIDs = useMemo(\n () =>\n createRenderedWorkbenchNodeIDsSelector(shouldKeepMinimizedNodeMounted),\n [shouldKeepMinimizedNodeMounted]\n );\n const nodeIDs = useWorkbenchSelector<TData, readonly string[]>(\n selectRenderedNodeIDs\n );\n const { defaultNodeIDs, dialogPopoverNodeIDs } = useWorkbenchSelector<\n TData,\n {\n defaultNodeIDs: readonly string[];\n dialogPopoverNodeIDs: readonly string[];\n }\n >((state) => {\n if (\n !resolveWindowSurfaceLayer ||\n presentation?.mode === \"mission-control\"\n ) {\n return {\n defaultNodeIDs: nodeIDs,\n dialogPopoverNodeIDs: [] as string[]\n };\n }\n\n const nodeByID = new Map(state.nodes.map((node) => [node.id, node]));\n const nextDefaultNodeIDs: string[] = [];\n const nextDialogPopoverNodeIDs: string[] = [];\n\n for (const nodeID of nodeIDs) {\n const node = nodeByID.get(nodeID);\n if (node && resolveWindowSurfaceLayer({ node }) === \"dialog-popover\") {\n nextDialogPopoverNodeIDs.push(nodeID);\n } else {\n nextDefaultNodeIDs.push(nodeID);\n }\n }\n\n return {\n defaultNodeIDs: nextDefaultNodeIDs,\n dialogPopoverNodeIDs: nextDialogPopoverNodeIDs\n };\n });\n const snapPreviewRect = useWorkbenchSelector(selectWorkbenchSnapPreviewRect);\n const presentationInteraction =\n interactive && presentation?.mode === \"mission-control\"\n ? (presentation.interaction ?? null)\n : null;\n const dialogPopoverLayer =\n dialogPopoverNodeIDs.length > 0 ? (\n <WorkbenchNodeLayerGroup\n className=\"workbench-node-layer workbench-node-layer--dialog-popover\"\n edgeSnapEnabled={edgeSnapEnabled}\n fullscreenHeaderMode={resolveFullscreenHeaderMode}\n genie={genie}\n interactive={interactive}\n nodeIDs={dialogPopoverNodeIDs}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n resolveWindowZIndex={resolveWindowZIndex}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n ) : null;\n\n return (\n <Fragment>\n <WorkbenchNodeLayerGroup\n className=\"workbench-node-layer\"\n edgeSnapEnabled={edgeSnapEnabled}\n fullscreenHeaderMode={resolveFullscreenHeaderMode}\n genie={genie}\n interactive={interactive}\n nodeIDs={defaultNodeIDs}\n onBackdropPress={presentationInteraction?.onBackdropPress}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n resolveWindowZIndex={resolveWindowZIndex}\n snapPreviewRect={snapPreviewRect}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n {typeof document === \"undefined\"\n ? dialogPopoverLayer\n : dialogPopoverLayer\n ? createPortal(dialogPopoverLayer, document.body)\n : null}\n </Fragment>\n );\n}\n\ninterface WorkbenchNodeLayerGroupProps<TData = unknown> {\n className: string;\n edgeSnapEnabled: boolean;\n fullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n genie: WorkbenchGenieController<TData>;\n interactive: boolean;\n nodeIDs: readonly string[];\n onBackdropPress?: () => void;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n snapPreviewRect?: ReturnType<typeof selectWorkbenchSnapPreviewRect>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nfunction WorkbenchNodeLayerGroup<TData>({\n className,\n edgeSnapEnabled,\n fullscreenHeaderMode,\n genie,\n interactive,\n nodeIDs,\n onBackdropPress,\n presentation,\n renderNode,\n renderWindowActions,\n renderWindowHeader,\n resolveWindowZIndex,\n snapPreviewRect,\n windowChromeI18n,\n windowChromeMode\n}: WorkbenchNodeLayerGroupProps<TData>) {\n return (\n <div\n className={className}\n data-workbench-interactive={interactive ? \"true\" : \"false\"}\n onClick={\n onBackdropPress\n ? (event) => {\n if (event.target !== event.currentTarget) {\n return;\n }\n onBackdropPress();\n }\n : undefined\n }\n >\n {snapPreviewRect ? (\n <div\n className=\"workbench-snap-preview\"\n style={{\n height: snapPreviewRect.height,\n left: snapPreviewRect.x,\n top: snapPreviewRect.y,\n width: snapPreviewRect.width\n }}\n />\n ) : null}\n {nodeIDs.map((nodeID) => (\n <MemoizedWorkbenchNodeLayerItem\n key={nodeID}\n fullscreenHeaderMode={fullscreenHeaderMode}\n genie={genie}\n edgeSnapEnabled={edgeSnapEnabled}\n interactive={interactive}\n nodeID={nodeID}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n resolveWindowZIndex={resolveWindowZIndex}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n ))}\n </div>\n );\n}\n\ninterface WorkbenchNodeLayerItemProps<TData = unknown> {\n fullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n genie: WorkbenchGenieController<TData>;\n edgeSnapEnabled: boolean;\n interactive: boolean;\n nodeID: string;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nfunction WorkbenchNodeLayerItem<TData>({\n fullscreenHeaderMode,\n genie,\n edgeSnapEnabled,\n interactive,\n nodeID,\n presentation,\n renderNode,\n renderWindowActions,\n renderWindowHeader,\n resolveWindowZIndex,\n windowChromeI18n,\n windowChromeMode\n}: WorkbenchNodeLayerItemProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const node = useWorkbenchSelector<TData, WorkbenchNode<TData> | null>(\n (state) => state.nodes.find((candidate) => candidate.id === nodeID) ?? null\n );\n const isFocused = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id === nodeID\n );\n const zIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, nodeID)\n );\n\n if (!node) {\n return null;\n }\n\n return (\n <WorkbenchWindowFrame\n edgeSnapEnabled={edgeSnapEnabled}\n hiddenMounted={node.isMinimized}\n interactive={interactive}\n presentation={presentation}\n node={node}\n genie={genie}\n resolveWindowZIndex={resolveWindowZIndex}\n fullscreenHeaderMode={fullscreenHeaderMode?.({\n controller,\n node\n })}\n renderActions={renderWindowActions}\n renderHeader={renderWindowHeader}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={resolveWorkbenchWindowChromeMode({\n controller,\n node,\n windowChromeMode\n })}\n >\n {renderNode({\n node,\n layout: {\n frame: node.frame,\n presentation,\n zIndex,\n isFocused\n },\n controller\n })}\n </WorkbenchWindowFrame>\n );\n}\n\nconst MemoizedWorkbenchNodeLayerItem = memo(\n WorkbenchNodeLayerItem\n) as typeof WorkbenchNodeLayerItem;\n","import { type ReactNode } from \"react\";\nimport { createI18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport { Checkbox } from \"@tutti-os/ui-system\";\nimport {\n selectFocusedWorkbenchNode,\n selectWorkbenchNodeZIndex\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode, WorkbenchResizeHandle } from \"../core/types.ts\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { WorkbenchWindowFullscreenToggle } from \"./WorkbenchWindowFullscreenToggle.tsx\";\nimport { useWorkbenchDrag } from \"./hooks/useWorkbenchDrag.ts\";\nimport { useWorkbenchResize } from \"./hooks/useWorkbenchResize.ts\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport {\n createWorkbenchWindowChromeI18nRuntime,\n workbenchWindowChromeI18nResources,\n type WorkbenchWindowChromeI18nRuntime\n} from \"./workbenchWindowI18n.ts\";\nimport type {\n WorkbenchFullscreenHeaderMode,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowZIndex,\n WorkbenchSurfacePresentation,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\nimport { resolveWorkbenchWindowHeader } from \"./windowHeader.ts\";\n\nexport interface WorkbenchWindowFrameProps<TData = unknown> {\n children: ReactNode;\n genie: WorkbenchGenieController;\n edgeSnapEnabled?: boolean;\n hiddenMounted?: boolean;\n interactive?: boolean;\n node: WorkbenchNode<TData>;\n presentation?: WorkbenchSurfacePresentation | null;\n renderActions?: WorkbenchRenderWindowActions<TData>;\n renderHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n fullscreenHeaderMode?: WorkbenchFullscreenHeaderMode;\n windowChromeMode?: WorkbenchWindowChromeMode;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nconst resizeHandles: WorkbenchResizeHandle[] = [\n \"north\",\n \"east\",\n \"south\",\n \"west\",\n \"north-east\",\n \"north-west\",\n \"south-east\",\n \"south-west\"\n];\n\nconst defaultWindowChromeI18n = createWorkbenchWindowChromeI18nRuntime(\n createI18nRuntime({\n dictionaries: [workbenchWindowChromeI18nResources.en]\n })\n);\n\nfunction resolveWorkbenchNodeLaunchSource(data: unknown): string | undefined {\n if (\n data &&\n typeof data === \"object\" &&\n \"launchSource\" in data &&\n typeof data.launchSource === \"string\" &&\n data.launchSource.length > 0\n ) {\n return data.launchSource;\n }\n return undefined;\n}\n\nfunction resolveWorkbenchNodeTypeId(data: unknown): string | undefined {\n if (\n data &&\n typeof data === \"object\" &&\n \"typeId\" in data &&\n typeof data.typeId === \"string\"\n ) {\n return data.typeId;\n }\n\n return undefined;\n}\n\nexport function WorkbenchWindowFrame<TData>({\n children,\n edgeSnapEnabled = false,\n genie,\n hiddenMounted = false,\n interactive = true,\n node,\n presentation = null,\n renderActions,\n renderHeader,\n resolveWindowZIndex,\n windowChromeMode = \"system\",\n windowChromeI18n\n}: WorkbenchWindowFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const baseZIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, node.id)\n );\n const zIndex =\n resolveWindowZIndex?.({\n baseZIndex,\n node\n }) ?? baseZIndex;\n const isFocused = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id === node.id\n );\n const isDragging = useWorkbenchSelector(\n (state) => state.activeDragNodeId === node.id\n );\n const isResizing = useWorkbenchSelector(\n (state) => state.activeResizeNodeId === node.id\n );\n const onDragStart = useWorkbenchDrag(node, { edgeSnapEnabled });\n const onHeaderDoubleClick = () => {\n if (!interactive) {\n return;\n }\n controller.commands.focusNode(node.id);\n controller.commands.applySnapTarget(node.id, \"top\");\n };\n const genieControls = {\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => {\n genie.minimizeNodeToAnchor(nodeID, minimize);\n }\n } as const;\n const defaultActions = interactive ? (\n <div\n className=\"workbench-window__traffic-light-actions\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n {renderActions\n ? renderActions({\n controller,\n genie: genieControls,\n node\n })\n : null}\n <WorkbenchWindowFullscreenToggle\n controller={controller}\n i18n={windowChromeI18n ?? defaultWindowChromeI18n}\n node={node}\n />\n </div>\n ) : null;\n const resolvedHeader = resolveWorkbenchWindowHeader({\n controller,\n defaultActions,\n genie: genieControls,\n node,\n onDoubleClick: onHeaderDoubleClick,\n onDragStart,\n renderHeader: interactive ? renderHeader : undefined,\n windowChromeMode\n });\n const shouldRenderCustomHeader =\n resolvedHeader.windowChromeMode === \"custom-header\";\n const resolvedFullscreenHeaderMode: WorkbenchFullscreenHeaderMode =\n \"persistent\";\n const presentationMode = presentation?.mode ?? null;\n const presentationFrame = presentation?.frameByNodeId.get(node.id) ?? null;\n const isPresentationHidden =\n presentationMode === \"mission-control\" &&\n !presentation?.visibleNodeIds.has(node.id);\n const presentationInteraction =\n interactive &&\n presentationMode === \"mission-control\" &&\n !isPresentationHidden\n ? (presentation?.interaction ?? null)\n : null;\n const isMissionControlSelected =\n presentationInteraction?.selectedNodeIds.has(node.id) ?? false;\n const presentationScale =\n presentationMode === \"mission-control\" && presentationFrame\n ? Math.min(\n presentationFrame.width / Math.max(1, node.frame.width),\n presentationFrame.height / Math.max(1, node.frame.height)\n )\n : 1;\n const presentationOffsetX =\n presentationMode === \"mission-control\" && presentationFrame\n ? presentationFrame.x +\n Math.max(\n 0,\n (presentationFrame.width - node.frame.width * presentationScale) / 2\n ) -\n node.frame.x\n : 0;\n const presentationOffsetY =\n presentationMode === \"mission-control\" && presentationFrame\n ? presentationFrame.y +\n Math.max(\n 0,\n (presentationFrame.height - node.frame.height * presentationScale) / 2\n ) -\n node.frame.y\n : 0;\n const shellTransform =\n presentationMode === \"mission-control\" && presentationFrame\n ? `matrix(${presentationScale}, 0, 0, ${presentationScale}, ${presentationOffsetX}, ${presentationOffsetY})`\n : undefined;\n\n return (\n <section\n aria-hidden={hiddenMounted || isPresentationHidden ? true : undefined}\n className=\"workbench-window-shell\"\n data-focused={isFocused ? \"true\" : \"false\"}\n data-display-mode={node.displayMode}\n data-genie-state={genie.isNodeGenieHidden(node.id) ? \"hidden\" : \"visible\"}\n data-launch-source={resolveWorkbenchNodeLaunchSource(node.data)}\n data-minimized-mount={hiddenMounted ? \"hidden\" : \"visible\"}\n data-presentation-mode={presentationMode ?? \"default\"}\n data-presentation-visibility={isPresentationHidden ? \"hidden\" : \"visible\"}\n data-slot=\"viewport-menu-boundary\"\n data-workbench-node-type-id={resolveWorkbenchNodeTypeId(node.data)}\n data-workbench-window-id={node.id}\n data-window-drag-state={isDragging ? \"dragging\" : \"idle\"}\n data-window-resize-state={isResizing ? \"resizing\" : \"idle\"}\n style={{\n height: node.frame.height,\n left: node.frame.x,\n top: node.frame.y,\n transform: shellTransform,\n transformOrigin: \"top left\",\n width: node.frame.width,\n zIndex\n }}\n onPointerDown={\n hiddenMounted ||\n isPresentationHidden ||\n !interactive ||\n presentationMode === \"mission-control\"\n ? undefined\n : () => controller.commands.focusNode(node.id)\n }\n >\n <div className=\"workbench-window-shell__content\">\n <div\n className=\"workbench-window\"\n data-focused={isFocused ? \"true\" : \"false\"}\n data-display-mode={node.displayMode}\n data-fullscreen-header-mode={resolvedFullscreenHeaderMode}\n data-window-chrome-mode={resolvedHeader.windowChromeMode}\n data-workbench-window-capture=\"true\"\n data-window-drag-state={isDragging ? \"dragging\" : \"idle\"}\n data-window-resize-state={isResizing ? \"resizing\" : \"idle\"}\n >\n <div\n className={[\n \"workbench-window__header\",\n shouldRenderCustomHeader\n ? \"workbench-window__header--custom\"\n : null\n ]\n .filter(Boolean)\n .join(\" \")}\n onDoubleClick={\n shouldRenderCustomHeader || !interactive\n ? undefined\n : onHeaderDoubleClick\n }\n onPointerDown={\n shouldRenderCustomHeader || !interactive ? undefined : onDragStart\n }\n >\n {shouldRenderCustomHeader ? (\n resolvedHeader.customHeader\n ) : (\n <>\n {defaultActions}\n <div className=\"workbench-window__title\">{node.title}</div>\n </>\n )}\n </div>\n <div className=\"workbench-window__body\">{children}</div>\n </div>\n {node.displayMode === \"floating\" &&\n !hiddenMounted &&\n presentationMode !== \"mission-control\" &&\n interactive\n ? resizeHandles.map((handle) => (\n <ResizeHandle key={handle} handle={handle} node={node} />\n ))\n : null}\n </div>\n {presentationInteraction ? (\n <button\n aria-label={node.title}\n aria-pressed={\n presentationInteraction.mode === \"layout\"\n ? isMissionControlSelected\n : undefined\n }\n className=\"absolute inset-0 z-10 block appearance-none rounded-lg border-0 bg-transparent p-0 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring/60\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n presentationInteraction.onNodePress(node.id);\n }}\n >\n {presentationInteraction.mode === \"layout\" &&\n isMissionControlSelected ? (\n <div className=\"pointer-events-none absolute inset-0 rounded-lg border-2 border-[var(--tutti-purple)] transition-[border-color,transform] duration-150 ease-out\" />\n ) : null}\n </button>\n ) : null}\n {presentationInteraction?.mode === \"layout\" &&\n isMissionControlSelected ? (\n <Checkbox\n aria-hidden=\"true\"\n checked\n className=\"pointer-events-none absolute right-3 bottom-3 z-20 size-6 rounded-md text-[var(--white-stationary)] shadow-[0_2px_8px_rgb(0_0_0_/_0.18)] data-[state=checked]:border-[var(--tutti-purple)] data-[state=checked]:bg-[var(--tutti-purple)] [&_[data-slot=checkbox-indicator]>svg]:size-4\"\n tabIndex={-1}\n />\n ) : null}\n </section>\n );\n}\n\nfunction ResizeHandle<TData>({\n handle,\n node\n}: {\n handle: WorkbenchResizeHandle;\n node: WorkbenchNode<TData>;\n}) {\n const onPointerDown = useWorkbenchResize(node, handle);\n return (\n <div\n className=\"workbench-window__resize-handle\"\n data-handle={handle}\n onPointerDown={onPointerDown}\n />\n );\n}\n","import type { HTMLAttributes, MouseEvent, PointerEvent } from \"react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\n\ntype WorkbenchWindowTrafficLightTone = \"close\" | \"minimize\" | \"maximize\";\n\nexport interface WorkbenchWindowTrafficLightAction {\n disabled?: boolean;\n label: string;\n onClick: (event: MouseEvent<HTMLButtonElement>) => void;\n pressed?: boolean;\n}\n\nexport interface WorkbenchWindowTrafficLightsProps extends HTMLAttributes<HTMLDivElement> {\n close?: WorkbenchWindowTrafficLightAction | null;\n maximize?: WorkbenchWindowTrafficLightAction | null;\n minimize?: WorkbenchWindowTrafficLightAction | null;\n}\n\nexport function WorkbenchWindowTrafficLights({\n className,\n close,\n maximize,\n minimize,\n onDoubleClick,\n onPointerDown,\n ...props\n}: WorkbenchWindowTrafficLightsProps) {\n return (\n <div\n {...props}\n className={[\"workbench-window-traffic-lights\", className ?? null]\n .filter(Boolean)\n .join(\" \")}\n onDoubleClick={(event) => {\n event.stopPropagation();\n onDoubleClick?.(event);\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n onPointerDown?.(event);\n }}\n >\n {close ? (\n <WorkbenchWindowTrafficLightButton\n action=\"close\"\n input={close}\n tone=\"close\"\n />\n ) : null}\n {minimize ? (\n <WorkbenchWindowTrafficLightButton\n action=\"minimize\"\n input={minimize}\n tone=\"minimize\"\n />\n ) : null}\n {maximize ? (\n <WorkbenchWindowTrafficLightButton\n action=\"fullscreen\"\n input={maximize}\n tone=\"maximize\"\n />\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchWindowTrafficLightButton({\n action,\n input,\n tone\n}: {\n action: \"close\" | \"fullscreen\" | \"minimize\";\n input: WorkbenchWindowTrafficLightAction;\n tone: WorkbenchWindowTrafficLightTone;\n}) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n event.stopPropagation();\n if (input.disabled) {\n return;\n }\n input.onClick(event);\n };\n const stopPointer = (event: PointerEvent<HTMLButtonElement>): void => {\n event.stopPropagation();\n };\n\n const button = (\n <button\n aria-label={input.label}\n aria-pressed={input.pressed}\n className=\"workbench-window-traffic-light\"\n data-workbench-action={action}\n data-workbench-traffic-light={tone}\n disabled={input.disabled}\n type=\"button\"\n onClick={handleClick}\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={stopPointer}\n />\n );\n\n return (\n <TooltipProvider delayDuration={250} skipDelayDuration={0}>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{input.label}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\nimport { WorkbenchWindowTrafficLights } from \"./WorkbenchWindowTrafficLights.tsx\";\n\nexport function WorkbenchWindowFullscreenToggle<TData>({\n controller,\n disabled = false,\n i18n,\n node\n}: {\n controller: WorkbenchController<TData>;\n disabled?: boolean;\n i18n: WorkbenchWindowChromeI18nRuntime;\n node: WorkbenchNode<TData>;\n}) {\n const isFullscreen = node.displayMode === \"fullscreen\";\n const label = i18n.t(isFullscreen ? \"exitFullscreen\" : \"enterFullscreen\");\n\n return (\n <WorkbenchWindowTrafficLights\n maximize={{\n disabled,\n label,\n onClick: (event) => {\n controller.commands.focusNode(node.id);\n\n if (isFullscreen) {\n controller.commands.exitFullscreen(node.id);\n return;\n }\n\n event.currentTarget.blur();\n controller.commands.enterFullscreen(node.id);\n },\n pressed: isFullscreen\n }}\n />\n );\n}\n","import { useCallback } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { WorkbenchNode } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\nimport { useWorkbenchSnap } from \"./useWorkbenchSnap.ts\";\n\nexport function useWorkbenchDrag<TData>(\n node: WorkbenchNode<TData>,\n options: { edgeSnapEnabled?: boolean } = {}\n) {\n const controller = useWorkbenchController<TData>();\n const updateSnap = useWorkbenchSnap<TData>();\n const edgeSnapEnabled = options.edgeSnapEnabled === true;\n\n return useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n controller.commands.focusNode(node.id);\n\n event.currentTarget.setPointerCapture(event.pointerId);\n controller.commands.setActiveDragNode(node.id);\n\n const origin = { x: event.clientX, y: event.clientY };\n const initialFrame = node.frame;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const nextFrame = {\n ...initialFrame,\n x: initialFrame.x + moveEvent.clientX - origin.x,\n y: initialFrame.y + moveEvent.clientY - origin.y\n };\n updateSnap(\n { x: moveEvent.clientX, y: moveEvent.clientY },\n { edgeSnapEnabled }\n );\n controller.commands.dragNode(node.id, nextFrame);\n };\n\n const clearListeners = () => {\n controller.commands.setActiveDragNode(null);\n controller.commands.setActiveSnapTarget(null);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", finishDrag);\n window.removeEventListener(\"pointercancel\", cancelDrag);\n };\n\n const finishDrag = (upEvent: PointerEvent) => {\n if (\n updateSnap(\n { x: upEvent.clientX, y: upEvent.clientY },\n { edgeSnapEnabled }\n ) !== null\n ) {\n controller.commands.applyActiveSnapTarget(node.id);\n }\n clearListeners();\n };\n\n const cancelDrag = () => {\n clearListeners();\n };\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", finishDrag);\n window.addEventListener(\"pointercancel\", cancelDrag);\n },\n [controller, edgeSnapEnabled, node.frame, node.id, updateSnap]\n );\n}\n","import { useCallback } from \"react\";\nimport {\n inferWorkbenchSnapTarget,\n WORKBENCH_EDGE_SNAP_THRESHOLD_PX\n} from \"../../core/geometry.ts\";\nimport type { WorkbenchSnapTarget } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\nimport { resolveWorkbenchActiveSnapTarget } from \"./workbenchSnapTarget.ts\";\n\nexport function useWorkbenchSnap<TData = unknown>() {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (\n pointerClientPoint: { x: number; y: number },\n options: { edgeSnapEnabled?: boolean } = {}\n ): WorkbenchSnapTarget => {\n const target = inferWorkbenchSnapTarget(\n pointerClientPoint,\n controller.getSnapshot().surfaceSize,\n options.edgeSnapEnabled ? WORKBENCH_EDGE_SNAP_THRESHOLD_PX : 0,\n controller.getSnapshot().layoutConstraints\n );\n const activeTarget = resolveWorkbenchActiveSnapTarget(target, options);\n controller.commands.setActiveSnapTarget(activeTarget);\n return activeTarget;\n },\n [controller]\n );\n}\n","import type { WorkbenchSnapTarget } from \"../../core/types.ts\";\n\nexport function resolveWorkbenchActiveSnapTarget(\n target: WorkbenchSnapTarget,\n options: { edgeSnapEnabled?: boolean } = {}\n): WorkbenchSnapTarget {\n if (options.edgeSnapEnabled) {\n return target;\n }\n switch (target) {\n case \"top\":\n case \"top-left\":\n case \"top-right\":\n return \"top\";\n default:\n return null;\n }\n}\n","import { useCallback } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { WorkbenchNode, WorkbenchResizeHandle } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchResize<TData>(\n node: WorkbenchNode<TData>,\n handle: WorkbenchResizeHandle\n) {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n controller.commands.focusNode(node.id);\n controller.commands.setActiveResizeNode(node.id);\n\n const origin = { x: event.clientX, y: event.clientY };\n const initialFrame = node.frame;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const deltaX = moveEvent.clientX - origin.x;\n const deltaY = moveEvent.clientY - origin.y;\n controller.commands.resizeNode(\n node.id,\n resizeFrame(initialFrame, handle, deltaX, deltaY)\n );\n };\n\n const cleanup = () => {\n controller.commands.setActiveResizeNode(null);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", cleanup);\n window.removeEventListener(\"pointercancel\", cleanup);\n };\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", cleanup);\n window.addEventListener(\"pointercancel\", cleanup);\n },\n [controller, handle, node.frame, node.id]\n );\n}\n\nfunction resizeFrame(\n frame: WorkbenchNode[\"frame\"],\n handle: WorkbenchResizeHandle,\n deltaX: number,\n deltaY: number\n): WorkbenchNode[\"frame\"] {\n const next = { ...frame };\n if (handle.includes(\"east\")) {\n next.width += deltaX;\n }\n if (handle.includes(\"south\")) {\n next.height += deltaY;\n }\n if (handle.includes(\"west\")) {\n next.x += deltaX;\n next.width -= deltaX;\n }\n if (handle.includes(\"north\")) {\n next.y += deltaY;\n next.height -= deltaY;\n }\n return next;\n}\n","import type { ReactNode } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type {\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode,\n WorkbenchWindowHeaderContext,\n WorkbenchWindowHeaderDragHandleProps\n} from \"./types.ts\";\n\ntype WorkbenchHeaderGenieControls = {\n minimizeNodeToAnchor(nodeID: string, minimize?: () => void): void;\n};\n\nexport interface ResolveWorkbenchWindowHeaderInput<TData = unknown> {\n controller: WorkbenchController<TData>;\n defaultActions: ReactNode;\n genie: WorkbenchHeaderGenieControls;\n node: WorkbenchNode<TData>;\n onDoubleClick: WorkbenchWindowHeaderDragHandleProps[\"onDoubleClick\"];\n onDragStart: WorkbenchWindowHeaderDragHandleProps[\"onPointerDown\"];\n renderHeader?: WorkbenchRenderWindowHeader<TData>;\n windowChromeMode?: WorkbenchWindowChromeMode;\n}\n\nexport interface ResolvedWorkbenchWindowHeader<TData = unknown> {\n context: WorkbenchWindowHeaderContext<TData>;\n customHeader: ReactNode | null;\n windowChromeMode: WorkbenchWindowChromeMode;\n}\n\nexport function resolveWorkbenchWindowChromeMode<TData>({\n controller,\n node,\n windowChromeMode\n}: {\n controller: WorkbenchController<TData>;\n node: WorkbenchNode<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n}): WorkbenchWindowChromeMode {\n if (typeof windowChromeMode === \"function\") {\n return windowChromeMode({ controller, node });\n }\n\n return windowChromeMode ?? \"system\";\n}\n\nexport function resolveWorkbenchWindowHeader<TData>({\n controller,\n defaultActions,\n genie,\n node,\n onDoubleClick,\n onDragStart,\n renderHeader,\n windowChromeMode = \"system\"\n}: ResolveWorkbenchWindowHeaderInput<TData>): ResolvedWorkbenchWindowHeader<TData> {\n const context: WorkbenchWindowHeaderContext<TData> = {\n controller,\n defaultActions,\n dragHandleProps: {\n \"data-workbench-drag-handle\": \"true\",\n onDoubleClick,\n onPointerDown: onDragStart\n },\n genie,\n node,\n surfaceSize: controller.getSnapshot().surfaceSize\n };\n\n const customHeader =\n windowChromeMode === \"custom-header\" && renderHeader\n ? renderHeader(context)\n : null;\n\n return {\n context,\n customHeader,\n windowChromeMode: customHeader === null ? \"system\" : \"custom-header\"\n };\n}\n","import type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\nimport type { WorkbenchKeepMinimizedNodeMounted } from \"./types.ts\";\n\nexport function createRenderedWorkbenchNodeIDsSelector<TData>(\n shouldKeepMinimizedNodeMounted:\n | WorkbenchKeepMinimizedNodeMounted<TData>\n | undefined = undefined\n): (state: WorkbenchState<TData>) => readonly string[] {\n let previousIDs: readonly string[] | null = null;\n\n return (state) => {\n const nextIDs = state.nodes\n .filter((node) =>\n shouldRenderWorkbenchNode(node, shouldKeepMinimizedNodeMounted)\n )\n .map((node) => node.id);\n\n if (previousIDs && stringArraysEqual(previousIDs, nextIDs)) {\n return previousIDs;\n }\n\n previousIDs = nextIDs;\n return nextIDs;\n };\n}\n\nfunction shouldRenderWorkbenchNode<TData>(\n node: WorkbenchNode<TData>,\n shouldKeepMinimizedNodeMounted:\n | WorkbenchKeepMinimizedNodeMounted<TData>\n | undefined\n): boolean {\n return !node.isMinimized || shouldKeepMinimizedNodeMounted?.(node) === true;\n}\n\nfunction stringArraysEqual(left: readonly string[], right: readonly string[]) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every((value, index) => value === right[index]);\n}\n","import { useEffect } from \"react\";\nimport { selectFocusedVisibleWorkbenchNode } from \"../../core/selectors.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\nimport {\n resolveWorkbenchShortcutIntent,\n type WorkbenchWindowManagementShortcutPreset\n} from \"./workbenchShortcutIntent.ts\";\n\nexport function useWorkbenchShortcuts<TData = unknown>(\n options: {\n enabled?: boolean;\n windowManagementShortcutPreset?: WorkbenchWindowManagementShortcutPreset | null;\n } = {}\n): void {\n const controller = useWorkbenchController<TData>();\n const enabled = options.enabled ?? true;\n const windowManagementShortcutPreset =\n options.windowManagementShortcutPreset ?? null;\n\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n const intent = resolveWorkbenchShortcutIntent(event, {\n windowManagementShortcutPreset\n });\n if (!intent) {\n return;\n }\n\n let handled = false;\n const focusedNode = selectFocusedVisibleWorkbenchNode(\n controller.getSnapshot()\n );\n if (intent.type === \"exitFullscreen\") {\n if (focusedNode?.displayMode === \"fullscreen\") {\n controller.commands.exitFullscreen(focusedNode.id);\n handled = true;\n }\n } else if (intent.type === \"applyFocusedSnapTarget\") {\n if (focusedNode) {\n controller.commands.applySnapTarget(\n focusedNode.id,\n intent.snapTarget\n );\n handled = true;\n }\n } else if (intent.type === \"applyFocusedQuickLayout\") {\n if (focusedNode) {\n controller.commands.applyQuickLayout(focusedNode.id, intent.target);\n handled = true;\n }\n } else {\n controller.commands.applyVisibleLayoutPreset(intent.preset);\n handled = true;\n }\n\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [controller, enabled, windowManagementShortcutPreset]);\n}\n","import type {\n WorkbenchLayoutPreset,\n WorkbenchQuickLayoutTarget,\n WorkbenchSnapTarget\n} from \"../../core/types.ts\";\n\nexport type WorkbenchShortcutIntent =\n | { type: \"exitFullscreen\" }\n | {\n type: \"applyFocusedSnapTarget\";\n snapTarget: Exclude<WorkbenchSnapTarget, null>;\n }\n | {\n type: \"applyFocusedQuickLayout\";\n target: WorkbenchQuickLayoutTarget;\n }\n | {\n type: \"applyVisibleLayoutPreset\";\n preset: WorkbenchLayoutPreset;\n };\n\nexport type WorkbenchWindowManagementShortcutPreset =\n | \"commandArrows\"\n | \"commandShiftArrows\";\n\ninterface WorkbenchShortcutEventLike {\n altKey?: boolean;\n ctrlKey?: boolean;\n defaultPrevented?: boolean;\n key: string;\n metaKey?: boolean;\n shiftKey?: boolean;\n target?: EventTarget | null;\n}\n\nexport function resolveWorkbenchShortcutIntent(\n event: WorkbenchShortcutEventLike,\n options: {\n windowManagementShortcutPreset?: WorkbenchWindowManagementShortcutPreset | null;\n } = {}\n): WorkbenchShortcutIntent | null {\n if (\n event.defaultPrevented ||\n isEditableShortcutTarget(event.target ?? null)\n ) {\n return null;\n }\n\n if (\n event.key === \"Escape\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.shiftKey\n ) {\n return { type: \"exitFullscreen\" };\n }\n\n if (\n !matchesWindowManagementShortcutPreset(\n event,\n options.windowManagementShortcutPreset ?? null\n )\n ) {\n return null;\n }\n\n switch (event.key) {\n case \"ArrowLeft\":\n return { type: \"applyFocusedSnapTarget\", snapTarget: \"left\" };\n case \"ArrowRight\":\n return { type: \"applyFocusedSnapTarget\", snapTarget: \"right\" };\n case \"ArrowUp\":\n return { type: \"applyFocusedQuickLayout\", target: \"top\" };\n case \"ArrowDown\":\n return { type: \"applyFocusedQuickLayout\", target: \"bottom\" };\n case \"0\":\n return {\n type: \"applyVisibleLayoutPreset\",\n preset: { kind: \"balanced\" }\n };\n default:\n return null;\n }\n}\n\nfunction matchesWindowManagementShortcutPreset(\n event: WorkbenchShortcutEventLike,\n preset: WorkbenchWindowManagementShortcutPreset | null\n): boolean {\n if (preset === null) {\n return false;\n }\n if (!event.metaKey || event.ctrlKey || event.altKey) {\n return false;\n }\n switch (preset) {\n case \"commandArrows\":\n return !event.shiftKey;\n case \"commandShiftArrows\":\n return event.shiftKey === true;\n }\n}\n\nfunction isEditableShortcutTarget(target: EventTarget | null): boolean {\n const candidate = target as {\n isContentEditable?: boolean;\n tagName?: string;\n } | null;\n const tagName = candidate?.tagName?.toUpperCase();\n return (\n candidate?.isContentEditable === true ||\n tagName === \"INPUT\" ||\n tagName === \"TEXTAREA\" ||\n tagName === \"SELECT\"\n );\n}\n","import { useLayoutEffect, useRef, type RefObject } from \"react\";\nimport type { WorkbenchSize } from \"../../core/types.ts\";\n\nexport function useWorkbenchSurfaceSize<TElement extends HTMLElement>(\n onSizeChange: (size: WorkbenchSize) => void\n): RefObject<TElement | null> {\n const ref = useRef<TElement | null>(null);\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!element) {\n return;\n }\n\n const publish = () => {\n const rect = element.getBoundingClientRect();\n onSizeChange({\n width: Math.max(0, Math.round(rect.width)),\n height: Math.max(0, Math.round(rect.height))\n });\n };\n\n publish();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publish);\n return () => {\n window.removeEventListener(\"resize\", publish);\n };\n }\n\n const observer = new ResizeObserver(publish);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [onSizeChange]);\n\n return ref;\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode\n} from \"react\";\nimport { createPortal, flushSync } from \"react-dom\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"../store/types.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchMinimizeAnimation } from \"./types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport {\n centerPointFromRect,\n cloneMeaningfulGenieElement,\n easeInQuadratic,\n isUsableGenieRect,\n renderGenieScanlines,\n viewportRectFromElement,\n type WorkbenchGenieDirection,\n type WorkbenchGenieMeaningfulImageClone,\n type WorkbenchGenieViewportRect\n} from \"./genieAnimation.ts\";\n\nconst genieDurationMs = 400;\nconst previewCaptureRaceTimeoutMs = 120;\nconst scaleMinimizeDurationMs = 220;\nconst genieMaxDevicePixelRatio = 2;\nconst genieSnapshotScale = 1;\nconst renderedGeniePreviewHeaderOffsetPx = 40;\nconst minimizedDockSlotEnterAnimationMs = 720;\nconst dockAnchorResolveMaxAnimationFrames = 3;\nconst dockPreviewMaxWidth = 260;\nconst dockPreviewMaxHeight = 170;\nconst dockPreviewImageCacheMaxEntries = 96;\nconst inlineImageResourceCacheMaxEntries = 160;\nconst dockAnchorFallbackSizePx = 43.2;\nconst genieInlineImageMaxDevicePixelRatio = 2;\nconst dockPreviewImageByNodeID = new Map<string, string>();\nconst inlineImageResourceByUrl = new Map<string, Promise<string | null>>();\n\ninterface CapturedGenieTexture {\n canvas: HTMLCanvasElement;\n rect: WorkbenchGenieViewportRect;\n}\n\ninterface PreparedGenieTextureCapture {\n clone: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n rect: WorkbenchGenieViewportRect;\n}\n\ninterface PendingRenderedGeniePreviewCapture {\n id: number;\n nodeID: string;\n preview: ReactNode;\n rect: WorkbenchGenieViewportRect;\n usedFallbackPreview: boolean;\n}\n\nfunction resolveWorkbenchCaptureElement(\n windowElement: HTMLElement\n): HTMLElement {\n return (\n windowElement.querySelector<HTMLElement>(\n '[data-workbench-window-capture=\"true\"]'\n ) ??\n windowElement.querySelector<HTMLElement>(\".workbench-window\") ??\n windowElement\n );\n}\n\nfunction waitForNextAnimationFrame(): Promise<void> {\n return new Promise((resolve) => {\n window.requestAnimationFrame(() => resolve());\n });\n}\n\nfunction racePreviewImageCapture(\n promise: Promise<string | null>,\n timeoutMs: number\n): Promise<{\n previewImageUrl: string | null;\n status: \"pending\" | \"resolved\";\n}> {\n return new Promise((resolve) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n resolve({ previewImageUrl: null, status: \"pending\" });\n }, timeoutMs);\n promise.then((previewImageUrl) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n resolve({ previewImageUrl, status: \"resolved\" });\n });\n });\n}\n\nfunction isFocusedWorkbenchNode<TData>(\n controller: WorkbenchController<TData>,\n nodeID: string\n): boolean {\n return controller.getSnapshot().nodeStack.at(-1) === nodeID;\n}\n\nfunction isEmptyGeniePreview(preview: ReactNode): boolean {\n return preview === null || preview === undefined || preview === false;\n}\n\nfunction logWorkbenchGenieDiagnostic(\n debugDiagnostics: WorkbenchDebugDiagnostics | undefined,\n event: string,\n details: Record<string, unknown>,\n level: \"debug\" | \"info\" | \"warn\" = \"info\"\n): void {\n if (!debugDiagnostics?.isEnabled() || !debugDiagnostics.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level,\n source: \"workbench-genie\"\n })\n ).catch(() => undefined);\n}\n\nfunction describeGenieNode<TData>(\n node: WorkbenchNode<TData> | null | undefined\n): Record<string, unknown> {\n if (!node) {\n return {};\n }\n const data =\n node.data && typeof node.data === \"object\"\n ? (node.data as Record<string, unknown>)\n : {};\n return {\n displayMode: node.displayMode,\n instanceId: typeof data.instanceId === \"string\" ? data.instanceId : null,\n isMinimized: node.isMinimized,\n minimizedAtUnixMs: node.minimizedAtUnixMs,\n nodeId: node.id,\n title: node.title,\n typeId: typeof data.typeId === \"string\" ? data.typeId : null\n };\n}\n\nexport interface WorkbenchGenieController<TData = unknown> {\n genieLayer: ReactNode;\n isNodeGenieHidden: (nodeID: string) => boolean;\n isPendingMinimizedDockNode: (nodeID: string) => boolean;\n launchNodeFromAnchor: (\n anchorKey: string,\n nodeID: string,\n launch: () => Promise<string | null | void> | string | null | void\n ) => void;\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => void;\n pendingMinimizedNode: WorkbenchNode<TData> | null;\n registerDockAnchor: (anchorKey: string, element: HTMLElement | null) => void;\n shouldAnimateMinimizedDockEnter: (nodeID: string) => boolean;\n}\n\nexport type WorkbenchNodePreviewImageCapture<TData = unknown> = (\n node: WorkbenchNode<TData>\n) => Promise<string | null> | string | null;\n\nexport type WorkbenchNodeGeniePreviewRenderer<TData = unknown> = (\n node: WorkbenchNode<TData>,\n input: { previewViewport: { height: number; width: number } }\n) => ReactNode;\n\nfunction shouldReduceMotion(): boolean {\n return (\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches === true\n );\n}\n\nfunction clampProgress(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction resolveGenieAnimationProgress(\n direction: WorkbenchGenieDirection,\n progress: number\n): number {\n return direction === \"open\" ? easeInQuadratic(progress) : progress;\n}\n\nfunction blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n return;\n }\n reject(new Error(\"image blob reader produced a non-string result\"));\n });\n reader.addEventListener(\"error\", () => {\n reject(reader.error ?? new Error(\"image blob reader failed\"));\n });\n reader.readAsDataURL(blob);\n });\n}\n\nasync function fetchInlineImageResource(\n imageUrl: string\n): Promise<string | null> {\n try {\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new Error(`image fetch failed with status ${response.status}`);\n }\n const blob = await response.blob();\n return await blobToDataUrl(blob);\n } catch {\n return null;\n }\n}\n\nfunction readInlineImageResource(imageUrl: string): Promise<string | null> {\n if (imageUrl.startsWith(\"data:\")) {\n return Promise.resolve(imageUrl);\n }\n\n const cached = inlineImageResourceByUrl.get(imageUrl);\n if (cached) {\n inlineImageResourceByUrl.delete(imageUrl);\n inlineImageResourceByUrl.set(imageUrl, cached);\n return cached;\n }\n\n const promise = fetchInlineImageResource(imageUrl);\n inlineImageResourceByUrl.set(imageUrl, promise);\n while (inlineImageResourceByUrl.size > inlineImageResourceCacheMaxEntries) {\n const oldestImageUrl = inlineImageResourceByUrl.keys().next().value;\n if (typeof oldestImageUrl !== \"string\") {\n break;\n }\n inlineImageResourceByUrl.delete(oldestImageUrl);\n }\n return promise;\n}\n\nasync function inlineCloneImageResources({\n cloneRoot,\n images\n}: {\n cloneRoot: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n}): Promise<void> {\n const cloneImages = Array.from(cloneRoot.querySelectorAll(\"img\"));\n\n await Promise.all(\n images.map(async (imageInfo, index) => {\n const cloneImage = cloneImages[index];\n if (!cloneImage) {\n return;\n }\n\n cloneImage.removeAttribute(\"srcset\");\n cloneImage.removeAttribute(\"sizes\");\n const imageUrl = imageInfo.url;\n if (!imageUrl) {\n return;\n }\n const inlineImageUrl =\n (await readInlineImageResource(imageUrl)) ?? imageUrl;\n const resizedImageUrl = await resizeInlineImageResourceForGenieTexture(\n inlineImageUrl,\n imageInfo\n );\n if (resizedImageUrl && resizedImageUrl !== inlineImageUrl) {\n cloneImage.src = resizedImageUrl;\n return;\n }\n cloneImage.src = inlineImageUrl;\n })\n );\n}\n\nasync function loadImageFromSvg(svg: string): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n await image.decode();\n return image;\n}\n\nfunction resolveGenieInlineImageTargetSize({\n displayHeight,\n displayWidth\n}: WorkbenchGenieMeaningfulImageClone): {\n height: number;\n width: number;\n} | null {\n if (displayWidth <= 0 || displayHeight <= 0) {\n return null;\n }\n const scale = Math.min(\n window.devicePixelRatio || 1,\n genieInlineImageMaxDevicePixelRatio\n );\n return {\n height: Math.max(1, Math.ceil(displayHeight * scale)),\n width: Math.max(1, Math.ceil(displayWidth * scale))\n };\n}\n\nasync function resizeInlineImageResourceForGenieTexture(\n imageUrl: string,\n imageInfo: WorkbenchGenieMeaningfulImageClone\n): Promise<string | null> {\n const targetSize = resolveGenieInlineImageTargetSize(imageInfo);\n if (!targetSize) {\n return null;\n }\n\n const image = new Image();\n image.src = imageUrl;\n try {\n await image.decode();\n } catch {\n return null;\n }\n if (\n image.naturalWidth <= targetSize.width &&\n image.naturalHeight <= targetSize.height\n ) {\n return null;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = targetSize.width;\n canvas.height = targetSize.height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n try {\n context.drawImage(image, 0, 0, targetSize.width, targetSize.height);\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n}\n\nfunction prepareElementTextureCapture(\n element: HTMLElement\n): PreparedGenieTextureCapture | null {\n const windowRect = viewportRectFromElement(element);\n if (!isUsableGenieRect(windowRect)) {\n return null;\n }\n\n const clonedElement = cloneMeaningfulGenieElement(element, windowRect);\n if (!clonedElement) {\n return null;\n }\n const { clone, images } = clonedElement;\n clone.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\");\n clone.style.position = \"relative\";\n clone.style.left = \"0\";\n clone.style.top = \"0\";\n clone.style.width = `${windowRect.width}px`;\n clone.style.height = `${windowRect.height}px`;\n clone.style.transform = \"none\";\n clone.style.opacity = \"1\";\n clone.style.visibility = \"visible\";\n clone.style.pointerEvents = \"none\";\n return {\n clone,\n images,\n rect: windowRect\n };\n}\n\nfunction prepareRenderedGeniePreviewCloneForTexture(\n clone: HTMLElement,\n textureRect: WorkbenchGenieViewportRect\n): void {\n clone.style.width = `${textureRect.width}px`;\n clone.style.height = `${textureRect.height}px`;\n\n const previewElement = clone.querySelector<HTMLElement>(\n \".workbench-genie-preview-capture__preview\"\n );\n if (!previewElement) {\n return;\n }\n\n previewElement.style.display = \"block\";\n previewElement.style.width = `${textureRect.width}px`;\n previewElement.style.height = `${textureRect.height}px`;\n previewElement.style.padding = \"0\";\n previewElement.style.border = \"0\";\n previewElement.style.borderRadius = \"0\";\n previewElement.style.background = \"var(--background-panel)\";\n previewElement.style.boxShadow = \"none\";\n previewElement.style.transform = `translateY(${renderedGeniePreviewHeaderOffsetPx}px)`;\n}\n\nasync function renderPreparedElementTexture({\n clone,\n images,\n rect\n}: PreparedGenieTextureCapture): Promise<CapturedGenieTexture | null> {\n await inlineCloneImageResources({\n cloneRoot: clone,\n images\n });\n\n const svgTexture = createGenieSvgTexture(clone, rect);\n const image = await loadImageFromSvg(svgTexture);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(rect.width * genieSnapshotScale));\n canvas.height = Math.max(1, Math.round(rect.height * genieSnapshotScale));\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.imageSmoothingEnabled = true;\n context.imageSmoothingQuality = \"high\";\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n return { canvas, rect };\n}\n\nasync function captureElementTexture(\n element: HTMLElement\n): Promise<CapturedGenieTexture | null> {\n const preparedCapture = prepareElementTextureCapture(element);\n return preparedCapture ? renderPreparedElementTexture(preparedCapture) : null;\n}\n\nfunction createDockPreviewDataUrl(canvas: HTMLCanvasElement): string | null {\n if (canvas.width <= 0 || canvas.height <= 0) {\n return null;\n }\n\n const scale = Math.min(\n 1,\n dockPreviewMaxWidth / canvas.width,\n dockPreviewMaxHeight / canvas.height\n );\n const output = document.createElement(\"canvas\");\n output.width = Math.max(1, Math.round(canvas.width * scale));\n output.height = Math.max(1, Math.round(canvas.height * scale));\n const context = output.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.drawImage(canvas, 0, 0, output.width, output.height);\n return output.toDataURL(\"image/png\");\n}\n\nasync function renderPreviewImageTexture({\n previewImageUrl,\n rect\n}: {\n previewImageUrl: string;\n rect: WorkbenchGenieViewportRect;\n}): Promise<CapturedGenieTexture | null> {\n if (!isUsableGenieRect(rect)) {\n return null;\n }\n\n const image = new Image();\n image.src = previewImageUrl;\n await image.decode();\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(rect.width * genieSnapshotScale));\n canvas.height = Math.max(1, Math.round(rect.height * genieSnapshotScale));\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.imageSmoothingEnabled = true;\n context.imageSmoothingQuality = \"high\";\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n return { canvas, rect };\n}\n\nfunction readDockAnchorFallbackSize(element: HTMLElement): number {\n const cssValue = window\n .getComputedStyle(element)\n .getPropertyValue(\"--desktop-dock-size\");\n const parsed = Number.parseFloat(cssValue);\n return Number.isFinite(parsed) && parsed > 0\n ? parsed\n : dockAnchorFallbackSizePx;\n}\n\nfunction resolveDockAnchorViewportRect(\n element: HTMLElement\n): WorkbenchGenieViewportRect {\n const rect = viewportRectFromElement(element);\n if (\n element.dataset.desktopDockSlot !== \"true\" ||\n element.dataset.nodeState !== \"minimized\"\n ) {\n return rect;\n }\n\n const isLayoutAnimating =\n element.dataset.presence === \"entering\" ||\n element.dataset.collapsing === \"true\";\n if (!isLayoutAnimating) {\n return rect;\n }\n\n const fallbackSize = readDockAnchorFallbackSize(element);\n const minimumUsableSize = fallbackSize * 0.5;\n return {\n ...rect,\n height: rect.height >= minimumUsableSize ? rect.height : fallbackSize,\n width: rect.width >= minimumUsableSize ? rect.width : fallbackSize\n };\n}\n\nexport function writeCachedWorkbenchNodePreviewImage(\n nodeID: string,\n previewImageUrl: string | null | undefined\n): void {\n if (previewImageUrl) {\n dockPreviewImageByNodeID.delete(nodeID);\n dockPreviewImageByNodeID.set(nodeID, previewImageUrl);\n while (dockPreviewImageByNodeID.size > dockPreviewImageCacheMaxEntries) {\n const oldestNodeID = dockPreviewImageByNodeID.keys().next().value;\n if (typeof oldestNodeID !== \"string\") {\n break;\n }\n dockPreviewImageByNodeID.delete(oldestNodeID);\n }\n }\n}\n\nexport function readCachedWorkbenchNodePreviewImage(\n nodeID: string\n): string | null {\n return dockPreviewImageByNodeID.get(nodeID) ?? null;\n}\n\nexport async function captureWorkbenchNodePreviewImage(\n nodeID: string,\n options: { bypassCache?: boolean } = {}\n): Promise<string | null> {\n if (!options.bypassCache) {\n const cachedPreviewImageUrl = readCachedWorkbenchNodePreviewImage(nodeID);\n if (cachedPreviewImageUrl) {\n return cachedPreviewImageUrl;\n }\n }\n\n const windowElement =\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-workbench-window-id]\")\n ).find((candidate) => candidate.dataset.workbenchWindowId === nodeID) ??\n null;\n const captureTarget = windowElement\n ? resolveWorkbenchCaptureElement(windowElement)\n : null;\n if (!captureTarget) {\n return null;\n }\n\n const texture = await captureElementTexture(captureTarget).catch(() => null);\n const previewImageUrl = texture\n ? createDockPreviewDataUrl(texture.canvas)\n : null;\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n return previewImageUrl;\n}\n\nasync function captureProvidedWorkbenchNodePreviewImageForNode<TData>(\n node: WorkbenchNode<TData>,\n input: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n } = {}\n): Promise<string | null> {\n const previewImageUrl = await Promise.resolve(\n input.captureNodePreviewImage?.(node) ?? null\n ).catch(() => null);\n if (!previewImageUrl) {\n return null;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, previewImageUrl);\n persistWorkbenchNodePreviewImage(node, previewImageUrl, input);\n return previewImageUrl;\n}\n\nfunction persistWorkbenchNodePreviewImage<TData>(\n node: WorkbenchNode<TData>,\n previewImageUrl: string | null | undefined,\n input: {\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n }\n): void {\n if (!previewImageUrl || !input.dockPreviewCache) {\n return;\n }\n const key = input.resolveDockPreviewCacheKey?.(node) ?? null;\n if (!key) {\n return;\n }\n input.dockPreviewCache.write({ key, previewImageUrl });\n}\n\nfunction createGenieSvgTexture(\n element: HTMLElement,\n rect: WorkbenchGenieViewportRect\n): string {\n const svgNamespace = \"http://www.w3.org/2000/svg\";\n const svgDocument = document.implementation.createDocument(\n svgNamespace,\n \"svg\",\n null\n );\n const svg = svgDocument.documentElement;\n svg.setAttribute(\"xmlns\", svgNamespace);\n svg.setAttribute(\"width\", String(rect.width));\n svg.setAttribute(\"height\", String(rect.height));\n svg.setAttribute(\"viewBox\", `0 0 ${rect.width} ${rect.height}`);\n\n const foreignObject = svgDocument.createElementNS(\n svgNamespace,\n \"foreignObject\"\n );\n foreignObject.setAttribute(\"width\", \"100%\");\n foreignObject.setAttribute(\"height\", \"100%\");\n foreignObject.setAttribute(\"x\", \"0\");\n foreignObject.setAttribute(\"y\", \"0\");\n foreignObject.appendChild(svgDocument.importNode(element, true));\n svg.appendChild(foreignObject);\n\n return new XMLSerializer().serializeToString(svgDocument);\n}\n\nexport function useWorkbenchGenieAnimation<TData>({\n captureNodePreviewImage,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n minimizeAnimation = \"genie\",\n renderNodeGeniePreview,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shouldCaptureNodePreviewImage\n}: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n controller: WorkbenchController<TData>;\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n minimizeAnimation?: WorkbenchMinimizeAnimation;\n renderNodeGeniePreview?: WorkbenchNodeGeniePreviewRenderer<TData>;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shouldCaptureNodePreviewImage?: (node: WorkbenchNode<TData>) => boolean;\n}): WorkbenchGenieController<TData> {\n const dockAnchorElementsRef = useRef(new Map<string, HTMLElement>());\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const rafRef = useRef<number | null>(null);\n const animationGenerationRef = useRef(0);\n const animationCleanupRef = useRef<(() => void) | null>(null);\n const minimizedDockEnterAnimationNodeIdsRef = useRef(new Set<string>());\n const minimizedDockEnterAnimationTimersRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const minimizedGenieTextureByNodeIDRef = useRef(\n new Map<string, CapturedGenieTexture>()\n );\n const renderedPreviewCaptureIDRef = useRef(0);\n const renderedPreviewCaptureElementRef = useRef<HTMLDivElement | null>(null);\n const pendingRenderedPreviewCaptureRef =\n useRef<PendingRenderedGeniePreviewCapture | null>(null);\n const [isCanvasActive, setIsCanvasActive] = useState(false);\n const [genieHiddenNodeIDs, setGenieHiddenNodeIDs] = useState(\n () => new Set<string>()\n );\n const [pendingMinimizedNode, setPendingMinimizedNode] =\n useState<WorkbenchNode<TData> | null>(null);\n const [pendingRenderedPreviewCapture, setPendingRenderedPreviewCapture] =\n useState<PendingRenderedGeniePreviewCapture | null>(null);\n\n const registerDockAnchor = useCallback(\n (anchorKey: string, element: HTMLElement | null) => {\n if (element) {\n dockAnchorElementsRef.current.set(anchorKey, element);\n return;\n }\n dockAnchorElementsRef.current.delete(anchorKey);\n },\n []\n );\n\n const resolveDockAnchorRect = useCallback((anchorKey: string) => {\n const element = dockAnchorElementsRef.current.get(anchorKey) ?? null;\n if (!element) {\n return null;\n }\n return resolveDockAnchorViewportRect(element);\n }, []);\n\n const resolveDockAnchorRectAfterRender = useCallback(\n async (anchorKey: string, isCurrent: () => boolean) => {\n let dockRect = resolveDockAnchorRect(anchorKey);\n for (\n let frame = 0;\n (!dockRect || !isUsableGenieRect(dockRect)) &&\n frame < dockAnchorResolveMaxAnimationFrames;\n frame += 1\n ) {\n await waitForNextAnimationFrame();\n if (!isCurrent()) {\n return null;\n }\n dockRect = resolveDockAnchorRect(anchorKey);\n }\n return dockRect;\n },\n [resolveDockAnchorRect]\n );\n\n const resolveNodeElement = useCallback((nodeID: string) => {\n return (\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-workbench-window-id]\")\n ).find((candidate) => candidate.dataset.workbenchWindowId === nodeID) ??\n null\n );\n }, []);\n\n const resolveAnchorKeyForNode = useCallback(\n (node: WorkbenchNode<TData>) => resolveDockAnchorKey?.(node) ?? node.id,\n [resolveDockAnchorKey]\n );\n\n const releaseMinimizedDockEnterAnimation = useCallback((nodeID: string) => {\n const timer = minimizedDockEnterAnimationTimersRef.current.get(nodeID);\n if (timer) {\n clearTimeout(timer);\n minimizedDockEnterAnimationTimersRef.current.delete(nodeID);\n }\n minimizedDockEnterAnimationNodeIdsRef.current.delete(nodeID);\n }, []);\n\n const registerMinimizedDockEnterAnimation = useCallback(\n (nodeID: string) => {\n releaseMinimizedDockEnterAnimation(nodeID);\n minimizedDockEnterAnimationNodeIdsRef.current.add(nodeID);\n },\n [releaseMinimizedDockEnterAnimation]\n );\n\n const scheduleReleaseMinimizedDockEnterAnimation = useCallback(\n (nodeID: string, delayMs = minimizedDockSlotEnterAnimationMs) => {\n const existing = minimizedDockEnterAnimationTimersRef.current.get(nodeID);\n if (existing) {\n clearTimeout(existing);\n }\n minimizedDockEnterAnimationTimersRef.current.set(\n nodeID,\n setTimeout(() => {\n minimizedDockEnterAnimationTimersRef.current.delete(nodeID);\n minimizedDockEnterAnimationNodeIdsRef.current.delete(nodeID);\n }, delayMs)\n );\n },\n []\n );\n\n const shouldAnimateMinimizedDockEnter = useCallback((nodeID: string) => {\n return minimizedDockEnterAnimationNodeIdsRef.current.has(nodeID);\n }, []);\n\n const readMinimizedGenieTexture = useCallback((nodeID: string) => {\n return minimizedGenieTextureByNodeIDRef.current.get(nodeID) ?? null;\n }, []);\n\n const writeMinimizedGenieTexture = useCallback(\n (nodeID: string, texture: CapturedGenieTexture) => {\n const cache = minimizedGenieTextureByNodeIDRef.current;\n cache.delete(nodeID);\n cache.set(nodeID, texture);\n },\n []\n );\n\n const clearMinimizedGenieTexture = useCallback((nodeID: string) => {\n minimizedGenieTextureByNodeIDRef.current.delete(nodeID);\n }, []);\n\n const pruneMinimizedGenieTextures = useCallback(\n (retainNodeID?: string) => {\n const minimizedNodeIDs = new Set(\n controller\n .getSnapshot()\n .nodes.filter((node) => node.isMinimized === true)\n .map((node) => node.id)\n );\n if (retainNodeID) {\n minimizedNodeIDs.add(retainNodeID);\n }\n for (const nodeID of minimizedGenieTextureByNodeIDRef.current.keys()) {\n if (!minimizedNodeIDs.has(nodeID)) {\n minimizedGenieTextureByNodeIDRef.current.delete(nodeID);\n }\n }\n },\n [controller]\n );\n\n const hideNodeForGenie = useCallback((nodeID: string) => {\n setGenieHiddenNodeIDs((current) => {\n if (current.has(nodeID)) {\n return current;\n }\n return new Set([...current, nodeID]);\n });\n }, []);\n\n const showNodeForGenie = useCallback((nodeID: string) => {\n setGenieHiddenNodeIDs((current) => {\n if (!current.has(nodeID)) {\n return current;\n }\n const next = new Set(current);\n next.delete(nodeID);\n return next;\n });\n }, []);\n\n const clearPendingMinimizedNode = useCallback((nodeID: string) => {\n setPendingMinimizedNode((current) =>\n current?.id === nodeID ? null : current\n );\n }, []);\n\n const clearRenderedPreviewCapture = useCallback((id: number) => {\n if (pendingRenderedPreviewCaptureRef.current?.id !== id) {\n return;\n }\n pendingRenderedPreviewCaptureRef.current = null;\n renderedPreviewCaptureElementRef.current = null;\n setPendingRenderedPreviewCapture(null);\n }, []);\n\n const requestRenderedGeniePreviewTexture = useCallback(\n async ({\n node,\n textureRect\n }: {\n node: WorkbenchNode<TData>;\n textureRect: WorkbenchGenieViewportRect;\n }): Promise<CapturedGenieTexture | null> => {\n if (!isUsableGenieRect(textureRect)) {\n return null;\n }\n\n const previewViewport = {\n height: textureRect.height,\n width: textureRect.width\n };\n let preview: ReactNode = null;\n try {\n preview =\n renderNodeGeniePreview?.(node, {\n previewViewport\n }) ?? null;\n } catch {\n preview = null;\n }\n if (isEmptyGeniePreview(preview)) {\n return null;\n }\n const captureID = renderedPreviewCaptureIDRef.current + 1;\n renderedPreviewCaptureIDRef.current = captureID;\n const pendingCapture: PendingRenderedGeniePreviewCapture = {\n id: captureID,\n nodeID: node.id,\n preview,\n rect: textureRect,\n usedFallbackPreview: false\n };\n\n pendingRenderedPreviewCaptureRef.current = pendingCapture;\n flushSync(() => {\n setPendingRenderedPreviewCapture(pendingCapture);\n });\n\n try {\n await waitForNextAnimationFrame();\n await waitForNextAnimationFrame();\n\n if (pendingRenderedPreviewCaptureRef.current?.id !== captureID) {\n return null;\n }\n\n const element = renderedPreviewCaptureElementRef.current;\n if (!element) {\n return null;\n }\n\n const preparedCapture = prepareElementTextureCapture(element);\n if (!preparedCapture) {\n return null;\n }\n\n prepareRenderedGeniePreviewCloneForTexture(\n preparedCapture.clone,\n textureRect\n );\n const texture = await renderPreparedElementTexture({\n ...preparedCapture,\n rect: textureRect\n });\n return texture;\n } catch {\n return null;\n } finally {\n clearRenderedPreviewCapture(captureID);\n }\n },\n [clearRenderedPreviewCapture, renderNodeGeniePreview]\n );\n\n const setupCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n return null;\n }\n const devicePixelRatio = Math.min(\n window.devicePixelRatio || 1,\n genieMaxDevicePixelRatio\n );\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n canvas.width = Math.max(1, Math.round(viewportWidth * devicePixelRatio));\n canvas.height = Math.max(1, Math.round(viewportHeight * devicePixelRatio));\n canvas.style.width = `${viewportWidth}px`;\n canvas.style.height = `${viewportHeight}px`;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);\n return { context, viewportHeight, viewportWidth };\n }, []);\n\n const clearCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n const context = canvas?.getContext(\"2d\") ?? null;\n if (canvas && context) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n setIsCanvasActive(false);\n }, []);\n\n const stopAnimation = useCallback((runCleanup = true) => {\n animationGenerationRef.current += 1;\n if (rafRef.current !== null) {\n window.cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n const cleanup = animationCleanupRef.current;\n animationCleanupRef.current = null;\n if (runCleanup) {\n cleanup?.();\n }\n }, []);\n\n const runGenieAnimation = useCallback(\n ({\n direction,\n dockRect,\n onComplete,\n onCancel,\n skipStop,\n texture\n }: {\n direction: WorkbenchGenieDirection;\n dockRect: WorkbenchGenieViewportRect;\n onCancel?: () => void;\n onComplete: () => void;\n skipStop?: boolean;\n texture: CapturedGenieTexture;\n }) => {\n if (!skipStop) {\n stopAnimation();\n }\n const setup = setupCanvas();\n if (!setup) {\n onComplete();\n return;\n }\n\n const generation = animationGenerationRef.current;\n const dockPoint = centerPointFromRect(dockRect);\n let startTime: number | null = null;\n animationCleanupRef.current = onCancel ?? null;\n setIsCanvasActive(true);\n renderGenieScanlines(\n setup.context,\n setup.viewportWidth,\n setup.viewportHeight,\n {\n direction,\n dockPoint,\n progress: 0,\n texture: texture.canvas,\n textureRect: texture.rect\n }\n );\n\n const drawFrame = (timestamp: number) => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n startTime ??= timestamp;\n const progress = clampProgress(\n (timestamp - startTime) / genieDurationMs\n );\n const animationProgress = resolveGenieAnimationProgress(\n direction,\n progress\n );\n renderGenieScanlines(\n setup.context,\n setup.viewportWidth,\n setup.viewportHeight,\n {\n direction,\n dockPoint,\n progress: animationProgress,\n texture: texture.canvas,\n textureRect: texture.rect\n }\n );\n\n if (progress < 1) {\n rafRef.current = window.requestAnimationFrame(drawFrame);\n return;\n }\n\n rafRef.current = null;\n animationCleanupRef.current = null;\n onComplete();\n };\n\n rafRef.current = window.requestAnimationFrame(drawFrame);\n },\n [setupCanvas, stopAnimation]\n );\n\n const runScaleWindowAnimation = useCallback(\n ({\n direction,\n dockRect,\n nodeElement,\n onCancel,\n onComplete,\n skipStop\n }: {\n direction: WorkbenchGenieDirection;\n dockRect: WorkbenchGenieViewportRect;\n nodeElement: HTMLElement;\n onCancel: () => void;\n onComplete: () => void;\n skipStop?: boolean;\n }) => {\n if (!skipStop) {\n stopAnimation();\n }\n const windowRect = viewportRectFromElement(nodeElement);\n if (!isUsableGenieRect(windowRect) || !isUsableGenieRect(dockRect)) {\n onComplete();\n return;\n }\n\n const generation = animationGenerationRef.current;\n const fromCenter = centerPointFromRect(windowRect);\n const toCenter = centerPointFromRect(dockRect);\n const targetScale = Math.max(\n 0.04,\n Math.min(\n 0.32,\n dockRect.width / Math.max(1, windowRect.width),\n dockRect.height / Math.max(1, windowRect.height)\n )\n );\n const previousPointerEvents = nodeElement.style.pointerEvents;\n const previousTransformOrigin = nodeElement.style.transformOrigin;\n const previousVisibility = nodeElement.style.visibility;\n const previousZIndex = nodeElement.style.zIndex;\n nodeElement.style.pointerEvents = \"none\";\n nodeElement.style.transformOrigin = \"center center\";\n nodeElement.style.visibility = \"visible\";\n nodeElement.style.zIndex = \"var(--z-workbench-genie)\";\n\n const dockTransform = `translate3d(${toCenter.x - fromCenter.x}px, ${\n toCenter.y - fromCenter.y\n }px, 0) scale(${targetScale})`;\n const windowTransform = \"translate3d(0, 0, 0) scale(1)\";\n const keyframes =\n direction === \"open\"\n ? [\n {\n opacity: 0,\n transform: dockTransform\n },\n {\n opacity: 1,\n transform: windowTransform\n }\n ]\n : [\n {\n opacity: 1,\n transform: windowTransform\n },\n {\n opacity: 0,\n transform: dockTransform\n }\n ];\n const animation = nodeElement.animate(keyframes, {\n duration: scaleMinimizeDurationMs,\n easing: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n fill: \"forwards\"\n });\n\n const restoreElement = () => {\n animation.cancel();\n nodeElement.style.pointerEvents = previousPointerEvents;\n nodeElement.style.transformOrigin = previousTransformOrigin;\n nodeElement.style.visibility = previousVisibility;\n nodeElement.style.zIndex = previousZIndex;\n };\n\n animationCleanupRef.current = () => {\n restoreElement();\n onCancel();\n };\n animation.finished\n .then(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n animationCleanupRef.current = null;\n restoreElement();\n onComplete();\n })\n .catch(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n animationCleanupRef.current = null;\n restoreElement();\n onComplete();\n });\n },\n [stopAnimation]\n );\n\n useEffect(() => () => stopAnimation(false), [stopAnimation]);\n\n const startOpenOrRestoreAnimation = useCallback(\n async (\n nodeID: string,\n anchorKey: string,\n generation: number,\n dockRectFallback: WorkbenchGenieViewportRect | null,\n minimizedNode: WorkbenchNode<TData> | null\n ) => {\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n if (effectiveMinimizeAnimation === \"off\") {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n const resolvedDockRect = resolveDockAnchorRect(anchorKey);\n const dockRect =\n resolvedDockRect && isUsableGenieRect(resolvedDockRect)\n ? resolvedDockRect\n : dockRectFallback;\n const nodeElement = resolveNodeElement(nodeID);\n if (effectiveMinimizeAnimation === \"scale\") {\n if (!dockRect || !nodeElement || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n runScaleWindowAnimation({\n direction: \"open\",\n dockRect,\n nodeElement,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n }\n });\n return;\n }\n\n if (!dockRect || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n const cachedTexture = readMinimizedGenieTexture(nodeID);\n const restoredWindowRect = nodeElement\n ? viewportRectFromElement(nodeElement)\n : null;\n const shouldRestoreFromRenderedPreview =\n minimizedNode !== null &&\n (shouldCaptureNodePreviewImage?.(minimizedNode) ?? true) === false;\n const renderedPreviewTexture =\n cachedTexture ||\n !shouldRestoreFromRenderedPreview ||\n !restoredWindowRect ||\n !isUsableGenieRect(restoredWindowRect)\n ? null\n : await requestRenderedGeniePreviewTexture({\n node: minimizedNode,\n textureRect: restoredWindowRect\n }).catch(() => null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n const captureTarget =\n cachedTexture || renderedPreviewTexture || !nodeElement\n ? null\n : resolveWorkbenchCaptureElement(nodeElement);\n if (!cachedTexture && !renderedPreviewTexture && !captureTarget) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n const texture =\n cachedTexture ??\n renderedPreviewTexture ??\n (captureTarget\n ? await captureElementTexture(captureTarget).catch(() => null)\n : null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n runGenieAnimation({\n direction: \"open\",\n dockRect,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n minimizeAnimation,\n readMinimizedGenieTexture,\n requestRenderedGeniePreviewTexture,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n runScaleWindowAnimation,\n shouldCaptureNodePreviewImage,\n showNodeForGenie\n ]\n );\n\n const launchNodeFromAnchor = useCallback(\n (\n anchorKey: string,\n nodeID: string,\n launch: () => Promise<string | null | void> | string | null | void\n ) => {\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n if (target.isMinimized !== true) {\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n if (effectiveMinimizeAnimation === \"off\") {\n stopAnimation();\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n stopAnimation();\n const dockRectFallback = resolveDockAnchorRect(anchorKey);\n hideNodeForGenie(nodeID);\n animationCleanupRef.current = () => {\n if (rafRef.current !== null) {\n window.cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n };\n const generation = animationGenerationRef.current;\n rafRef.current = window.requestAnimationFrame(() => {\n rafRef.current = null;\n if (generation !== animationGenerationRef.current) {\n return;\n }\n void Promise.resolve(launch())\n .catch(() => null)\n .then(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n void startOpenOrRestoreAnimation(\n nodeID,\n anchorKey,\n generation,\n dockRectFallback,\n target\n );\n });\n });\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n controller,\n hideNodeForGenie,\n minimizeAnimation,\n resolveDockAnchorRect,\n showNodeForGenie,\n startOpenOrRestoreAnimation,\n stopAnimation\n ]\n );\n\n const minimizeNodeToAnchor = useCallback(\n (nodeID: string, minimize?: () => void) => {\n void (async () => {\n pruneMinimizedGenieTextures();\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n nodeId: nodeID,\n reason: \"target_missing\"\n },\n \"warn\"\n );\n return;\n }\n clearMinimizedGenieTexture(nodeID);\n const runMinimize =\n minimize ?? (() => controller.commands.minimizeNode(nodeID));\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n const shouldCapturePreview =\n shouldCaptureNodePreviewImage?.(target) ?? true;\n if (effectiveMinimizeAnimation === \"off\") {\n stopAnimation();\n let frameID: number | null = null;\n let timerID: ReturnType<typeof setTimeout> | null = null;\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n if (frameID !== null) {\n window.cancelAnimationFrame(frameID);\n frameID = null;\n }\n if (timerID !== null) {\n clearTimeout(timerID);\n timerID = null;\n }\n animationCleanupRef.current = null;\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n runMinimize();\n });\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n };\n animationCleanupRef.current = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n commitMinimize();\n };\n registerMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n hideNodeForGenie(nodeID);\n setPendingMinimizedNode({\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n });\n });\n if (shouldCapturePreview) {\n void captureProvidedWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n frameID = window.requestAnimationFrame(() => {\n frameID = null;\n timerID = setTimeout(commitMinimize, 0);\n });\n return;\n }\n\n if (effectiveMinimizeAnimation === \"scale\") {\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n if (!nodeElement) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"scale\",\n reason: \"node_element_missing\"\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const wasFocusedForCapture =\n shouldCapturePreview && isFocusedWorkbenchNode(controller, nodeID);\n if (shouldCapturePreview && !wasFocusedForCapture) {\n flushSync(() => {\n controller.commands.focusNode(nodeID);\n });\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n }\n\n if (shouldCapturePreview) {\n void captureProvidedWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n runMinimize();\n };\n const cleanupPendingMinimize = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n commitMinimize();\n });\n };\n const pendingMinimizedNode: WorkbenchNode<TData> = {\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n };\n registerMinimizedDockEnterAnimation(nodeID);\n\n flushSync(() => {\n setPendingMinimizedNode(pendingMinimizedNode);\n });\n animationCleanupRef.current = cleanupPendingMinimize;\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const anchorKey = resolveAnchorKeyForNode(pendingMinimizedNode);\n const dockRect = await resolveDockAnchorRectAfterRender(\n anchorKey,\n () => generation === animationGenerationRef.current\n );\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (\n !nodeElement.isConnected ||\n !dockRect ||\n !isUsableGenieRect(dockRect)\n ) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n anchorKey,\n dockRect,\n mode: \"scale\",\n nodeElementConnected: nodeElement.isConnected,\n registeredDockAnchorKeys: Array.from(\n dockAnchorElementsRef.current.keys()\n ).filter((key) => key.startsWith(\"minimized:\")),\n reason: \"dock_rect_unusable\"\n },\n \"warn\"\n );\n cleanupPendingMinimize();\n return;\n }\n\n runScaleWindowAnimation({\n direction: \"minimize\",\n dockRect,\n nodeElement,\n onCancel: () => {\n cleanupPendingMinimize();\n },\n onComplete: () => {\n animationCleanupRef.current = null;\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n commitMinimize();\n });\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n },\n skipStop: true\n });\n return;\n }\n\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n if (!nodeElement) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"node_element_missing\"\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const windowRect = viewportRectFromElement(nodeElement);\n if (!isUsableGenieRect(windowRect)) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"window_rect_unusable\",\n windowRect\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const pendingMinimizedNode: WorkbenchNode<TData> = {\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n };\n const componentPreviewTexture = shouldCapturePreview\n ? null\n : await requestRenderedGeniePreviewTexture({\n node: pendingMinimizedNode,\n textureRect: windowRect\n }).catch(() => null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!shouldCapturePreview) {\n if (!componentPreviewTexture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.texture.missing\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"component_preview_texture_missing\",\n shouldCapturePreview,\n windowRect\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n }\n\n const captureTarget = resolveWorkbenchCaptureElement(nodeElement);\n const preparedTexture = shouldCapturePreview\n ? prepareElementTextureCapture(captureTarget)\n : null;\n if (!preparedTexture) {\n if (!componentPreviewTexture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"prepared_texture_missing\",\n shouldCapturePreview\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n }\n const wasFocusedForCapture = isFocusedWorkbenchNode(controller, nodeID);\n if (shouldCapturePreview && !wasFocusedForCapture) {\n flushSync(() => {\n controller.commands.focusNode(nodeID);\n });\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n }\n const previewImageUrlPromise = shouldCapturePreview\n ? Promise.resolve(captureNodePreviewImage?.(target) ?? null).catch(\n () => null\n )\n : Promise.resolve(null);\n const previewCaptureOutcome = await racePreviewImageCapture(\n previewImageUrlPromise,\n previewCaptureRaceTimeoutMs\n );\n const previewImageUrl = previewCaptureOutcome.previewImageUrl;\n if (previewCaptureOutcome.status === \"pending\") {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.preview_capture.deferred\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n timeoutMs: previewCaptureRaceTimeoutMs\n },\n \"debug\"\n );\n void previewImageUrlPromise.then((latePreviewImageUrl) => {\n if (\n !latePreviewImageUrl ||\n generation !== animationGenerationRef.current\n ) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(nodeID, latePreviewImageUrl);\n persistWorkbenchNodePreviewImage(target, latePreviewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n });\n }\n const previewImageTexture =\n shouldCapturePreview && previewImageUrl\n ? await renderPreviewImageTexture({\n previewImageUrl,\n rect: windowRect\n }).catch(() => null)\n : null;\n const texture =\n componentPreviewTexture ??\n previewImageTexture ??\n (preparedTexture\n ? await renderPreparedElementTexture(preparedTexture).catch(\n () => null\n )\n : null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n hasComponentPreviewTexture: Boolean(componentPreviewTexture),\n hasPreparedDomTexture: Boolean(preparedTexture),\n hasPreviewImageTexture: Boolean(previewImageTexture),\n mode: \"genie\",\n reason: \"texture_missing\",\n shouldCapturePreview\n },\n \"warn\"\n );\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n persistWorkbenchNodePreviewImage(target, previewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n runMinimize();\n return;\n }\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n persistWorkbenchNodePreviewImage(target, previewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n } else {\n const capturedPreviewImageUrl = createDockPreviewDataUrl(\n texture.canvas\n );\n writeCachedWorkbenchNodePreviewImage(nodeID, capturedPreviewImageUrl);\n persistWorkbenchNodePreviewImage(target, capturedPreviewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n writeMinimizedGenieTexture(nodeID, texture);\n pruneMinimizedGenieTextures(nodeID);\n\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n runMinimize();\n };\n const cleanupPendingGenieMinimize = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n commitMinimize();\n });\n clearCanvas();\n };\n animationCleanupRef.current = cleanupPendingGenieMinimize;\n\n registerMinimizedDockEnterAnimation(nodeID);\n\n flushSync(() => {\n setPendingMinimizedNode(pendingMinimizedNode);\n });\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const anchorKey = resolveAnchorKeyForNode(pendingMinimizedNode);\n const dockRect = await resolveDockAnchorRectAfterRender(\n anchorKey,\n () => generation === animationGenerationRef.current\n );\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!dockRect || !isUsableGenieRect(dockRect)) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n anchorKey,\n dockRect,\n mode: \"genie\",\n registeredDockAnchorKeys: Array.from(\n dockAnchorElementsRef.current.keys()\n ).filter((key) => key.startsWith(\"minimized:\")),\n reason: \"dock_rect_unusable\"\n },\n \"warn\"\n );\n animationCleanupRef.current = null;\n cleanupPendingGenieMinimize();\n return;\n }\n\n runGenieAnimation({\n direction: \"minimize\",\n dockRect,\n onCancel: () => {\n cleanupPendingGenieMinimize();\n },\n onComplete: () => {\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n commitMinimize();\n });\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n flushSync(() => {\n hideNodeForGenie(nodeID);\n });\n })();\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n controller,\n captureNodePreviewImage,\n clearPendingMinimizedNode,\n debugDiagnostics,\n dockPreviewCache,\n hideNodeForGenie,\n minimizeAnimation,\n pruneMinimizedGenieTextures,\n registerMinimizedDockEnterAnimation,\n releaseMinimizedDockEnterAnimation,\n requestRenderedGeniePreviewTexture,\n resolveAnchorKeyForNode,\n resolveDockPreviewCacheKey,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n runScaleWindowAnimation,\n scheduleReleaseMinimizedDockEnterAnimation,\n shouldCaptureNodePreviewImage,\n setupCanvas,\n showNodeForGenie,\n stopAnimation,\n writeMinimizedGenieTexture\n ]\n );\n\n useEffect(\n () => () => {\n for (const timer of minimizedDockEnterAnimationTimersRef.current.values()) {\n clearTimeout(timer);\n }\n minimizedDockEnterAnimationTimersRef.current.clear();\n minimizedDockEnterAnimationNodeIdsRef.current.clear();\n minimizedGenieTextureByNodeIDRef.current.clear();\n },\n []\n );\n\n return {\n genieLayer:\n typeof document === \"undefined\"\n ? null\n : createPortal(\n <>\n <canvas\n ref={canvasRef}\n className=\"workbench-genie-layer\"\n data-workbench-genie-layer-state={\n isCanvasActive ? \"active\" : \"idle\"\n }\n aria-hidden\n />\n {pendingRenderedPreviewCapture ? (\n <div\n ref={renderedPreviewCaptureElementRef}\n className=\"workbench-genie-preview-capture\"\n data-workbench-genie-preview-capture-id={\n pendingRenderedPreviewCapture.id\n }\n data-workbench-genie-preview-node-id={\n pendingRenderedPreviewCapture.nodeID\n }\n data-workbench-genie-preview-used-fallback={\n pendingRenderedPreviewCapture.usedFallbackPreview\n ? \"true\"\n : \"false\"\n }\n style={{\n height: pendingRenderedPreviewCapture.rect.height,\n width: pendingRenderedPreviewCapture.rect.width\n }}\n aria-hidden\n >\n {pendingRenderedPreviewCapture.preview}\n </div>\n ) : null}\n </>,\n document.body\n ),\n isNodeGenieHidden: useCallback(\n (nodeID: string) => genieHiddenNodeIDs.has(nodeID),\n [genieHiddenNodeIDs]\n ),\n isPendingMinimizedDockNode: useCallback(\n (nodeID: string) => pendingMinimizedNode?.id === nodeID,\n [pendingMinimizedNode]\n ),\n launchNodeFromAnchor,\n minimizeNodeToAnchor,\n pendingMinimizedNode,\n registerDockAnchor,\n shouldAnimateMinimizedDockEnter\n };\n}\n","export interface WorkbenchGenieViewportRect {\n height: number;\n left: number;\n top: number;\n width: number;\n}\n\nexport type WorkbenchGenieDirection = \"open\" | \"minimize\";\n\nexport interface WorkbenchGeniePoint {\n x: number;\n y: number;\n}\n\nexport interface WorkbenchGenieScanlineFrame {\n direction: WorkbenchGenieDirection;\n dockPoint: WorkbenchGeniePoint;\n progress: number;\n texture: HTMLCanvasElement;\n textureRect: WorkbenchGenieViewportRect;\n}\n\nexport interface WorkbenchGenieMeaningfulElementClone {\n clone: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n}\n\nexport interface WorkbenchGenieMeaningfulImageClone {\n displayHeight: number;\n displayWidth: number;\n url: string | null;\n}\n\nconst genieHorizontalRowStagger = 0.65;\nconst genieVerticalRowStagger = 0.2;\nconst genieDockGlowRadius = 55;\nconst genieScanlineStrideThresholdPx = 640;\nconst genieMaxScanlineStride = 3;\n\nexport function clampGenieProgress(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function easeInOutCubic(value: number): number {\n const progress = clampGenieProgress(value);\n return progress < 0.5\n ? 4 * progress * progress * progress\n : 1 - Math.pow(-2 * progress + 2, 3) / 2;\n}\n\nexport function easeInQuadratic(value: number): number {\n const progress = clampGenieProgress(value);\n return progress * progress;\n}\n\nexport function easeOutQuadratic(value: number): number {\n const progress = clampGenieProgress(value);\n return 1 - (1 - progress) * (1 - progress);\n}\n\nexport function lerpGenieValue(\n from: number,\n to: number,\n progress: number\n): number {\n return from + (to - from) * progress;\n}\n\nexport function viewportRectFromElement(\n element: HTMLElement\n): WorkbenchGenieViewportRect {\n const rect = element.getBoundingClientRect();\n return {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n };\n}\n\nexport function isUsableGenieRect(rect: WorkbenchGenieViewportRect): boolean {\n return rect.width > 0 && rect.height > 0;\n}\n\nexport function centerPointFromRect(\n rect: WorkbenchGenieViewportRect\n): WorkbenchGeniePoint {\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2\n };\n}\n\nfunction resolveGenieScanlineStride(textureHeight: number): number {\n return Math.max(\n 1,\n Math.min(\n genieMaxScanlineStride,\n Math.ceil(textureHeight / genieScanlineStrideThresholdPx)\n )\n );\n}\n\nfunction resolveGenieDirtyRect({\n dockPoint,\n textureRect,\n viewportHeight,\n viewportWidth\n}: {\n dockPoint: WorkbenchGeniePoint;\n textureRect: WorkbenchGenieViewportRect;\n viewportHeight: number;\n viewportWidth: number;\n}): WorkbenchGenieViewportRect {\n const padding = genieDockGlowRadius + 4;\n const left = Math.max(\n 0,\n Math.floor(Math.min(textureRect.left, dockPoint.x) - padding)\n );\n const top = Math.max(\n 0,\n Math.floor(Math.min(textureRect.top, dockPoint.y) - padding)\n );\n const right = Math.min(\n viewportWidth,\n Math.ceil(\n Math.max(textureRect.left + textureRect.width, dockPoint.x) + padding\n )\n );\n const bottom = Math.min(\n viewportHeight,\n Math.ceil(\n Math.max(textureRect.top + textureRect.height, dockPoint.y) + padding\n )\n );\n\n return {\n height: Math.max(0, bottom - top),\n left,\n top,\n width: Math.max(0, right - left)\n };\n}\n\nfunction resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger\n}: {\n direction: WorkbenchGenieDirection;\n progress: number;\n rowProgress: number;\n stagger: number;\n}): number {\n const start =\n direction === \"minimize\"\n ? (1 - rowProgress) * stagger\n : rowProgress * stagger;\n return clampGenieProgress((progress - start) / (1 - start));\n}\n\nfunction resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY,\n textureHeight,\n textureRect\n}: {\n direction: WorkbenchGenieDirection;\n dockPoint: WorkbenchGeniePoint;\n progress: number;\n sourceY: number;\n textureHeight: number;\n textureRect: WorkbenchGenieViewportRect;\n}): number {\n const rowProgress = clampGenieProgress(sourceY / textureHeight);\n const verticalProgress = resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger: genieVerticalRowStagger\n });\n const verticalEase = easeInQuadratic(verticalProgress);\n return direction === \"minimize\"\n ? lerpGenieValue(textureRect.top + sourceY, dockPoint.y, verticalEase)\n : lerpGenieValue(dockPoint.y, textureRect.top + sourceY, verticalEase);\n}\n\nfunction canInlineComputedStyle(\n element: Element\n): element is HTMLElement | SVGElement {\n return (\n element instanceof HTMLElement ||\n (typeof SVGElement !== \"undefined\" && element instanceof SVGElement)\n );\n}\n\nfunction isHiddenForGenieTexture(computed: CSSStyleDeclaration): boolean {\n return (\n computed.display === \"none\" ||\n computed.visibility === \"hidden\" ||\n computed.visibility === \"collapse\" ||\n Number.parseFloat(computed.opacity || \"1\") <= 0\n );\n}\n\nfunction rectsIntersect(\n a: WorkbenchGenieViewportRect,\n b: WorkbenchGenieViewportRect\n): boolean {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\ntype WorkbenchGenieElementSkipReason =\n | \"hidden\"\n | \"offscreen\"\n | \"unsupported\"\n | \"zero-size\";\n\nfunction resolveElementSkipReasonForGenieTexture(\n element: Element,\n rootRect: WorkbenchGenieViewportRect,\n computed: CSSStyleDeclaration\n): WorkbenchGenieElementSkipReason | null {\n if (isHiddenForGenieTexture(computed)) {\n return \"hidden\";\n }\n const tagName = element.tagName.toLowerCase();\n if (tagName === \"script\" || tagName === \"style\" || tagName === \"template\") {\n return \"unsupported\";\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return \"zero-size\";\n }\n return rectsIntersect(\n {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n rootRect\n )\n ? null\n : \"offscreen\";\n}\n\nfunction hasMeaningfulTextNode(node: Node): boolean {\n return node.textContent?.trim() ? true : false;\n}\n\nfunction cloneMeaningfulGenieNode(\n source: Node,\n rootRect: WorkbenchGenieViewportRect,\n images: WorkbenchGenieMeaningfulImageClone[],\n forceInclude = false\n): Node | null {\n if (source.nodeType === Node.TEXT_NODE) {\n if (!hasMeaningfulTextNode(source)) {\n return null;\n }\n return source.cloneNode(false);\n }\n if (source.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const sourceElement = source as Element;\n if (!canInlineComputedStyle(sourceElement)) {\n return null;\n }\n const computed = window.getComputedStyle(sourceElement);\n const skipReason = resolveElementSkipReasonForGenieTexture(\n sourceElement,\n rootRect,\n computed\n );\n const includeSelf = forceInclude || skipReason === null;\n if (!includeSelf && skipReason === \"hidden\") {\n return null;\n }\n\n const clone = sourceElement.cloneNode(false) as Element;\n copyGenieComputedStyle(sourceElement, clone, computed);\n\n for (const child of Array.from(source.childNodes)) {\n const childClone = cloneMeaningfulGenieNode(child, rootRect, images);\n if (childClone) {\n clone.appendChild(childClone);\n }\n }\n\n if (!includeSelf && clone.childNodes.length === 0) {\n return null;\n }\n\n if (sourceElement instanceof HTMLImageElement) {\n const rect = sourceElement.getBoundingClientRect();\n images.push({\n displayHeight: rect.height,\n displayWidth: rect.width,\n url:\n sourceElement.currentSrc ||\n sourceElement.src ||\n sourceElement.getAttribute(\"src\") ||\n null\n });\n }\n return clone;\n}\n\nfunction copyGenieComputedStyle(\n source: Element,\n clone: Element,\n computed = window.getComputedStyle(source)\n): void {\n if (!canInlineComputedStyle(source) || !canInlineComputedStyle(clone)) {\n return;\n }\n if (computed.cssText) {\n clone.style.cssText = computed.cssText;\n } else {\n for (let index = 0; index < computed.length; index += 1) {\n const propertyName = computed.item(index);\n if (!propertyName) {\n continue;\n }\n clone.style.setProperty(\n propertyName,\n computed.getPropertyValue(propertyName),\n computed.getPropertyPriority(propertyName)\n );\n }\n }\n clone.style.animation = \"none\";\n clone.style.opacity = \"1\";\n clone.style.transition = \"none\";\n clone.style.visibility = \"visible\";\n}\n\nexport function cloneMeaningfulGenieElement(\n source: HTMLElement,\n rootRect: WorkbenchGenieViewportRect\n): WorkbenchGenieMeaningfulElementClone | null {\n const images: WorkbenchGenieMeaningfulImageClone[] = [];\n const clone = cloneMeaningfulGenieNode(source, rootRect, images, true);\n if (!(clone instanceof HTMLElement)) {\n return null;\n }\n return { clone, images };\n}\n\nexport function renderGenieScanlines(\n context: CanvasRenderingContext2D,\n viewportWidth: number,\n viewportHeight: number,\n frame: WorkbenchGenieScanlineFrame\n): void {\n const { direction, dockPoint, texture, textureRect } = frame;\n const progress = clampGenieProgress(frame.progress);\n const sourceWidth = Math.max(1, texture.width);\n const sourceHeight = Math.max(1, texture.height);\n const destinationWidth = Math.max(1, textureRect.width);\n const destinationHeight = Math.max(1, textureRect.height);\n const scanlineStride = resolveGenieScanlineStride(sourceHeight);\n const dirtyRect = resolveGenieDirtyRect({\n dockPoint,\n textureRect,\n viewportHeight,\n viewportWidth\n });\n\n context.clearRect(\n dirtyRect.left,\n dirtyRect.top,\n dirtyRect.width,\n dirtyRect.height\n );\n\n for (let y = 0; y < sourceHeight; y += scanlineStride) {\n const sourceSliceHeight = Math.min(scanlineStride, sourceHeight - y);\n const sourceMidY = y + sourceSliceHeight / 2;\n const rowProgress = sourceMidY / sourceHeight;\n const horizontalProgress = resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger: genieHorizontalRowStagger\n });\n const horizontalEase = easeInOutCubic(horizontalProgress);\n\n const left =\n direction === \"minimize\"\n ? lerpGenieValue(textureRect.left, dockPoint.x, horizontalEase)\n : lerpGenieValue(dockPoint.x, textureRect.left, horizontalEase);\n const right =\n direction === \"minimize\"\n ? lerpGenieValue(\n textureRect.left + destinationWidth,\n dockPoint.x,\n horizontalEase\n )\n : lerpGenieValue(\n dockPoint.x,\n textureRect.left + destinationWidth,\n horizontalEase\n );\n const destinationSourceTop = (y / sourceHeight) * destinationHeight;\n const destinationSourceBottom =\n ((y + sourceSliceHeight) / sourceHeight) * destinationHeight;\n const targetTop = resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY: destinationSourceTop,\n textureHeight: destinationHeight,\n textureRect\n });\n const targetBottom = resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY: destinationSourceBottom,\n textureHeight: destinationHeight,\n textureRect\n });\n const targetY = Math.min(targetTop, targetBottom) - 0.5;\n const targetHeight = Math.max(1, Math.abs(targetBottom - targetTop) + 1);\n const rowWidth = right - left;\n\n if (rowWidth < 0.8) {\n continue;\n }\n\n context.drawImage(\n texture,\n 0,\n y,\n sourceWidth,\n sourceSliceHeight,\n left,\n targetY,\n rowWidth,\n targetHeight\n );\n }\n\n const glowProgress = direction === \"minimize\" ? progress : 1 - progress;\n if (glowProgress <= 0.75) {\n return;\n }\n\n const glowAlpha = easeOutQuadratic((glowProgress - 0.75) / 0.25) * 0.3;\n const dockGlow = context.createRadialGradient(\n dockPoint.x,\n dockPoint.y,\n 0,\n dockPoint.x,\n dockPoint.y,\n genieDockGlowRadius\n );\n dockGlow.addColorStop(0, `rgba(255, 255, 255, ${glowAlpha})`);\n dockGlow.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n context.fillStyle = dockGlow;\n context.fillRect(\n dirtyRect.left,\n dirtyRect.top,\n dirtyRect.width,\n dirtyRect.height\n );\n}\n","import type {\n WorkbenchContribution,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostClosePreparer,\n WorkbenchHostLaunchRequest,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps\n} from \"./types.ts\";\n\nexport interface ResolvedWorkbenchHostConfig {\n dockEntries: readonly WorkbenchHostDockEntry[];\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: WorkbenchHostProps[\"onLaunchRequest\"];\n onNodeCloseRequest?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n prepareHostClose?: WorkbenchHostClosePreparer;\n}\n\nexport interface ResolvedWorkbenchHostRuntimeConfig {\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: WorkbenchHostProps[\"onLaunchRequest\"];\n onNodeCloseRequest?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n}\n\nexport function resolveWorkbenchHostConfig(\n props: Pick<\n WorkbenchHostProps,\n | \"contributions\"\n | \"dockEntries\"\n | \"externalStateSource\"\n | \"nodes\"\n | \"onLaunchRequest\"\n | \"onNodeCloseRequest\"\n >\n): ResolvedWorkbenchHostConfig {\n const contributions = props.contributions ?? [];\n\n return {\n dockEntries: resolveWorkbenchHostDockEntries(props),\n ...resolveWorkbenchHostRuntimeConfig(props),\n prepareHostClose: resolveHostClosePreparer(contributions)\n };\n}\n\nexport function resolveWorkbenchHostDockEntries(\n props: Pick<WorkbenchHostProps, \"contributions\" | \"dockEntries\">\n): readonly WorkbenchHostDockEntry[] {\n const contributions = props.contributions ?? [];\n return mergeByKey(\n contributions.flatMap((contribution) => contribution.dockEntries ?? []),\n props.dockEntries ?? [],\n (entry) => entry.id\n );\n}\n\nexport function resolveWorkbenchHostRuntimeConfig(\n props: Pick<\n WorkbenchHostProps,\n | \"contributions\"\n | \"externalStateSource\"\n | \"nodes\"\n | \"onLaunchRequest\"\n | \"onNodeCloseRequest\"\n >\n): ResolvedWorkbenchHostRuntimeConfig {\n const contributions = props.contributions ?? [];\n\n return {\n externalStateSource:\n props.externalStateSource ??\n combineContributionExternalStateSources(contributions),\n nodes: mergeByKey(\n contributions.flatMap((contribution) => contribution.nodes ?? []),\n props.nodes ?? [],\n (definition) => definition.typeId\n ),\n onLaunchRequest: resolveLaunchRequestHandler({\n contributions,\n explicitHandler: props.onLaunchRequest\n }),\n onNodeCloseRequest: resolveNodeCloseRequestHandler({\n contributions,\n explicitHandler: props.onNodeCloseRequest\n })\n };\n}\n\nfunction mergeByKey<T>(\n contributionItems: readonly T[],\n explicitItems: readonly T[],\n getKey: (item: T) => string\n): readonly T[] {\n const merged = new Map<string, T>();\n for (const item of [...contributionItems, ...explicitItems]) {\n const key = getKey(item);\n merged.delete(key);\n merged.set(key, item);\n }\n return [...merged.values()];\n}\n\nfunction combineContributionExternalStateSources(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostExternalStateSource | undefined {\n const sources = contributions\n .map((contribution) => contribution.externalStateSource)\n .filter((source): source is WorkbenchHostExternalStateSource =>\n Boolean(source)\n );\n\n if (sources.length === 0) {\n return undefined;\n }\n\n return {\n getNodeState(input) {\n for (const source of sources) {\n const state = source.getNodeState(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n getSnapshotNodeState(input) {\n for (const source of sources) {\n const state = source.getSnapshotNodeState?.(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n getWorkspaceState(input) {\n for (const source of sources) {\n const state = source.getWorkspaceState(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n subscribe(listener) {\n const disposers = sources\n .map((source) => source.subscribe?.(listener))\n .filter((dispose): dispose is () => void => Boolean(dispose));\n return () => {\n for (const dispose of disposers) {\n dispose();\n }\n };\n }\n };\n}\n\nfunction resolveLaunchRequestHandler(input: {\n contributions: readonly WorkbenchContribution[];\n explicitHandler?: WorkbenchHostProps[\"onLaunchRequest\"];\n}): WorkbenchHostProps[\"onLaunchRequest\"] {\n const contributionHandlers = input.contributions\n .map((contribution) => contribution.onLaunchRequest)\n .filter(\n (\n handler\n ): handler is NonNullable<WorkbenchContribution[\"onLaunchRequest\"]> =>\n Boolean(handler)\n );\n\n if (!input.explicitHandler && contributionHandlers.length === 0) {\n return undefined;\n }\n\n return async (request: WorkbenchHostLaunchRequest) => {\n const explicitResult = await input.explicitHandler?.(request);\n if (explicitResult !== null && explicitResult !== undefined) {\n return explicitResult;\n }\n\n for (const handler of contributionHandlers) {\n const result = await handler(request);\n if (result !== null && result !== undefined) {\n return result;\n }\n }\n\n return null;\n };\n}\n\nfunction resolveNodeCloseRequestHandler(input: {\n contributions: readonly WorkbenchContribution[];\n explicitHandler?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n}): WorkbenchHostProps[\"onNodeCloseRequest\"] {\n const contributionHandlers = input.contributions\n .map((contribution) => contribution.onNodeCloseRequest)\n .filter(\n (\n handler\n ): handler is NonNullable<WorkbenchContribution[\"onNodeCloseRequest\"]> =>\n Boolean(handler)\n );\n\n if (!input.explicitHandler && contributionHandlers.length === 0) {\n return undefined;\n }\n\n return async (request: WorkbenchHostNodeCloseRequest) => {\n const explicitResult = await input.explicitHandler?.(request);\n if (explicitResult !== undefined) {\n return explicitResult;\n }\n\n for (const handler of contributionHandlers) {\n const result = await handler(request);\n if (result !== undefined) {\n return result;\n }\n }\n\n return undefined;\n };\n}\n\nexport function resolveWorkbenchHostPrepareClose(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostClosePreparer | undefined {\n return resolveHostClosePreparer(contributions);\n}\n\nfunction resolveHostClosePreparer(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostClosePreparer | undefined {\n const preparers = contributions\n .map((contribution) => contribution.prepareHostClose)\n .filter(\n (\n prepare\n ): prepare is NonNullable<WorkbenchContribution[\"prepareHostClose\"]> =>\n Boolean(prepare)\n );\n\n if (preparers.length === 0) {\n return undefined;\n }\n\n return async (context) => {\n for (const prepare of preparers) {\n if (!(await prepare(context))) {\n return false;\n }\n }\n\n return true;\n };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { createWorkbenchMissionControlI18nRuntime } from \"../mission-control/workbenchMissionControlI18n.ts\";\nimport { createWorkbenchWindowChromeI18nRuntime } from \"../react/workbenchWindowI18n.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport { createWorkbenchHostMissionControlAdapter } from \"./missionControlAdapter.ts\";\nimport type { ResolvedWorkbenchHostConfig } from \"./hostConfig.ts\";\nimport { createWorkbenchHostSession } from \"./session.ts\";\nimport type {\n WorkbenchHostChromeRenderContext,\n WorkbenchHostNodeData,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport { createWorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostRuntime({\n debugDiagnostics,\n externalStateSource,\n i18n,\n missionControlEnabled,\n nodes,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest,\n projectedNodes,\n snapshotRepository,\n workspaceId\n}: Pick<\n WorkbenchHostProps,\n | \"debugDiagnostics\"\n | \"i18n\"\n | \"onHandleReady\"\n | \"onMissionControlAdapterReady\"\n | \"projectedNodes\"\n | \"snapshotRepository\"\n | \"workspaceId\"\n> &\n Pick<\n ResolvedWorkbenchHostConfig,\n \"externalStateSource\" | \"nodes\" | \"onLaunchRequest\" | \"onNodeCloseRequest\"\n > & {\n missionControlEnabled: boolean;\n }) {\n const [externalStateRevision, bumpExternalStateRevision] = useState(0);\n const [, bumpHydrationRevision] = useState(0);\n const hostSession = useMemo(() => {\n logWorkbenchHostDebug(\"create-session\", debugDiagnostics, {\n nodeTypeIDs: nodes.map((node) => node.typeId),\n projectedNodeCount: projectedNodes?.length ?? 0,\n workspaceId\n });\n return createWorkbenchHostSession({\n debugDiagnostics,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest,\n projectedNodes: projectedNodes ?? [],\n snapshotRepository,\n workspaceId\n });\n }, [\n debugDiagnostics,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest,\n snapshotRepository,\n workspaceId\n ]);\n const hostI18n = useMemo(() => createWorkbenchHostI18nRuntime(i18n), [i18n]);\n const missionControlI18n = useMemo(\n () => createWorkbenchMissionControlI18nRuntime(i18n),\n [i18n]\n );\n const windowChromeI18n = useMemo(\n () => createWorkbenchWindowChromeI18nRuntime(i18n),\n [i18n]\n );\n const nodeDefinitionByType = useMemo(\n () => new Map(nodes.map((definition) => [definition.typeId, definition])),\n [nodes]\n );\n const isHydrating = hostSession.isHydrating?.() ?? false;\n const missionControlAdapter = useMemo(\n () =>\n missionControlEnabled && !isHydrating\n ? createWorkbenchHostMissionControlAdapter({\n activateNode: hostSession.activateNode.bind(hostSession),\n controller: hostSession.controller\n })\n : null,\n [hostSession.controller, isHydrating, missionControlEnabled]\n );\n const chromeController = useMemo(\n () =>\n isHydrating\n ? createReadOnlyWorkbenchController(hostSession.controller)\n : hostSession.controller,\n [hostSession.controller, isHydrating]\n );\n const chromeContext = useMemo<WorkbenchHostChromeRenderContext>(\n () => ({\n activateNode: hostSession.activateNode.bind(hostSession),\n controller: chromeController,\n focusNode: hostSession.focusNode.bind(hostSession),\n launchNode: hostSession.launchNode.bind(hostSession)\n }),\n [chromeController, hostSession]\n );\n\n useEffect(() => {\n let isCurrent = true;\n void hostSession.load().finally(() => {\n if (isCurrent) {\n bumpHydrationRevision((revision) => revision + 1);\n }\n });\n\n return () => {\n isCurrent = false;\n logWorkbenchHostDebug(\"dispose-session\", debugDiagnostics, {\n workspaceId\n });\n hostSession.dispose();\n };\n }, [debugDiagnostics, hostSession, workspaceId]);\n\n useEffect(() => {\n onHandleReady?.(hostSession);\n return () => {\n onHandleReady?.(null);\n };\n }, [hostSession, onHandleReady]);\n\n useEffect(() => {\n if (!onMissionControlAdapterReady) {\n return undefined;\n }\n\n onMissionControlAdapterReady(missionControlAdapter);\n return () => {\n onMissionControlAdapterReady(null);\n };\n }, [missionControlAdapter, onMissionControlAdapterReady]);\n\n useEffect(() => {\n hostSession.reconcileProjectedNodes(projectedNodes ?? []);\n }, [hostSession, projectedNodes]);\n\n useEffect(() => {\n if (!externalStateSource?.subscribe) {\n return undefined;\n }\n\n return externalStateSource.subscribe(() => {\n bumpExternalStateRevision((revision) => revision + 1);\n });\n }, [externalStateSource, workspaceId]);\n\n return {\n chromeContext,\n externalStateRevision,\n hostI18n,\n isHydrating,\n hostSession,\n missionControlI18n,\n missionControlAdapter,\n nodeDefinitionByType,\n windowChromeI18n\n };\n}\n\nconst noop = () => {};\n\nconst readOnlyWorkbenchCommands = new Proxy(\n {},\n {\n get: () => noop\n }\n) as WorkbenchController<WorkbenchHostNodeData>[\"commands\"];\n\nfunction createReadOnlyWorkbenchController(\n controller: WorkbenchController<WorkbenchHostNodeData>\n): WorkbenchController<WorkbenchHostNodeData> {\n return {\n commands: readOnlyWorkbenchCommands,\n dispatch: noop,\n getSnapshot: controller.getSnapshot.bind(controller),\n subscribe: controller.subscribe.bind(controller)\n };\n}\n\nfunction logWorkbenchHostDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n payload: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.isEnabled()) {\n return;\n }\n\n console.info(\"[workbench:host]\", {\n event,\n ...payload\n });\n void Promise.resolve(\n debugDiagnostics.log?.({\n details: payload,\n event,\n level: \"info\",\n source: \"workbench-host\",\n workspaceId:\n typeof payload.workspaceId === \"string\" ? payload.workspaceId : null\n })\n ).catch(() => undefined);\n}\n","export function createDerivedSnapshotGetter<TSourceSnapshot, TSnapshot>(input: {\n deriveSnapshot: (sourceSnapshot: TSourceSnapshot) => TSnapshot;\n getSourceSnapshot: () => TSourceSnapshot;\n}): () => TSnapshot {\n let cachedSourceSnapshot: TSourceSnapshot | null = null;\n let cachedSnapshot: TSnapshot | null = null;\n let hasCachedSnapshot = false;\n\n return () => {\n const sourceSnapshot = input.getSourceSnapshot();\n if (hasCachedSnapshot && cachedSourceSnapshot === sourceSnapshot) {\n return cachedSnapshot as TSnapshot;\n }\n\n const snapshot = input.deriveSnapshot(sourceSnapshot);\n cachedSourceSnapshot = sourceSnapshot;\n cachedSnapshot = snapshot;\n hasCachedSnapshot = true;\n return snapshot;\n };\n}\n","export const workbenchFocusInputActivationType = \"focus-input\";\n","import { selectVisibleWorkbenchNodes } from \"../core/selectors.ts\";\nimport { createDerivedSnapshotGetter } from \"../store/createDerivedSnapshotGetter.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type { WorkbenchMissionControlAdapter } from \"../mission-control/types.ts\";\nimport { workbenchFocusInputActivationType } from \"./activations.ts\";\nimport type {\n WorkbenchHostActivationTarget,\n WorkbenchHostNodeData\n} from \"./types.ts\";\n\nexport function createWorkbenchHostMissionControlAdapter(input: {\n activateNode?: (\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ) => void;\n controller: WorkbenchController<WorkbenchHostNodeData>;\n}): WorkbenchMissionControlAdapter<WorkbenchHostNodeData> {\n const getSnapshot = createDerivedSnapshotGetter<\n ReturnType<WorkbenchController<WorkbenchHostNodeData>[\"getSnapshot\"]>,\n ReturnType<\n WorkbenchMissionControlAdapter<WorkbenchHostNodeData>[\"getSnapshot\"]\n >\n >({\n deriveSnapshot(controllerSnapshot) {\n return {\n layoutConstraints: controllerSnapshot.layoutConstraints,\n surfaceSize: controllerSnapshot.surfaceSize,\n visibleNodes: selectVisibleWorkbenchNodes(controllerSnapshot)\n };\n },\n getSourceSnapshot() {\n return input.controller.getSnapshot();\n }\n });\n\n return {\n applyLayoutPreset(nodeIds, preset) {\n input.controller.commands.applyLayoutPreset(nodeIds, preset);\n },\n focusNode(nodeId) {\n if (input.activateNode) {\n input.activateNode(\n { nodeId },\n { type: workbenchFocusInputActivationType }\n );\n return;\n }\n input.controller.commands.focusNode(nodeId);\n },\n getSnapshot,\n subscribe(listener) {\n return input.controller.subscribe(listener);\n }\n };\n}\n","import {\n normalizeWorkbenchSnapshot,\n workbenchSnapshotSchemaVersion,\n type WorkbenchSnapshot,\n type WorkbenchSnapshotNode\n} from \"@tutti-os/workbench-snapshot\";\nimport type { WorkbenchNode, WorkbenchState } from \"./types.ts\";\n\nexport interface CreateWorkbenchNodeInput<TData = unknown> {\n data: TData;\n displayMode?: WorkbenchNode<TData>[\"displayMode\"];\n frame: WorkbenchNode<TData>[\"frame\"];\n id: string;\n isMinimized?: boolean;\n kind: string;\n minimizedAtUnixMs?: WorkbenchNode<TData>[\"minimizedAtUnixMs\"];\n restoreFrame?: WorkbenchNode<TData>[\"restoreFrame\"];\n sizeConstraints?: WorkbenchNode<TData>[\"sizeConstraints\"];\n title: string;\n}\n\nexport interface CreateWorkbenchSnapshotFromStateOptions {\n activeSpaceId?: WorkbenchSnapshot[\"activeSpaceId\"];\n metadata?: WorkbenchSnapshot[\"metadata\"];\n spaces?: WorkbenchSnapshot[\"spaces\"];\n}\n\nexport function createWorkbenchNode<TData = unknown>(\n input: CreateWorkbenchNodeInput<TData>\n): WorkbenchNode<TData> {\n return {\n id: input.id,\n kind: input.kind,\n title: input.title,\n frame: input.frame,\n displayMode: input.displayMode ?? \"floating\",\n restoreFrame: input.restoreFrame ?? null,\n isMinimized: input.isMinimized ?? false,\n minimizedAtUnixMs:\n input.isMinimized === true ? (input.minimizedAtUnixMs ?? null) : null,\n sizeConstraints: input.sizeConstraints ?? null,\n data: input.data\n };\n}\n\nexport function createWorkbenchNodeFromSnapshot<TData = unknown>(\n snapshotNode: WorkbenchSnapshotNode\n): WorkbenchNode<TData> {\n return createWorkbenchNode<TData>({\n id: snapshotNode.id,\n kind: snapshotNode.kind,\n title: snapshotNode.title,\n frame: snapshotNode.frame,\n displayMode: snapshotNode.displayMode,\n restoreFrame: snapshotNode.restoreFrame ?? null,\n isMinimized: snapshotNode.isMinimized,\n minimizedAtUnixMs: snapshotNode.minimizedAtUnixMs ?? null,\n data: snapshotNode.data as TData\n });\n}\n\nexport function createWorkbenchStateFromSnapshot<TData = unknown>(\n snapshot: WorkbenchSnapshot\n): Pick<WorkbenchState<TData>, \"nodeStack\" | \"nodes\"> {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n const nodes = normalized.nodes.map((node) =>\n createWorkbenchNodeFromSnapshot<TData>(node)\n );\n\n return {\n nodes,\n nodeStack: normalized.nodeStack ?? nodes.map((node) => node.id)\n };\n}\n\nexport function createWorkbenchSnapshotFromState<TData = unknown>(\n state: Pick<WorkbenchState<TData>, \"nodeStack\" | \"nodes\">,\n options: CreateWorkbenchSnapshotFromStateOptions = {}\n): WorkbenchSnapshot {\n return normalizeWorkbenchSnapshot({\n schemaVersion: workbenchSnapshotSchemaVersion,\n nodes: state.nodes.map((node) => ({\n id: node.id,\n kind: node.kind,\n title: node.title,\n frame: node.frame,\n displayMode: node.displayMode,\n restoreFrame: node.restoreFrame,\n isMinimized: node.isMinimized,\n minimizedAtUnixMs: node.minimizedAtUnixMs,\n data: node.data\n })),\n nodeStack: state.nodeStack,\n activeNodeId: state.nodeStack.at(-1) ?? null,\n spaces: options.spaces,\n activeSpaceId: options.activeSpaceId,\n metadata: options.metadata\n });\n}\n","import { clampWorkbenchRect } from \"./geometry.ts\";\nimport {\n defaultWorkbenchLayoutConstraints,\n type WorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchNode,\n type WorkbenchNodeSizeConstraints,\n type WorkbenchSize\n} from \"./types.ts\";\n\nexport const WORKBENCH_WINDOW_CASCADE_OFFSET = 28;\n\nexport function createWorkbenchInitialRect(\n index: number,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const frameOrigin = {\n x: constraints.safeArea.left + constraints.surfacePadding,\n y: constraints.safeArea.top + constraints.surfacePadding\n };\n const baseWidth = Math.min(760, Math.max(360, surfaceSize.width * 0.62));\n const baseHeight = Math.min(520, Math.max(260, surfaceSize.height * 0.62));\n const offset = (index % 8) * WORKBENCH_WINDOW_CASCADE_OFFSET;\n\n return clampWorkbenchRect(\n {\n x: frameOrigin.x + offset,\n y: frameOrigin.y + offset,\n width: baseWidth,\n height: baseHeight\n },\n surfaceSize,\n constraints,\n sizeConstraints\n );\n}\n\nexport function resolveWorkbenchCascadedRect<TData>(input: {\n constraints?: WorkbenchLayoutConstraints;\n currentNodeStack: readonly string[];\n existingNodes: readonly WorkbenchNode<TData>[];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchSize;\n}): WorkbenchFrame {\n const activeNode =\n input.existingNodes.find(\n (node) => node.id === input.currentNodeStack.at(-1)\n ) ?? input.existingNodes.at(-1);\n\n if (!activeNode) {\n return clampWorkbenchRect(\n input.preferredFrame,\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n }\n\n return clampWorkbenchRect(\n {\n x: activeNode.frame.x + WORKBENCH_WINDOW_CASCADE_OFFSET,\n y: activeNode.frame.y + WORKBENCH_WINDOW_CASCADE_OFFSET,\n width: input.preferredFrame.width,\n height: input.preferredFrame.height\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function placeWorkbenchNode<TData>(\n node: Omit<WorkbenchNode<TData>, \"frame\"> & { frame?: WorkbenchFrame },\n index: number,\n surfaceSize: WorkbenchSize\n): WorkbenchNode<TData> {\n return {\n ...node,\n frame: node.frame ?? createWorkbenchInitialRect(index, surfaceSize)\n };\n}\n","export interface WorkbenchHostNodeIdentityInput {\n instanceId: string;\n typeId: string;\n}\n\nexport function createWorkbenchHostProjectedNodeId(\n input: WorkbenchHostNodeIdentityInput\n): string {\n return `${input.typeId}:${input.instanceId}`;\n}\n\nexport function createWorkbenchHostLaunchedNodeId(\n input: WorkbenchHostNodeIdentityInput\n): string {\n return input.instanceId === input.typeId\n ? input.typeId\n : createWorkbenchHostProjectedNodeId(input);\n}\n","import type { WorkbenchSnapshot } from \"@tutti-os/workbench-snapshot\";\nimport {\n clampWorkbenchRect,\n getWorkbenchFullscreenRect,\n getWorkbenchLayoutFrame,\n rectsEqual\n} from \"../core/geometry.ts\";\nimport { resolveWorkbenchCascadedRect } from \"../core/placement.ts\";\nimport {\n createWorkbenchNode,\n createWorkbenchStateFromSnapshot\n} from \"../core/snapshot.ts\";\nimport type {\n WorkbenchFrame,\n WorkbenchNode,\n WorkbenchNodeSizeConstraints,\n WorkbenchState\n} from \"../core/types.ts\";\nimport {\n createWorkbenchHostLaunchedNodeId,\n createWorkbenchHostProjectedNodeId\n} from \"./nodeIdentity.ts\";\nimport type {\n WorkbenchHostActivation,\n WorkbenchHostLaunchFramePolicy,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProjectedNode\n} from \"./types.ts\";\n\nconst initializedMetadataKeys = [\n \"tuttiWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\nexport const COMPACT_LAUNCH_WIDTH_THRESHOLD = 1440;\nexport const COMPACT_LAUNCH_FRAME_SCALE = 0.85;\nexport const closedDockWindowFramesMetadataKey =\n \"workbenchHostClosedDockWindowFrames\";\nconst maxClosedDockWindowFrameEntries = 128;\n\nexport interface ClosedDockWindowFrameEntry {\n dockEntryId: string;\n frame: WorkbenchFrame;\n typeId: string;\n}\n\nexport function createDefaultLaunchResult(\n definition: WorkbenchHostNodeDefinition,\n input?: Pick<WorkbenchHostLaunchResult, \"dockEntryId\" | \"launchSource\">\n): WorkbenchHostLaunchResult {\n return {\n defaultFrame: definition.frame,\n dockEntryId: input?.dockEntryId,\n instanceId: definition.typeId,\n framePolicy: \"cascade\",\n launchSource: input?.launchSource ?? null,\n sizeConstraints: definition.sizeConstraints ?? null,\n title: definition.title,\n typeId: definition.typeId\n };\n}\n\nexport function createWorkbenchProjectedHostNode(input: {\n definition: WorkbenchHostNodeDefinition;\n projectedNode: WorkbenchHostProjectedNode;\n restoredNode: WorkbenchNode<WorkbenchHostNodeData> | null;\n}): WorkbenchNode<WorkbenchHostNodeData> {\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: null,\n dockEntryId: input.projectedNode.dockEntryId ?? null,\n ...(input.restoredNode?.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: input.restoredNode.data.snapshotNodeState }),\n instanceId: input.projectedNode.instanceId,\n instanceKey: input.projectedNode.instanceKey ?? null,\n isProjected: true,\n projectionSubject: input.projectedNode.subject ?? null,\n typeId: input.definition.typeId\n },\n displayMode: input.restoredNode?.displayMode,\n frame:\n input.restoredNode?.frame ??\n input.projectedNode.defaultFrame ??\n input.definition.frame,\n id: createProjectedNodeID(\n input.definition.typeId,\n input.projectedNode.instanceId\n ),\n isMinimized: input.restoredNode?.isMinimized,\n kind: input.definition.typeId,\n restoreFrame: input.restoredNode?.restoreFrame,\n sizeConstraints:\n input.projectedNode.sizeConstraints ??\n input.restoredNode?.sizeConstraints ??\n input.definition.sizeConstraints ??\n null,\n title: input.projectedNode.title\n });\n}\n\nexport function createWorkbenchLaunchedHostNode(input: {\n activation: WorkbenchHostActivation | null;\n definition: WorkbenchHostNodeDefinition;\n resolvedFrame: WorkbenchNode<WorkbenchHostNodeData>[\"frame\"];\n result: WorkbenchHostLaunchResult;\n}): WorkbenchNode<WorkbenchHostNodeData> {\n const preferredFrame = input.result.defaultFrame ?? input.definition.frame;\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: input.activation,\n dockEntryId: input.result.dockEntryId ?? null,\n instanceId: input.result.instanceId,\n instanceKey: input.result.instanceKey ?? null,\n isProjected: false,\n launchSource: input.result.launchSource ?? null,\n projectionSubject: null,\n typeId: input.definition.typeId\n },\n displayMode: input.result.displayMode,\n frame: input.resolvedFrame,\n id: createLaunchedNodeID(input.definition.typeId, input.result.instanceId),\n kind: input.definition.typeId,\n restoreFrame:\n input.result.displayMode === \"fullscreen\" ? preferredFrame : null,\n sizeConstraints: resolveWorkbenchHostNodeSizeConstraints(\n input.result,\n input.definition\n ),\n title: input.result.title ?? input.definition.title\n });\n}\n\nexport function resolveWorkbenchLaunchedHostNodeFrame(input: {\n currentState: Pick<\n WorkbenchState<WorkbenchHostNodeData>,\n \"layoutConstraints\" | \"nodeStack\" | \"nodes\" | \"surfaceSize\"\n >;\n definition: WorkbenchHostNodeDefinition;\n result: WorkbenchHostLaunchResult;\n}): WorkbenchNode<WorkbenchHostNodeData>[\"frame\"] {\n const preferredFrame = input.result.defaultFrame ?? input.definition.frame;\n const sizeConstraints = resolveWorkbenchHostNodeSizeConstraints(\n input.result,\n input.definition\n );\n\n if (input.result.displayMode === \"fullscreen\") {\n return getWorkbenchFullscreenRect(\n input.currentState.surfaceSize,\n input.currentState.layoutConstraints,\n sizeConstraints\n );\n }\n\n const framePolicy = resolveLaunchFramePolicy(input.result);\n\n if (framePolicy === \"absolute\") {\n return preferredFrame;\n }\n\n const responsivePreferredFrame = resolveCompactWorkbenchPreferredFrame({\n constraints: input.currentState.layoutConstraints,\n preferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize\n });\n\n if (framePolicy === \"cascade-same-type-centered\") {\n const existingSameTypeNodes = input.currentState.nodes.filter(\n (node) => node.data.typeId === input.result.typeId\n );\n const existingSameTypeNodeIds = new Set(\n existingSameTypeNodes.map((node) => node.id)\n );\n\n return resolveWorkbenchCascadedRect({\n currentNodeStack: input.currentState.nodeStack.filter((nodeId) =>\n existingSameTypeNodeIds.has(nodeId)\n ),\n existingNodes: existingSameTypeNodes,\n preferredFrame: resolveWorkbenchCenteredPreferredFrame({\n constraints: input.currentState.layoutConstraints,\n preferredFrame: responsivePreferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize\n }),\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize,\n constraints: input.currentState.layoutConstraints\n });\n }\n\n return resolveWorkbenchCascadedRect({\n currentNodeStack: input.currentState.nodeStack,\n existingNodes: input.currentState.nodes,\n preferredFrame: responsivePreferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize,\n constraints: input.currentState.layoutConstraints\n });\n}\n\nexport function closedDockWindowFrameEntryKey(input: {\n dockEntryId: string;\n typeId: string;\n}): string {\n return JSON.stringify([input.typeId, input.dockEntryId]);\n}\n\nexport function readClosedDockWindowFrameEntries(\n metadata: WorkbenchSnapshot[\"metadata\"]\n): Map<string, ClosedDockWindowFrameEntry> {\n const value = metadata?.[closedDockWindowFramesMetadataKey];\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n !Array.isArray(value.entries)\n ) {\n return new Map();\n }\n\n const entries = new Map<string, ClosedDockWindowFrameEntry>();\n for (const entry of value.entries.slice(0, maxClosedDockWindowFrameEntries)) {\n const normalized = normalizeClosedDockWindowFrameEntry(entry);\n if (!normalized) {\n continue;\n }\n entries.set(closedDockWindowFrameEntryKey(normalized), normalized);\n }\n return entries;\n}\n\nexport function writeClosedDockWindowFrameEntries(\n metadata: WorkbenchSnapshot[\"metadata\"],\n entries: Iterable<ClosedDockWindowFrameEntry>\n): WorkbenchSnapshot[\"metadata\"] {\n const normalizedEntries = Array.from(entries)\n .map(normalizeClosedDockWindowFrameEntry)\n .filter((entry): entry is ClosedDockWindowFrameEntry => entry !== null)\n .slice(-maxClosedDockWindowFrameEntries);\n const nextMetadata = { ...(metadata ?? {}) };\n if (normalizedEntries.length === 0) {\n delete nextMetadata[closedDockWindowFramesMetadataKey];\n } else {\n nextMetadata[closedDockWindowFramesMetadataKey] = {\n version: 1,\n entries: normalizedEntries\n };\n }\n return Object.keys(nextMetadata).length > 0 ? nextMetadata : undefined;\n}\n\nfunction normalizeClosedDockWindowFrameEntry(\n value: unknown\n): ClosedDockWindowFrameEntry | null {\n if (!isRecord(value)) {\n return null;\n }\n const typeId = normalizeNonEmptyString(value.typeId);\n const dockEntryId = normalizeNonEmptyString(value.dockEntryId);\n const frame = normalizeWorkbenchFrame(value.frame);\n if (!typeId || !dockEntryId || !frame) {\n return null;\n }\n\n return {\n dockEntryId,\n frame,\n typeId\n };\n}\n\nfunction normalizeWorkbenchFrame(value: unknown): WorkbenchFrame | null {\n if (!isRecord(value)) {\n return null;\n }\n const x = normalizeFiniteNumber(value.x);\n const y = normalizeFiniteNumber(value.y);\n const width = normalizeFiniteNumber(value.width);\n const height = normalizeFiniteNumber(value.height);\n if (x === null || y === null || width === null || height === null) {\n return null;\n }\n if (width < 160 || height < 120) {\n return null;\n }\n\n return { height, width, x, y };\n}\n\nfunction normalizeFiniteNumber(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n return Math.round(value);\n}\n\nfunction normalizeNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resolveLaunchFramePolicy(\n result: WorkbenchHostLaunchResult\n): WorkbenchHostLaunchFramePolicy {\n return result.framePolicy;\n}\n\nfunction resolveWorkbenchCenteredPreferredFrame(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchFrame {\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n\n return clampWorkbenchRect(\n {\n height: input.preferredFrame.height,\n width: input.preferredFrame.width,\n x: Math.round(\n layoutFrame.x + (layoutFrame.width - input.preferredFrame.width) / 2\n ),\n y: Math.round(\n layoutFrame.y + (layoutFrame.height - input.preferredFrame.height) / 2\n )\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function resolveCompactWorkbenchPreferredFrame(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchFrame {\n if (!shouldUseCompactWorkbenchFrame(input.surfaceSize)) {\n return input.preferredFrame;\n }\n\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n const width = Math.round(\n input.preferredFrame.width * COMPACT_LAUNCH_FRAME_SCALE\n );\n const height = Math.round(\n input.preferredFrame.height * COMPACT_LAUNCH_FRAME_SCALE\n );\n\n return clampWorkbenchRect(\n {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function compactRestoredWorkbenchHostNodes(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchNode<WorkbenchHostNodeData>[] {\n if (!shouldUseCompactWorkbenchFrame(input.surfaceSize)) {\n return [...input.nodes];\n }\n\n return input.nodes.map((node) => {\n const sizeConstraints =\n node.sizeConstraints ??\n input.nodeDefinitionByType.get(node.data.typeId)?.sizeConstraints ??\n null;\n if (node.displayMode === \"fullscreen\") {\n return {\n ...node,\n frame: getWorkbenchFullscreenRect(\n input.surfaceSize,\n input.constraints,\n sizeConstraints\n )\n };\n }\n\n const defaultFrame =\n input.nodeDefinitionByType.get(node.data.typeId)?.frame ?? node.frame;\n const compactWidth = Math.round(\n defaultFrame.width * COMPACT_LAUNCH_FRAME_SCALE\n );\n const compactHeight = Math.round(\n defaultFrame.height * COMPACT_LAUNCH_FRAME_SCALE\n );\n const width = Math.min(node.frame.width, compactWidth);\n const height = Math.min(node.frame.height, compactHeight);\n const sizeChanged =\n width !== node.frame.width || height !== node.frame.height;\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n const frame = clampWorkbenchRect(\n sizeChanged\n ? {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n }\n : node.frame,\n input.surfaceSize,\n input.constraints,\n sizeConstraints\n );\n\n return rectsEqual(node.frame, frame) ? node : { ...node, frame };\n });\n}\n\nfunction shouldUseCompactWorkbenchFrame(\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"]\n): boolean {\n return surfaceSize.width < COMPACT_LAUNCH_WIDTH_THRESHOLD;\n}\n\nexport function createProjectedNodeID(\n typeId: string,\n instanceId: string\n): string {\n return createWorkbenchHostProjectedNodeId({ instanceId, typeId });\n}\n\nexport function persistedWorkbenchState(\n state: Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\">,\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>\n): Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\"> {\n return {\n nodeStack: state.nodeStack,\n nodes: state.nodes\n .filter((node) => {\n return (\n nodeDefinitionByType.get(node.data.typeId)?.window?.persists !== false\n );\n })\n .map((node) => ({\n ...node,\n data: {\n dockEntryId: node.data.dockEntryId ?? null,\n ...(node.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: node.data.snapshotNodeState }),\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n ...(node.data.isProjected === true ? { isProjected: true } : {}),\n typeId: node.data.typeId\n }\n }))\n };\n}\n\nexport function stateFromSnapshotOrDefinitions(\n snapshot: WorkbenchSnapshot | null,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[],\n projectedNodes: readonly WorkbenchHostProjectedNode[] = []\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n if (!snapshot) {\n return mergeProjectedNodesIntoState(\n createDefaultWorkbenchState(nodeDefinitions),\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n }\n\n const snapshotState = createWorkbenchStateFromSnapshot<unknown>(snapshot);\n const nodes = snapshotState.nodes\n .map((node) => {\n const definition = resolveDefinitionForRestoredNode(\n node,\n nodeDefinitions\n );\n if (!definition) {\n return null;\n }\n if (readWorkbenchHostNodeData(node.data)?.isProjected === true) {\n return null;\n }\n return createRestoredNode(definition, node);\n })\n .filter(\n (node): node is WorkbenchNode<WorkbenchHostNodeData> => node !== null\n )\n .filter((node) => {\n const definition = nodeDefinitions.find(\n (candidate) => candidate.typeId === node.data.typeId\n );\n return (\n definition?.window?.persists !== false &&\n definition?.window?.restoreOnLoad !== false\n );\n });\n\n if (nodes.length === 0 && !isSnapshotInitialized(snapshot)) {\n return mergeProjectedNodesIntoState(\n createDefaultWorkbenchState(nodeDefinitions),\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n }\n\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const nodeStack = snapshotState.nodeStack.filter((nodeID) =>\n nodeIDs.has(nodeID)\n );\n for (const node of nodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n\n return mergeProjectedNodesIntoState(\n {\n nodeStack,\n nodes\n },\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n}\n\nexport function restoredSnapshotNodesByID(\n snapshot: WorkbenchSnapshot | null,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): Map<string, WorkbenchNode<WorkbenchHostNodeData>> {\n if (!snapshot) {\n return new Map();\n }\n\n const nodes = createWorkbenchStateFromSnapshot<unknown>(snapshot)\n .nodes.map((node) => {\n const definition = resolveDefinitionForRestoredNode(\n node,\n nodeDefinitions\n );\n if (!definition) {\n return null;\n }\n return createRestoredNode(definition, node);\n })\n .filter(\n (node): node is WorkbenchNode<WorkbenchHostNodeData> => node !== null\n );\n\n return new Map(nodes.map((node) => [node.id, node]));\n}\n\nexport function updateProjectedNodeFromInput(\n node: WorkbenchNode<WorkbenchHostNodeData>,\n projectedNode: WorkbenchHostProjectedNode,\n definition?: WorkbenchHostNodeDefinition\n): WorkbenchNode<WorkbenchHostNodeData> {\n const nextInstanceKey = projectedNode.instanceKey ?? null;\n const nextSubject = projectedNode.subject ?? null;\n const nextDockEntryId = projectedNode.dockEntryId ?? null;\n const nextSizeConstraints =\n projectedNode.sizeConstraints ?? definition?.sizeConstraints ?? null;\n if (\n node.title === projectedNode.title &&\n node.data.dockEntryId === nextDockEntryId &&\n node.data.instanceId === projectedNode.instanceId &&\n node.data.instanceKey === nextInstanceKey &&\n node.data.isProjected === true &&\n projectedSubjectsEqual(node.data.projectionSubject ?? null, nextSubject) &&\n node.sizeConstraints?.minWidth === nextSizeConstraints?.minWidth &&\n node.sizeConstraints?.minHeight === nextSizeConstraints?.minHeight &&\n node.data.typeId === projectedNode.typeId\n ) {\n return node;\n }\n\n return {\n ...node,\n data: {\n dockEntryId: nextDockEntryId,\n ...(node.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: node.data.snapshotNodeState }),\n instanceId: projectedNode.instanceId,\n instanceKey: nextInstanceKey,\n activation: node.data.activation ?? null,\n isProjected: true,\n projectionSubject: nextSubject,\n ...(node.data.runtimeNodeState === undefined\n ? {}\n : { runtimeNodeState: node.data.runtimeNodeState }),\n typeId: projectedNode.typeId\n },\n sizeConstraints: nextSizeConstraints,\n title: projectedNode.title\n };\n}\n\nexport function projectedWorkbenchNodeStack(input: {\n currentNodeStack: readonly string[];\n nextNodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n snapshot: WorkbenchSnapshot | null;\n}): string[] {\n const nodeIDs = new Set(input.nextNodes.map((node) => node.id));\n const nodeStack = input.currentNodeStack.filter((nodeID) =>\n nodeIDs.has(nodeID)\n );\n const snapshotState = input.snapshot\n ? createWorkbenchStateFromSnapshot<unknown>(input.snapshot)\n : null;\n for (const nodeID of snapshotState?.nodeStack ?? []) {\n if (nodeIDs.has(nodeID) && !nodeStack.includes(nodeID)) {\n nodeStack.push(nodeID);\n }\n }\n for (const node of input.nextNodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n return nodeStack;\n}\n\nexport function shallowArrayEqual<T>(\n left: readonly T[],\n right: readonly T[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => entry === right[index])\n );\n}\n\nexport function stringArrayEqual(\n left: readonly string[],\n right: readonly string[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => entry === right[index])\n );\n}\n\nfunction createWorkbenchHostNode(input: {\n definition: WorkbenchHostNodeDefinition;\n descriptor: {\n frame?: WorkbenchNode<WorkbenchHostNodeData>[\"frame\"];\n instanceId?: string;\n instanceKey?: string | null;\n title?: string;\n };\n}): WorkbenchNode<WorkbenchHostNodeData> {\n const strategy = input.definition.instance;\n const instanceId =\n input.descriptor.instanceId ??\n (strategy?.mode === \"multi\"\n ? `${input.definition.typeId}-instance`\n : input.definition.typeId);\n const nodeId =\n strategy?.mode === \"multi\"\n ? `${input.definition.typeId}:${instanceId}`\n : input.definition.typeId;\n\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: null,\n dockEntryId: null,\n instanceId,\n instanceKey: input.descriptor.instanceKey ?? null,\n isProjected: false,\n projectionSubject: null,\n typeId: input.definition.typeId\n },\n frame: input.descriptor.frame ?? input.definition.frame,\n id: nodeId,\n kind: input.definition.typeId,\n sizeConstraints: input.definition.sizeConstraints ?? null,\n title: input.descriptor.title ?? input.definition.title\n });\n}\n\nfunction createLaunchedNodeID(typeId: string, instanceId: string): string {\n return createWorkbenchHostLaunchedNodeId({ instanceId, typeId });\n}\n\nfunction createDefaultWorkbenchState(\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n const nodes = nodeDefinitions\n .filter((definition) => definition.window?.defaultOpen !== false)\n .filter((definition) => definition.instance?.mode !== \"multi\")\n .map((definition) =>\n createWorkbenchHostNode({\n definition,\n descriptor: {\n frame: definition.frame,\n instanceId: definition.typeId,\n title: definition.title\n }\n })\n );\n return {\n nodeStack: nodes.map((node) => node.id),\n nodes\n };\n}\n\nfunction createRestoredNode(\n definition: WorkbenchHostNodeDefinition,\n node: WorkbenchNode<unknown>\n): WorkbenchNode<WorkbenchHostNodeData> {\n const restoredData = readWorkbenchHostNodeData(node.data);\n return {\n ...node,\n data: {\n dockEntryId: restoredData?.dockEntryId ?? null,\n ...(restoredData?.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: restoredData.snapshotNodeState }),\n instanceId:\n restoredData?.instanceId ??\n (definition.instance?.mode === \"multi\"\n ? deriveInstanceIdFromNodeID(definition.typeId, node.id)\n : definition.typeId),\n instanceKey: restoredData?.instanceKey ?? null,\n activation: null,\n isProjected: false,\n projectionSubject: null,\n typeId: definition.typeId\n },\n kind: definition.typeId,\n sizeConstraints: definition.sizeConstraints ?? null,\n title: definition.instance?.mode === \"multi\" ? node.title : definition.title\n };\n}\n\nexport function resolveWorkbenchHostNodeSizeConstraints(\n result: Pick<WorkbenchHostLaunchResult, \"sizeConstraints\">,\n definition: Pick<WorkbenchHostNodeDefinition, \"sizeConstraints\">\n): WorkbenchNodeSizeConstraints | null {\n return result.sizeConstraints ?? definition.sizeConstraints ?? null;\n}\n\nfunction deriveInstanceIdFromNodeID(typeId: string, nodeId: string): string {\n const prefix = `${typeId}:`;\n return nodeId.startsWith(prefix) ? nodeId.slice(prefix.length) : nodeId;\n}\n\nfunction isSnapshotInitialized(snapshot: WorkbenchSnapshot | null): boolean {\n if (!snapshot) {\n return false;\n }\n\n for (const key of initializedMetadataKeys) {\n if (snapshot.metadata?.[key] === true) {\n return true;\n }\n }\n return false;\n}\n\nfunction readWorkbenchHostNodeData(\n value: unknown\n): WorkbenchHostNodeData | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const typed = value as Partial<WorkbenchHostNodeData>;\n if (\n typeof typed.typeId !== \"string\" ||\n typeof typed.instanceId !== \"string\"\n ) {\n return null;\n }\n\n return {\n dockEntryId:\n typeof typed.dockEntryId === \"string\" || typed.dockEntryId === null\n ? typed.dockEntryId\n : null,\n ...(typed.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: typed.snapshotNodeState }),\n instanceId: typed.instanceId,\n instanceKey:\n typeof typed.instanceKey === \"string\" || typed.instanceKey === null\n ? typed.instanceKey\n : null,\n activation: null,\n isProjected: typed.isProjected === true,\n launchSource: null,\n projectionSubject: null,\n typeId: typed.typeId\n };\n}\n\nfunction resolveDefinitionForRestoredNode(\n node: WorkbenchNode<unknown>,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): WorkbenchHostNodeDefinition | null {\n const data = readWorkbenchHostNodeData(node.data);\n if (data) {\n return (\n nodeDefinitions.find((definition) => definition.typeId === data.typeId) ??\n null\n );\n }\n\n return (\n nodeDefinitions.find((definition) => {\n if (definition.instance?.mode === \"multi\") {\n return node.id.startsWith(`${definition.typeId}:`);\n }\n return node.id === definition.typeId;\n }) ?? null\n );\n}\n\nfunction mergeProjectedNodesIntoState(\n state: Partial<WorkbenchState<WorkbenchHostNodeData>>,\n input: {\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[];\n projectedNodes: readonly WorkbenchHostProjectedNode[];\n snapshot: WorkbenchSnapshot | null;\n }\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n if (input.projectedNodes.length === 0) {\n return state;\n }\n\n const nodeDefinitionByType = new Map(\n input.nodeDefinitions.map((definition) => [definition.typeId, definition])\n );\n const nodes = state.nodes ? [...state.nodes] : [];\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const restoredNodesByID = restoredSnapshotNodesByID(\n input.snapshot,\n input.nodeDefinitions\n );\n\n for (const projectedNode of input.projectedNodes) {\n const definition = nodeDefinitionByType.get(projectedNode.typeId);\n if (!definition) {\n continue;\n }\n const nodeID = createProjectedNodeID(\n projectedNode.typeId,\n projectedNode.instanceId\n );\n if (nodeIDs.has(nodeID)) {\n continue;\n }\n\n const nextNode = createWorkbenchProjectedHostNode({\n definition,\n projectedNode,\n restoredNode: restoredNodesByID.get(nodeID) ?? null\n });\n nodes.push(nextNode);\n nodeIDs.add(nextNode.id);\n }\n\n return {\n ...state,\n nodeStack: projectedWorkbenchNodeStack({\n currentNodeStack: state.nodeStack ?? [],\n nextNodes: nodes,\n snapshot: input.snapshot\n }),\n nodes\n };\n}\n\nfunction projectedSubjectsEqual(\n left: WorkbenchHostNodeData[\"projectionSubject\"],\n right: WorkbenchHostNodeData[\"projectionSubject\"]\n): boolean {\n return left?.id === right?.id && left?.type === right?.type;\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostExternalStateSource,\n WorkbenchHostNodeData\n} from \"./types.ts\";\n\nexport interface WorkbenchHostExternalState {\n externalNodeState: unknown;\n externalWorkspaceState: unknown;\n}\n\nexport function readWorkbenchHostExternalState(input: {\n externalStateSource?: WorkbenchHostExternalStateSource;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n workspaceId: string;\n}): WorkbenchHostExternalState {\n if (!input.externalStateSource) {\n return {\n externalNodeState: null,\n externalWorkspaceState: null\n };\n }\n\n const nodeStateInput = {\n instanceId: input.node.data.instanceId,\n instanceKey: input.node.data.instanceKey ?? null,\n nodeId: input.node.id,\n typeId: input.node.data.typeId,\n workspaceId: input.workspaceId,\n ...(input.node.data.projectionSubject\n ? { subject: input.node.data.projectionSubject }\n : {})\n };\n\n const sourceNodeState =\n input.externalStateSource.getNodeState(nodeStateInput);\n\n return {\n externalNodeState:\n sourceNodeState ?? input.node.data.snapshotNodeState ?? null,\n externalWorkspaceState: input.externalStateSource.getWorkspaceState({\n workspaceId: input.workspaceId\n })\n };\n}\n","import {\n normalizeWorkbenchSnapshot,\n type WorkbenchSnapshot,\n type WorkbenchSnapshotNode,\n type WorkbenchSnapshotSpaceV1\n} from \"@tutti-os/workbench-snapshot\";\nimport {\n closedDockWindowFramesMetadataKey,\n readClosedDockWindowFrameEntries,\n writeClosedDockWindowFrameEntries\n} from \"./sessionState.ts\";\n\nexport interface WorkbenchHostSnapshotNodeData {\n dockEntryId?: string | null;\n instanceId: string;\n instanceKey?: string | null;\n isProjected?: true;\n snapshotNodeState?: unknown;\n typeId: string;\n}\n\nconst allowedMetadataKeys = [\n \"tuttiWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\n\nexport function sanitizeWorkbenchHostSnapshot(\n snapshot: WorkbenchSnapshot\n): WorkbenchSnapshot {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n return normalizeWorkbenchSnapshot({\n schemaVersion: normalized.schemaVersion,\n nodes: normalized.nodes.map(sanitizeNode),\n nodeStack: normalized.nodeStack,\n activeNodeId: normalized.activeNodeId,\n spaces: normalized.spaces?.map(sanitizeSpace),\n activeSpaceId: normalized.activeSpaceId,\n metadata: sanitizeMetadata(normalized.metadata)\n });\n}\n\nfunction sanitizeNode(node: WorkbenchSnapshotNode): WorkbenchSnapshotNode {\n return {\n id: node.id,\n kind: node.kind,\n title: node.title,\n frame: node.frame,\n displayMode: node.displayMode,\n restoreFrame: node.restoreFrame,\n isMinimized: node.isMinimized,\n data: sanitizeNodeData(node.data)\n };\n}\n\nfunction sanitizeNodeData(\n value: unknown\n): WorkbenchHostSnapshotNodeData | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const typed = value as Partial<WorkbenchHostSnapshotNodeData>;\n if (\n typeof typed.typeId !== \"string\" ||\n typeof typed.instanceId !== \"string\"\n ) {\n return undefined;\n }\n\n return {\n dockEntryId:\n typeof typed.dockEntryId === \"string\" || typed.dockEntryId === null\n ? typed.dockEntryId\n : null,\n instanceId: typed.instanceId,\n instanceKey:\n typeof typed.instanceKey === \"string\" || typed.instanceKey === null\n ? typed.instanceKey\n : null,\n ...(typed.isProjected === true ? { isProjected: true } : {}),\n ...(typed.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: typed.snapshotNodeState }),\n typeId: typed.typeId\n };\n}\n\nfunction sanitizeSpace(\n space: WorkbenchSnapshotSpaceV1\n): WorkbenchSnapshotSpaceV1 {\n return {\n id: space.id,\n name: space.name,\n nodeIds: space.nodeIds,\n frame: space.frame\n };\n}\n\nfunction sanitizeMetadata(\n metadata: WorkbenchSnapshot[\"metadata\"]\n): WorkbenchSnapshot[\"metadata\"] {\n const sanitized: Record<string, unknown> = {};\n for (const key of allowedMetadataKeys) {\n if (metadata?.[key] === true) {\n sanitized[key] = true;\n }\n }\n if (metadata?.[closedDockWindowFramesMetadataKey] !== undefined) {\n return writeClosedDockWindowFrameEntries(\n sanitized,\n readClosedDockWindowFrameEntries(metadata).values()\n );\n }\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n","import type { WorkbenchSnapshot } from \"@tutti-os/workbench-snapshot\";\nimport { createWorkbenchSnapshotFromState } from \"../core/snapshot.ts\";\nimport type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchController } from \"../store/createWorkbenchController.ts\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"../store/types.ts\";\nimport {\n type ClosedDockWindowFrameEntry,\n compactRestoredWorkbenchHostNodes,\n createDefaultLaunchResult,\n createProjectedNodeID,\n createWorkbenchLaunchedHostNode,\n createWorkbenchProjectedHostNode,\n closedDockWindowFrameEntryKey,\n persistedWorkbenchState,\n projectedWorkbenchNodeStack,\n readClosedDockWindowFrameEntries,\n resolveWorkbenchLaunchedHostNodeFrame,\n restoredSnapshotNodesByID,\n shallowArrayEqual,\n stateFromSnapshotOrDefinitions,\n stringArrayEqual,\n updateProjectedNodeFromInput,\n writeClosedDockWindowFrameEntries\n} from \"./sessionState.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport { sanitizeWorkbenchHostSnapshot } from \"./snapshotSanitizer.ts\";\nimport type { WorkbenchHostNodeData } from \"./types.ts\";\nimport type {\n WorkbenchHostActivation,\n WorkbenchHostActivationTarget,\n WorkbenchHostCloseEffect,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchInput,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeLeaseHandle,\n WorkbenchHostNodeCloseDecision,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProjectedNode,\n WorkbenchHostRuntimeHandle,\n WorkbenchHostSnapshotRepository\n} from \"./types.ts\";\n\nconst initializedMetadataKey = \"workbenchHostInitialized\";\nconst snapshotSaveDelayMs = 400;\nconst launchDiagnosticTextMaxLength = 800;\n\nexport function createWorkbenchHostSession(input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n}): WorkbenchHostRuntimeHandle {\n return new WorkbenchHostSessionController(input);\n}\n\nclass WorkbenchHostSessionController implements WorkbenchHostRuntimeHandle {\n readonly controller: WorkbenchController<WorkbenchHostNodeData>;\n private readonly input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n };\n\n private readonly nodeDefinitions: readonly WorkbenchHostNodeDefinition[];\n private readonly nodeDefinitionByType = new Map<\n string,\n WorkbenchHostNodeDefinition\n >();\n private isHydratingInitialSnapshot = true;\n private isDisposed = false;\n private isSnapshotLoaded = false;\n private loadedSnapshot: WorkbenchSnapshot | null;\n private closedDockWindowFrameEntries = new Map<\n string,\n ClosedDockWindowFrameEntry\n >();\n private loadGeneration = 0;\n private loadPromise: Promise<void> | null = null;\n private readonly nodeLeases = new Map<string, WorkbenchHostNodeLeaseHandle>();\n private nextActivationSequence = 1;\n private hasAppliedInitialCompactRestoredFrames = false;\n private hasReceivedSurfaceSize = false;\n private observedSurfaceSize:\n | WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"]\n | null = null;\n private pendingProjectedNodeReconciliation = false;\n private projectedNodes: readonly WorkbenchHostProjectedNode[];\n private readyPromise: Promise<void>;\n private resolveReady: () => void = noop;\n private saveTimer: ReturnType<typeof globalThis.setTimeout> | null = null;\n private externalStateUnsubscribe: (() => void) | null = null;\n private leaseUnsubscribe: (() => void) | null = null;\n private unsubscribe: (() => void) | null = null;\n\n constructor(input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n }) {\n this.input = input;\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n this.nodeDefinitions = input.nodes;\n for (const definition of input.nodes) {\n this.nodeDefinitionByType.set(definition.typeId, definition);\n }\n this.loadedSnapshot = this.readCachedSnapshot();\n this.closedDockWindowFrameEntries = readClosedDockWindowFrameEntries(\n this.loadedSnapshot?.metadata\n );\n this.projectedNodes = input.projectedNodes ?? [];\n this.controller = createWorkbenchController<WorkbenchHostNodeData>(\n stateFromSnapshotOrDefinitions(\n this.loadedSnapshot,\n this.nodeDefinitions,\n this.projectedNodes\n ),\n { debugDiagnostics: input.debugDiagnostics }\n );\n this.observedSurfaceSize = this.controller.getSnapshot().surfaceSize;\n this.leaseUnsubscribe = this.controller.subscribe(() => {\n this.noteSurfaceSizeChange();\n this.reconcileNodeLeases();\n this.applyInitialCompactRestoredFrames();\n });\n this.isSnapshotLoaded = this.loadedSnapshot !== null;\n if (this.isSnapshotLoaded) {\n this.applyInitialCompactRestoredFrames();\n this.subscribeToPersistence();\n }\n }\n\n activateNode(\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.activateNodeNow(target, activation);\n });\n }\n\n private activateNodeNow(\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ): void {\n if (!activation.type.trim()) {\n return;\n }\n\n const node = this.findExistingNodeByTarget(target);\n if (!node) {\n return;\n }\n\n const envelope: WorkbenchHostActivation = {\n sequence: this.nextActivationSequence++,\n type: activation.type,\n ...(activation.payload === undefined\n ? {}\n : { payload: activation.payload })\n };\n this.restoreAndFocusNode(node.id);\n this.controller.commands.replaceState({\n nodes: this.controller.getSnapshot().nodes.map((entry) =>\n entry.id === node.id\n ? {\n ...entry,\n data: {\n ...entry.data,\n activation: envelope\n }\n }\n : entry\n )\n });\n }\n\n clearNodeActivation(nodeId: string, sequence: number): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.clearNodeActivationNow(nodeId, sequence);\n });\n }\n\n private clearNodeActivationNow(nodeId: string, sequence: number): void {\n const snapshot = this.controller.getSnapshot();\n const node = snapshot.nodes.find((entry) => entry.id === nodeId);\n if (node?.data.activation?.sequence !== sequence) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((entry) =>\n entry.id === nodeId\n ? {\n ...entry,\n data: {\n ...entry.data,\n activation: null\n }\n }\n : entry\n )\n });\n }\n\n async collectWindowCloseEffects(): Promise<\n readonly WorkbenchHostCloseEffect[]\n > {\n const snapshot = this.controller.getSnapshot();\n const effects = await Promise.all(\n snapshot.nodes.map(async (node) => {\n const definition = this.nodeDefinitionByType.get(node.data.typeId);\n if (!definition?.getWindowCloseEffect) {\n return null;\n }\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: this.input.externalStateSource,\n node,\n workspaceId: this.input.workspaceId\n });\n const effect = await definition.getWindowCloseEffect({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n node,\n workspaceId: this.input.workspaceId\n });\n return effect ?? null;\n })\n );\n return effects.filter(\n (effect): effect is WorkbenchHostCloseEffect => effect !== null\n );\n }\n\n closeNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.rememberClosedDockWindowFrame(nodeId);\n this.controller.commands.closeNode(nodeId);\n });\n }\n\n dispose(): void {\n this.isDisposed = true;\n this.loadGeneration++;\n this.loadPromise = null;\n this.markReady();\n this.leaseUnsubscribe?.();\n this.leaseUnsubscribe = null;\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.externalStateUnsubscribe?.();\n this.externalStateUnsubscribe = null;\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n this.saveTimer = null;\n this.saveSnapshot();\n }\n this.disposeNodeLeases();\n }\n\n focusNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.restoreAndFocusNode(nodeId);\n });\n }\n\n minimizeNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.controller.commands.minimizeNode(nodeId);\n });\n }\n\n exitFullscreenNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.controller.commands.exitFullscreen(nodeId);\n });\n }\n\n getSnapshot(): ReturnType<\n WorkbenchController<WorkbenchHostNodeData>[\"getSnapshot\"]\n > {\n return this.controller.getSnapshot();\n }\n\n isHydrating(): boolean {\n return this.isHydratingInitialSnapshot;\n }\n\n async launchNode(input: WorkbenchHostLaunchInput): Promise<string | null> {\n const generation = this.loadGeneration;\n if (!(await this.waitUntilReady(generation))) {\n return null;\n }\n\n const definition = this.nodeDefinitionByType.get(input.typeId);\n if (!definition) {\n return null;\n }\n\n const launchSource = resolveWorkbenchHostLaunchSource(input);\n const currentState = this.controller.getSnapshot();\n const request: WorkbenchHostLaunchRequest = {\n ...input,\n layoutConstraints: currentState.layoutConstraints,\n surfaceSize: currentState.surfaceSize,\n workspaceId: this.input.workspaceId\n };\n if (launchSource !== null) {\n request.launchSource = launchSource;\n }\n\n let result: WorkbenchHostLaunchResult | null | void;\n try {\n result = this.input.onLaunchRequest\n ? await this.input.onLaunchRequest(request)\n : createDefaultLaunchResult(definition, {\n dockEntryId: input.dockEntryId,\n launchSource\n });\n } catch (error) {\n this.logLaunchFailure(request, error);\n return null;\n }\n if (this.isDisposed || !result || generation !== this.loadGeneration) {\n return null;\n }\n\n return this.openLaunchResult({\n ...result,\n launchSource: result.launchSource ?? launchSource\n });\n }\n\n private logLaunchFailure(\n request: WorkbenchHostLaunchRequest,\n error: unknown\n ): void {\n void Promise.resolve(\n this.input.debugDiagnostics?.log?.({\n details: {\n dockEntryId: request.dockEntryId ?? null,\n error: diagnosticErrorDetails(error),\n launchSource: request.launchSource ?? null,\n payload: diagnosticValueSummary(request.payload),\n reason: request.reason,\n typeId: request.typeId\n },\n event: \"host.launch.failed\",\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: request.workspaceId\n })\n ).catch(() => undefined);\n }\n\n async load(): Promise<void> {\n if (this.loadPromise && !this.isDisposed) {\n return this.loadPromise;\n }\n\n const generation = ++this.loadGeneration;\n if (!this.isHydratingInitialSnapshot) {\n this.resetHydrationBarrier();\n }\n this.isDisposed = false;\n this.loadPromise = this.loadInitialSnapshot(generation);\n return this.loadPromise;\n }\n\n private async loadInitialSnapshot(generation: number): Promise<void> {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.externalStateUnsubscribe?.();\n this.externalStateUnsubscribe = null;\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n try {\n const snapshot = await this.input.snapshotRepository.load(\n this.input.workspaceId\n );\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n\n this.loadedSnapshot = snapshot;\n this.closedDockWindowFrameEntries = readClosedDockWindowFrameEntries(\n snapshot?.metadata\n );\n this.controller.commands.replaceState(\n stateFromSnapshotOrDefinitions(\n snapshot,\n this.nodeDefinitions,\n this.projectedNodes\n )\n );\n this.applyProjectedNodes(this.projectedNodes);\n } catch {\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n this.loadedSnapshot = null;\n this.closedDockWindowFrameEntries = new Map();\n this.controller.commands.replaceState(\n stateFromSnapshotOrDefinitions(\n null,\n this.nodeDefinitions,\n this.projectedNodes\n )\n );\n this.applyProjectedNodes(this.projectedNodes);\n }\n\n this.reconcileNodeLeases();\n this.isSnapshotLoaded = true;\n this.applyInitialCompactRestoredFrames();\n this.subscribeToPersistence();\n this.markReady();\n }\n\n requestNodeClose(nodeId: string): void {\n const generation = this.loadGeneration;\n this.runWhenReady(generation, () => {\n this.requestNodeCloseNow(nodeId, generation);\n });\n }\n\n private requestNodeCloseNow(nodeId: string, generation: number): void {\n const node =\n this.controller\n .getSnapshot()\n .nodes.find((entry) => entry.id === nodeId) ?? null;\n if (!node) {\n return;\n }\n\n const request = {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n isProjected: node.data.isProjected === true,\n nodeId: node.id,\n subject: node.data.projectionSubject ?? null,\n typeId: node.data.typeId,\n workspaceId: this.input.workspaceId\n };\n if (node.data.isProjected === true && !this.input.onNodeCloseRequest) {\n return;\n }\n const decision = this.input.onNodeCloseRequest?.(request);\n void Promise.resolve(decision).then((resolvedDecision) => {\n if (\n this.isDisposed ||\n resolvedDecision === \"keep-open\" ||\n generation !== this.loadGeneration\n ) {\n return;\n }\n this.rememberClosedDockWindowFrame(node.id);\n this.controller.commands.closeNode(node.id);\n }, noop);\n }\n\n setNodeRuntimeState(nodeId: string, state: unknown): void {\n const snapshot = this.controller.getSnapshot();\n if (!snapshot.nodes.some((node) => node.id === nodeId)) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((node) =>\n node.id === nodeId\n ? {\n ...node,\n data:\n state === undefined\n ? withoutRuntimeNodeState(node.data)\n : {\n ...node.data,\n runtimeNodeState: state\n }\n }\n : node\n )\n });\n }\n\n setNodeSizeConstraints(\n nodeId: string,\n sizeConstraints: WorkbenchNode[\"sizeConstraints\"]\n ): void {\n this.controller.commands.setNodeSizeConstraints(\n nodeId,\n sizeConstraints ?? null\n );\n }\n\n setNodeTitle(nodeId: string, title: string): void {\n const nextTitle = title.trim();\n if (!nextTitle) {\n return;\n }\n\n const snapshot = this.controller.getSnapshot();\n const node = snapshot.nodes.find((entry) => entry.id === nodeId);\n if (!node || node.title === nextTitle) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((entry) =>\n entry.id === nodeId\n ? {\n ...entry,\n title: nextTitle\n }\n : entry\n )\n });\n }\n\n setSnapshotNodeState(nodeId: string, state: unknown): void {\n const snapshot = this.controller.getSnapshot();\n if (!snapshot.nodes.some((node) => node.id === nodeId)) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((node) =>\n node.id === nodeId\n ? {\n ...node,\n data:\n state === undefined\n ? withoutSnapshotNodeState(node.data)\n : {\n ...node.data,\n snapshotNodeState: state\n }\n }\n : node\n )\n });\n }\n\n reconcileProjectedNodes(\n projectedNodes: readonly WorkbenchHostProjectedNode[]\n ): void {\n this.projectedNodes = projectedNodes;\n if (this.isHydratingInitialSnapshot) {\n this.queueProjectedNodeReconciliation();\n return;\n }\n\n this.applyProjectedNodes(projectedNodes);\n }\n\n private applyProjectedNodes(\n projectedNodes: readonly WorkbenchHostProjectedNode[]\n ): void {\n const projectedNodesByID = new Map(\n projectedNodes.map((node) => [\n createProjectedNodeID(node.typeId, node.instanceId),\n node\n ])\n );\n const currentState = this.controller.getSnapshot();\n const snapshotNodesByID = restoredSnapshotNodesByID(\n this.loadedSnapshot,\n this.nodeDefinitions\n );\n\n const nextNodes = currentState.nodes\n .filter(\n (node) => !node.data.isProjected || projectedNodesByID.has(node.id)\n )\n .map((node) => {\n const projectedNode = projectedNodesByID.get(node.id);\n return projectedNode\n ? updateProjectedNodeFromInput(\n node,\n projectedNode,\n this.nodeDefinitionByType.get(projectedNode.typeId)\n )\n : node;\n });\n const nextNodeIDs = new Set(nextNodes.map((node) => node.id));\n\n for (const projectedNode of projectedNodes) {\n const nodeID = createProjectedNodeID(\n projectedNode.typeId,\n projectedNode.instanceId\n );\n if (nextNodeIDs.has(nodeID)) {\n continue;\n }\n\n const definition = this.nodeDefinitionByType.get(projectedNode.typeId);\n if (!definition) {\n continue;\n }\n\n const nextNode = createWorkbenchProjectedHostNode({\n definition,\n projectedNode,\n restoredNode: snapshotNodesByID.get(nodeID) ?? null\n });\n nextNodes.push(nextNode);\n nextNodeIDs.add(nextNode.id);\n }\n\n const nodeStack = projectedWorkbenchNodeStack({\n currentNodeStack: currentState.nodeStack,\n nextNodes,\n snapshot: this.loadedSnapshot\n });\n if (\n shallowArrayEqual(currentState.nodes, nextNodes) &&\n stringArrayEqual(currentState.nodeStack, nodeStack)\n ) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodeStack,\n nodes: nextNodes\n });\n }\n\n private openLaunchResult(result: WorkbenchHostLaunchResult): string | null {\n const definition = this.nodeDefinitionByType.get(result.typeId);\n if (!definition) {\n return null;\n }\n const launchResult = this.applyClosedDockWindowFrame(result);\n\n const exactExisting = this.findExistingNodeByTarget({\n instanceId: launchResult.instanceId,\n typeId: launchResult.typeId\n });\n const dockEntryExisting = exactExisting\n ? null\n : this.findExistingNodeByDockEntry(launchResult);\n const existing = exactExisting ?? dockEntryExisting;\n if (existing) {\n this.controller.commands.setNodeSizeConstraints(\n existing.id,\n launchResult.sizeConstraints ?? definition.sizeConstraints ?? null\n );\n if (\n exactExisting &&\n launchResult.framePolicy === \"cascade-same-type-centered\"\n ) {\n const currentState = this.controller.getSnapshot();\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: {\n ...currentState,\n nodes: currentState.nodes.filter((node) => node.id !== existing.id),\n nodeStack: currentState.nodeStack.filter(\n (nodeId) => nodeId !== existing.id\n )\n },\n definition,\n result: launchResult\n });\n this.controller.commands.resizeNode(existing.id, resolvedFrame);\n }\n this.restoreAndFocusNode(existing.id);\n if (launchResult.activation) {\n this.activateNodeNow({ nodeId: existing.id }, launchResult.activation);\n }\n return existing.id;\n }\n\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: this.controller.getSnapshot(),\n definition,\n result: launchResult\n });\n const nextNode = createWorkbenchLaunchedHostNode({\n activation: this.createActivationEnvelope(launchResult.activation),\n definition,\n resolvedFrame,\n result: launchResult\n });\n this.controller.commands.openNode(nextNode);\n this.controller.commands.focusNode(nextNode.id);\n return nextNode.id;\n }\n\n private createActivationEnvelope(\n activation: WorkbenchHostLaunchResult[\"activation\"]\n ): WorkbenchHostActivation | null {\n if (!activation?.type.trim()) {\n return null;\n }\n\n return {\n sequence: this.nextActivationSequence++,\n type: activation.type,\n ...(activation.payload === undefined\n ? {}\n : { payload: activation.payload })\n };\n }\n\n private findExistingNodeByTarget(\n target: WorkbenchHostActivationTarget\n ): WorkbenchNode<WorkbenchHostNodeData> | null {\n const snapshot = this.controller.getSnapshot();\n if (\"nodeId\" in target) {\n return snapshot.nodes.find((node) => node.id === target.nodeId) ?? null;\n }\n\n const definition = this.nodeDefinitionByType.get(target.typeId);\n if (!definition) {\n return null;\n }\n const nodes = snapshot.nodes.filter(\n (node) => node.data.typeId === definition.typeId\n );\n if (target.instanceId) {\n return (\n nodes.find((node) => node.data.instanceId === target.instanceId) ?? null\n );\n }\n\n if (definition.instance?.mode === \"multi\") {\n return null;\n }\n\n return nodes[0] ?? null;\n }\n\n private findExistingNodeByDockEntry(\n result: WorkbenchHostLaunchResult\n ): WorkbenchNode<WorkbenchHostNodeData> | null {\n const dockEntryId = result.dockEntryId?.trim();\n if (!result.reuseDockEntryNode || !dockEntryId) {\n return null;\n }\n\n const snapshot = this.controller.getSnapshot();\n const nodesByID = new Map(snapshot.nodes.map((node) => [node.id, node]));\n for (let index = snapshot.nodeStack.length - 1; index >= 0; index -= 1) {\n const node = nodesByID.get(snapshot.nodeStack[index] ?? \"\");\n if (\n node?.data.typeId === result.typeId &&\n node.data.dockEntryId === dockEntryId\n ) {\n return node;\n }\n }\n\n return (\n snapshot.nodes.find(\n (node) =>\n node.data.typeId === result.typeId &&\n node.data.dockEntryId === dockEntryId\n ) ?? null\n );\n }\n\n private readCachedSnapshot(): WorkbenchSnapshot | null {\n if (!this.input.snapshotRepository.hasLoaded?.(this.input.workspaceId)) {\n return null;\n }\n\n return (\n this.input.snapshotRepository.readCached?.(this.input.workspaceId) ?? null\n );\n }\n\n private markReady(): void {\n if (!this.isHydratingInitialSnapshot) {\n return;\n }\n\n this.isHydratingInitialSnapshot = false;\n this.resolveReady();\n }\n\n private resetHydrationBarrier(): void {\n this.isHydratingInitialSnapshot = true;\n this.hasAppliedInitialCompactRestoredFrames = false;\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n }\n\n private noteSurfaceSizeChange(): void {\n const currentSurfaceSize = this.controller.getSnapshot().surfaceSize;\n if (\n this.observedSurfaceSize &&\n (this.observedSurfaceSize.width !== currentSurfaceSize.width ||\n this.observedSurfaceSize.height !== currentSurfaceSize.height)\n ) {\n this.hasReceivedSurfaceSize = true;\n }\n this.observedSurfaceSize = currentSurfaceSize;\n }\n\n private applyInitialCompactRestoredFrames(): void {\n if (\n this.hasAppliedInitialCompactRestoredFrames ||\n !this.isSnapshotLoaded ||\n !this.hasReceivedSurfaceSize\n ) {\n return;\n }\n\n const snapshot = this.controller.getSnapshot();\n const compactedNodes = compactRestoredWorkbenchHostNodes({\n constraints: snapshot.layoutConstraints,\n nodeDefinitionByType: this.nodeDefinitionByType,\n nodes: snapshot.nodes,\n surfaceSize: snapshot.surfaceSize\n });\n this.hasAppliedInitialCompactRestoredFrames = true;\n if (shallowArrayEqual(snapshot.nodes, compactedNodes)) {\n return;\n }\n this.controller.commands.replaceNodes(compactedNodes);\n }\n\n private queueProjectedNodeReconciliation(): void {\n if (this.pendingProjectedNodeReconciliation) {\n return;\n }\n\n const generation = this.loadGeneration;\n this.pendingProjectedNodeReconciliation = true;\n void this.readyPromise.then(() => {\n this.pendingProjectedNodeReconciliation = false;\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n this.applyProjectedNodes(this.projectedNodes);\n });\n }\n\n private runWhenReady(generation: number, action: () => void): void {\n if (!this.isHydratingInitialSnapshot) {\n if (!this.isDisposed && generation === this.loadGeneration) {\n action();\n }\n return;\n }\n\n void this.readyPromise.then(() => {\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n action();\n });\n }\n\n private async waitUntilReady(generation: number): Promise<boolean> {\n if (!this.isHydratingInitialSnapshot) {\n return !this.isDisposed && generation === this.loadGeneration;\n }\n\n await this.readyPromise;\n return !this.isDisposed && generation === this.loadGeneration;\n }\n\n private restoreAndFocusNode(nodeId: string): void {\n const existing = this.controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeId);\n if (!existing) {\n return;\n }\n if (existing.isMinimized) {\n this.controller.commands.restoreNode(existing.id);\n }\n this.controller.commands.focusNode(existing.id);\n }\n\n private saveSnapshot(): void {\n if (!this.isSnapshotLoaded) {\n return;\n }\n\n const snapshot = sanitizeWorkbenchHostSnapshot(\n createWorkbenchSnapshotFromState(\n this.applyExternalSnapshotNodeState(\n persistedWorkbenchState(\n this.controller.getSnapshot(),\n this.nodeDefinitionByType\n )\n ),\n {\n activeSpaceId: this.loadedSnapshot?.activeSpaceId,\n metadata: writeClosedDockWindowFrameEntries(\n {\n ...(this.loadedSnapshot?.metadata ?? {}),\n [initializedMetadataKey]: true\n },\n this.closedDockWindowFrameEntries.values()\n ),\n spaces: this.loadedSnapshot?.spaces\n }\n )\n );\n if (workbenchSnapshotSaveKey(snapshot) === this.loadedSnapshotSaveKey()) {\n return;\n }\n void Promise.resolve(\n this.input.snapshotRepository.save(this.input.workspaceId, snapshot)\n ).then((savedSnapshot) => {\n this.loadedSnapshot = savedSnapshot;\n }, noop);\n }\n\n private rememberClosedDockWindowFrame(nodeId: string): void {\n const node = this.controller\n .getSnapshot()\n .nodes.find((entry) => entry.id === nodeId);\n const dockEntryId = node?.data.dockEntryId?.trim();\n if (!node || !dockEntryId) {\n return;\n }\n\n const entry: ClosedDockWindowFrameEntry = {\n dockEntryId,\n frame:\n node.displayMode === \"fullscreen\" && node.restoreFrame\n ? node.restoreFrame\n : node.frame,\n typeId: node.data.typeId\n };\n this.closedDockWindowFrameEntries.set(\n closedDockWindowFrameEntryKey(entry),\n entry\n );\n }\n\n private applyClosedDockWindowFrame(\n result: WorkbenchHostLaunchResult\n ): WorkbenchHostLaunchResult {\n const dockEntryId = result.dockEntryId?.trim();\n if (!dockEntryId) {\n return result;\n }\n\n const entry = this.closedDockWindowFrameEntries.get(\n closedDockWindowFrameEntryKey({\n dockEntryId,\n typeId: result.typeId\n })\n );\n if (!entry) {\n return result;\n }\n\n return {\n ...result,\n defaultFrame: entry.frame,\n framePolicy: \"absolute\"\n };\n }\n\n private loadedSnapshotSaveKey(): string | null {\n if (!this.loadedSnapshot) {\n return null;\n }\n return workbenchSnapshotSaveKey(\n sanitizeWorkbenchHostSnapshot(this.loadedSnapshot)\n );\n }\n\n private schedulePersistedSnapshotWrite(): void {\n if (!this.isSnapshotLoaded || this.isDisposed) {\n return;\n }\n\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n }\n this.saveTimer = globalThis.setTimeout(() => {\n this.saveTimer = null;\n this.saveSnapshot();\n }, snapshotSaveDelayMs);\n }\n\n private subscribeToPersistence(): void {\n if (this.unsubscribe !== null) {\n return;\n }\n\n this.unsubscribe = this.controller.subscribe(() => {\n this.schedulePersistedSnapshotWrite();\n });\n if (this.externalStateUnsubscribe === null) {\n const source = this.input.externalStateSource;\n const canReadSnapshotNodeState =\n typeof source?.getSnapshotNodeState === \"function\";\n if (!canReadSnapshotNodeState) {\n return;\n }\n this.externalStateUnsubscribe =\n source?.subscribe?.(() => {\n this.schedulePersistedSnapshotWrite();\n }) ?? null;\n }\n }\n\n private disposeNodeLeases(): void {\n for (const lease of this.nodeLeases.values()) {\n lease.release();\n }\n this.nodeLeases.clear();\n }\n\n private applyExternalSnapshotNodeState(\n state: Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\">\n ): Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\"> {\n const source = this.input.externalStateSource;\n const getSnapshotNodeState = source?.getSnapshotNodeState?.bind(source);\n if (!getSnapshotNodeState) {\n return state;\n }\n\n return {\n ...state,\n nodes: state.nodes.map((node) => {\n const lookupInput = {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId: this.input.workspaceId,\n ...(node.data.projectionSubject\n ? { subject: node.data.projectionSubject }\n : {})\n };\n const snapshotNodeState = getSnapshotNodeState(lookupInput);\n const nextSnapshotNodeState =\n snapshotNodeState ?? node.data.snapshotNodeState;\n if (nextSnapshotNodeState === undefined) {\n return node;\n }\n return {\n ...node,\n data: {\n ...node.data,\n snapshotNodeState: nextSnapshotNodeState\n }\n };\n })\n };\n }\n\n private reconcileNodeLeases(): void {\n const activeNodes = this.controller.getSnapshot().nodes;\n const nextNodeIDs = new Set(activeNodes.map((node) => node.id));\n\n for (const [nodeID, lease] of this.nodeLeases) {\n if (nextNodeIDs.has(nodeID)) {\n continue;\n }\n lease.release();\n this.nodeLeases.delete(nodeID);\n }\n\n for (const node of activeNodes) {\n if (this.nodeLeases.has(node.id)) {\n continue;\n }\n const definition = this.nodeDefinitionByType.get(node.data.typeId);\n const lease = definition?.createLease?.({\n node,\n workspaceId: this.input.workspaceId\n });\n if (lease) {\n this.nodeLeases.set(node.id, lease);\n }\n }\n }\n}\n\nfunction withoutRuntimeNodeState(\n data: WorkbenchHostNodeData\n): WorkbenchHostNodeData {\n const next = { ...data };\n delete next.runtimeNodeState;\n return next;\n}\n\nfunction withoutSnapshotNodeState(\n data: WorkbenchHostNodeData\n): WorkbenchHostNodeData {\n const next = { ...data };\n delete next.snapshotNodeState;\n return next;\n}\n\nfunction workbenchSnapshotSaveKey(snapshot: WorkbenchSnapshot): string {\n return JSON.stringify(snapshot);\n}\n\nfunction resolveWorkbenchHostLaunchSource(\n input: WorkbenchHostLaunchInput\n): string | null {\n if (input.launchSource?.trim()) {\n return input.launchSource.trim();\n }\n switch (input.reason) {\n case \"dock\":\n return \"dock\";\n case \"launchpad\":\n return \"launchpad\";\n case \"shortcut\":\n return \"keyboard\";\n case \"command\":\n return \"command\";\n case \"host\":\n return null;\n }\n}\n\nfunction diagnosticErrorDetails(error: unknown): Record<string, unknown> {\n if (error instanceof Error) {\n return {\n message: limitLaunchDiagnosticText(error.message),\n name: error.name,\n stack: limitLaunchDiagnosticText(error.stack)\n };\n }\n return {\n message: diagnosticValueSummary(error),\n name: typeof error\n };\n}\n\nfunction diagnosticValueSummary(value: unknown): string | null {\n if (value === undefined) {\n return null;\n }\n if (typeof value === \"string\") {\n return limitLaunchDiagnosticText(value) ?? \"\";\n }\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n try {\n return limitLaunchDiagnosticText(JSON.stringify(value)) ?? null;\n } catch {\n return Object.prototype.toString.call(value);\n }\n}\n\nfunction limitLaunchDiagnosticText(value: string | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed.length > launchDiagnosticTextMaxLength\n ? `${trimmed.slice(0, launchDiagnosticTextMaxLength)}...`\n : trimmed;\n}\n\nfunction noop(): void {}\n","import { Component, useCallback, useMemo } from \"react\";\nimport type { ErrorInfo, ReactNode } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowSurfaceLayer,\n WorkbenchResolveWindowZIndex,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowActionContext\n} from \"../react/types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport {\n renderMinimizedDockPreviewContent,\n WorkbenchHostDock\n} from \"./WorkbenchHostDock.tsx\";\nimport {\n createWorkbenchHostNodeBodyContext,\n createWorkbenchHostNodeHeaderContext\n} from \"./hostNodeContext.ts\";\nimport { WorkbenchHostWindowActions } from \"./WorkbenchHostWindowActions.tsx\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport {\n isWorkbenchMinimizedDockEligibleNode,\n resolveWorkbenchMinimizedDockAnchorKeyForNode,\n resolveWorkbenchMinimizedDockSlots\n} from \"./minimizedDockSlots.ts\";\nimport type {\n WorkbenchHostChromeRenderContext,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostNodeBodyContext,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps,\n WorkbenchHostRuntimeHandle\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostSurfaceRenderers(input: {\n captureNodePreviewImage?: WorkbenchHostProps[\"captureNodePreviewImage\"];\n chromeContext: WorkbenchHostChromeRenderContext;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockStateSource?: WorkbenchHostProps[\"dockStateSource\"];\n externalStateSource?: WorkbenchHostExternalStateSource;\n externalStateRevision: number;\n hostI18n: WorkbenchHostI18nRuntime;\n hostSession: WorkbenchHostRuntimeHandle;\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: WorkbenchHostProps[\"onDockEntryAction\"];\n onDockEntryClick?: WorkbenchHostProps[\"onDockEntryClick\"];\n onMissionControlRequestOpen?: WorkbenchHostProps[\"onMissionControlRequestOpen\"];\n renderBottomChrome?: WorkbenchHostProps[\"renderBottomChrome\"];\n renderTopChrome?: WorkbenchHostProps[\"renderTopChrome\"];\n workspaceId: string;\n}) {\n const renderBottomChrome = useMemo(() => {\n const renderChrome = input.renderBottomChrome;\n return renderChrome\n ? () => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n chromeSlot: \"bottom\"\n }}\n event=\"workbench.chrome.render_error\"\n fallbackKind=\"bottom-chrome\"\n resetKey={`${input.workspaceId}:bottom-chrome`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostChromeRenderer\n context={input.chromeContext}\n renderChrome={renderChrome}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n )\n : undefined;\n }, [\n input.chromeContext,\n input.debugDiagnostics,\n input.renderBottomChrome,\n input.workspaceId\n ]);\n const renderTopChrome = useMemo(() => {\n const renderChrome = input.renderTopChrome;\n return renderChrome\n ? () => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n chromeSlot: \"top\"\n }}\n event=\"workbench.chrome.render_error\"\n fallbackKind=\"top-chrome\"\n resetKey={`${input.workspaceId}:top-chrome`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostChromeRenderer\n context={input.chromeContext}\n renderChrome={renderChrome}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n )\n : undefined;\n }, [\n input.chromeContext,\n input.debugDiagnostics,\n input.renderTopChrome,\n input.workspaceId\n ]);\n\n const captureNodePreviewImage = useCallback(\n async (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(node.data.typeId);\n const minimizedDock = definition?.window?.minimizedDock;\n const capturePreview =\n minimizedDock?.kind === \"snapshot\"\n ? minimizedDock.capturePreview\n : undefined;\n const snapshot = input.hostSession.getSnapshot();\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: input.externalStateSource,\n node,\n workspaceId: input.workspaceId\n });\n const nodePreview =\n (await Promise.resolve(\n capturePreview?.({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host: input.hostSession,\n isFocused: snapshot.nodeStack.at(-1) === node.id,\n isMinimized: node.isMinimized,\n node\n }) ?? null\n ).catch(() => null)) ??\n (await Promise.resolve(\n input.captureNodePreviewImage?.(node) ?? null\n ).catch(() => null));\n return nodePreview;\n },\n [\n input.captureNodePreviewImage,\n input.externalStateSource,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const renderDock = useCallback(\n (context: Parameters<typeof WorkbenchHostDock>[0][\"context\"]) => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n dockEntryCount: input.dockEntries.length,\n dockPlacement: input.dockPlacement ?? null\n }}\n event=\"workbench.dock.render_error\"\n fallbackKind=\"dock\"\n resetKey={`${input.workspaceId}:dock`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostDock\n captureNodePreviewImage={captureNodePreviewImage}\n context={context}\n debugDiagnostics={input.debugDiagnostics}\n dockEntries={input.dockEntries}\n dockPlacement={input.dockPlacement}\n dockPreviewCache={input.dockPreviewCache}\n dockStateSource={input.dockStateSource}\n externalStateSource={input.externalStateSource}\n host={input.hostSession}\n i18n={input.hostI18n}\n nodeDefinitions={input.nodeDefinitionByType}\n onDockEntryAction={input.onDockEntryAction}\n onDockEntryClick={input.onDockEntryClick}\n onMissionControlRequestOpen={input.onMissionControlRequestOpen}\n workspaceId={input.workspaceId}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n ),\n [\n captureNodePreviewImage,\n input.debugDiagnostics,\n input.dockEntries,\n input.dockPlacement,\n input.dockPreviewCache,\n input.dockStateSource,\n input.externalStateSource,\n input.hostI18n,\n input.hostSession,\n input.nodeDefinitionByType,\n input.onDockEntryAction,\n input.onDockEntryClick,\n input.onMissionControlRequestOpen,\n input.workspaceId\n ]\n );\n\n const renderNode = useCallback(\n (context: WorkbenchRenderNodeContext<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(\n context.node.data.typeId\n );\n if (!definition) {\n return null;\n }\n\n const bodyContext = createWorkbenchHostNodeBodyContext({\n context,\n definition,\n externalStateSource: input.externalStateSource,\n host: input.hostSession,\n workspaceId: input.workspaceId\n });\n\n return (\n <WorkbenchHostNodeRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n node={context.node}\n resetKey={`${context.node.id}:${context.node.data.typeId}:${input.externalStateRevision}`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostNodeBodyRenderer\n context={bodyContext}\n definition={definition}\n />\n </WorkbenchHostNodeRenderErrorBoundary>\n );\n },\n [\n input.debugDiagnostics,\n input.externalStateSource,\n input.externalStateRevision,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const renderWindowActions = useCallback(\n (context: WorkbenchWindowActionContext<WorkbenchHostNodeData>) => (\n <WorkbenchHostWindowActions\n context={context}\n host={input.hostSession}\n i18n={input.hostI18n}\n nodeDefinitions={input.nodeDefinitionByType}\n />\n ),\n [input.hostI18n, input.hostSession, input.nodeDefinitionByType]\n );\n\n const renderWindowHeader = useCallback(\n (\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0]\n ) => {\n const definition = input.nodeDefinitionByType.get(\n context.node.data.typeId\n );\n if (!definition?.renderHeader) {\n return null;\n }\n\n return definition.renderHeader(\n createWorkbenchHostNodeHeaderContext({\n context,\n definition,\n externalStateSource: input.externalStateSource,\n host: input.hostSession,\n workspaceId: input.workspaceId\n })\n );\n },\n [\n input.externalStateSource,\n input.externalStateRevision,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const shouldKeepMinimizedNodeMounted = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const capability = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.keepMountedWhenMinimized;\n return typeof capability === \"function\"\n ? capability(node)\n : capability === true;\n },\n [input.nodeDefinitionByType]\n );\n\n const shouldCaptureNodePreviewImage = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const minimizedDock = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.minimizedDock;\n return minimizedDock?.kind !== \"component\";\n },\n [input.nodeDefinitionByType]\n );\n\n const renderNodeGeniePreview = useCallback(\n (\n node: WorkbenchNode<WorkbenchHostNodeData>,\n {\n previewViewport\n }: { previewViewport: { height: number; width: number } }\n ) => {\n const minimizedDock = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.minimizedDock;\n if (minimizedDock?.kind !== \"component\") {\n return null;\n }\n\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: input.externalStateSource,\n node,\n workspaceId: input.workspaceId\n });\n const preview = minimizedDock.providePreview({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host: input.hostSession,\n isFocused: input.hostSession.getSnapshot().nodeStack.at(-1) === node.id,\n isMinimized: node.isMinimized,\n node,\n previewViewport\n });\n return preview\n ? renderMinimizedDockPreviewContent(\n preview,\n \"workbench-genie-preview-capture__preview\"\n )\n : null;\n },\n [\n input.externalStateSource,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const resolveDockAnchorKey = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n if (\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitionByType\n })\n ) {\n const snapshotNodes = input.hostSession.getSnapshot().nodes;\n const slotNodes = snapshotNodes.some(\n (snapshotNode) => snapshotNode.id === node.id\n )\n ? snapshotNodes.map((snapshotNode) =>\n snapshotNode.id === node.id ? node : snapshotNode\n )\n : [...snapshotNodes, node];\n const minimizedAnchorKey =\n resolveWorkbenchMinimizedDockAnchorKeyForNode({\n nodeId: node.id,\n slots: resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions: input.nodeDefinitionByType,\n nodes: slotNodes\n })\n });\n if (minimizedAnchorKey) {\n return minimizedAnchorKey;\n }\n }\n\n if (typeof node.data.dockEntryId === \"string\") {\n const dockEntry = input.dockEntries.find(\n (entry) => entry.id === node.data.dockEntryId\n );\n return dockEntry?.anchorKey ?? node.data.dockEntryId;\n }\n\n return node.data.typeId;\n },\n [input.dockEntries, input.hostSession, input.nodeDefinitionByType]\n );\n\n const resolveDockPreviewCacheKey = useCallback(\n (\n node: WorkbenchNode<WorkbenchHostNodeData>\n ): WorkbenchDockPreviewCacheKey | null => ({\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId: input.workspaceId\n }),\n [input.workspaceId]\n );\n\n const windowChromeMode = useCallback<\n WorkbenchResolveWindowChromeMode<WorkbenchHostNodeData>\n >(\n ({ node }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.renderHeader\n ? \"custom-header\"\n : \"system\",\n [input.nodeDefinitionByType]\n );\n\n const resolveWindowZIndex = useCallback<\n WorkbenchResolveWindowZIndex<WorkbenchHostNodeData>\n >(({ baseZIndex }) => baseZIndex, []);\n\n const resolveWindowSurfaceLayer = useCallback<\n WorkbenchResolveWindowSurfaceLayer<WorkbenchHostNodeData>\n >(\n ({ node }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.window?.surfaceLayer ??\n \"default\",\n [input.nodeDefinitionByType]\n );\n\n const resolveFullscreenHeaderMode = useCallback(\n ({ node }: { node: WorkbenchNode<WorkbenchHostNodeData> }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.window\n ?.fullscreenHeaderMode,\n [input.nodeDefinitionByType]\n );\n\n return {\n captureNodePreviewImage,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldCaptureNodePreviewImage,\n shouldKeepMinimizedNodeMounted,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n resolveFullscreenHeaderMode,\n resolveWindowSurfaceLayer,\n resolveWindowZIndex,\n windowChromeMode\n };\n}\n\ninterface WorkbenchHostNodeRenderErrorBoundaryProps {\n children: ReactNode;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n node: WorkbenchNode<WorkbenchHostNodeData>;\n resetKey: string;\n workspaceId: string;\n}\n\ninterface WorkbenchHostSurfaceRenderErrorBoundaryProps {\n children: ReactNode;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n details?: Record<string, unknown>;\n event: string;\n fallbackKind: string;\n resetKey: string;\n workspaceId: string;\n}\n\ninterface WorkbenchHostNodeRenderErrorBoundaryState {\n hasError: boolean;\n}\n\ninterface WorkbenchHostSurfaceRenderErrorBoundaryState {\n hasError: boolean;\n}\n\nclass WorkbenchHostSurfaceRenderErrorBoundary extends Component<\n WorkbenchHostSurfaceRenderErrorBoundaryProps,\n WorkbenchHostSurfaceRenderErrorBoundaryState\n> {\n override state: WorkbenchHostSurfaceRenderErrorBoundaryState = {\n hasError: false\n };\n\n static getDerivedStateFromError(): WorkbenchHostSurfaceRenderErrorBoundaryState {\n return { hasError: true };\n }\n\n override componentDidUpdate(\n previousProps: WorkbenchHostSurfaceRenderErrorBoundaryProps\n ): void {\n if (this.state.hasError && previousProps.resetKey !== this.props.resetKey) {\n this.setState({ hasError: false });\n }\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n try {\n const result = this.props.debugDiagnostics?.log?.({\n details: {\n ...(this.props.details ?? {}),\n componentStack: info.componentStack ?? null,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorName: error instanceof Error ? error.name : typeof error,\n errorStack: error instanceof Error ? (error.stack ?? null) : null\n },\n event: this.props.event,\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: this.props.workspaceId\n });\n void Promise.resolve(result).catch(() => undefined);\n } catch {\n // Rendering recovery must not depend on diagnostics transport.\n }\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div\n data-workbench-surface-render-error={this.props.fallbackKind}\n style={{ height: \"100%\", width: \"100%\" }}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\nclass WorkbenchHostNodeRenderErrorBoundary extends Component<\n WorkbenchHostNodeRenderErrorBoundaryProps,\n WorkbenchHostNodeRenderErrorBoundaryState\n> {\n override state: WorkbenchHostNodeRenderErrorBoundaryState = {\n hasError: false\n };\n\n static getDerivedStateFromError(): WorkbenchHostNodeRenderErrorBoundaryState {\n return { hasError: true };\n }\n\n override componentDidUpdate(\n previousProps: WorkbenchHostNodeRenderErrorBoundaryProps\n ): void {\n if (this.state.hasError && previousProps.resetKey !== this.props.resetKey) {\n this.setState({ hasError: false });\n }\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n try {\n const result = this.props.debugDiagnostics?.log?.({\n details: {\n componentStack: info.componentStack ?? null,\n dockEntryId: this.props.node.data.dockEntryId ?? null,\n displayMode: this.props.node.displayMode,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorName: error instanceof Error ? error.name : typeof error,\n errorStack: error instanceof Error ? (error.stack ?? null) : null,\n frame: this.props.node.frame,\n instanceId: this.props.node.data.instanceId,\n instanceKey: this.props.node.data.instanceKey ?? null,\n isMinimized: this.props.node.isMinimized,\n launchSource: this.props.node.data.launchSource ?? null,\n nodeId: this.props.node.id,\n typeId: this.props.node.data.typeId\n },\n event: \"workbench.node.render_error\",\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: this.props.workspaceId\n });\n void Promise.resolve(result).catch(() => undefined);\n } catch {\n // Rendering recovery must not depend on diagnostics transport.\n }\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div\n data-workbench-node-render-error=\"true\"\n style={{\n alignItems: \"center\",\n boxSizing: \"border-box\",\n color: \"var(--text-secondary, #6b7280)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n height: \"100%\",\n justifyContent: \"center\",\n padding: 24,\n textAlign: \"center\",\n width: \"100%\"\n }}\n >\n <div\n data-workbench-node-render-error-message=\"true\"\n style={{\n color: \"var(--text-primary, #111827)\",\n fontSize: 14,\n fontWeight: 600\n }}\n >\n This workspace view failed to render.\n </div>\n <div style={{ fontSize: 12 }}>\n Try selecting another conversation or reopen the window.\n </div>\n <button\n type=\"button\"\n onClick={() => this.setState({ hasError: false })}\n style={{\n border: \"1px solid var(--line-2, #d1d5db)\",\n borderRadius: 6,\n background: \"var(--background-fronted, #ffffff)\",\n color: \"var(--text-primary, #111827)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 600,\n marginTop: 4,\n padding: \"6px 10px\"\n }}\n >\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\nfunction WorkbenchHostNodeBodyRenderer({\n context,\n definition\n}: {\n context: WorkbenchHostNodeBodyContext;\n definition: WorkbenchHostNodeDefinition;\n}): ReactNode {\n return definition.renderBody(context);\n}\n\nfunction WorkbenchHostChromeRenderer({\n context,\n renderChrome\n}: {\n context: WorkbenchHostChromeRenderContext;\n renderChrome: NonNullable<WorkbenchHostProps[\"renderTopChrome\"]>;\n}): ReactNode {\n return renderChrome(context);\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type Dispatch,\n type FocusEvent as ReactFocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type SetStateAction\n} from \"react\";\nimport {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n ChevronDownIcon,\n ChevronUpIcon\n} from \"@tutti-os/ui-system\";\nimport type { WorkbenchDockContext } from \"../react/types.ts\";\nimport {\n captureWorkbenchNodePreviewImage,\n readCachedWorkbenchNodePreviewImage,\n writeCachedWorkbenchNodePreviewImage\n} from \"../react/useWorkbenchGenieAnimation.tsx\";\nimport {\n resolveWorkbenchDockEntries,\n resolveWorkbenchDockEntryClick,\n type ResolvedWorkbenchHostDockEntry\n} from \"./dockEntries.ts\";\nimport {\n DOCK_ICON_BASE_SIZE,\n DOCK_ICON_PEAK_SIZE,\n useDockMagnification\n} from \"./dockMagnification.ts\";\nimport {\n resolveWorkbenchHostDockScrollState,\n type WorkbenchHostDockScrollState\n} from \"./dockScrollState.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport {\n resolveWorkbenchMinimizedDockSlots,\n type WorkbenchMinimizedDockNode,\n type WorkbenchMinimizedDockSlot\n} from \"./minimizedDockSlots.ts\";\nimport { useMinimizedDockStackPromotion } from \"./minimizedDockStackPromotion.ts\";\nimport {\n resolveWorkbenchMinimizedDockRestoreIntent,\n type WorkbenchMinimizedDockRestoreIntent\n} from \"./minimizedDockRestoreIntent.ts\";\nimport {\n WorkbenchHostDockPopup,\n type WorkbenchHostDockPopupAnchorRect,\n type WorkbenchHostDockPopupState\n} from \"./WorkbenchHostDockPopup.tsx\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport type {\n WorkbenchDockPreviewContent,\n WorkbenchHostDockEntry,\n WorkbenchHostDockEntryStateSource,\n WorkbenchHostExternalStateSource,\n WorkbenchHostHandle,\n WorkbenchHostNodeDefinition,\n WorkbenchHostNodeData,\n WorkbenchHostNodeInstanceStrategy,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport type { createWorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\ntype WorkbenchMinimizedDockNodeSlotRestoreIntent = Extract<\n WorkbenchMinimizedDockRestoreIntent,\n { kind: \"node-slot\" }\n>;\n\ntype WorkbenchMinimizedDockStackPopupCardRestoreIntent = Extract<\n WorkbenchMinimizedDockRestoreIntent,\n { kind: \"stack-popup-card\" }\n>;\n\ntype WorkbenchDockWallpaperTone = \"dark\" | \"light\";\n\nconst minimizedDockPreviewViewport = {\n height: 34.2,\n width: 46.8\n};\n\nfunction stripDockDescriptionTerminalPunctuation(value: string): string {\n const trimmed = value.trim();\n if (!trimmed || trimmed.endsWith(\"...\") || trimmed.endsWith(\"…\")) {\n return trimmed;\n }\n return trimmed.replace(/[。..]+$/u, \"\");\n}\n\nfunction activateDockButtonFromKeyboard(\n event: ReactKeyboardEvent<HTMLElement>,\n disabled = false\n) {\n if (disabled || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n\n event.preventDefault();\n event.currentTarget.click();\n}\n\nfunction isDockVisualMutationActive(element: HTMLElement | null): boolean {\n if (!element) {\n return false;\n }\n\n return (\n element.hasAttribute(\"data-dock-pointer-active\") ||\n element.hasAttribute(\"data-dock-hover-panel-open\") ||\n element.querySelector(\n '[data-collapsing=\"true\"], [data-presence=\"entering\"], [data-presence=\"exiting\"], [data-stack-dispatching=\"true\"], [data-promoted-from-stack=\"true\"]'\n ) !== null\n );\n}\n\nexport function WorkbenchHostDock({\n captureNodePreviewImage,\n context,\n debugDiagnostics,\n dockEntries,\n dockPlacement = \"bottom\",\n dockPreviewCache,\n dockStateSource,\n externalStateSource,\n host,\n i18n,\n nodeDefinitions,\n onDockEntryAction,\n onDockEntryClick,\n onMissionControlRequestOpen,\n workspaceId\n}: {\n captureNodePreviewImage?: WorkbenchHostProps[\"captureNodePreviewImage\"];\n context: WorkbenchDockContext<WorkbenchHostNodeData>;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockStateSource?: WorkbenchHostDockEntryStateSource;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n i18n: ReturnType<typeof createWorkbenchHostI18nRuntime>;\n nodeDefinitions: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: (input: {\n actionId: string;\n entryId: string;\n host: WorkbenchHostHandle;\n }) => Promise<void> | void;\n onDockEntryClick?: (input: {\n entryId: string;\n host: WorkbenchHostHandle;\n nodeId?: string;\n }) => Promise<void> | void;\n onMissionControlRequestOpen?: WorkbenchHostProps[\"onMissionControlRequestOpen\"];\n workspaceId: string;\n}) {\n const minimizedNodeIDs = useMemo(\n () => new Set(context.minimizedNodes.map((node) => node.id)),\n [context.minimizedNodes]\n );\n const dockMeasureRef = useRef<HTMLDivElement | null>(null);\n const dockItemsRef = useRef<HTMLDivElement | null>(null);\n const hoverPanelRef = useRef<HTMLDivElement | null>(null);\n const hoverPanelCloseTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hoverPanelOpenTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const labelTooltipOpenTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hoverPanelScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const labelTooltipScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const hoverPanelRestTargetRef = useRef<{\n anchorKey: string;\n entryId: string;\n } | null>(null);\n const activeHoverPanelRef = useRef<WorkbenchHostDockHoverPanelState | null>(\n null\n );\n const activeLabelTooltipRef =\n useRef<WorkbenchHostDockLabelTooltipState | null>(null);\n const pendingDockStateRefreshRef = useRef(false);\n const slotRefs = useRef(new Map<string, HTMLElement>());\n const wallpaperToneElementRefs = useRef(new Map<string, HTMLElement>());\n const dockSlotRefCallbacksRef = useRef(\n new Map<string, (element: HTMLElement | null) => void>()\n );\n const previousAttentionTokenByEntryId = useRef(new Map<string, unknown>());\n const dockEntryClickThrottleUntilRef = useRef(new Map<string, number>());\n const attentionTimeouts = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const [activeAttentionEntryIds, setActiveAttentionEntryIds] = useState<\n Set<string>\n >(new Set());\n const [activePopup, setActivePopup] =\n useState<WorkbenchHostDockPopupState | null>(null);\n const [activeHoverPanel, setActiveHoverPanel] =\n useState<WorkbenchHostDockHoverPanelState | null>(null);\n const [activeLabelTooltip, setActiveLabelTooltip] =\n useState<WorkbenchHostDockLabelTooltipState | null>(null);\n const [activeMinimizedStackPopup, setActiveMinimizedStackPopup] =\n useState<WorkbenchHostDockPopupAnchorRect | null>(null);\n const [pendingActionKeys, setPendingActionKeys] = useState<Set<string>>(\n () => new Set()\n );\n const [dockFrameSize, setDockFrameSize] = useState<number | null>(null);\n const { triggerDockBounce } = useDockBounce(slotRefs);\n const [dockScrollState, setDockScrollState] =\n useState<WorkbenchHostDockScrollState>(() => ({\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n }));\n const [dockStateRevision, setDockStateRevision] = useState(0);\n const [externalStateRevision, setExternalStateRevision] = useState(0);\n const [\n collapsingMinimizedLaunchAnchorKeys,\n setCollapsingMinimizedLaunchAnchorKeys\n ] = useState<Set<string>>(() => new Set());\n const collapsingMinimizedLaunchTimerRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n\n const clearHoverPanelCloseTimer = useCallback(() => {\n if (hoverPanelCloseTimerRef.current === null) {\n return;\n }\n clearTimeout(hoverPanelCloseTimerRef.current);\n hoverPanelCloseTimerRef.current = null;\n }, []);\n\n const clearHoverPanelOpenTimer = useCallback(() => {\n if (hoverPanelOpenTimerRef.current === null) {\n return;\n }\n clearTimeout(hoverPanelOpenTimerRef.current);\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n }, []);\n\n const clearLabelTooltipOpenTimer = useCallback(() => {\n if (labelTooltipOpenTimerRef.current === null) {\n return;\n }\n clearTimeout(labelTooltipOpenTimerRef.current);\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n }, []);\n\n useEffect(\n () => () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n for (const timer of collapsingMinimizedLaunchTimerRef.current.values()) {\n clearTimeout(timer);\n }\n collapsingMinimizedLaunchTimerRef.current.clear();\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n clearLabelTooltipOpenTimer\n ]\n );\n\n const clearCollapsingMinimizedLaunch = useCallback((anchorKey: string) => {\n const timer = collapsingMinimizedLaunchTimerRef.current.get(anchorKey);\n if (timer) {\n clearTimeout(timer);\n collapsingMinimizedLaunchTimerRef.current.delete(anchorKey);\n }\n const slotElement = slotRefs.current.get(anchorKey);\n slotElement?.removeAttribute(\"data-collapsing\");\n slotElement?.style.removeProperty(\"--desktop-dock-collapse-inline-size\");\n slotElement?.style.removeProperty(\"--desktop-dock-collapse-block-size\");\n setCollapsingMinimizedLaunchAnchorKeys((current) => {\n if (!current.has(anchorKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(anchorKey);\n return next;\n });\n }, []);\n\n const scheduleCollapsingMinimizedLaunchClear = useCallback(\n (anchorKey: string) => {\n const existing = collapsingMinimizedLaunchTimerRef.current.get(anchorKey);\n if (existing) {\n clearTimeout(existing);\n }\n collapsingMinimizedLaunchTimerRef.current.set(\n anchorKey,\n setTimeout(() => {\n clearCollapsingMinimizedLaunch(anchorKey);\n }, minimizedDockSlotLayoutAnimationMs)\n );\n },\n [clearCollapsingMinimizedLaunch]\n );\n\n useLayoutEffect(() => {\n const element = dockMeasureRef.current;\n if (!element || typeof window === \"undefined\") {\n return undefined;\n }\n\n let frameId: number | null = null;\n const updateDockFrameSize = () => {\n frameId = null;\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n return;\n }\n const rect = element.getBoundingClientRect();\n const nextSize = Math.ceil(\n (dockPlacement === \"left\" ? rect.height : rect.width) +\n desktopDockPlateChromeWidth\n );\n setDockFrameSize((current) =>\n current === nextSize ? current : nextSize\n );\n };\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(updateDockFrameSize);\n };\n\n updateDockFrameSize();\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(element);\n window.addEventListener(\"resize\", scheduleUpdate);\n\n return () => {\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n };\n }, [dockPlacement]);\n\n const flushPendingDockStateRefresh = useCallback(() => {\n if (!pendingDockStateRefreshRef.current) {\n return;\n }\n pendingDockStateRefreshRef.current = false;\n setDockStateRevision((revision) => revision + 1);\n }, []);\n\n useEffect(() => {\n if (!dockStateSource) {\n return undefined;\n }\n return dockStateSource.subscribe(() => {\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n pendingDockStateRefreshRef.current = true;\n return;\n }\n setDockStateRevision((revision) => revision + 1);\n });\n }, [dockStateSource]);\n\n const renderedDockEntries = useMemo(\n () =>\n dockEntries.map((entry) => {\n const dynamicState = dockStateSource?.getEntryState(entry.id);\n return dynamicState ? { ...entry, ...dynamicState } : entry;\n }),\n [dockEntries, dockStateRevision, dockStateSource]\n );\n const resolvedEntries = useMemo(\n () =>\n resolveWorkbenchDockEntries({\n dockEntries: renderedDockEntries,\n minimizedNodeIds: minimizedNodeIDs,\n nodes: context.nodes\n }),\n [context.nodes, minimizedNodeIDs, renderedDockEntries]\n );\n const minimizedDockSlots = useMemo(\n () =>\n resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions,\n nodes: context.minimizedNodes\n }),\n [context.minimizedNodes, nodeDefinitions]\n );\n const { promotedNodeId, stackDispatching } =\n useMinimizedDockStackPromotion(minimizedDockSlots);\n const dockItems = useMemo(\n () =>\n createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n }),\n [minimizedDockSlots, resolvedEntries]\n );\n const presentDockItems = useDockPresenceItems(dockItems, (nodeId) =>\n context.genie.shouldAnimateMinimizedDockEnter(nodeId)\n );\n const presentDockItemKeys = useMemo(\n () => presentDockItems.map((item) => item.key).join(\"\\n\"),\n [presentDockItems]\n );\n const wallpaperTones = useDockWallpaperTones({\n dockItemsRef,\n elementRefs: wallpaperToneElementRefs,\n itemKeys: presentDockItemKeys\n });\n const dockWidth = useMemo(\n () => resolveWorkbenchHostDockItemsWidth(dockItems),\n [dockItems]\n );\n const {\n clearSlotMagnification,\n handlePointerLeave: handleDockPointerLeave,\n handlePointerMove: handleDockPointerMove,\n pauseMagnification: pauseDockMagnification,\n resetMagnification: resetDockMagnification\n } = useDockMagnification({\n dockPlacement,\n dockRootRef: dockMeasureRef,\n slotRefs\n });\n const clearSlotMagnificationRef = useRef<(anchorKey: string) => void>(() => {\n return;\n });\n const registerDockAnchorRef = useRef(\n (anchorKey: string, element: HTMLElement | null) => {\n context.genie.registerDockAnchor(anchorKey, element);\n }\n );\n clearSlotMagnificationRef.current = (anchorKey) => {\n clearSlotMagnification(anchorKey);\n };\n registerDockAnchorRef.current = (anchorKey, element) => {\n context.genie.registerDockAnchor(anchorKey, element);\n };\n const registerWallpaperToneElement = useCallback(\n (key: string) => (element: HTMLElement | null) => {\n if (element) {\n wallpaperToneElementRefs.current.set(key, element);\n return;\n }\n wallpaperToneElementRefs.current.delete(key);\n },\n []\n );\n\n const setDockHoverPanelOpen = useCallback((open: boolean) => {\n if (open) {\n dockMeasureRef.current?.setAttribute(\n \"data-dock-hover-panel-open\",\n \"true\"\n );\n return;\n }\n dockMeasureRef.current?.removeAttribute(\"data-dock-hover-panel-open\");\n }, []);\n\n useEffect(() => {\n activeHoverPanelRef.current = activeHoverPanel;\n }, [activeHoverPanel]);\n\n useEffect(() => {\n activeLabelTooltipRef.current = activeLabelTooltip;\n }, [activeLabelTooltip]);\n\n const closeLabelTooltipImmediate = useCallback(\n (targetKey?: string) => {\n clearLabelTooltipOpenTimer();\n if (\n targetKey !== undefined &&\n activeLabelTooltipRef.current?.key !== targetKey\n ) {\n return;\n }\n if (activeLabelTooltipRef.current === null) {\n return;\n }\n activeLabelTooltipRef.current = null;\n setActiveLabelTooltip(null);\n },\n [clearLabelTooltipOpenTimer]\n );\n\n const closeHoverPanelImmediate = useCallback(\n (entryId?: string) => {\n clearHoverPanelOpenTimer();\n clearHoverPanelCloseTimer();\n if (\n entryId !== undefined &&\n activeHoverPanelRef.current?.entryId !== entryId\n ) {\n return;\n }\n if (activeHoverPanelRef.current === null) {\n return;\n }\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n activeHoverPanelRef.current = null;\n setActiveHoverPanel(null);\n flushPendingDockStateRefresh();\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n flushPendingDockStateRefresh,\n setDockHoverPanelOpen\n ]\n );\n\n const scheduleHoverPanelClose = useCallback(\n (entryId?: string) => {\n clearHoverPanelOpenTimer();\n clearHoverPanelCloseTimer();\n hoverPanelCloseTimerRef.current = setTimeout(() => {\n hoverPanelCloseTimerRef.current = null;\n closeHoverPanelImmediate(entryId);\n handleDockPointerLeave();\n }, dockHoverPanelCloseDelayMs);\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n closeHoverPanelImmediate,\n handleDockPointerLeave\n ]\n );\n\n const showHoverPanel = useCallback(\n (entryId: string, anchorKey: string, anchorElement: HTMLElement): void => {\n const dockElement = dockMeasureRef.current;\n if (!dockElement) {\n return;\n }\n\n pauseDockMagnification();\n const dockRect = dockElement.getBoundingClientRect();\n const anchorRect = anchorElement.getBoundingClientRect();\n clearHoverPanelCloseTimer();\n const nextHoverPanel = {\n anchorKey,\n anchorRect: {\n height: anchorRect.height,\n left: anchorRect.left - dockRect.left,\n top: anchorRect.top - dockRect.top,\n width: anchorRect.width\n },\n entryId\n };\n setDockHoverPanelOpen(true);\n activeHoverPanelRef.current = nextHoverPanel;\n setActiveHoverPanel(nextHoverPanel);\n },\n [clearHoverPanelCloseTimer, pauseDockMagnification, setDockHoverPanelOpen]\n );\n\n const scheduleHoverPanelAfterRest = useCallback(\n (entryId: string, anchorKey: string) => {\n hoverPanelRestTargetRef.current = { anchorKey, entryId };\n clearHoverPanelOpenTimer();\n hoverPanelScheduledPointRef.current = null;\n hoverPanelOpenTimerRef.current = setTimeout(() => {\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n const pending = hoverPanelRestTargetRef.current;\n if (!pending || pending.entryId !== entryId) {\n return;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n showHoverPanel(entryId, anchorKey, slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearHoverPanelOpenTimer, showHoverPanel]\n );\n\n const showLabelTooltip = useCallback(\n (\n target: WorkbenchHostDockLabelTooltipTarget,\n anchorKey: string,\n anchorElement: HTMLElement\n ): void => {\n const dockElement = dockMeasureRef.current;\n if (!dockElement) {\n return;\n }\n\n const dockRect = dockElement.getBoundingClientRect();\n const anchorRect = resolveDockLabelTooltipAnchorRect({\n dockPlacement,\n slotElement: anchorElement\n });\n clearLabelTooltipOpenTimer();\n const nextTooltip = {\n anchorKey,\n anchorRect: {\n height: anchorRect.height,\n left: anchorRect.left - dockRect.left,\n top: anchorRect.top - dockRect.top,\n width: anchorRect.width\n },\n key: target.key,\n label: target.label\n };\n activeLabelTooltipRef.current = nextTooltip;\n setActiveLabelTooltip(nextTooltip);\n },\n [clearLabelTooltipOpenTimer, dockPlacement]\n );\n\n const scheduleLabelTooltipAfterRest = useCallback(\n (target: WorkbenchHostDockLabelTooltipTarget, anchorKey: string) => {\n clearLabelTooltipOpenTimer();\n labelTooltipScheduledPointRef.current = null;\n labelTooltipOpenTimerRef.current = setTimeout(() => {\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n showLabelTooltip(target, anchorKey, slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearLabelTooltipOpenTimer, showLabelTooltip]\n );\n\n const resolveHoverPanelTargetAtPoint = useCallback(\n (\n clientX: number,\n clientY: number\n ): {\n anchorKey: string;\n entryId: string;\n slotElement: HTMLElement;\n } | null => {\n for (const [anchorKey, slotElement] of slotRefs.current) {\n const entryId = slotElement.dataset.dockHoverPanelEntryId;\n if (!entryId) {\n continue;\n }\n\n const rect = slotElement.getBoundingClientRect();\n if (\n clientX >= rect.left - dockHoverPanelHitSlopPx &&\n clientX <= rect.right + dockHoverPanelHitSlopPx &&\n clientY >= rect.top - dockHoverPanelHitSlopPx &&\n clientY <= rect.bottom + dockHoverPanelHitSlopPx\n ) {\n return { anchorKey, entryId, slotElement };\n }\n }\n return null;\n },\n []\n );\n\n const resolveLabelTooltipTargetAtPoint = useCallback(\n (\n clientX: number,\n clientY: number\n ): {\n anchorKey: string;\n slotElement: HTMLElement;\n target: WorkbenchHostDockLabelTooltipTarget;\n } | null => {\n for (const [anchorKey, slotElement] of slotRefs.current) {\n if (slotElement.dataset.dockHoverPanelEntryId) {\n continue;\n }\n const key = slotElement.dataset.dockLabelTooltipKey;\n const label = slotElement.dataset.dockLabelTooltipLabel?.trim() ?? \"\";\n if (!key || !label) {\n continue;\n }\n\n const rect = slotElement.getBoundingClientRect();\n if (\n clientX >= rect.left - dockHoverPanelHitSlopPx &&\n clientX <= rect.right + dockHoverPanelHitSlopPx &&\n clientY >= rect.top - dockHoverPanelHitSlopPx &&\n clientY <= rect.bottom + dockHoverPanelHitSlopPx\n ) {\n return {\n anchorKey,\n slotElement,\n target: {\n key,\n label\n }\n };\n }\n }\n return null;\n },\n []\n );\n\n const isPointerInsideActiveHoverPanelRegion = useCallback(\n (clientX: number, clientY: number): boolean => {\n const activeHoverPanel = activeHoverPanelRef.current;\n if (!activeHoverPanel) {\n return false;\n }\n\n const anchorSlot = slotRefs.current.get(activeHoverPanel.anchorKey);\n const panel = hoverPanelRef.current;\n if (\n !anchorSlot ||\n !panel ||\n !anchorSlot.isConnected ||\n !panel.isConnected\n ) {\n return false;\n }\n\n const anchorRect = anchorSlot.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n return (\n rectContainsPoint(\n anchorRect,\n clientX,\n clientY,\n dockHoverPanelHitSlopPx\n ) ||\n rectContainsPoint(\n panelRect,\n clientX,\n clientY,\n dockHoverPanelHitSlopPx\n ) ||\n rectContainsPoint(\n createHoverPanelBridgeRect(anchorRect, panelRect),\n clientX,\n clientY,\n dockHoverPanelBridgeSlopPx\n )\n );\n },\n []\n );\n\n const scheduleHoverPanelAtPointAfterRest = useCallback(\n (clientX: number, clientY: number) => {\n const scheduledPoint = hoverPanelScheduledPointRef.current;\n if (\n hoverPanelOpenTimerRef.current !== null &&\n scheduledPoint &&\n Math.abs(clientX - scheduledPoint.clientX) <=\n dockHoverPanelPointerRestTolerancePx &&\n Math.abs(clientY - scheduledPoint.clientY) <=\n dockHoverPanelPointerRestTolerancePx\n ) {\n return;\n }\n\n clearHoverPanelOpenTimer();\n hoverPanelScheduledPointRef.current = { clientX, clientY };\n hoverPanelOpenTimerRef.current = setTimeout(() => {\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n if (activeHoverPanelRef.current !== null) {\n return;\n }\n const target = resolveHoverPanelTargetAtPoint(clientX, clientY);\n if (!target) {\n hoverPanelRestTargetRef.current = null;\n return;\n }\n hoverPanelRestTargetRef.current = {\n anchorKey: target.anchorKey,\n entryId: target.entryId\n };\n showHoverPanel(target.entryId, target.anchorKey, target.slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearHoverPanelOpenTimer, resolveHoverPanelTargetAtPoint, showHoverPanel]\n );\n\n const scheduleLabelTooltipAtPointAfterRest = useCallback(\n (clientX: number, clientY: number) => {\n if (activeLabelTooltipRef.current !== null) {\n return;\n }\n\n const scheduledPoint = labelTooltipScheduledPointRef.current;\n if (\n labelTooltipOpenTimerRef.current !== null &&\n scheduledPoint &&\n Math.abs(clientX - scheduledPoint.clientX) <=\n dockHoverPanelPointerRestTolerancePx &&\n Math.abs(clientY - scheduledPoint.clientY) <=\n dockHoverPanelPointerRestTolerancePx\n ) {\n return;\n }\n\n clearLabelTooltipOpenTimer();\n labelTooltipScheduledPointRef.current = { clientX, clientY };\n labelTooltipOpenTimerRef.current = setTimeout(() => {\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n if (activeHoverPanelRef.current !== null) {\n return;\n }\n const target = resolveLabelTooltipTargetAtPoint(clientX, clientY);\n if (!target) {\n return;\n }\n showLabelTooltip(target.target, target.anchorKey, target.slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [\n clearLabelTooltipOpenTimer,\n resolveLabelTooltipTargetAtPoint,\n showLabelTooltip\n ]\n );\n\n const beginDockIconInteraction = useCallback(\n (anchorKey: string) => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n triggerDockBounce(anchorKey);\n },\n [\n clearHoverPanelOpenTimer,\n closeHoverPanelImmediate,\n closeLabelTooltipImmediate,\n triggerDockBounce\n ]\n );\n\n const isDockEntryClickThrottled = useCallback(\n (anchorKey: string): boolean => {\n const throttledUntil =\n dockEntryClickThrottleUntilRef.current.get(anchorKey);\n return throttledUntil !== undefined && Date.now() < throttledUntil;\n },\n []\n );\n\n const claimDockEntryClick = useCallback((anchorKey: string): void => {\n dockEntryClickThrottleUntilRef.current.set(\n anchorKey,\n Date.now() + DOCK_ENTRY_CLICK_THROTTLE_MS\n );\n }, []);\n\n const beginDockMinimizedInteraction = useCallback(\n (anchorKey?: string): boolean => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n pauseDockMagnification();\n\n if (!anchorKey) {\n return false;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return false;\n }\n clearSlotMagnification(anchorKey);\n if (slotElement.dataset.collapsing === \"true\") {\n return true;\n }\n const rect = slotElement.getBoundingClientRect();\n slotElement.style.setProperty(\n \"--desktop-dock-collapse-inline-size\",\n `${rect.width}px`\n );\n slotElement.style.setProperty(\n \"--desktop-dock-collapse-block-size\",\n `${rect.height}px`\n );\n slotElement.dataset.collapsing = \"true\";\n return true;\n },\n [\n clearHoverPanelOpenTimer,\n clearLabelTooltipOpenTimer,\n clearSlotMagnification,\n closeHoverPanelImmediate,\n closeLabelTooltipImmediate,\n pauseDockMagnification\n ]\n );\n\n const runDockMinimizedLaunchAfterCollapse = useCallback(\n (\n intent: WorkbenchMinimizedDockNodeSlotRestoreIntent,\n launch: (intent: WorkbenchMinimizedDockNodeSlotRestoreIntent) => void\n ) => {\n const { anchorKey } = intent;\n beginDockMinimizedInteraction(anchorKey);\n setCollapsingMinimizedLaunchAnchorKeys((current) => {\n const next = new Set(current);\n next.add(anchorKey);\n return next;\n });\n scheduleCollapsingMinimizedLaunchClear(anchorKey);\n launch(intent);\n },\n [beginDockMinimizedInteraction, scheduleCollapsingMinimizedLaunchClear]\n );\n\n const runDockMinimizedStackLaunch = useCallback(\n (\n intent: WorkbenchMinimizedDockStackPopupCardRestoreIntent,\n launch: (\n intent: WorkbenchMinimizedDockStackPopupCardRestoreIntent\n ) => void\n ) => {\n beginDockMinimizedInteraction();\n launch(intent);\n },\n [beginDockMinimizedInteraction]\n );\n\n const handleDockPointerTravel = useCallback(\n (clientX: number, clientY: number) => {\n if (activeHoverPanelRef.current !== null) {\n closeLabelTooltipImmediate();\n if (isPointerInsideActiveHoverPanelRegion(clientX, clientY)) {\n clearHoverPanelCloseTimer();\n return;\n }\n scheduleHoverPanelClose(activeHoverPanelRef.current.entryId);\n handleDockPointerLeave();\n return;\n }\n\n const activeLabelTooltip = activeLabelTooltipRef.current;\n if (activeLabelTooltip) {\n const target = resolveLabelTooltipTargetAtPoint(clientX, clientY);\n if (target?.target.key !== activeLabelTooltip.key) {\n closeLabelTooltipImmediate(activeLabelTooltip.key);\n }\n }\n\n handleDockPointerMove(clientX, clientY);\n scheduleHoverPanelAtPointAfterRest(clientX, clientY);\n scheduleLabelTooltipAtPointAfterRest(clientX, clientY);\n },\n [\n clearHoverPanelCloseTimer,\n closeLabelTooltipImmediate,\n handleDockPointerMove,\n handleDockPointerLeave,\n isPointerInsideActiveHoverPanelRegion,\n resolveLabelTooltipTargetAtPoint,\n scheduleHoverPanelClose,\n scheduleHoverPanelAtPointAfterRest,\n scheduleLabelTooltipAtPointAfterRest\n ]\n );\n\n const updateDockScrollState = useCallback(() => {\n const scrollElement = dockItemsRef.current;\n const viewportElement = dockMeasureRef.current;\n if (!scrollElement || !viewportElement) {\n setDockScrollState((current) =>\n current.hasOverflow ||\n current.canScrollBackward ||\n current.canScrollForward\n ? {\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n }\n : current\n );\n return;\n }\n\n const isVertical = dockPlacement === \"left\";\n const viewportSize = isVertical\n ? viewportElement.clientHeight\n : viewportElement.clientWidth;\n const scrollSize = isVertical\n ? scrollElement.scrollHeight\n : scrollElement.scrollWidth;\n const scrollOffset = isVertical\n ? scrollElement.scrollTop\n : scrollElement.scrollLeft;\n const nextState = resolveWorkbenchHostDockScrollState({\n contentSize: dockWidth,\n scrollOffset,\n scrollSize,\n viewportSize\n });\n\n setDockScrollState((current) =>\n current.canScrollBackward === nextState.canScrollBackward &&\n current.canScrollForward === nextState.canScrollForward &&\n current.hasOverflow === nextState.hasOverflow\n ? current\n : nextState\n );\n }, [dockPlacement, dockWidth]);\n\n useLayoutEffect(() => {\n const element = dockItemsRef.current;\n if (!element || typeof window === \"undefined\") {\n return undefined;\n }\n\n let frameId: number | null = null;\n const scheduleUpdate = () => {\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n return;\n }\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(() => {\n frameId = null;\n updateDockScrollState();\n });\n };\n\n updateDockScrollState();\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(element);\n window.addEventListener(\"resize\", scheduleUpdate);\n element.addEventListener(\"scroll\", scheduleUpdate, { passive: true });\n\n return () => {\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n element.removeEventListener(\"scroll\", scheduleUpdate);\n };\n }, [dockPlacement, presentDockItems.length, updateDockScrollState]);\n\n const hasMinimizedPreviewCapture = minimizedDockSlots.some((slot) =>\n minimizedDockSlotNodes(slot).some((node) =>\n (() => {\n if (context.genie.isPendingMinimizedDockNode(node.id)) {\n return false;\n }\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return (\n minimizedDock?.kind === \"snapshot\" &&\n Boolean(minimizedDock.capturePreview)\n );\n })()\n )\n );\n\n useEffect(() => {\n const shouldSubscribe = activePopup !== null || hasMinimizedPreviewCapture;\n if (!shouldSubscribe || !externalStateSource?.subscribe) {\n return undefined;\n }\n return externalStateSource.subscribe(() => {\n setExternalStateRevision((revision) => revision + 1);\n });\n }, [activePopup, externalStateSource, hasMinimizedPreviewCapture]);\n\n useEffect(() => {\n const nextAttentionIds = new Set<string>();\n\n for (const entry of renderedDockEntries) {\n const nextToken = entry.attentionToken ?? null;\n const previousToken =\n previousAttentionTokenByEntryId.current.get(entry.id) ?? null;\n if (nextToken !== null && nextToken !== previousToken) {\n nextAttentionIds.add(entry.id);\n }\n previousAttentionTokenByEntryId.current.set(entry.id, nextToken);\n }\n\n if (nextAttentionIds.size === 0) {\n return;\n }\n\n setActiveAttentionEntryIds((current) => {\n const next = new Set(current);\n for (const entryId of nextAttentionIds) {\n next.add(entryId);\n }\n return next;\n });\n\n for (const entryId of nextAttentionIds) {\n const existingTimeout = attentionTimeouts.current.get(entryId);\n if (existingTimeout) {\n globalThis.clearTimeout(existingTimeout);\n }\n attentionTimeouts.current.set(\n entryId,\n globalThis.setTimeout(() => {\n attentionTimeouts.current.delete(entryId);\n setActiveAttentionEntryIds((current) => {\n if (!current.has(entryId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(entryId);\n return next;\n });\n }, 900)\n );\n }\n }, [renderedDockEntries]);\n\n useEffect(\n () => () => {\n for (const timeout of attentionTimeouts.current.values()) {\n globalThis.clearTimeout(timeout);\n }\n attentionTimeouts.current.clear();\n },\n []\n );\n\n const captureMinimizedNodePreview = useCallback(\n async (node: WorkbenchMinimizedDockNode) => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n const capturePreview =\n minimizedDock?.kind === \"snapshot\"\n ? minimizedDock.capturePreview\n : undefined;\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n return (\n (await Promise.resolve(\n capturePreview?.({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node\n }) ?? null\n ).catch(() => null)) ??\n (await Promise.resolve(captureNodePreviewImage?.(node) ?? null).catch(\n () => null\n ))\n );\n },\n [\n captureNodePreviewImage,\n context.focusedNodeId,\n externalStateRevision,\n externalStateSource,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n const provideMinimizedNodePreview = useCallback(\n (node: WorkbenchMinimizedDockNode): WorkbenchDockPreviewContent | null => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n if (minimizedDock?.kind !== \"component\") {\n return null;\n }\n\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n return minimizedDock.providePreview({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node,\n previewViewport: minimizedDockPreviewViewport\n });\n },\n [\n context.focusedNodeId,\n externalStateSource,\n host,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n const provideMinimizedNodePreviewForNode = useCallback(\n (node: WorkbenchMinimizedDockNode) => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return minimizedDock?.kind === \"component\"\n ? provideMinimizedNodePreview\n : undefined;\n },\n [nodeDefinitions, provideMinimizedNodePreview]\n );\n\n if (dockItems.length === 0 && presentDockItems.length === 0) {\n return null;\n }\n\n const closePopup = () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n setActivePopup(null);\n setActiveHoverPanel(null);\n closeLabelTooltipImmediate();\n setActiveMinimizedStackPopup(null);\n };\n\n const scrollDockItems = (direction: WorkbenchHostDockScrollDirection) => {\n const element = dockItemsRef.current;\n if (!element) {\n return;\n }\n\n resetDockMagnification();\n closeHoverPanelImmediate();\n closeLabelTooltipImmediate();\n hoverPanelRestTargetRef.current = null;\n\n const isVertical = dockPlacement === \"left\";\n const viewportSize = isVertical\n ? element.clientHeight\n : element.clientWidth;\n const delta =\n Math.max(DOCK_ICON_PEAK_SIZE * 2, viewportSize * 0.72) *\n (direction === \"forward\" ? 1 : -1);\n\n element.scrollBy({\n behavior: \"smooth\",\n left: isVertical ? 0 : delta,\n top: isVertical ? delta : 0\n });\n };\n\n const registerDockSlot = useCallback((anchorKey: string) => {\n const existing = dockSlotRefCallbacksRef.current.get(anchorKey);\n if (existing) {\n return existing;\n }\n\n const callback = (element: HTMLElement | null) => {\n if (element) {\n slotRefs.current.set(anchorKey, element);\n wallpaperToneElementRefs.current.set(anchorKey, element);\n } else {\n slotRefs.current.delete(anchorKey);\n wallpaperToneElementRefs.current.delete(anchorKey);\n if (!dockMeasureRef.current?.hasAttribute(\"data-dock-pointer-active\")) {\n clearSlotMagnificationRef.current(anchorKey);\n }\n }\n registerDockAnchorRef.current(anchorKey, element);\n };\n dockSlotRefCallbacksRef.current.set(anchorKey, callback);\n return callback;\n }, []);\n\n const runDockEntryAction = useCallback(\n (entryId: string, actionId: string) => {\n const actionKey = dockActionKey(entryId, actionId);\n if (pendingActionKeys.has(actionKey)) {\n return;\n }\n setPendingActionKeys((current) => {\n const next = new Set(current);\n next.add(actionKey);\n return next;\n });\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId,\n entryId,\n host\n });\n } catch {\n // Keep dock action failures contained.\n } finally {\n setPendingActionKeys((current) => {\n if (!current.has(actionKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(actionKey);\n return next;\n });\n }\n })();\n },\n [host, onDockEntryAction, pendingActionKeys]\n );\n\n const popupEntry =\n activePopup === null\n ? null\n : (resolvedEntries.find(\n (entry) => entry.entry.id === activePopup.entryId\n ) ?? null);\n const activeMinimizedStackSlot =\n activeMinimizedStackPopup === null\n ? null\n : (minimizedDockSlots.find(\n (\n slot\n ): slot is Extract<WorkbenchMinimizedDockSlot, { kind: \"stack\" }> =>\n slot.kind === \"stack\"\n ) ?? null);\n const openDockContextMenuNodeIds =\n popupEntry?.matchedNodes.map((node) => node.id) ?? [];\n const dockContextMenuInstanceMode =\n popupEntry === null\n ? undefined\n : resolveDockEntryInstanceMode(popupEntry.entry, nodeDefinitions);\n const canShowAllWindowsFromDockContextMenu =\n onMissionControlRequestOpen !== undefined &&\n dockContextMenuInstanceMode === \"multi\" &&\n openDockContextMenuNodeIds.length > 1;\n const fullscreenNodeFromDockContextMenu =\n popupEntry === null\n ? null\n : resolveDockContextMenuFullscreenNode({\n focusedNodeId: context.focusedNodeId,\n minimizedNodeIDs,\n nodeDefinitions,\n nodes: popupEntry.matchedNodes\n });\n const canOpenFromDockContextMenu =\n popupEntry !== null &&\n popupEntry.matchedNodes.length === 0 &&\n resolveWorkbenchDockEntryClick({\n entry: popupEntry.entry,\n instanceMode: dockContextMenuInstanceMode,\n matchedNodes: popupEntry.matchedNodes\n }).kind === \"launch\";\n\n return (\n <div\n className=\"flex justify-center pointer-events-none\"\n data-dock-placement={dockPlacement}\n >\n <div\n className=\"desktop-dock-plate\"\n style={\n dockFrameSize === null\n ? undefined\n : ({\n \"--desktop-dock-frame-size\": `${dockFrameSize}px`\n } as WorkbenchHostDockPlateStyle)\n }\n >\n <div\n ref={dockMeasureRef}\n aria-label={i18n.t(\"dockLabel\")}\n className=\"desktop-dock\"\n data-dock-placement={dockPlacement}\n data-desktop-dock-root=\"true\"\n data-scroll-overflow={\n dockScrollState.hasOverflow ? \"true\" : undefined\n }\n data-scroll-backward={\n dockScrollState.canScrollBackward ? \"true\" : undefined\n }\n data-scroll-forward={\n dockScrollState.canScrollForward ? \"true\" : undefined\n }\n onPointerLeave={() => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n handleDockPointerLeave();\n flushPendingDockStateRefresh();\n }}\n onPointerMoveCapture={(event) => {\n handleDockPointerTravel(event.clientX, event.clientY);\n }}\n role=\"toolbar\"\n style={\n dockPlacement === \"left\"\n ? { height: dockWidth }\n : { width: dockWidth }\n }\n >\n <span\n className=\"desktop-dock__pointer-rail\"\n data-desktop-dock-pointer-rail=\"true\"\n aria-hidden\n />\n <button\n aria-label={i18n.t(\n dockPlacement === \"left\" ? \"scrollDockUp\" : \"scrollDockLeft\"\n )}\n className=\"desktop-dock__scroll-button desktop-dock__scroll-button--backward\"\n data-scroll-button=\"backward\"\n disabled={!dockScrollState.canScrollBackward}\n onClick={() => scrollDockItems(\"backward\")}\n type=\"button\"\n >\n {dockPlacement === \"left\" ? (\n <ChevronUpIcon size={16} />\n ) : (\n <ArrowLeftIcon size={16} />\n )}\n </button>\n <div ref={dockItemsRef} className=\"desktop-dock__items\">\n {presentDockItems.map((dockItem) => {\n if (dockItem.item.kind === \"separator\") {\n return (\n <span\n ref={registerWallpaperToneElement(dockItem.key)}\n className=\"desktop-dock__separator\"\n aria-hidden=\"true\"\n data-presence={dockItem.presence}\n data-wallpaper-tone={wallpaperTones.get(dockItem.key)}\n key={dockItem.key}\n />\n );\n }\n\n if (dockItem.item.kind === \"entry\") {\n const resolvedEntry = dockItem.item.resolvedEntry;\n const { anchorKey, entry } = resolvedEntry;\n const currentPopup =\n activePopup?.entryId === entry.id ? activePopup : null;\n const instanceMode = resolveDockEntryInstanceMode(\n entry,\n nodeDefinitions\n );\n const clickResolution = resolveWorkbenchDockEntryClick({\n entry,\n instanceMode,\n matchedNodes: resolvedEntry.matchedNodes\n });\n const hasHoverPanel = dockEntryHasHoverPanel(entry);\n const labelTooltipTarget = hasHoverPanel\n ? null\n : dockLabelTooltipTarget(`entry:${entry.id}`, entry.label);\n const dockButton = (\n <button\n aria-expanded={currentPopup ? true : undefined}\n aria-haspopup={\n clickResolution.kind === \"open-popup\"\n ? \"dialog\"\n : undefined\n }\n aria-label={i18n.t(\"launch\", { title: entry.label })}\n aria-disabled={\n clickResolution.kind === \"blocked\" ? true : undefined\n }\n className=\"desktop-dock__btn\"\n data-interactive={\n clickResolution.kind === \"blocked\" ? \"false\" : \"true\"\n }\n type=\"button\"\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n if (clickResolution.kind === \"blocked\") {\n return;\n }\n if (isDockEntryClickThrottled(anchorKey)) {\n return;\n }\n beginDockIconInteraction(anchorKey);\n }}\n onClick={(event) => {\n if (clickResolution.kind === \"blocked\") {\n return;\n }\n if (isDockEntryClickThrottled(anchorKey)) {\n return;\n }\n claimDockEntryClick(anchorKey);\n logWorkbenchDockDebug(\"dock.click\", debugDiagnostics, {\n anchorKey,\n clickResolution,\n dockDiagnostics: entry.diagnostics ?? null,\n dockNodeState: resolvedEntry.dockNodeState,\n entryId: entry.id,\n entryLaunchBehavior: entry.launchBehavior ?? \"enabled\",\n entryOrder: entry.order ?? null,\n entryState: entry.state ?? { kind: \"enabled\" },\n entryVisibility: entry.visibility ?? \"always\",\n hoverActions:\n entry.hoverActions?.map((action) => ({\n disabled: action.disabled === true,\n id: action.id,\n pending: Boolean(action.pendingLabel)\n })) ?? [],\n instanceMode: instanceMode ?? null,\n matchedNodeCount: resolvedEntry.matchedNodes.length,\n matchedNodeIds: resolvedEntry.matchedNodes.map(\n (node) => node.id\n ),\n typeId: entry.typeId,\n workspaceId\n });\n switch (clickResolution.kind) {\n case \"focus-node\":\n closePopup();\n void (async () => {\n try {\n await onDockEntryClick?.({\n entryId: entry.id,\n host,\n nodeId: clickResolution.nodeId\n });\n } catch {\n // Keep dock click failures contained.\n }\n })();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n clickResolution.nodeId,\n () => {\n host.focusNode(clickResolution.nodeId);\n }\n );\n return;\n case \"open-popup\": {\n const rect =\n event.currentTarget.getBoundingClientRect();\n logWorkbenchDockDebug(\n \"dock.popup.toggle\",\n debugDiagnostics,\n {\n anchorKey,\n entryId: entry.id,\n matchedNodeCount:\n resolvedEntry.matchedNodes.length,\n nextOpen: currentPopup === null,\n typeId: entry.typeId,\n workspaceId\n }\n );\n setActivePopup((current) =>\n current?.entryId === entry.id\n ? null\n : {\n anchorRect: {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n kind: \"preview\",\n entryId: entry.id\n }\n );\n return;\n }\n case \"action\":\n closePopup();\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId: clickResolution.actionId,\n entryId: entry.id,\n host\n });\n } catch {\n // Keep dock action failures contained.\n }\n })();\n return;\n case \"launch\":\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n entry.id,\n () =>\n host.launchNode({\n dockEntryId: entry.id,\n payload: entry.launchPayload,\n reason: \"dock\",\n typeId: entry.typeId\n })\n );\n return;\n }\n }}\n onContextMenu={(event) => {\n if (\n clickResolution.kind === \"blocked\" ||\n !dockEntryHasContextMenu(entry, resolvedEntry)\n ) {\n return;\n }\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n logWorkbenchDockDebug(\n \"dock.popup.context_menu\",\n debugDiagnostics,\n {\n anchorKey,\n entryId: entry.id,\n matchedNodeCount: resolvedEntry.matchedNodes.length,\n typeId: entry.typeId,\n workspaceId\n }\n );\n setActivePopup({\n anchorRect: {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n kind: \"context-menu\",\n entryId: entry.id\n });\n }}\n >\n <span\n className=\"desktop-dock__icon-shell\"\n data-desktop-dock-icon-shell=\"true\"\n data-entry-state={entry.state?.kind ?? \"enabled\"}\n aria-hidden\n >\n <span className=\"desktop-dock__icon-content\">\n {entry.icon}\n </span>\n {renderDockBadge(\n entry,\n resolvedEntry.matchedNodes.length\n )}\n </span>\n </button>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(anchorKey)}\n className=\"desktop-dock__slot\"\n data-attention-active={\n activeAttentionEntryIds.has(entry.id) ? \"true\" : undefined\n }\n data-desktop-dock-anchor-key={anchorKey}\n data-desktop-dock-slot=\"true\"\n data-entry-state={entry.state?.kind ?? \"enabled\"}\n data-dock-hover-panel-entry-id={\n hasHoverPanel ? entry.id : undefined\n }\n data-dock-label-tooltip-key={labelTooltipTarget?.key}\n data-dock-label-tooltip-label={labelTooltipTarget?.label}\n data-icon-size={entry.iconSize ?? \"default\"}\n data-node-state={resolvedEntry.dockNodeState}\n data-popup-active={currentPopup ? \"true\" : undefined}\n data-presence={dockItem.presence}\n data-section-id={entry.sectionId}\n data-wallpaper-tone={wallpaperTones.get(anchorKey)}\n onBlur={(event) => {\n if (\n hasHoverPanel &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeHoverPanelImmediate(entry.id);\n }\n if (\n labelTooltipTarget &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n if (hasHoverPanel) {\n showHoverPanel(\n entry.id,\n anchorKey,\n event.currentTarget\n );\n return;\n }\n if (labelTooltipTarget) {\n showLabelTooltip(\n labelTooltipTarget,\n anchorKey,\n event.currentTarget\n );\n }\n }}\n onPointerEnter={() => {\n if (hasHoverPanel) {\n scheduleHoverPanelAfterRest(entry.id, anchorKey);\n return;\n }\n if (labelTooltipTarget) {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n anchorKey\n );\n }\n }}\n onPointerLeave={(event) => {\n if (!hasHoverPanel) {\n if (labelTooltipTarget) {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }\n return;\n }\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n hoverPanelRef.current?.contains(relatedTarget)\n ) {\n return;\n }\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleHoverPanelAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n return;\n }\n if (\n hoverPanelRestTargetRef.current?.anchorKey === anchorKey\n ) {\n hoverPanelRestTargetRef.current = null;\n }\n clearHoverPanelOpenTimer();\n closeHoverPanelImmediate(entry.id);\n handleDockPointerLeave();\n }}\n >\n {dockButton}\n </span>\n );\n }\n\n const slot = dockItem.item.slot;\n if (slot.kind === \"stack\") {\n const stackPopupActive =\n activeMinimizedStackPopup !== null ? true : undefined;\n const stackLabel = i18n.t(\"minimizedWindows\");\n const labelTooltipTarget = dockLabelTooltipTarget(\n `minimized-stack:${slot.anchorKey}`,\n stackLabel\n );\n const stackButton = (\n <span\n aria-expanded={stackPopupActive}\n aria-haspopup=\"dialog\"\n aria-label={stackLabel}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive=\"true\"\n role=\"button\"\n tabIndex={0}\n onKeyDown={activateDockButtonFromKeyboard}\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n beginDockMinimizedInteraction();\n }}\n onClick={(event) => {\n setActivePopup(null);\n const rect = event.currentTarget.getBoundingClientRect();\n const dockRect =\n dockMeasureRef.current?.getBoundingClientRect();\n setActiveMinimizedStackPopup((current) =>\n current\n ? null\n : {\n dockRight: Math.max(\n rect.right,\n dockRect?.right ?? rect.right\n ),\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n }\n );\n }}\n >\n <span\n className=\"desktop-dock__minimized-stack-icon\"\n data-desktop-dock-icon-shell=\"true\"\n data-stack-folded={\n slot.nodes.length > 1 ? \"true\" : undefined\n }\n aria-hidden\n >\n {Array.from(\n {\n length:\n slot.nodes.length > 1\n ? 3\n : Math.min(slot.nodes.length, 1)\n },\n (_, index) => {\n const node = slot.nodes[index];\n if (index === 0 && node) {\n return (\n <WorkbenchHostDockMinimizedNodePreview\n key={minimizedDockPreviewFreezeKey(node)}\n capturePreview={captureMinimizedNodePreview}\n className={`desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index}`}\n dockPreviewCache={dockPreviewCache}\n node={node}\n providePreview={provideMinimizedNodePreviewForNode(\n node\n )}\n workspaceId={workspaceId}\n />\n );\n }\n return (\n <span\n key={`${slot.anchorKey}-stack-back-${index}`}\n aria-hidden=\"true\"\n className={`desktop-dock__minimized-preview desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index} desktop-dock__minimized-stack-layer-back`}\n />\n );\n }\n )}\n <span className=\"desktop-dock__count-badge\">\n {slot.nodes.length}\n </span>\n </span>\n </span>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(slot.anchorKey)}\n className=\"desktop-dock__slot desktop-dock__slot--minimized\"\n data-desktop-dock-anchor-key={slot.anchorKey}\n data-desktop-dock-slot=\"true\"\n data-dock-label-tooltip-key={labelTooltipTarget.key}\n data-dock-label-tooltip-label={labelTooltipTarget.label}\n data-node-state=\"minimized\"\n data-popup-active={stackPopupActive}\n data-presence={dockItem.presence}\n data-section-id=\"minimized\"\n data-stack-dispatching={\n stackDispatching ? \"true\" : undefined\n }\n data-wallpaper-tone={wallpaperTones.get(slot.anchorKey)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n showLabelTooltip(\n labelTooltipTarget,\n slot.anchorKey,\n event.currentTarget\n );\n }}\n onPointerEnter={() => {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n slot.anchorKey\n );\n }}\n onPointerLeave={(event) => {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }}\n >\n {stackButton}\n </span>\n );\n }\n\n const node = slot.node;\n const isPendingMinimizedNode =\n context.genie.isPendingMinimizedDockNode(node.id);\n const labelTooltipTarget = dockLabelTooltipTarget(\n `minimized-node:${node.id}`,\n node.title\n );\n const dockButton = (\n <span\n aria-label={i18n.t(\"launch\", { title: node.title })}\n aria-disabled={isPendingMinimizedNode ? true : undefined}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive={isPendingMinimizedNode ? \"false\" : \"true\"}\n role=\"button\"\n tabIndex={isPendingMinimizedNode ? -1 : 0}\n onKeyDown={(event) =>\n activateDockButtonFromKeyboard(\n event,\n isPendingMinimizedNode\n )\n }\n onPointerDown={(event) => {\n if (event.button !== 0 || isPendingMinimizedNode) {\n return;\n }\n const restoreIntent =\n resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId: node.id,\n slots: minimizedDockSlots,\n source: {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\"\n }\n });\n if (restoreIntent?.kind !== \"node-slot\") {\n clearCollapsingMinimizedLaunch(slot.anchorKey);\n return;\n }\n beginDockMinimizedInteraction();\n }}\n onClick={() => {\n if (isPendingMinimizedNode) {\n return;\n }\n const restoreIntent =\n resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId: node.id,\n slots: minimizedDockSlots,\n source: {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\"\n }\n });\n if (restoreIntent?.kind !== \"node-slot\") {\n clearCollapsingMinimizedLaunch(slot.anchorKey);\n return;\n }\n closePopup();\n runDockMinimizedLaunchAfterCollapse(\n restoreIntent,\n (intent) => {\n context.genie.launchNodeFromAnchor(\n intent.anchorKey,\n intent.nodeId,\n () => {\n host.focusNode(intent.nodeId);\n }\n );\n }\n );\n }}\n >\n <WorkbenchHostDockMinimizedNodePreview\n key={minimizedDockPreviewFreezeKey(node)}\n capturePreview={\n isPendingMinimizedNode\n ? undefined\n : captureMinimizedNodePreview\n }\n deferPreview={isPendingMinimizedNode}\n dockPreviewCache={\n isPendingMinimizedNode ? undefined : dockPreviewCache\n }\n node={node}\n providePreview={\n isPendingMinimizedNode\n ? undefined\n : provideMinimizedNodePreviewForNode(node)\n }\n workspaceId={workspaceId}\n />\n </span>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(slot.anchorKey)}\n className=\"desktop-dock__slot desktop-dock__slot--minimized\"\n data-collapsing={\n collapsingMinimizedLaunchAnchorKeys.has(slot.anchorKey)\n ? \"true\"\n : undefined\n }\n data-desktop-dock-anchor-key={slot.anchorKey}\n data-desktop-dock-slot=\"true\"\n data-dock-label-tooltip-key={labelTooltipTarget.key}\n data-dock-label-tooltip-label={labelTooltipTarget.label}\n data-node-state=\"minimized\"\n data-pending-minimize={\n isPendingMinimizedNode ? \"true\" : undefined\n }\n data-presence={dockItem.presence}\n data-promoted-from-stack={\n promotedNodeId === node.id ? \"true\" : undefined\n }\n data-section-id=\"minimized\"\n data-wallpaper-tone={wallpaperTones.get(slot.anchorKey)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n showLabelTooltip(\n labelTooltipTarget,\n slot.anchorKey,\n event.currentTarget\n );\n }}\n onPointerEnter={() => {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n slot.anchorKey\n );\n }}\n onPointerLeave={(event) => {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }}\n >\n {dockButton}\n </span>\n );\n })}\n </div>\n <button\n aria-label={i18n.t(\n dockPlacement === \"left\" ? \"scrollDockDown\" : \"scrollDockRight\"\n )}\n className=\"desktop-dock__scroll-button desktop-dock__scroll-button--forward\"\n data-scroll-button=\"forward\"\n disabled={!dockScrollState.canScrollForward}\n onClick={() => scrollDockItems(\"forward\")}\n type=\"button\"\n >\n {dockPlacement === \"left\" ? (\n <ChevronDownIcon size={16} />\n ) : (\n <ArrowRightIcon size={16} />\n )}\n </button>\n {activeHoverPanel ? (\n <WorkbenchHostDockHoverPanel\n entry={\n resolvedEntries.find(\n (entry) => entry.entry.id === activeHoverPanel.entryId\n )?.entry ?? null\n }\n host={host}\n onDockEntryAction={onDockEntryAction}\n pendingActionKeys={pendingActionKeys}\n placement={dockPlacement}\n hoverPanelRef={hoverPanelRef}\n setPendingActionKeys={setPendingActionKeys}\n state={activeHoverPanel}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeHoverPanelImmediate(activeHoverPanel.entryId);\n }\n }}\n onFocus={clearHoverPanelCloseTimer}\n onPointerEnter={clearHoverPanelCloseTimer}\n onPointerLeave={(event) => {\n const relatedTarget = event.relatedTarget;\n const anchorSlot = slotRefs.current.get(\n activeHoverPanel.anchorKey\n );\n if (\n relatedTarget instanceof Node &&\n anchorSlot?.contains(relatedTarget)\n ) {\n return;\n }\n scheduleHoverPanelClose(activeHoverPanel.entryId);\n handleDockPointerLeave();\n }}\n />\n ) : null}\n {activeLabelTooltip ? (\n <WorkbenchHostDockLabelTooltip\n placement={dockPlacement}\n state={activeLabelTooltip}\n />\n ) : null}\n </div>\n </div>\n {popupEntry && activePopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activePopup.anchorRect}\n placement={dockPlacement}\n canEnterFullscreen={fullscreenNodeFromDockContextMenu !== null}\n canShowAllWindows={canShowAllWindowsFromDockContextMenu}\n debugDiagnostics={debugDiagnostics}\n dockRetention={\n popupEntry.entry.dockRetention\n ? {\n checked: popupEntry.entry.dockRetention.retained,\n disabled:\n popupEntry.entry.dockRetention.disabled === true ||\n pendingActionKeys.has(\n dockActionKey(\n popupEntry.entry.id,\n popupEntry.entry.dockRetention.actionId\n )\n ),\n label: i18n.t(\n popupEntry.entry.dockRetention.retained\n ? \"dockContextMenu.removeFromDock\"\n : \"dockContextMenu.keepInDock\"\n ),\n pendingLabel: pendingActionKeys.has(\n dockActionKey(\n popupEntry.entry.id,\n popupEntry.entry.dockRetention.actionId\n )\n )\n ? popupEntry.entry.dockRetention.pendingLabel\n : undefined\n }\n : null\n }\n capturePreview={\n popupEntry.entry.capturePopupItemPreview\n ? async (item) => {\n const previewImageUrl = await Promise.resolve(\n popupEntry.entry.capturePopupItemPreview?.(item) ?? null\n ).catch(() => null);\n return previewImageUrl\n ? {\n kind: \"image\",\n revision: item.previewRevision ?? undefined,\n src: previewImageUrl\n }\n : null;\n }\n : undefined\n }\n dockPreviewCache={dockPreviewCache}\n items={popupEntry.matchedNodes\n .map((node) => {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n const item = {\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: minimizedNodeIDs.has(node.id),\n node\n };\n const descriptor =\n popupEntry.entry.resolvePopupItem?.(item) ?? {};\n const descriptorPreviewImageUrl =\n descriptor.previewImageUrl ?? null;\n const descriptorPreview =\n descriptor.preview ??\n (descriptorPreviewImageUrl\n ? ({\n kind: \"image\",\n revision: descriptor.revision ?? null,\n src: descriptorPreviewImageUrl\n } as const)\n : (popupEntry.entry.providePopupItemPreview?.(item) ?? null));\n return {\n ...item,\n preview: descriptorPreview,\n previewRevision:\n previewRevision(descriptorPreview) ??\n descriptor.revision ??\n null,\n subtitle:\n descriptor.subtitle === undefined\n ? (node.data.instanceKey ?? node.data.instanceId)\n : descriptor.subtitle,\n title:\n descriptor.title === undefined\n ? node.title\n : descriptor.title?.trim() || null\n };\n })\n .sort((left, right) => {\n if (left.isFocused !== right.isFocused) {\n return left.isFocused ? -1 : 1;\n }\n return left.node.id.localeCompare(right.node.id);\n })}\n label={popupEntry.entry.label}\n labelMode={popupEntry.entry.popupCardLabelMode}\n newWindowLabel={i18n.t(\"newWindow\")}\n openLabel={i18n.t(\"dockContextMenu.open\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n fullscreenLabel={i18n.t(\"dockContextMenu.fullscreen\")}\n hideLabel={i18n.t(\"dockContextMenu.hide\")}\n onClose={() => {\n logWorkbenchDockDebug(\n \"dock.popup.close_requested\",\n debugDiagnostics,\n {\n entryId: popupEntry.entry.id,\n itemCount: popupEntry.matchedNodes.length,\n workspaceId\n }\n );\n closePopup();\n }}\n onCloseNode={(nodeId) => {\n host.requestNodeClose(nodeId);\n const hasRemainingItems = popupEntry.matchedNodes.some(\n (node) => node.id !== nodeId\n );\n if (!hasRemainingItems) {\n closePopup();\n }\n }}\n onCreateNew={() => {\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n popupEntry.entry.id,\n () =>\n host.launchNode({\n dockEntryId: popupEntry.entry.id,\n payload: popupEntry.entry.launchPayload,\n reason: \"dock\",\n typeId: popupEntry.entry.typeId\n })\n );\n }}\n onEnterFullscreen={() => {\n if (!fullscreenNodeFromDockContextMenu) {\n return;\n }\n context.controller.commands.enterFullscreen(\n fullscreenNodeFromDockContextMenu.id\n );\n closePopup();\n }}\n onHide={() => {\n for (const node of popupEntry.matchedNodes) {\n if (!minimizedNodeIDs.has(node.id)) {\n host.minimizeNode(node.id);\n }\n }\n closePopup();\n }}\n onRunDockRetentionAction={\n popupEntry.entry.dockRetention\n ? () => {\n const dockRetention = popupEntry.entry.dockRetention;\n if (!dockRetention || dockRetention.disabled === true) {\n return;\n }\n runDockEntryAction(\n popupEntry.entry.id,\n dockRetention.actionId\n );\n closePopup();\n }\n : undefined\n }\n onSelectNode={(nodeId) => {\n closePopup();\n void (async () => {\n try {\n await onDockEntryClick?.({\n entryId: popupEntry.entry.id,\n host,\n nodeId\n });\n } catch {\n // Keep dock click failures contained.\n }\n })();\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n nodeId,\n () => {\n host.focusNode(nodeId);\n }\n );\n }}\n onShowAllWindows={() => {\n closePopup();\n for (const node of popupEntry.matchedNodes) {\n if (minimizedNodeIDs.has(node.id)) {\n context.controller.commands.restoreNode(node.id);\n }\n }\n window.requestAnimationFrame(() => {\n onMissionControlRequestOpen?.(\"activate\", {\n nodeIds: openDockContextMenuNodeIds,\n trigger: \"dock-context-menu\"\n });\n });\n }}\n onQuit={() => {\n for (const node of popupEntry.matchedNodes) {\n host.requestNodeClose(node.id);\n }\n closePopup();\n }}\n quitLabel={i18n.t(\"dockContextMenu.quit\")}\n showCreateNew={canCreateNewWindow(\n popupEntry.entry,\n dockContextMenuInstanceMode\n )}\n showOpen={canOpenFromDockContextMenu}\n showAllWindowsLabel={i18n.t(\"dockContextMenu.showAllWindows\")}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n variant={\n activePopup.kind === \"context-menu\" ? \"context-menu\" : \"default\"\n }\n />\n ) : null}\n {activeMinimizedStackSlot && activeMinimizedStackPopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activeMinimizedStackPopup}\n placement={dockPlacement}\n debugDiagnostics={debugDiagnostics}\n capturePreview={async (item) => {\n const src = await captureMinimizedNodePreview(item.node);\n return src ? { kind: \"image\", src } : null;\n }}\n dockPreviewCache={dockPreviewCache}\n items={activeMinimizedStackSlot.nodes.map((node) => {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return {\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: true,\n node,\n preview:\n minimizedDock?.kind === \"component\"\n ? (provideMinimizedNodePreview(node) ?? null)\n : minimizedDock?.kind === \"snapshot\" &&\n minimizedDock.capturePreview\n ? null\n : (() => {\n const previewImageUrl =\n readCachedWorkbenchNodePreviewImage(node.id);\n return previewImageUrl\n ? ({ kind: \"image\", src: previewImageUrl } as const)\n : null;\n })(),\n previewRevision: null,\n subtitle: node.data.instanceKey ?? node.data.instanceId,\n title: node.title\n };\n })}\n label={i18n.t(\"minimizedWindows\")}\n newWindowLabel={i18n.t(\"newWindow\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n onClose={() => {\n logWorkbenchDockDebug(\n \"dock.popup.close_requested\",\n debugDiagnostics,\n {\n entryId: \"minimized-stack\",\n itemCount: activeMinimizedStackSlot.nodes.length,\n workspaceId\n }\n );\n closePopup();\n }}\n onCloseNode={(nodeId) => {\n host.requestNodeClose(nodeId);\n const hasRemainingItems = activeMinimizedStackSlot.nodes.some(\n (node) => node.id !== nodeId\n );\n if (!hasRemainingItems) {\n closePopup();\n }\n }}\n onCreateNew={() => undefined}\n onSelectNode={(nodeId) => {\n const restoreIntent = resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId,\n slots: minimizedDockSlots,\n source: {\n kind: \"stack-popup-card\",\n stackAnchorKey: activeMinimizedStackSlot.anchorKey\n }\n });\n if (restoreIntent?.kind !== \"stack-popup-card\") {\n return;\n }\n closePopup();\n runDockMinimizedStackLaunch(restoreIntent, (intent) => {\n context.genie.launchNodeFromAnchor(\n intent.anchorKey,\n intent.nodeId,\n () => {\n host.focusNode(intent.nodeId);\n }\n );\n });\n }}\n showCreateNew={false}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n variant=\"minimized-stack\"\n />\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchHostDockMinimizedNodePreview({\n capturePreview,\n className,\n deferPreview = false,\n dockPreviewCache,\n node,\n providePreview,\n workspaceId\n}: {\n capturePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => Promise<string | null> | string | null;\n className?: string;\n deferPreview?: boolean;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n node: WorkbenchMinimizedDockNode;\n providePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => WorkbenchDockPreviewContent | null;\n workspaceId: string;\n}) {\n const [componentPreview, setComponentPreview] = useState<\n WorkbenchDockPreviewContent | null | undefined\n >(undefined);\n const [previewImageUrl, setPreviewImageUrl] = useState<string | null>(() =>\n deferPreview || providePreview\n ? null\n : readCachedWorkbenchNodePreviewImage(node.id)\n );\n\n useEffect(() => {\n if (deferPreview || !providePreview || componentPreview !== undefined) {\n return undefined;\n }\n\n let cancelled = false;\n let frameId: number | null = null;\n let idleId: number | null = null;\n let timeoutId: ReturnType<typeof globalThis.setTimeout> | null = null;\n const setDeferredComponentPreview = () => {\n if (cancelled) {\n return;\n }\n setComponentPreview(providePreview(node) ?? null);\n };\n const scheduler = globalThis as typeof globalThis & {\n cancelIdleCallback?: (id: number) => void;\n cancelAnimationFrame?: (id: number) => void;\n requestIdleCallback?: (\n callback: () => void,\n options?: { timeout?: number }\n ) => number;\n requestAnimationFrame?: (callback: () => void) => number;\n };\n\n if (typeof scheduler.requestIdleCallback === \"function\") {\n idleId = scheduler.requestIdleCallback(setDeferredComponentPreview, {\n timeout: 250\n });\n } else if (typeof scheduler.requestAnimationFrame === \"function\") {\n frameId = scheduler.requestAnimationFrame(() => {\n frameId = null;\n timeoutId = globalThis.setTimeout(setDeferredComponentPreview, 0);\n });\n } else {\n timeoutId = globalThis.setTimeout(setDeferredComponentPreview, 0);\n }\n\n return () => {\n cancelled = true;\n if (\n idleId !== null &&\n typeof scheduler.cancelIdleCallback === \"function\"\n ) {\n scheduler.cancelIdleCallback(idleId);\n }\n if (\n frameId !== null &&\n typeof scheduler.cancelAnimationFrame === \"function\"\n ) {\n scheduler.cancelAnimationFrame(frameId);\n }\n if (timeoutId !== null) {\n globalThis.clearTimeout(timeoutId);\n }\n };\n }, [\n componentPreview,\n deferPreview,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n providePreview\n ]);\n\n useEffect(() => {\n if (deferPreview || providePreview) {\n return undefined;\n }\n\n let cancelled = false;\n const cachedPreviewImageUrl = readCachedWorkbenchNodePreviewImage(node.id);\n setPreviewImageUrl(cachedPreviewImageUrl);\n const cacheKey = resolveDockPreviewCacheKey(workspaceId, node);\n if (!cachedPreviewImageUrl && dockPreviewCache) {\n void dockPreviewCache\n .read(cacheKey)\n .catch(() => null)\n .then((persistedPreview) => {\n if (cancelled || !persistedPreview) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, persistedPreview);\n setPreviewImageUrl(persistedPreview);\n });\n }\n if (capturePreview) {\n void Promise.resolve(capturePreview(node))\n .catch(() => null)\n .then((nextPreview) => {\n if (cancelled || !nextPreview) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, nextPreview);\n dockPreviewCache?.write({\n key: cacheKey,\n previewImageUrl: nextPreview\n });\n setPreviewImageUrl(nextPreview);\n });\n }\n if (cachedPreviewImageUrl || node.isMinimized || capturePreview) {\n return () => {\n cancelled = true;\n };\n }\n void captureWorkbenchNodePreviewImage(node.id).then((nextPreview) => {\n if (!cancelled) {\n setPreviewImageUrl(nextPreview);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [\n capturePreview,\n deferPreview,\n dockPreviewCache,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n providePreview,\n workspaceId\n ]);\n\n if (deferPreview) {\n return renderMinimizedDockPreviewPlaceholder(className);\n }\n\n if (componentPreview) {\n return renderMinimizedDockPreviewContent(componentPreview, className);\n }\n\n if (previewImageUrl) {\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--snapshot\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <img\n alt=\"\"\n className=\"desktop-dock__minimized-preview-image\"\n draggable={false}\n src={previewImageUrl}\n />\n </span>\n );\n }\n\n return renderMinimizedDockPreviewPlaceholder(className);\n}\n\nfunction renderMinimizedDockPreviewPlaceholder(className?: string) {\n return (\n <span\n className={[\"desktop-dock__minimized-preview\", className]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <span className=\"desktop-dock__minimized-preview-line\" />\n <span className=\"desktop-dock__minimized-preview-line desktop-dock__minimized-preview-line--short\" />\n <span className=\"desktop-dock__minimized-preview-line desktop-dock__minimized-preview-line--accent\" />\n </span>\n );\n}\n\nexport function renderMinimizedDockPreviewContent(\n preview: WorkbenchDockPreviewContent,\n className?: string\n) {\n if (preview.kind === \"image\") {\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--snapshot\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <img\n alt=\"\"\n className=\"desktop-dock__minimized-preview-image\"\n draggable={false}\n src={preview.src}\n />\n </span>\n );\n }\n\n return (\n <WorkbenchHostDockFrozenComponentPreview\n className={className}\n preview={preview}\n />\n );\n}\n\nfunction WorkbenchHostDockFrozenComponentPreview({\n className,\n preview\n}: {\n className?: string;\n preview: Extract<WorkbenchDockPreviewContent, { kind: \"component\" }>;\n}) {\n const sourceRef = useRef<HTMLSpanElement | null>(null);\n const [frozenMarkup, setFrozenMarkup] = useState<string | null>(null);\n\n useLayoutEffect(() => {\n if (frozenMarkup !== null) {\n return;\n }\n setFrozenMarkup(sourceRef.current?.innerHTML ?? \"\");\n }, [frozenMarkup]);\n\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--component\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n {frozenMarkup === null ? (\n <span\n ref={sourceRef}\n className=\"desktop-dock__minimized-preview-freeze-source\"\n >\n {preview.element}\n </span>\n ) : (\n <span\n className=\"desktop-dock__minimized-preview-frozen-content\"\n dangerouslySetInnerHTML={{ __html: frozenMarkup }}\n />\n )}\n </span>\n );\n}\n\nfunction minimizedDockPreviewFreezeKey(\n node: WorkbenchMinimizedDockNode\n): string {\n return `${node.id}:${node.minimizedAtUnixMs ?? \"pending\"}`;\n}\n\nfunction dockEntryHasHoverPanel(entry: WorkbenchHostDockEntry): boolean {\n return (\n Boolean(entry.state?.reason?.trim()) ||\n (entry.hoverActions?.length ?? 0) > 0\n );\n}\n\nfunction dockEntryHasContextMenu(\n entry: WorkbenchHostDockEntry,\n resolvedEntry: ResolvedWorkbenchHostDockEntry\n): boolean {\n if (resolvedEntry.matchedNodes.length > 0 || entry.dockRetention) {\n return true;\n }\n return entry.clickActionId === undefined;\n}\n\nfunction resolveDockContextMenuFullscreenNode({\n focusedNodeId,\n minimizedNodeIDs,\n nodeDefinitions,\n nodes\n}: {\n focusedNodeId: string | null;\n minimizedNodeIDs: ReadonlySet<string>;\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}) {\n const candidates = nodes.filter((node) => {\n if (node.displayMode === \"fullscreen\" || minimizedNodeIDs.has(node.id)) {\n return false;\n }\n return (\n nodeDefinitions.get(node.data.typeId)?.window?.fullscreenable !== false\n );\n });\n return (\n candidates.find((node) => node.id === focusedNodeId) ??\n candidates[0] ??\n null\n );\n}\n\nfunction dockLabelTooltipTarget(\n key: string,\n label: string\n): WorkbenchHostDockLabelTooltipTarget {\n return { key, label: label.trim() };\n}\n\nfunction resolveDockLabelTooltipAnchorRect({\n dockPlacement,\n slotElement\n}: {\n dockPlacement: WorkbenchHostProps[\"dockPlacement\"];\n slotElement: HTMLElement;\n}): {\n height: number;\n left: number;\n top: number;\n width: number;\n} {\n const slotRect = slotElement.getBoundingClientRect();\n if (dockPlacement === \"left\") {\n return {\n height: DOCK_ICON_BASE_SIZE,\n left: slotRect.left,\n top: slotRect.top + (slotRect.height - DOCK_ICON_BASE_SIZE) / 2,\n width: DOCK_ICON_BASE_SIZE\n };\n }\n\n return {\n height: DOCK_ICON_BASE_SIZE,\n left: slotRect.left + (slotRect.width - DOCK_ICON_BASE_SIZE) / 2,\n top: slotRect.bottom - DOCK_ICON_BASE_SIZE,\n width: DOCK_ICON_BASE_SIZE\n };\n}\n\nfunction renderDockBadge(\n entry: WorkbenchHostDockEntry,\n matchedNodeCount: number\n) {\n const badge =\n entry.badge ??\n (matchedNodeCount > 1\n ? ({\n kind: \"count\",\n value: matchedNodeCount\n } as const)\n : null);\n if (!badge) {\n return null;\n }\n if (badge.kind === \"count\") {\n return <span className=\"desktop-dock__count-badge\">{badge.value}</span>;\n }\n if (badge.kind === \"custom\") {\n return <span className=\"desktop-dock__custom-badge\">{badge.content}</span>;\n }\n return (\n <span className=\"desktop-dock__status-badge\" data-status={badge.status} />\n );\n}\n\nfunction WorkbenchHostDockLabelTooltip({\n placement,\n state\n}: {\n placement: WorkbenchHostProps[\"dockPlacement\"];\n state: WorkbenchHostDockLabelTooltipState;\n}) {\n return (\n <div\n className=\"desktop-dock__label-tooltip\"\n data-dock-placement={placement}\n role=\"tooltip\"\n style={\n {\n \"--desktop-dock-label-tooltip-anchor-height\": `${state.anchorRect.height}px`,\n \"--desktop-dock-label-tooltip-anchor-left\": `${state.anchorRect.left}px`,\n \"--desktop-dock-label-tooltip-anchor-top\": `${state.anchorRect.top}px`,\n \"--desktop-dock-label-tooltip-anchor-width\": `${state.anchorRect.width}px`\n } as WorkbenchHostDockLabelTooltipStyle\n }\n >\n {state.label}\n </div>\n );\n}\n\nfunction WorkbenchHostDockHoverPanel({\n entry,\n host,\n hoverPanelRef,\n onBlur,\n onDockEntryAction,\n onFocus,\n onPointerEnter,\n onPointerLeave,\n pendingActionKeys,\n placement,\n setPendingActionKeys,\n state\n}: {\n entry: WorkbenchHostDockEntry | null;\n host: WorkbenchHostHandle;\n hoverPanelRef: RefObject<HTMLDivElement | null>;\n onDockEntryAction?: (input: {\n actionId: string;\n entryId: string;\n host: WorkbenchHostHandle;\n }) => Promise<void> | void;\n onBlur?: (event: ReactFocusEvent<HTMLDivElement>) => void;\n onFocus?: () => void;\n onPointerEnter?: () => void;\n onPointerLeave?: (event: ReactPointerEvent<HTMLDivElement>) => void;\n pendingActionKeys: Set<string>;\n placement: WorkbenchHostProps[\"dockPlacement\"];\n setPendingActionKeys: Dispatch<SetStateAction<Set<string>>>;\n state: WorkbenchHostDockHoverPanelState;\n}) {\n if (!entry) {\n return null;\n }\n\n return (\n <div\n ref={hoverPanelRef}\n className=\"desktop-dock__hover-panel\"\n data-dock-placement={placement}\n role=\"group\"\n aria-label={entry.label}\n onBlur={onBlur}\n onFocus={onFocus}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n style={\n {\n \"--desktop-dock-hover-panel-anchor-height\": `${state.anchorRect.height}px`,\n \"--desktop-dock-hover-panel-anchor-left\": `${state.anchorRect.left}px`,\n \"--desktop-dock-hover-panel-anchor-top\": `${state.anchorRect.top}px`,\n \"--desktop-dock-hover-panel-anchor-width\": `${state.anchorRect.width}px`\n } as WorkbenchHostDockHoverPanelStyle\n }\n >\n <div className=\"desktop-dock__hover-panel-title\">{entry.label}</div>\n {entry.state?.reason ? (\n <div className=\"desktop-dock__hover-panel-description\">\n {stripDockDescriptionTerminalPunctuation(entry.state.reason)}\n </div>\n ) : null}\n {entry.hoverActions?.length ? (\n <div className=\"desktop-dock__hover-actions\">\n {entry.hoverActions.map((action) => {\n const actionKey = dockActionKey(entry.id, action.id);\n const isLocallyPending = pendingActionKeys.has(actionKey);\n const isPending =\n isLocallyPending ||\n (action.disabled === true && action.pendingLabel !== undefined);\n return (\n <Button\n key={action.id}\n aria-busy={isPending ? true : undefined}\n className=\"desktop-dock__hover-action\"\n disabled={action.disabled || isLocallyPending}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (\n action.disabled === true ||\n pendingActionKeys.has(actionKey)\n ) {\n return;\n }\n setPendingActionKeys((current) => {\n const next = new Set(current);\n next.add(actionKey);\n return next;\n });\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId: action.id,\n entryId: entry.id,\n host\n });\n } catch {\n // Keep dock action failures contained.\n } finally {\n setPendingActionKeys((current) => {\n if (!current.has(actionKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(actionKey);\n return next;\n });\n }\n })();\n }}\n >\n {isPending\n ? (action.pendingLabel ?? action.label)\n : action.label}\n </Button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction resolveDockEntryInstanceMode(\n entry: WorkbenchHostDockEntry,\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>\n): WorkbenchHostNodeInstanceStrategy[\"mode\"] | undefined {\n return (\n entry.instanceMode ?? nodeDefinitions.get(entry.typeId)?.instance?.mode\n );\n}\n\nfunction canCreateNewWindow(\n entry: WorkbenchHostDockEntry,\n instanceMode: WorkbenchHostNodeInstanceStrategy[\"mode\"] | undefined\n): boolean {\n const stateKind = entry.state?.kind ?? \"enabled\";\n return (\n instanceMode === \"multi\" &&\n (entry.launchBehavior ?? \"enabled\") === \"enabled\" &&\n stateKind !== \"disabled\" &&\n stateKind !== \"loading\" &&\n stateKind !== \"unavailable\"\n );\n}\n\nfunction anchorKeyFromPopupEntry(\n entry: ResolvedWorkbenchHostDockEntry\n): string {\n return entry.anchorKey;\n}\n\nfunction previewRevision(\n preview: WorkbenchDockPreviewContent | null | undefined\n): string | null {\n return preview?.revision ?? null;\n}\n\nfunction logWorkbenchDockDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n details: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level: \"info\",\n source: \"workbench-dock\",\n workspaceId:\n typeof details.workspaceId === \"string\" ? details.workspaceId : null\n })\n ).catch(() => undefined);\n}\n\nfunction minimizedDockSlotNodes(\n slot: WorkbenchMinimizedDockSlot\n): readonly WorkbenchMinimizedDockNode[] {\n return slot.kind === \"stack\" ? slot.nodes : [slot.node];\n}\n\nfunction resolveDockPreviewCacheKey(\n workspaceId: string,\n node: WorkbenchMinimizedDockNode\n): WorkbenchDockPreviewCacheKey {\n return {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId\n };\n}\n\nfunction dockActionKey(entryId: string, actionId: string): string {\n return `${entryId}:${actionId}`;\n}\n\nfunction createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n}: {\n minimizedDockSlots: readonly WorkbenchMinimizedDockSlot[];\n resolvedEntries: readonly ResolvedWorkbenchHostDockEntry[];\n}): WorkbenchHostDockItem[] {\n const items: WorkbenchHostDockItem[] = [];\n\n for (const resolvedEntry of resolvedEntries) {\n if (resolvedEntry.sectionBreakBefore) {\n items.push({\n key: `separator:before:${resolvedEntry.entry.id}`,\n kind: \"separator\"\n });\n }\n items.push({\n key: `entry:${resolvedEntry.entry.id}`,\n kind: \"entry\",\n resolvedEntry\n });\n if (resolvedEntry.entry.separatorAfter) {\n items.push({\n key: `separator:after:${resolvedEntry.entry.id}`,\n kind: \"separator\"\n });\n }\n }\n\n if (minimizedDockSlots.length > 0 && resolvedEntries.length > 0) {\n items.push({\n key: \"separator:minimized\",\n kind: \"separator\"\n });\n }\n\n for (const slot of minimizedDockSlots) {\n items.push({\n key: `minimized:${slot.anchorKey}`,\n kind: \"minimized\",\n slot\n });\n }\n\n return items;\n}\n\nfunction resolveMinimizedDockItemNodeId(\n item: WorkbenchHostDockItem\n): string | null {\n if (item.kind !== \"minimized\" || item.slot.kind !== \"node\") {\n return null;\n }\n return item.slot.node.id;\n}\n\nfunction resolveNextDockItemPresence(\n item: WorkbenchHostDockItem,\n initialized: boolean,\n previousPresence: WorkbenchHostDockPresence | undefined,\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean\n): WorkbenchHostDockPresence {\n if (!initialized) {\n return \"present\";\n }\n\n if (item.key === \"separator:minimized\") {\n return \"present\";\n }\n\n if (item.kind === \"minimized\") {\n const nodeId = resolveMinimizedDockItemNodeId(item);\n if (nodeId && shouldAnimateMinimizedDockEnter(nodeId)) {\n if (previousPresence === \"exiting\") {\n return \"entering\";\n }\n return previousPresence ?? \"entering\";\n }\n return \"present\";\n }\n\n if (previousPresence === \"exiting\") {\n return \"entering\";\n }\n\n return previousPresence ?? \"entering\";\n}\n\nfunction resolveDockPresenceItems(input: {\n current: readonly WorkbenchHostPresentDockItem[];\n initialized: boolean;\n nextSourceItems: readonly WorkbenchHostDockItem[];\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean;\n}): WorkbenchHostPresentDockItem[] {\n const currentByKey = new Map(input.current.map((item) => [item.key, item]));\n const currentIndexByKey = new Map(\n input.current.map((item, index) => [item.key, index])\n );\n const nextByKey = new Map(\n input.nextSourceItems.map((item) => [item.key, item])\n );\n const nextKeys = new Set(input.nextSourceItems.map((item) => item.key));\n const currentVisibleItemCount = input.current.filter(\n (item) => item.presence !== \"exiting\"\n ).length;\n const shouldRetainExitingItems =\n input.nextSourceItems.length < currentVisibleItemCount;\n const emittedKeys = new Set<string>();\n const nextItems: WorkbenchHostPresentDockItem[] = [];\n let currentIndex = 0;\n\n const emitExitingUntil = (nextCurrentIndex: number) => {\n while (currentIndex < nextCurrentIndex) {\n const currentItem = input.current[currentIndex];\n currentIndex += 1;\n if (\n shouldRetainExitingItems &&\n currentItem &&\n !nextKeys.has(currentItem.key) &&\n !emittedKeys.has(currentItem.key)\n ) {\n emittedKeys.add(currentItem.key);\n nextItems.push({\n ...currentItem,\n presence: \"exiting\"\n });\n }\n }\n };\n\n for (const item of input.nextSourceItems) {\n const previousIndex = currentIndexByKey.get(item.key);\n if (previousIndex !== undefined) {\n emitExitingUntil(previousIndex);\n currentIndex = Math.max(currentIndex, previousIndex + 1);\n }\n emittedKeys.add(item.key);\n nextItems.push({\n item,\n key: item.key,\n presence: resolveNextDockItemPresence(\n item,\n input.initialized,\n currentByKey.get(item.key)?.presence,\n input.shouldAnimateMinimizedDockEnter\n )\n });\n }\n\n for (const currentItem of input.current) {\n if (shouldRetainExitingItems && !nextKeys.has(currentItem.key)) {\n if (emittedKeys.has(currentItem.key)) {\n continue;\n }\n emittedKeys.add(currentItem.key);\n nextItems.push({\n ...currentItem,\n presence: \"exiting\"\n });\n }\n }\n\n return nextItems.filter(\n (item) => nextByKey.has(item.key) || item.presence === \"exiting\"\n );\n}\n\nfunction resolveDockPresenceSettleMs(\n items: readonly WorkbenchHostPresentDockItem[]\n): number {\n if (\n items.some(\n (item) =>\n item.item.kind === \"minimized\" &&\n (item.presence === \"entering\" || item.presence === \"exiting\")\n )\n ) {\n return minimizedDockSlotLayoutAnimationMs;\n }\n return dockPresenceAnimationMs;\n}\n\nfunction useDockPresenceItems(\n items: readonly WorkbenchHostDockItem[],\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean\n): WorkbenchHostPresentDockItem[] {\n const latestItemsByKey = useRef(new Map<string, WorkbenchHostDockItem>());\n const shouldAnimateMinimizedDockEnterRef = useRef(\n shouldAnimateMinimizedDockEnter\n );\n latestItemsByKey.current = new Map(items.map((item) => [item.key, item]));\n shouldAnimateMinimizedDockEnterRef.current = shouldAnimateMinimizedDockEnter;\n const itemKeys = items.map((item) => item.key).join(\"\\u0000\");\n const [presentItems, setPresentItems] = useState<\n WorkbenchHostPresentDockItem[]\n >(() =>\n items.map((item) => ({\n item,\n key: item.key,\n presence: \"present\" as const\n }))\n );\n const initialized = useRef(false);\n\n useEffect(() => {\n let nextSettleMs = dockPresenceAnimationMs;\n\n setPresentItems((current) => {\n const filteredItems = resolveDockPresenceItems({\n current,\n initialized: initialized.current,\n nextSourceItems: [...latestItemsByKey.current.values()],\n shouldAnimateMinimizedDockEnter:\n shouldAnimateMinimizedDockEnterRef.current\n });\n nextSettleMs = resolveDockPresenceSettleMs(filteredItems);\n return filteredItems;\n });\n initialized.current = true;\n\n const timeout = globalThis.setTimeout(() => {\n setPresentItems((current) =>\n current\n .filter((item) => item.presence !== \"exiting\")\n .map((item) =>\n item.presence === \"entering\"\n ? { ...item, presence: \"present\" as const }\n : item\n )\n );\n }, nextSettleMs);\n\n return () => globalThis.clearTimeout(timeout);\n }, [itemKeys]);\n\n const renderedPresentItems = resolveDockPresenceItems({\n current: presentItems,\n initialized: initialized.current,\n nextSourceItems: [...latestItemsByKey.current.values()],\n shouldAnimateMinimizedDockEnter\n });\n\n return renderedPresentItems.map((presentItem) => {\n const latestItem = latestItemsByKey.current.get(presentItem.key);\n return latestItem ? { ...presentItem, item: latestItem } : presentItem;\n });\n}\n\nfunction useDockWallpaperTones({\n dockItemsRef,\n elementRefs,\n itemKeys\n}: {\n dockItemsRef: RefObject<HTMLElement | null>;\n elementRefs: RefObject<Map<string, HTMLElement>>;\n itemKeys: string;\n}): ReadonlyMap<string, WorkbenchDockWallpaperTone> {\n const [tones, setTones] = useState<Map<string, WorkbenchDockWallpaperTone>>(\n () => new Map()\n );\n\n useLayoutEffect(() => {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n let canceled = false;\n let frameId: number | null = null;\n\n const updateTones = () => {\n frameId = null;\n void resolveDockWallpaperTones({\n dockItemsElement: dockItemsRef.current,\n elements: elementRefs.current\n }).then((nextTones) => {\n if (canceled) {\n return;\n }\n setTones((current) =>\n dockWallpaperToneMapsEqual(current, nextTones) ? current : nextTones\n );\n });\n };\n\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(updateTones);\n };\n\n scheduleUpdate();\n window.addEventListener(\"resize\", scheduleUpdate);\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n if (dockItemsRef.current) {\n resizeObserver?.observe(dockItemsRef.current);\n }\n const wallpaperElement = dockItemsRef.current\n ?.closest(\".workbench-surface\")\n ?.querySelector(\".workbench-surface__wallpaper\");\n if (wallpaperElement instanceof HTMLElement) {\n resizeObserver?.observe(wallpaperElement);\n }\n\n return () => {\n canceled = true;\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n };\n }, [dockItemsRef, elementRefs, itemKeys]);\n\n return tones;\n}\n\nasync function resolveDockWallpaperTones({\n dockItemsElement,\n elements\n}: {\n dockItemsElement: HTMLElement | null;\n elements: ReadonlyMap<string, HTMLElement>;\n}): Promise<Map<string, WorkbenchDockWallpaperTone>> {\n const wallpaperElement = dockItemsElement\n ?.closest(\".workbench-surface\")\n ?.querySelector(\".workbench-surface__wallpaper\");\n if (!(wallpaperElement instanceof HTMLElement)) {\n return new Map();\n }\n\n const wallpaperStyle = window.getComputedStyle(wallpaperElement);\n const wallpaperUrl = parseDockWallpaperCssUrl(wallpaperStyle.backgroundImage);\n if (!wallpaperUrl) {\n return new Map();\n }\n\n const wallpaperImage = await loadDockWallpaperImage(wallpaperUrl);\n if (!wallpaperImage) {\n return new Map();\n }\n\n const sampleCanvas = createDockWallpaperSampleCanvas(wallpaperImage);\n if (!sampleCanvas) {\n return new Map();\n }\n\n const wallpaperRect = wallpaperElement.getBoundingClientRect();\n const renderedImageRect = resolveDockWallpaperRenderedImageRect({\n containerHeight: wallpaperRect.height,\n containerWidth: wallpaperRect.width,\n imageHeight: wallpaperImage.naturalHeight,\n imageWidth: wallpaperImage.naturalWidth,\n positionX: wallpaperStyle.backgroundPositionX,\n positionY: wallpaperStyle.backgroundPositionY,\n size: wallpaperStyle.backgroundSize\n });\n const nextTones = new Map<string, WorkbenchDockWallpaperTone>();\n\n for (const [key, element] of elements) {\n const luminance = sampleDockWallpaperLuminanceAtElement({\n elementRect: element.getBoundingClientRect(),\n renderedImageRect,\n sampleCanvas,\n wallpaperRect\n });\n if (luminance === null) {\n continue;\n }\n nextTones.set(\n key,\n luminance < dockWallpaperDarkLuminanceThreshold ? \"dark\" : \"light\"\n );\n }\n\n return nextTones;\n}\n\nfunction parseDockWallpaperCssUrl(backgroundImage: string): string | null {\n const match = /^url\\((['\"]?)(.*)\\1\\)$/u.exec(backgroundImage.trim());\n return match?.[2] ? match[2] : null;\n}\n\nconst dockWallpaperImageCache = new Map<\n string,\n Promise<HTMLImageElement | null>\n>();\n\nfunction loadDockWallpaperImage(url: string): Promise<HTMLImageElement | null> {\n const cached = dockWallpaperImageCache.get(url);\n if (cached) {\n return cached;\n }\n const promise = new Promise<HTMLImageElement | null>((resolve) => {\n const image = new Image();\n image.decoding = \"async\";\n image.onload = () => resolve(image);\n image.onerror = () => resolve(null);\n image.src = url;\n });\n dockWallpaperImageCache.set(url, promise);\n return promise;\n}\n\nfunction createDockWallpaperSampleCanvas(\n image: HTMLImageElement\n): HTMLCanvasElement | null {\n if (image.naturalWidth <= 0 || image.naturalHeight <= 0) {\n return null;\n }\n const canvas = document.createElement(\"canvas\");\n const scale =\n dockWallpaperSampleCanvasMaxSizePx /\n Math.max(image.naturalWidth, image.naturalHeight);\n canvas.width = Math.max(1, Math.round(image.naturalWidth * scale));\n canvas.height = Math.max(1, Math.round(image.naturalHeight * scale));\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (!context) {\n return null;\n }\n try {\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n context.getImageData(0, 0, 1, 1);\n } catch {\n return null;\n }\n return canvas;\n}\n\nfunction resolveDockWallpaperRenderedImageRect({\n containerHeight,\n containerWidth,\n imageHeight,\n imageWidth,\n positionX,\n positionY,\n size\n}: {\n containerHeight: number;\n containerWidth: number;\n imageHeight: number;\n imageWidth: number;\n positionX: string;\n positionY: string;\n size: string;\n}): { height: number; left: number; top: number; width: number } {\n const imageAspect = imageWidth / imageHeight;\n const containerAspect = containerWidth / containerHeight;\n let width = containerWidth;\n let height = containerHeight;\n\n if (size === \"cover\") {\n if (containerAspect > imageAspect) {\n height = containerWidth / imageAspect;\n } else {\n width = containerHeight * imageAspect;\n }\n } else if (size === \"contain\") {\n if (containerAspect > imageAspect) {\n width = containerHeight * imageAspect;\n } else {\n height = containerWidth / imageAspect;\n }\n } else if (size !== \"100% 100%\") {\n width = imageWidth;\n height = imageHeight;\n }\n\n return {\n height,\n left: resolveDockWallpaperPositionOffset(positionX, containerWidth - width),\n top: resolveDockWallpaperPositionOffset(\n positionY,\n containerHeight - height\n ),\n width\n };\n}\n\nfunction resolveDockWallpaperPositionOffset(\n value: string,\n availableSpace: number\n): number {\n const trimmed = value.trim();\n if (trimmed.endsWith(\"%\")) {\n const percentage = Number.parseFloat(trimmed);\n return Number.isFinite(percentage)\n ? (availableSpace * percentage) / 100\n : availableSpace / 2;\n }\n if (trimmed.endsWith(\"px\")) {\n const px = Number.parseFloat(trimmed);\n return Number.isFinite(px) ? px : availableSpace / 2;\n }\n if (trimmed === \"left\" || trimmed === \"top\") {\n return 0;\n }\n if (trimmed === \"right\" || trimmed === \"bottom\") {\n return availableSpace;\n }\n return availableSpace / 2;\n}\n\nfunction sampleDockWallpaperLuminanceAtElement({\n elementRect,\n renderedImageRect,\n sampleCanvas,\n wallpaperRect\n}: {\n elementRect: DOMRect;\n renderedImageRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n sampleCanvas: HTMLCanvasElement;\n wallpaperRect: DOMRect;\n}): number | null {\n const context = sampleCanvas.getContext(\"2d\", { willReadFrequently: true });\n if (!context) {\n return null;\n }\n const isVerticalElement = elementRect.height >= elementRect.width;\n let luminanceSum = 0;\n let samples = 0;\n\n for (let index = 0; index < dockWallpaperToneSampleCount; index += 1) {\n const ratio = index / (dockWallpaperToneSampleCount - 1);\n const clientX = isVerticalElement\n ? elementRect.left + elementRect.width / 2\n : elementRect.left + elementRect.width * ratio;\n const clientY = isVerticalElement\n ? elementRect.top + elementRect.height * ratio\n : elementRect.top + elementRect.height / 2;\n const imageX =\n (clientX - wallpaperRect.left - renderedImageRect.left) /\n renderedImageRect.width;\n const imageY =\n (clientY - wallpaperRect.top - renderedImageRect.top) /\n renderedImageRect.height;\n if (imageX < 0 || imageX > 1 || imageY < 0 || imageY > 1) {\n continue;\n }\n const canvasX = Math.min(\n sampleCanvas.width - 1,\n Math.max(0, Math.round(imageX * (sampleCanvas.width - 1)))\n );\n const canvasY = Math.min(\n sampleCanvas.height - 1,\n Math.max(0, Math.round(imageY * (sampleCanvas.height - 1)))\n );\n const pixel = context.getImageData(canvasX, canvasY, 1, 1).data;\n const red = pixel[0] ?? 0;\n const green = pixel[1] ?? 0;\n const blue = pixel[2] ?? 0;\n luminanceSum += 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n samples += 1;\n }\n\n return samples > 0 ? luminanceSum / samples : null;\n}\n\nfunction dockWallpaperToneMapsEqual(\n left: ReadonlyMap<string, WorkbenchDockWallpaperTone>,\n right: ReadonlyMap<string, WorkbenchDockWallpaperTone>\n): boolean {\n if (left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\nconst DOCK_BOUNCE_MS = 600;\nconst DOCK_ENTRY_CLICK_THROTTLE_MS = DOCK_BOUNCE_MS;\n\nfunction useDockBounce(slotRefs: RefObject<Map<string, HTMLElement>>) {\n const timeoutsRef = useRef(new Map<string, ReturnType<typeof setTimeout>>());\n\n const clearDockBounce = useCallback(\n (anchorKey: string): boolean => {\n const timeout = timeoutsRef.current.get(anchorKey);\n const slotElement = slotRefs.current.get(anchorKey);\n const wasBouncing = slotElement?.hasAttribute(\"data-bouncing\") === true;\n if (timeout) {\n clearTimeout(timeout);\n timeoutsRef.current.delete(anchorKey);\n }\n slotElement?.removeAttribute(\"data-bouncing\");\n return wasBouncing;\n },\n [slotRefs]\n );\n\n useEffect(\n () => () => {\n for (const anchorKey of timeoutsRef.current.keys()) {\n clearDockBounce(anchorKey);\n }\n timeoutsRef.current.clear();\n },\n [clearDockBounce]\n );\n\n const triggerDockBounce = useCallback(\n (anchorKey: string) => {\n const shouldRestartAnimation = clearDockBounce(anchorKey);\n\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n\n if (shouldRestartAnimation) {\n // Restart the CSS keyframes without scheduling a React render.\n void slotElement.offsetWidth;\n }\n slotElement.setAttribute(\"data-bouncing\", \"true\");\n timeoutsRef.current.set(\n anchorKey,\n setTimeout(() => {\n clearDockBounce(anchorKey);\n }, DOCK_BOUNCE_MS)\n );\n },\n [clearDockBounce, slotRefs]\n );\n\n return { triggerDockBounce };\n}\n\nfunction resolveWorkbenchHostDockItemsWidth(\n items: readonly WorkbenchHostDockItem[]\n): number {\n if (items.length === 0) {\n return dockItemsHorizontalPaddingPx;\n }\n\n const itemWidth = items.reduce(\n (sum, item) =>\n sum +\n (item.kind === \"separator\" ? dockSeparatorOuterWidthPx : dockSlotWidthPx),\n 0\n );\n const gapWidth = Math.max(0, items.length - 1) * dockItemsGapPx;\n return itemWidth + gapWidth + dockItemsHorizontalPaddingPx;\n}\n\nconst dockHoverPanelOpenDelayMs = 120;\nconst dockHoverPanelCloseDelayMs = 160;\nconst dockHoverPanelHitSlopPx = 12;\nconst dockHoverPanelBridgeSlopPx = 6;\nconst dockHoverPanelPointerRestTolerancePx = 4;\nconst dockWallpaperSampleCanvasMaxSizePx = 192;\nconst dockWallpaperToneSampleCount = 7;\nconst dockWallpaperDarkLuminanceThreshold = 132;\n\nfunction rectContainsPoint(\n rect: DOMRect,\n clientX: number,\n clientY: number,\n slopPx = 0\n): boolean {\n return (\n clientX >= rect.left - slopPx &&\n clientX <= rect.right + slopPx &&\n clientY >= rect.top - slopPx &&\n clientY <= rect.bottom + slopPx\n );\n}\n\nfunction createHoverPanelBridgeRect(anchor: DOMRect, panel: DOMRect): DOMRect {\n if (anchor.right <= panel.left || panel.right <= anchor.left) {\n const left = Math.min(anchor.right, panel.right);\n const right = Math.max(anchor.left, panel.left);\n const top = Math.max(anchor.top, panel.top);\n const bottom = Math.min(anchor.bottom, panel.bottom);\n return new DOMRect(left, top, right - left, Math.max(0, bottom - top));\n }\n\n const left = Math.max(anchor.left, panel.left);\n const right = Math.min(anchor.right, panel.right);\n const top = Math.min(anchor.bottom, panel.bottom);\n const bottom = Math.max(anchor.top, panel.top);\n return new DOMRect(left, top, Math.max(0, right - left), bottom - top);\n}\nconst dockPresenceAnimationMs = 300;\nconst minimizedDockSlotLayoutAnimationMs = 720;\nconst dockItemsGapPx = 10.8;\nconst dockItemsHorizontalPaddingPx = 12.6;\nconst dockSeparatorOuterWidthPx = 8.1;\nconst dockSlotWidthPx = 43.2;\nconst desktopDockPlateChromeWidth = 15.3;\n\ninterface WorkbenchHostDockPlateStyle extends CSSProperties {\n \"--desktop-dock-frame-size\"?: string;\n}\n\ninterface WorkbenchHostDockHoverPanelStyle extends CSSProperties {\n \"--desktop-dock-hover-panel-anchor-height\"?: string;\n \"--desktop-dock-hover-panel-anchor-left\"?: string;\n \"--desktop-dock-hover-panel-anchor-top\"?: string;\n \"--desktop-dock-hover-panel-anchor-width\"?: string;\n}\n\ninterface WorkbenchHostDockLabelTooltipStyle extends CSSProperties {\n \"--desktop-dock-label-tooltip-anchor-height\"?: string;\n \"--desktop-dock-label-tooltip-anchor-left\"?: string;\n \"--desktop-dock-label-tooltip-anchor-top\"?: string;\n \"--desktop-dock-label-tooltip-anchor-width\"?: string;\n}\n\ntype WorkbenchHostDockPresence = \"entering\" | \"exiting\" | \"present\";\ntype WorkbenchHostDockScrollDirection = \"backward\" | \"forward\";\n\ninterface WorkbenchHostDockLabelTooltipTarget {\n key: string;\n label: string;\n}\n\ninterface WorkbenchHostDockLabelTooltipState extends WorkbenchHostDockLabelTooltipTarget {\n anchorKey: string;\n anchorRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n}\n\ninterface WorkbenchHostDockHoverPanelState {\n anchorKey: string;\n anchorRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n entryId: string;\n}\n\ntype WorkbenchHostDockItem =\n | {\n key: string;\n kind: \"entry\";\n resolvedEntry: ResolvedWorkbenchHostDockEntry;\n }\n | {\n key: string;\n kind: \"minimized\";\n slot: WorkbenchMinimizedDockSlot;\n }\n | {\n key: string;\n kind: \"separator\";\n };\n\ninterface WorkbenchHostPresentDockItem {\n item: WorkbenchHostDockItem;\n key: string;\n presence: WorkbenchHostDockPresence;\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostDockEntry,\n WorkbenchHostNodeData,\n WorkbenchHostNodeInstanceStrategy\n} from \"./types.ts\";\n\nexport type WorkbenchHostDockNodeState = \"closed\" | \"minimized\" | \"open\";\n\nexport interface ResolvedWorkbenchHostDockEntry {\n anchorKey: string;\n dockNodeState: WorkbenchHostDockNodeState;\n entry: WorkbenchHostDockEntry;\n hasMatchingNodes: boolean;\n matchedNodes: WorkbenchNode<WorkbenchHostNodeData>[];\n sectionBreakBefore: boolean;\n}\n\nexport type WorkbenchHostDockClickResolution =\n | { actionId: string; kind: \"action\" }\n | { kind: \"blocked\" }\n | { kind: \"focus-node\"; nodeId: string }\n | { kind: \"launch\" }\n | { kind: \"open-popup\" };\n\nexport function matchWorkbenchDockEntryNode(\n entry: WorkbenchHostDockEntry,\n node: WorkbenchNode<WorkbenchHostNodeData>\n): boolean {\n if (typeof node.data.dockEntryId === \"string\") {\n return node.data.dockEntryId === entry.id;\n }\n return entry.matchNode?.(node) ?? false;\n}\n\nexport function resolveWorkbenchDockEntryAnchorKey(\n entry: WorkbenchHostDockEntry\n): string {\n return entry.anchorKey ?? entry.id;\n}\n\nexport function resolveWorkbenchDockEntries(input: {\n dockEntries: readonly WorkbenchHostDockEntry[];\n minimizedNodeIds: ReadonlySet<string>;\n nodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n}): ResolvedWorkbenchHostDockEntry[] {\n const sectionOrder = new Map<string, number>();\n let nextSectionIndex = 0;\n const sortedEntries = [...input.dockEntries]\n .map((entry, index) => {\n const sectionId = entry.sectionId ?? \"\";\n if (!sectionOrder.has(sectionId)) {\n sectionOrder.set(sectionId, nextSectionIndex++);\n }\n return {\n entry,\n index,\n sectionId\n };\n })\n .sort((left, right) => {\n const sectionOrderDelta =\n (sectionOrder.get(left.sectionId) ?? 0) -\n (sectionOrder.get(right.sectionId) ?? 0);\n if (sectionOrderDelta !== 0) {\n return sectionOrderDelta;\n }\n const orderDelta = (left.entry.order ?? 0) - (right.entry.order ?? 0);\n if (orderDelta !== 0) {\n return orderDelta;\n }\n return left.index - right.index;\n });\n\n let previousSectionId: string | null = null;\n const resolvedEntries: ResolvedWorkbenchHostDockEntry[] = [];\n\n for (const { entry, sectionId } of sortedEntries) {\n const matchedNodes = input.nodes.filter((node) =>\n matchWorkbenchDockEntryNode(entry, node)\n );\n const hasMatchingNodes = matchedNodes.length > 0;\n const visibility = entry.visibility ?? \"always\";\n if (\n visibility === \"never\" ||\n (visibility === \"when-open\" && !hasMatchingNodes)\n ) {\n continue;\n }\n\n const hasOpenNode = matchedNodes.some(\n (node) => !input.minimizedNodeIds.has(node.id)\n );\n const hasMinimizedNode = matchedNodes.some((node) =>\n input.minimizedNodeIds.has(node.id)\n );\n\n resolvedEntries.push({\n anchorKey: resolveWorkbenchDockEntryAnchorKey(entry),\n dockNodeState: hasMinimizedNode\n ? \"minimized\"\n : hasOpenNode\n ? \"open\"\n : \"closed\",\n entry,\n hasMatchingNodes,\n matchedNodes,\n sectionBreakBefore:\n previousSectionId !== null && previousSectionId !== sectionId\n });\n previousSectionId = sectionId;\n }\n\n return resolvedEntries;\n}\n\nexport function resolveWorkbenchDockEntryClick(input: {\n entry: WorkbenchHostDockEntry;\n instanceMode?: WorkbenchHostNodeInstanceStrategy[\"mode\"];\n matchedNodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n}): WorkbenchHostDockClickResolution {\n if (input.entry.clickActionId) {\n if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\n }\n return { actionId: input.entry.clickActionId, kind: \"action\" };\n }\n if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\n }\n if (input.entry.clickBehavior === \"launch\") {\n return { kind: \"launch\" };\n }\n if (input.instanceMode === \"multi\" && input.matchedNodes.length > 0) {\n return { kind: \"open-popup\" };\n }\n if (input.matchedNodes.length === 1) {\n return { kind: \"focus-node\", nodeId: input.matchedNodes[0]!.id };\n }\n if (input.matchedNodes.length > 1) {\n return { kind: \"open-popup\" };\n }\n return { kind: \"launch\" };\n}\n\nfunction isWorkbenchDockEntryBlocked(entry: WorkbenchHostDockEntry): boolean {\n const stateKind = entry.state?.kind ?? \"enabled\";\n return (\n stateKind === \"disabled\" ||\n stateKind === \"loading\" ||\n stateKind === \"unavailable\" ||\n (entry.launchBehavior ?? \"enabled\") !== \"enabled\"\n );\n}\n","import { useCallback, useEffect, useRef, type RefObject } from \"react\";\n\nexport const DOCK_ICON_BASE_SIZE = 43.2;\nexport const DOCK_ICON_PEAK_SIZE = DOCK_ICON_BASE_SIZE * 1.7;\nexport const DOCK_MAGNIFICATION_HALF_RANGE = DOCK_ICON_BASE_SIZE * 2.4;\n\nconst DOCK_MAGNIFICATION_SPRING_MASS = 0.1;\nconst DOCK_MAGNIFICATION_SPRING_STIFFNESS = 200;\nconst DOCK_MAGNIFICATION_SPRING_DAMPING = 14;\nconst MAGNIFICATION_SETTLE_EPSILON = 0.2;\nconst MAGNIFICATION_SIZE_EPSILON = 0.2;\nconst MAX_MAGNIFICATION_STEP_SECONDS = 1 / 30;\nconst MAGNIFICATION_INFLUENCE_PADDING = 8;\nconst DOCK_MAGNIFICATION_ENTRY_RAMP_MS = 90;\nconst DOCK_MAGNIFICATION_CROSS_AXIS_PADDING = 8;\n\ninterface DockMagnificationSpring {\n value: number;\n velocity: number;\n}\n\ninterface DockMagnificationAppliedStyle {\n size: number;\n}\n\nexport interface DockMagnificationSlotRect {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\ninterface DockMagnificationHitBounds {\n crossEnd: number;\n crossStart: number;\n mainEnd: number;\n mainStart: number;\n}\n\nconst dockMagnificationShellBySlot = new WeakMap<\n HTMLElement,\n HTMLElement | null\n>();\n\nexport function mapDistanceToTargetSize(\n distance: number,\n baseSize = DOCK_ICON_BASE_SIZE,\n peakSize = DOCK_ICON_PEAK_SIZE,\n halfRange = DOCK_MAGNIFICATION_HALF_RANGE\n): number {\n const absoluteDistance = Math.abs(distance);\n if (absoluteDistance >= halfRange) {\n return baseSize;\n }\n\n const influence = 1 - absoluteDistance / halfRange;\n return baseSize + (peakSize - baseSize) * influence;\n}\n\nexport function applyDockMagnificationEntryRamp(\n targetSize: number,\n baseSize: number,\n progress: number\n): number {\n const clampedProgress = Math.min(1, Math.max(0, progress));\n return baseSize + (targetSize - baseSize) * clampedProgress;\n}\n\nexport function resolveDockMagnificationHitBounds(\n slotRects: readonly DockMagnificationSlotRect[],\n dockPlacement: \"bottom\" | \"left\",\n crossAxisPadding = DOCK_MAGNIFICATION_CROSS_AXIS_PADDING\n): DockMagnificationHitBounds | null {\n if (slotRects.length === 0) {\n return null;\n }\n\n let mainStart = Number.POSITIVE_INFINITY;\n let mainEnd = Number.NEGATIVE_INFINITY;\n let crossStart = Number.POSITIVE_INFINITY;\n let crossEnd = Number.NEGATIVE_INFINITY;\n\n for (const rect of slotRects) {\n if (dockPlacement === \"left\") {\n mainStart = Math.min(mainStart, rect.top);\n mainEnd = Math.max(mainEnd, rect.bottom);\n crossStart = Math.min(crossStart, rect.left);\n crossEnd = Math.max(crossEnd, rect.right);\n } else {\n mainStart = Math.min(mainStart, rect.left);\n mainEnd = Math.max(mainEnd, rect.right);\n crossStart = Math.min(crossStart, rect.top);\n crossEnd = Math.max(crossEnd, rect.bottom);\n }\n }\n\n const effectiveCrossAxisEndPadding =\n dockPlacement === \"left\"\n ? crossAxisPadding + (DOCK_ICON_PEAK_SIZE - DOCK_ICON_BASE_SIZE)\n : crossAxisPadding;\n\n return {\n crossEnd: crossEnd + effectiveCrossAxisEndPadding,\n crossStart: crossStart - crossAxisPadding,\n mainEnd,\n mainStart\n };\n}\n\nfunction isDockMagnificationPointInsideHitBounds({\n clientX,\n clientY,\n dockPlacement,\n hitBounds\n}: {\n clientX: number;\n clientY: number;\n dockPlacement: \"bottom\" | \"left\";\n hitBounds: DockMagnificationHitBounds | null;\n}): boolean {\n if (!hitBounds) {\n return false;\n }\n\n const mainAxis = dockPlacement === \"left\" ? clientY : clientX;\n const crossAxis = dockPlacement === \"left\" ? clientX : clientY;\n return (\n mainAxis >= hitBounds.mainStart &&\n mainAxis <= hitBounds.mainEnd &&\n crossAxis >= hitBounds.crossStart &&\n crossAxis <= hitBounds.crossEnd\n );\n}\n\nexport function resolveDockMagnificationSlotCenter(\n rect: DockMagnificationSlotRect,\n dockPlacement: \"bottom\" | \"left\",\n baseSize = DOCK_ICON_BASE_SIZE\n): number {\n return dockPlacement === \"left\"\n ? rect.top + baseSize / 2\n : rect.left + baseSize / 2;\n}\n\nconst DOCK_MAGNIFICATION_SPRING_SUBSTEPS = 8;\n\nexport function advanceDockMagnificationSpring(\n current: DockMagnificationSpring,\n target: number,\n deltaSeconds: number\n): DockMagnificationSpring {\n const subDeltaSeconds = deltaSeconds / DOCK_MAGNIFICATION_SPRING_SUBSTEPS;\n let { value, velocity } = current;\n\n for (let step = 0; step < DOCK_MAGNIFICATION_SPRING_SUBSTEPS; step += 1) {\n const force =\n -DOCK_MAGNIFICATION_SPRING_STIFFNESS * (value - target) -\n DOCK_MAGNIFICATION_SPRING_DAMPING * velocity;\n const acceleration = force / DOCK_MAGNIFICATION_SPRING_MASS;\n velocity += acceleration * subDeltaSeconds;\n value += velocity * subDeltaSeconds;\n }\n\n return { value, velocity };\n}\n\nexport function isDockMagnificationSpringSettled(\n spring: DockMagnificationSpring,\n target: number\n): boolean {\n return (\n Math.abs(spring.value - target) <= MAGNIFICATION_SETTLE_EPSILON &&\n Math.abs(spring.velocity) <= MAGNIFICATION_SETTLE_EPSILON\n );\n}\n\nfunction roundDockMagnificationSize(size: number): number {\n return Math.round(size * 10) / 10;\n}\n\nfunction hasAppliedSizeChanged(\n previous: DockMagnificationAppliedStyle | undefined,\n next: DockMagnificationAppliedStyle\n): boolean {\n if (!previous) {\n return true;\n }\n\n return Math.abs(previous.size - next.size) > MAGNIFICATION_SIZE_EPSILON;\n}\n\nexport function resolveDockMagnificationSlotLayoutSize({\n size\n}: {\n size: number;\n}): { height: number; width: number } {\n return { height: size, width: size };\n}\n\nexport function isDockMagnificationSlotLayoutLocked(\n slotElement: HTMLElement\n): boolean {\n return (\n slotElement.dataset.collapsing === \"true\" ||\n slotElement.dataset.presence === \"entering\" ||\n slotElement.dataset.presence === \"exiting\"\n );\n}\n\nfunction resolveDockMagnificationShell(\n slotElement: HTMLElement\n): HTMLElement | null {\n const cachedShell = dockMagnificationShellBySlot.get(slotElement);\n if (\n cachedShell !== undefined &&\n (cachedShell === null || slotElement.contains(cachedShell))\n ) {\n return cachedShell;\n }\n\n const shell =\n slotElement.querySelector<HTMLElement>(\"[data-desktop-dock-icon-shell]\") ??\n slotElement.querySelector<HTMLElement>(\n \".desktop-dock__minimized-preview\"\n ) ??\n slotElement.querySelector<HTMLElement>(\n \".desktop-dock__minimized-stack-icon\"\n );\n dockMagnificationShellBySlot.set(slotElement, shell);\n return shell;\n}\n\nfunction applyDockSlotMagnification(\n slotElement: HTMLElement,\n size: number,\n baseSize: number,\n appliedStylesRef: Map<string, DockMagnificationAppliedStyle>\n): void {\n const anchorKey = slotElement.dataset.desktopDockAnchorKey;\n if (!anchorKey) {\n return;\n }\n\n const shell = resolveDockMagnificationShell(slotElement);\n if (!shell) {\n return;\n }\n\n const nextStyle = {\n size: roundDockMagnificationSize(size)\n };\n\n if (!hasAppliedSizeChanged(appliedStylesRef.get(anchorKey), nextStyle)) {\n return;\n }\n\n appliedStylesRef.set(anchorKey, nextStyle);\n\n if (Math.abs(nextStyle.size - baseSize) <= MAGNIFICATION_SIZE_EPSILON) {\n slotElement.style.removeProperty(\"width\");\n slotElement.style.removeProperty(\"height\");\n shell.style.removeProperty(\"transform\");\n return;\n }\n\n const scale = nextStyle.size / baseSize;\n const layoutSize = resolveDockMagnificationSlotLayoutSize({\n size: nextStyle.size\n });\n slotElement.style.width = `${layoutSize.width}px`;\n slotElement.style.height = `${layoutSize.height}px`;\n shell.style.transform = `scale(${scale})`;\n}\n\nfunction clearDockSlotMagnification(\n slotElement: HTMLElement,\n appliedStylesRef: Map<string, DockMagnificationAppliedStyle>\n): void {\n const anchorKey = slotElement.dataset.desktopDockAnchorKey;\n if (anchorKey) {\n appliedStylesRef.delete(anchorKey);\n }\n slotElement.style.removeProperty(\"width\");\n slotElement.style.removeProperty(\"height\");\n const shell = resolveDockMagnificationShell(slotElement);\n shell?.style.removeProperty(\"transform\");\n}\n\nexport function useDockMagnification({\n dockPlacement,\n dockRootRef,\n slotRefs\n}: {\n dockPlacement: \"bottom\" | \"left\";\n dockRootRef: RefObject<HTMLElement | null>;\n slotRefs: RefObject<Map<string, HTMLElement>>;\n}) {\n const pointerAxisRef = useRef<number | null>(null);\n const pendingPointerAxisRef = useRef<number | null>(null);\n const springsRef = useRef(new Map<string, DockMagnificationSpring>());\n const appliedStylesRef = useRef(\n new Map<string, DockMagnificationAppliedStyle>()\n );\n const animationFrameRef = useRef<number | null>(null);\n const lastFrameTimeRef = useRef<number | null>(null);\n const entryRampStartedAtRef = useRef<number | null>(null);\n const restCentersRef = useRef<Map<string, number> | null>(null);\n const hitBoundsRef = useRef<DockMagnificationHitBounds | null>(null);\n const slotOrderRef = useRef<string[]>([]);\n const magnifyActiveRef = useRef(false);\n\n const setMagnifyActive = useCallback(\n (active: boolean) => {\n if (magnifyActiveRef.current === active) {\n return;\n }\n magnifyActiveRef.current = active;\n if (active) {\n dockRootRef.current?.setAttribute(\"data-dock-pointer-active\", \"true\");\n } else {\n dockRootRef.current?.removeAttribute(\"data-dock-pointer-active\");\n }\n },\n [dockRootRef]\n );\n\n const stopAnimation = useCallback(() => {\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n lastFrameTimeRef.current = null;\n }, []);\n\n const captureRestCenters = useCallback(() => {\n const slots = slotRefs.current;\n const centers = new Map<string, number>();\n const slotRects: DockMagnificationSlotRect[] = [];\n const order: string[] = [];\n for (const [anchorKey, slotElement] of slots) {\n order.push(anchorKey);\n const rect = slotElement.getBoundingClientRect();\n slotRects.push({\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n top: rect.top\n });\n const center = resolveDockMagnificationSlotCenter(rect, dockPlacement);\n centers.set(anchorKey, center);\n }\n slotOrderRef.current = order;\n hitBoundsRef.current = resolveDockMagnificationHitBounds(\n slotRects,\n dockPlacement\n );\n restCentersRef.current = centers;\n }, [dockPlacement, slotRefs]);\n\n const runAnimationFrame = useCallback(\n (frameTime: number) => {\n if (pendingPointerAxisRef.current !== null) {\n pointerAxisRef.current = pendingPointerAxisRef.current;\n }\n\n const pointerAxis = pointerAxisRef.current;\n if (pointerAxis !== null) {\n captureRestCenters();\n entryRampStartedAtRef.current ??= frameTime;\n }\n const slots = slotRefs.current;\n const order = slotOrderRef.current;\n const previousFrameTime = lastFrameTimeRef.current;\n lastFrameTimeRef.current = frameTime;\n const deltaSeconds =\n previousFrameTime === null\n ? 1 / 60\n : Math.min(\n (frameTime - previousFrameTime) / 1000,\n MAX_MAGNIFICATION_STEP_SECONDS\n );\n\n let shouldContinue = false;\n let allSettled = true;\n const influenceRadius =\n DOCK_MAGNIFICATION_HALF_RANGE + MAGNIFICATION_INFLUENCE_PADDING;\n const entryRampProgress =\n pointerAxis === null || entryRampStartedAtRef.current === null\n ? 1\n : (frameTime - entryRampStartedAtRef.current) /\n DOCK_MAGNIFICATION_ENTRY_RAMP_MS;\n\n for (let index = 0; index < order.length; index += 1) {\n const anchorKey = order[index];\n if (!anchorKey) {\n continue;\n }\n\n const center = restCentersRef.current?.get(anchorKey);\n if (center === undefined) {\n continue;\n }\n\n const distance =\n pointerAxis === null\n ? DOCK_MAGNIFICATION_HALF_RANGE\n : pointerAxis - center;\n const absoluteDistance = Math.abs(distance);\n const inRange = absoluteDistance < influenceRadius;\n const targetSize = inRange\n ? applyDockMagnificationEntryRamp(\n mapDistanceToTargetSize(distance),\n DOCK_ICON_BASE_SIZE,\n entryRampProgress\n )\n : DOCK_ICON_BASE_SIZE;\n\n const currentSpring = springsRef.current.get(anchorKey) ?? {\n value: DOCK_ICON_BASE_SIZE,\n velocity: 0\n };\n const nextSpring =\n inRange ||\n !isDockMagnificationSpringSettled(currentSpring, DOCK_ICON_BASE_SIZE)\n ? advanceDockMagnificationSpring(\n currentSpring,\n targetSize,\n deltaSeconds\n )\n : currentSpring;\n\n if (\n !inRange &&\n isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n springsRef.current.delete(anchorKey);\n const slotElement = slots.get(anchorKey);\n if (slotElement) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n continue;\n }\n\n springsRef.current.set(anchorKey, nextSpring);\n\n const settled = isDockMagnificationSpringSettled(\n nextSpring,\n targetSize\n );\n if (!settled) {\n shouldContinue = true;\n }\n if (\n !isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n allSettled = false;\n }\n\n const slotElement = slots.get(anchorKey);\n if (!slotElement) {\n continue;\n }\n\n if (isDockMagnificationSlotLayoutLocked(slotElement)) {\n springsRef.current.delete(anchorKey);\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n continue;\n }\n\n if (\n pointerAxis === null &&\n isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n springsRef.current.delete(anchorKey);\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n continue;\n }\n\n applyDockSlotMagnification(\n slotElement,\n nextSpring.value,\n DOCK_ICON_BASE_SIZE,\n appliedStylesRef.current\n );\n }\n\n if (pointerAxis !== null) {\n shouldContinue = true;\n } else if (!allSettled) {\n shouldContinue = true;\n }\n\n if (pointerAxis === null && allSettled) {\n entryRampStartedAtRef.current = null;\n restCentersRef.current = null;\n hitBoundsRef.current = null;\n slotOrderRef.current = [];\n setMagnifyActive(false);\n }\n\n if (shouldContinue) {\n animationFrameRef.current = requestAnimationFrame(runAnimationFrame);\n return;\n }\n\n animationFrameRef.current = null;\n lastFrameTimeRef.current = null;\n },\n [captureRestCenters, setMagnifyActive, slotRefs]\n );\n\n const scheduleAnimation = useCallback(() => {\n if (animationFrameRef.current !== null) {\n return;\n }\n animationFrameRef.current = requestAnimationFrame(runAnimationFrame);\n }, [runAnimationFrame]);\n\n const handlePointerMove = useCallback(\n (clientX: number, clientY: number) => {\n if (restCentersRef.current === null) {\n captureRestCenters();\n }\n\n if (\n !isDockMagnificationPointInsideHitBounds({\n clientX,\n clientY,\n dockPlacement,\n hitBounds: hitBoundsRef.current\n })\n ) {\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n scheduleAnimation();\n return;\n }\n\n pendingPointerAxisRef.current =\n dockPlacement === \"left\" ? clientY : clientX;\n if (!magnifyActiveRef.current) {\n setMagnifyActive(true);\n }\n scheduleAnimation();\n },\n [captureRestCenters, dockPlacement, scheduleAnimation, setMagnifyActive]\n );\n\n const handlePointerLeave = useCallback(() => {\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n scheduleAnimation();\n }, [scheduleAnimation]);\n\n const clearSlotMagnification = useCallback(\n (anchorKey: string) => {\n springsRef.current.delete(anchorKey);\n restCentersRef.current?.delete(anchorKey);\n appliedStylesRef.current.delete(anchorKey);\n hitBoundsRef.current = null;\n slotOrderRef.current = slotOrderRef.current.filter(\n (key) => key !== anchorKey\n );\n const slotElement = slotRefs.current.get(anchorKey);\n if (slotElement) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n },\n [slotRefs]\n );\n\n const pauseMagnification = useCallback(() => {\n stopAnimation();\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n lastFrameTimeRef.current = null;\n }, [stopAnimation]);\n\n const resetMagnification = useCallback(() => {\n stopAnimation();\n for (const slotElement of slotRefs.current.values()) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n springsRef.current.clear();\n appliedStylesRef.current.clear();\n restCentersRef.current = null;\n hitBoundsRef.current = null;\n slotOrderRef.current = [];\n pointerAxisRef.current = null;\n pendingPointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n setMagnifyActive(false);\n }, [setMagnifyActive, slotRefs, stopAnimation]);\n\n useEffect(\n () => () => {\n resetMagnification();\n },\n [resetMagnification]\n );\n\n return {\n clearSlotMagnification,\n handlePointerLeave,\n handlePointerMove,\n pauseMagnification,\n resetMagnification\n };\n}\n","export interface WorkbenchHostDockScrollState {\n canScrollBackward: boolean;\n canScrollForward: boolean;\n hasOverflow: boolean;\n}\n\nexport interface ResolveWorkbenchHostDockScrollStateInput {\n contentSize: number;\n scrollOffset: number;\n scrollSize: number;\n viewportSize: number;\n}\n\nconst dockScrollOverflowEpsilonPx = 1;\n\nexport function resolveWorkbenchHostDockScrollState({\n contentSize,\n scrollOffset,\n scrollSize,\n viewportSize\n}: ResolveWorkbenchHostDockScrollStateInput): WorkbenchHostDockScrollState {\n const hasOverflow = contentSize > viewportSize + dockScrollOverflowEpsilonPx;\n if (!hasOverflow) {\n return {\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n };\n }\n\n const maxScrollOffset = Math.max(\n 0,\n Math.max(scrollSize, contentSize) - viewportSize\n );\n\n return {\n canScrollBackward: scrollOffset > dockScrollOverflowEpsilonPx,\n canScrollForward:\n scrollOffset < maxScrollOffset - dockScrollOverflowEpsilonPx,\n hasOverflow\n };\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition\n} from \"./types.ts\";\n\nexport const workbenchMinimizedDockVisibleSlotLimit = 5;\nexport const workbenchMinimizedDockStackedVisibleNodeCount = 4;\nexport const workbenchMinimizedDockStackAnchorKey = \"minimized-stack\";\n\nexport type WorkbenchMinimizedDockNode = WorkbenchNode<WorkbenchHostNodeData>;\n\nexport type WorkbenchMinimizedDockSlot =\n | {\n anchorKey: string;\n kind: \"node\";\n node: WorkbenchMinimizedDockNode;\n }\n | {\n anchorKey: string;\n kind: \"stack\";\n nodes: WorkbenchMinimizedDockNode[];\n };\n\nexport function resolveWorkbenchMinimizedDockNodeAnchorKey(\n nodeId: string\n): string {\n return `minimized:${nodeId}`;\n}\n\nexport function resolveWorkbenchMinimizedDockSlots(input: {\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}): WorkbenchMinimizedDockSlot[] {\n const minimizedNodes = orderWorkbenchMinimizedDockNodes(input);\n if (minimizedNodes.length === 0) {\n return [];\n }\n if (minimizedNodes.length <= workbenchMinimizedDockVisibleSlotLimit) {\n return minimizedNodes.map((node) => ({\n anchorKey: resolveWorkbenchMinimizedDockNodeAnchorKey(node.id),\n kind: \"node\",\n node\n }));\n }\n\n return [\n ...minimizedNodes\n .slice(0, workbenchMinimizedDockStackedVisibleNodeCount)\n .map((node) => ({\n anchorKey: resolveWorkbenchMinimizedDockNodeAnchorKey(node.id),\n kind: \"node\" as const,\n node\n })),\n {\n anchorKey: workbenchMinimizedDockStackAnchorKey,\n kind: \"stack\",\n nodes: minimizedNodes.slice(workbenchMinimizedDockStackedVisibleNodeCount)\n }\n ];\n}\n\nexport function resolveWorkbenchMinimizedDockAnchorKeyForNode(input: {\n nodeId: string;\n slots: readonly WorkbenchMinimizedDockSlot[];\n}): string | null {\n for (const slot of input.slots) {\n if (slot.kind === \"node\" && slot.node.id === input.nodeId) {\n return slot.anchorKey;\n }\n if (\n slot.kind === \"stack\" &&\n slot.nodes.some((node) => node.id === input.nodeId)\n ) {\n return slot.anchorKey;\n }\n }\n return null;\n}\n\nexport function isWorkbenchMinimizedDockEligibleNode(input: {\n node: WorkbenchMinimizedDockNode;\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n}): boolean {\n const definition = input.nodeDefinitions.get(input.node.data.typeId);\n return definition?.window?.minimizedDock !== undefined;\n}\n\nfunction orderWorkbenchMinimizedDockNodes(input: {\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}): WorkbenchMinimizedDockNode[] {\n return input.nodes\n .map((node, index) => ({ index, node }))\n .filter(\n ({ node }) =>\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitions\n })\n )\n .sort((left, right) => {\n const leftTime = left.node.minimizedAtUnixMs ?? 0;\n const rightTime = right.node.minimizedAtUnixMs ?? 0;\n if (leftTime !== rightTime) {\n return rightTime - leftTime;\n }\n return right.index - left.index;\n })\n .map(({ node }) => node);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { WorkbenchMinimizedDockSlot } from \"./minimizedDockSlots.ts\";\n\nexport const minimizedDockStackPromotionDurationMs = 520;\n\nexport function detectMinimizedDockStackPromotion(\n previous: readonly WorkbenchMinimizedDockSlot[],\n next: readonly WorkbenchMinimizedDockSlot[]\n): string | null {\n const previousVisibleNodeIds = new Set(\n previous\n .filter(\n (slot): slot is Extract<WorkbenchMinimizedDockSlot, { kind: \"node\" }> =>\n slot.kind === \"node\"\n )\n .map((slot) => slot.node.id)\n );\n const previousStackNodeIds =\n previous\n .find((slot) => slot.kind === \"stack\")\n ?.nodes.map((node) => node.id) ?? [];\n\n for (const slot of next) {\n if (slot.kind !== \"node\") {\n continue;\n }\n if (\n !previousVisibleNodeIds.has(slot.node.id) &&\n previousStackNodeIds.includes(slot.node.id)\n ) {\n return slot.node.id;\n }\n }\n\n return null;\n}\n\nexport function useMinimizedDockStackPromotion(\n slots: readonly WorkbenchMinimizedDockSlot[]\n) {\n const previousSlotsRef = useRef(slots);\n const promotionTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [promotedNodeId, setPromotedNodeId] = useState<string | null>(null);\n const [stackDispatching, setStackDispatching] = useState(false);\n\n useEffect(() => {\n const promotedNodeId = detectMinimizedDockStackPromotion(\n previousSlotsRef.current,\n slots\n );\n previousSlotsRef.current = slots;\n\n if (!promotedNodeId) {\n return undefined;\n }\n\n setPromotedNodeId(promotedNodeId);\n setStackDispatching(true);\n if (promotionTimerRef.current !== null) {\n clearTimeout(promotionTimerRef.current);\n }\n promotionTimerRef.current = setTimeout(() => {\n promotionTimerRef.current = null;\n setPromotedNodeId(null);\n setStackDispatching(false);\n }, minimizedDockStackPromotionDurationMs);\n\n return () => {\n if (promotionTimerRef.current !== null) {\n clearTimeout(promotionTimerRef.current);\n promotionTimerRef.current = null;\n }\n };\n }, [slots]);\n\n return { promotedNodeId, stackDispatching };\n}\n","import type { WorkbenchMinimizedDockSlot } from \"./minimizedDockSlots.ts\";\n\nexport type WorkbenchMinimizedDockRestoreIntent =\n | {\n anchorKey: string;\n kind: \"node-slot\";\n nodeId: string;\n }\n | {\n anchorKey: string;\n kind: \"stack-popup-card\";\n nodeId: string;\n stackAnchorKey: string;\n };\n\nexport type WorkbenchMinimizedDockRestoreSource =\n | {\n anchorKey: string;\n kind: \"node-slot\";\n }\n | {\n kind: \"stack-popup-card\";\n stackAnchorKey: string;\n };\n\nexport function resolveWorkbenchMinimizedDockRestoreIntent(input: {\n nodeId: string;\n slots: readonly WorkbenchMinimizedDockSlot[];\n source: WorkbenchMinimizedDockRestoreSource;\n}): WorkbenchMinimizedDockRestoreIntent | null {\n const { source } = input;\n switch (source.kind) {\n case \"node-slot\": {\n const slot = input.slots.find(\n (slot) => slot.anchorKey === source.anchorKey\n );\n if (slot?.kind !== \"node\" || slot.node.id !== input.nodeId) {\n return null;\n }\n return {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\",\n nodeId: input.nodeId\n };\n }\n\n case \"stack-popup-card\": {\n const slot = input.slots.find(\n (slot) => slot.anchorKey === source.stackAnchorKey\n );\n if (\n slot?.kind !== \"stack\" ||\n !slot.nodes.some((node) => node.id === input.nodeId)\n ) {\n return null;\n }\n return {\n anchorKey: slot.anchorKey,\n kind: \"stack-popup-card\",\n nodeId: input.nodeId,\n stackAnchorKey: slot.anchorKey\n };\n }\n }\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Button,\n CheckIcon,\n CloseIcon,\n FileCreateIcon,\n MaximizeIcon,\n MinimizeIcon,\n OverviewLayoutIcon,\n PinFilledIcon,\n PinIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport {\n captureWorkbenchNodePreviewImage,\n writeCachedWorkbenchNodePreviewImage\n} from \"../react/useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockPreviewContent,\n WorkbenchHostDockPopupCardLabelMode,\n WorkbenchHostHandle,\n WorkbenchHostNodeData,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport type { WorkbenchDockPlacement } from \"../react/types.ts\";\nimport {\n resolveInitialMinimizedStackScrollOffset,\n resolveMinimizedStackLeftGutterPx,\n resolveMinimizedStackPanelWidthPx,\n resolveMinimizedStackPopupLeftPx,\n resolveMinimizedStackPopupTopPx,\n resolveMinimizedStackTrackHeightPx,\n resolveMinimizedStackTrackTranslateXPx,\n resolveMinimizedStackViewportHeightPx\n} from \"./minimizedStackScroll.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"../react/dockPreviewCache.ts\";\n\nconst dockPopupCardWidthPx = 165;\nconst dockPopupGridGapPx = 8;\nconst dockPopupPanelPaddingInlinePx = 12;\nconst dockPopupPanelBorderInlinePx = 2;\nconst dockPopupPlacementGapPx = 14;\nconst dockPopupMinimizedStackLaunchDisappearMs = 0;\nconst dockPopupMinimizedStackPopupZIndex = 100300;\nconst dockPopupPreviewCacheMaxEntries = 64;\nconst dockPopupPreviewByMemoryKey = new Map<\n string,\n WorkbenchHostDockPopupCapturedPreview\n>();\nconst pendingDockPopupPreviewMemoryKeys = new Set<string>();\n\ntype WorkbenchHostDockPopupCapturedPreview = {\n preview: WorkbenchDockPreviewContent | null;\n revision: string | null;\n};\n\ntype WorkbenchHostDockPopupPreviewState =\n | {\n preview: WorkbenchDockPreviewContent;\n status: \"ready\";\n }\n | {\n status: \"loading\" | \"fallback\";\n };\n\nexport interface WorkbenchHostDockPopupAnchorRect {\n dockRight?: number;\n height: number;\n left: number;\n top: number;\n width: number;\n}\n\nexport interface WorkbenchHostDockPopupState {\n anchorRect: WorkbenchHostDockPopupAnchorRect;\n entryId: string;\n kind: \"context-menu\" | \"preview\";\n}\n\nexport interface WorkbenchHostDockPopupItem {\n externalNodeState?: unknown;\n externalWorkspaceState?: unknown;\n host: WorkbenchHostHandle;\n isFocused: boolean;\n isMinimized: boolean;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n preview: WorkbenchDockPreviewContent | null;\n previewRevision: string | null;\n subtitle: string | null;\n title: string | null;\n}\n\nexport type WorkbenchHostDockPopupVariant =\n | \"context-menu\"\n | \"default\"\n | \"minimized-stack\";\n\nexport interface WorkbenchHostDockPopupRetentionAction {\n checked: boolean;\n disabled?: boolean;\n label: string;\n pendingLabel?: string;\n}\n\ninterface WorkbenchHostDockPopupCardStyle extends CSSProperties {\n \"--desktop-dock-popup-card-lift\"?: string;\n \"--desktop-dock-popup-card-scale\"?: string;\n \"--desktop-dock-popup-card-z-index\"?: string;\n \"--desktop-dock-popup-fan-delay\"?: string;\n \"--desktop-dock-popup-fan-rotate\"?: string;\n \"--desktop-dock-popup-fan-x\"?: string;\n \"--desktop-dock-popup-fan-y\"?: string;\n}\n\ninterface WorkbenchHostDockPopupRootStyle extends CSSProperties {\n \"--desktop-dock-minimized-stack-width\"?: string;\n \"--desktop-dock-popup-columns\": string;\n \"--desktop-dock-popup-width\": string;\n}\n\nconst popupCardMagnificationRange = 160;\nconst popupCardMaxScale = 1.16;\nconst popupCardMaxLiftPx = 10;\n\nfunction resolvePopupCardMagnificationStyle(\n pointer: { x: number; y: number } | null,\n element: HTMLElement | null\n): WorkbenchHostDockPopupCardStyle | undefined {\n if (!pointer || !element) {\n return undefined;\n }\n\n const rect = element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distance = Math.hypot(pointer.x - centerX, pointer.y - centerY);\n const influence = Math.max(0, 1 - distance / popupCardMagnificationRange);\n if (influence <= 0) {\n return undefined;\n }\n\n const eased = influence * influence * (3 - 2 * influence);\n const scale = 1 + (popupCardMaxScale - 1) * eased;\n const lift = -popupCardMaxLiftPx * eased;\n return {\n \"--desktop-dock-popup-card-lift\": `${Math.round(lift * 10) / 10}px`,\n \"--desktop-dock-popup-card-scale\": `${Math.round(scale * 1000) / 1000}`,\n \"--desktop-dock-popup-card-z-index\": `${Math.round(1 + influence * 20)}`\n };\n}\n\nfunction resolvePopupFanCardStyle(\n index: number,\n count: number,\n placement: WorkbenchDockPlacement\n): WorkbenchHostDockPopupCardStyle {\n const safeCount = Math.max(1, count);\n const cappedIndex = Math.min(index, safeCount - 1);\n const arcDirection = placement === \"left\" ? -1 : 1;\n const arcX = cappedIndex * 6 * arcDirection;\n const arcY = -18 - cappedIndex * 78;\n const rotateDeg = (-2 + cappedIndex * 0.8) * arcDirection;\n\n return {\n \"--desktop-dock-popup-fan-delay\": `${index * 22}ms`,\n \"--desktop-dock-popup-fan-rotate\": `${Math.round(rotateDeg * 10) / 10}deg`,\n \"--desktop-dock-popup-fan-x\": `${Math.round(arcX)}px`,\n \"--desktop-dock-popup-fan-y\": `${Math.round(arcY)}px`\n };\n}\n\nfunction readDockPopupPreviewImage(\n memoryKey: string\n): WorkbenchHostDockPopupCapturedPreview | undefined {\n return dockPopupPreviewByMemoryKey.get(memoryKey);\n}\n\nfunction writeDockPopupPreviewImage(\n memoryKey: string,\n preview: WorkbenchDockPreviewContent | null,\n revision: string | null\n): void {\n dockPopupPreviewByMemoryKey.delete(memoryKey);\n dockPopupPreviewByMemoryKey.set(memoryKey, { preview, revision });\n while (dockPopupPreviewByMemoryKey.size > dockPopupPreviewCacheMaxEntries) {\n const oldestMemoryKey = dockPopupPreviewByMemoryKey.keys().next().value;\n if (typeof oldestMemoryKey !== \"string\") {\n break;\n }\n dockPopupPreviewByMemoryKey.delete(oldestMemoryKey);\n }\n}\n\nexport function WorkbenchHostDockPopup({\n anchorRect,\n canEnterFullscreen,\n canShowAllWindows,\n capturePreview,\n debugDiagnostics,\n dockRetention,\n dockPreviewCache,\n fullscreenLabel,\n hideLabel,\n items,\n label,\n labelMode,\n newWindowLabel,\n closeWindowLabel,\n onClose,\n onCloseNode,\n onCreateNew,\n onEnterFullscreen,\n onHide,\n onRunDockRetentionAction,\n onSelectNode,\n onShowAllWindows,\n openLabel,\n onQuit,\n placement = \"bottom\",\n quitLabel,\n resolveDockPreviewCacheKey,\n showAllWindowsLabel,\n showCreateNew,\n showOpen,\n variant\n}: {\n anchorRect: WorkbenchHostDockPopupState[\"anchorRect\"];\n canEnterFullscreen?: boolean;\n canShowAllWindows?: boolean;\n capturePreview?: (\n item: WorkbenchHostDockPopupItem\n ) =>\n | Promise<WorkbenchDockPreviewContent | string | null>\n | WorkbenchDockPreviewContent\n | string\n | null;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockRetention?: WorkbenchHostDockPopupRetentionAction | null;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n fullscreenLabel?: string;\n hideLabel?: string;\n items: WorkbenchHostDockPopupItem[];\n label: string;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n newWindowLabel: string;\n closeWindowLabel: (title: string) => string;\n onClose: () => void;\n onCloseNode: (nodeId: string) => void;\n onCreateNew: () => void;\n onEnterFullscreen?: () => void;\n onHide?: () => void;\n onRunDockRetentionAction?: () => void;\n onSelectNode: (nodeId: string) => void;\n onShowAllWindows?: () => void;\n openLabel?: string;\n onQuit?: () => void;\n placement?: WorkbenchDockPlacement;\n quitLabel?: string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<WorkbenchHostNodeData>;\n showAllWindowsLabel?: string;\n showCreateNew?: boolean;\n showOpen?: boolean;\n variant?: WorkbenchHostDockPopupVariant;\n}) {\n const resolvedLabelMode = labelMode ?? \"hover-overlay\";\n const resolvedVariant = variant ?? \"default\";\n const isMinimizedStack = resolvedVariant === \"minimized-stack\";\n const isContextMenu = resolvedVariant === \"context-menu\";\n const createCardCount = showCreateNew === false ? 0 : 1;\n const cardElementsRef = useRef(new Map<string, HTMLElement>());\n const cardRefCallbacksRef = useRef(\n new Map<string, (element: HTMLElement | null) => void>()\n );\n const popupRootRef = useRef<HTMLDivElement | null>(null);\n const minimizedStackViewportRef = useRef<HTMLDivElement | null>(null);\n const [pointer, setPointer] = useState<{ x: number; y: number } | null>(null);\n const [minimizedStackScrollOffset, setMinimizedStackScrollOffset] =\n useState(0);\n const [capturedPreviewByMemoryKey, setCapturedPreviewByMemoryKey] = useState<\n Record<string, WorkbenchHostDockPopupCapturedPreview | undefined>\n >({});\n const columnCount = isContextMenu\n ? 1\n : Math.min(Math.max(items.length + createCardCount, 1), 3);\n const popupWidthPx = isContextMenu\n ? 268\n : columnCount * dockPopupCardWidthPx +\n Math.max(0, columnCount - 1) * dockPopupGridGapPx +\n dockPopupPanelPaddingInlinePx * 2 +\n dockPopupPanelBorderInlinePx;\n const popupCenterY = anchorRect.top + anchorRect.height / 2;\n const isLeftMinimizedStack = placement === \"left\" && isMinimizedStack;\n const minimizedStackTrackHeightPx = resolveMinimizedStackTrackHeightPx(\n items.length\n );\n const minimizedStackViewportHeightPx = isMinimizedStack\n ? resolveMinimizedStackViewportHeightPx({\n anchorCenterY: popupCenterY,\n placement,\n trackHeightPx: minimizedStackTrackHeightPx\n })\n : minimizedStackTrackHeightPx;\n const minimizedStackTrackTranslateXPx = isMinimizedStack\n ? resolveMinimizedStackTrackTranslateXPx({\n itemCount: items.length,\n placement,\n scrollOffset: minimizedStackScrollOffset,\n trackHeightPx: minimizedStackTrackHeightPx,\n viewportHeightPx: minimizedStackViewportHeightPx\n })\n : 0;\n const minimizedStackLeftGutterPx = isLeftMinimizedStack\n ? resolveMinimizedStackLeftGutterPx({\n itemCount: items.length,\n placement,\n scrollOffset: minimizedStackScrollOffset,\n trackHeightPx: minimizedStackTrackHeightPx,\n viewportHeightPx: minimizedStackViewportHeightPx,\n trackTranslateXPx: minimizedStackTrackTranslateXPx\n })\n : 0;\n const minimizedStackPanelWidthPx = isLeftMinimizedStack\n ? resolveMinimizedStackPanelWidthPx(items.length, placement, {\n leftGutterPx: minimizedStackLeftGutterPx\n })\n : null;\n const popupStyle: WorkbenchHostDockPopupRootStyle = {\n \"--desktop-dock-popup-columns\": String(columnCount),\n \"--desktop-dock-popup-width\":\n minimizedStackPanelWidthPx != null\n ? `${minimizedStackPanelWidthPx}px`\n : `${popupWidthPx}px`,\n ...(minimizedStackPanelWidthPx != null\n ? {\n \"--desktop-dock-minimized-stack-width\": `${minimizedStackPanelWidthPx}px`,\n minWidth: minimizedStackPanelWidthPx,\n width: minimizedStackPanelWidthPx\n }\n : {}),\n left: isLeftMinimizedStack\n ? resolveMinimizedStackPopupLeftPx({\n anchorLeft: anchorRect.left,\n anchorWidth: anchorRect.width,\n dockRightPx: anchorRect.dockRight,\n leftGutterPx: minimizedStackLeftGutterPx\n })\n : placement === \"left\"\n ? anchorRect.left + anchorRect.width + dockPopupPlacementGapPx\n : anchorRect.left + anchorRect.width / 2,\n top: isLeftMinimizedStack\n ? resolveMinimizedStackPopupTopPx({ anchorTop: anchorRect.top })\n : placement === \"left\"\n ? popupCenterY\n : anchorRect.top - dockPopupPlacementGapPx,\n ...(isLeftMinimizedStack\n ? { zIndex: dockPopupMinimizedStackPopupZIndex }\n : {})\n };\n const minimizedStackMaxScrollOffset = Math.max(\n 0,\n minimizedStackTrackHeightPx - minimizedStackViewportHeightPx\n );\n const initialMinimizedStackScrollOffset =\n resolveInitialMinimizedStackScrollOffset({\n maxScrollOffset: minimizedStackMaxScrollOffset\n });\n const panelStyle: CSSProperties = {\n \"--desktop-dock-popup-columns\": String(columnCount),\n \"--desktop-dock-popup-item-count\": String(Math.max(1, items.length)),\n ...(isMinimizedStack\n ? {\n height: minimizedStackViewportHeightPx,\n minHeight: minimizedStackViewportHeightPx,\n ...(isLeftMinimizedStack && minimizedStackPanelWidthPx != null\n ? {\n width: minimizedStackPanelWidthPx,\n minWidth: minimizedStackPanelWidthPx,\n \"--desktop-dock-minimized-stack-left-gutter\": `${minimizedStackLeftGutterPx}px`\n }\n : {})\n }\n : {})\n } as CSSProperties;\n const popupDiagnosticKey = items.map((item) => item.node.id).join(\"|\");\n\n useEffect(() => {\n logWorkbenchDockPopupDebug(\"dock.popup.rendered\", debugDiagnostics, {\n hasCapturePreview: Boolean(capturePreview),\n itemCount: popupDiagnosticKey ? popupDiagnosticKey.split(\"|\").length : 0,\n nodeIds: popupDiagnosticKey ? popupDiagnosticKey.split(\"|\") : [],\n placement,\n variant: resolvedVariant\n });\n }, [\n capturePreview,\n debugDiagnostics,\n placement,\n popupDiagnosticKey,\n resolvedVariant\n ]);\n\n useLayoutEffect(() => {\n const rootElement = popupRootRef.current;\n const panelElement =\n rootElement?.querySelector<HTMLElement>(\n \"[data-desktop-dock-popup-panel]\"\n ) ?? null;\n logWorkbenchDockPopupDebug(\"dock.popup.layout\", debugDiagnostics, {\n panelRect: panelElement ? rectToDiagnostic(panelElement) : null,\n rootRect: rootElement ? rectToDiagnostic(rootElement) : null,\n rootStyle: rootElement ? styleToDiagnostic(rootElement) : null,\n viewportHeight: window.innerHeight,\n viewportWidth: window.innerWidth\n });\n }, [debugDiagnostics, popupDiagnosticKey]);\n\n const registerCard = useCallback((nodeId: string) => {\n const existing = cardRefCallbacksRef.current.get(nodeId);\n if (existing) {\n return existing;\n }\n\n const callback = (element: HTMLElement | null) => {\n if (element) {\n cardElementsRef.current.set(nodeId, element);\n } else {\n cardElementsRef.current.delete(nodeId);\n }\n };\n cardRefCallbacksRef.current.set(nodeId, callback);\n return callback;\n }, []);\n\n useEffect(() => {\n if (!isLeftMinimizedStack) {\n return;\n }\n document.body.setAttribute(\n \"data-desktop-dock-minimized-stack-open\",\n \"true\"\n );\n return () => {\n document.body.removeAttribute(\"data-desktop-dock-minimized-stack-open\");\n };\n }, [isLeftMinimizedStack]);\n\n useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (!(event.target instanceof Element)) {\n onClose();\n return;\n }\n if (\n event.target.closest(\"[data-desktop-dock-slot]\") ||\n event.target.closest(\"[data-desktop-dock-popup-card]\") ||\n event.target.closest(\n '.desktop-dock-popup-root:not([data-popup-variant=\"minimized-stack\"])'\n )\n ) {\n return;\n }\n onClose();\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n window.addEventListener(\"pointerdown\", handlePointerDown, true);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown, true);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [onClose]);\n\n const previewCaptureKey = items\n .map(\n (item) =>\n `${item.node.id}:${previewCacheToken(item.preview)}:${item.previewRevision ?? \"\"}`\n )\n .join(\"|\");\n\n useEffect(() => {\n if (!isMinimizedStack) {\n return;\n }\n setMinimizedStackScrollOffset(initialMinimizedStackScrollOffset);\n }, [initialMinimizedStackScrollOffset, isMinimizedStack, items.length]);\n\n useEffect(() => {\n if (!isMinimizedStack) {\n return;\n }\n const viewport = minimizedStackViewportRef.current;\n if (!viewport) {\n return;\n }\n const handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setMinimizedStackScrollOffset((current) =>\n Math.min(\n minimizedStackMaxScrollOffset,\n Math.max(0, current + event.deltaY)\n )\n );\n };\n viewport.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => viewport.removeEventListener(\"wheel\", handleWheel);\n }, [isMinimizedStack, minimizedStackMaxScrollOffset]);\n\n useEffect(() => {\n if (!capturePreview || isContextMenu) {\n return;\n }\n let cancelled = false;\n const missingItems = items.filter((item) => {\n const revision = item.previewRevision;\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] ??\n readDockPopupPreviewImage(previewMemoryKey);\n const hasCapturedPreview =\n capturedPreview !== undefined && capturedPreview.revision === revision;\n const shouldCaptureMissingPreview = !item.preview && !hasCapturedPreview;\n return (\n shouldCaptureMissingPreview &&\n !pendingDockPopupPreviewMemoryKeys.has(previewMemoryKey)\n );\n });\n if (missingItems.length === 0) {\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.batch\",\n debugDiagnostics,\n {\n itemCount: items.length,\n missingNodeIds: []\n }\n );\n return () => {\n cancelled = true;\n };\n }\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.batch\",\n debugDiagnostics,\n {\n itemCount: items.length,\n missingNodeIds: missingItems.map((item) => item.node.id)\n }\n );\n\n for (const item of missingItems) {\n pendingDockPopupPreviewMemoryKeys.add(\n resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n )\n );\n }\n\n void (async () => {\n for (const item of missingItems) {\n if (cancelled) {\n break;\n }\n\n const revision = item.previewRevision;\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.started\",\n debugDiagnostics,\n {\n isMinimized: item.isMinimized,\n nodeId: item.node.id,\n revision\n }\n );\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const cacheKey = resolveDockPopupPreviewCacheKey(\n resolveDockPreviewCacheKey?.(item.node) ?? null,\n revision\n );\n if (item.isMinimized && cacheKey) {\n const minimizedPersistedPreview = await readPersistedDockPreview(\n dockPreviewCache,\n cacheKey\n );\n if (cancelled) {\n break;\n }\n if (minimizedPersistedPreview) {\n const persistedPreview: WorkbenchDockPreviewContent = {\n kind: \"image\",\n src: minimizedPersistedPreview\n };\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n minimizedPersistedPreview\n );\n writeDockPopupPreviewImage(\n previewMemoryKey,\n persistedPreview,\n revision\n );\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: {\n preview: persistedPreview,\n revision\n }\n }));\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n continue;\n }\n }\n\n const preview = normalizeDockPopupPreviewContentResult(\n item.isMinimized\n ? ((await capturePreview?.(item)) ??\n (await captureWorkbenchNodePreviewImage(item.node.id, {\n bypassCache: false\n })))\n : await Promise.resolve(capturePreview?.(item) ?? null).catch(\n () => null\n ),\n revision\n );\n if (cancelled) {\n break;\n }\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.resolved\",\n debugDiagnostics,\n {\n hasPreview: Boolean(preview),\n nodeId: item.node.id,\n providerRevision: preview?.revision ?? null,\n revision\n }\n );\n if (preview) {\n if (preview.kind === \"image\") {\n writeCachedWorkbenchNodePreviewImage(item.node.id, preview.src);\n }\n writeDockPopupPreviewImage(previewMemoryKey, preview, revision);\n if (cacheKey && preview.kind === \"image\") {\n dockPreviewCache?.write({\n key: cacheKey,\n previewImageUrl: preview.src\n });\n }\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: { preview, revision }\n }));\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n continue;\n }\n\n const fallbackPersistedPreview =\n !item.isMinimized && cacheKey\n ? await readPersistedDockPreview(dockPreviewCache, cacheKey)\n : null;\n if (cancelled) {\n break;\n }\n if (fallbackPersistedPreview) {\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n fallbackPersistedPreview\n );\n }\n if (fallbackPersistedPreview || item.isMinimized) {\n const fallbackPreview: WorkbenchDockPreviewContent | null =\n fallbackPersistedPreview\n ? { kind: \"image\", src: fallbackPersistedPreview }\n : null;\n writeDockPopupPreviewImage(\n previewMemoryKey,\n fallbackPreview,\n revision\n );\n }\n if (!cancelled) {\n const fallbackPreview: WorkbenchDockPreviewContent | null =\n fallbackPersistedPreview\n ? { kind: \"image\", src: fallbackPersistedPreview }\n : null;\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: { preview: fallbackPreview, revision }\n }));\n }\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n }\n })().catch(() => {\n for (const item of missingItems) {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n writeDockPopupPreviewImage(\n previewMemoryKey,\n null,\n item.previewRevision\n );\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n }\n if (!cancelled) {\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n ...Object.fromEntries(\n missingItems.map((item) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n return [\n previewMemoryKey,\n { preview: null, revision: item.previewRevision }\n ];\n })\n )\n }));\n }\n });\n\n return () => {\n cancelled = true;\n for (const item of missingItems) {\n pendingDockPopupPreviewMemoryKeys.delete(\n resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n )\n );\n }\n };\n }, [\n capturePreview,\n dockPreviewCache,\n isContextMenu,\n items,\n previewCaptureKey,\n resolveDockPreviewCacheKey\n ]);\n\n const content = (\n <div\n ref={popupRootRef}\n className=\"desktop-dock-popup-root\"\n data-dock-placement={placement}\n data-desktop-dock-popup-root=\"true\"\n data-popup-variant={resolvedVariant}\n style={popupStyle}\n >\n <div\n aria-label={label}\n className={cn(\n \"desktop-dock-popup relative origin-bottom rounded-lg border border-[var(--border-1)] bg-background-fronted text-[var(--text-primary)] shadow-panel motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:slide-in-from-bottom-2 motion-safe:duration-[175ms] motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:animate-none\",\n isContextMenu ? \"p-1\" : \"p-3\",\n isLeftMinimizedStack\n ? \"w-full min-w-0 max-w-none\"\n : \"w-[min(var(--desktop-dock-popup-width,366px),calc(100vw-32px))]\"\n )}\n data-desktop-dock-popup-panel=\"true\"\n data-popup-variant={resolvedVariant}\n onPointerDown={(event) => event.stopPropagation()}\n onPointerMove={\n isMinimizedStack\n ? (event) => setPointer({ x: event.clientX, y: event.clientY })\n : undefined\n }\n onPointerLeave={isMinimizedStack ? () => setPointer(null) : undefined}\n role=\"dialog\"\n style={panelStyle}\n >\n {isContextMenu ? (\n <WorkbenchHostDockContextMenu\n canCreateNew={showCreateNew !== false}\n canEnterFullscreen={canEnterFullscreen === true}\n canShowAllWindows={canShowAllWindows === true}\n dockRetention={dockRetention}\n fullscreenLabel={fullscreenLabel}\n hideLabel={hideLabel}\n items={items}\n newWindowLabel={newWindowLabel}\n onCreateNew={onCreateNew}\n onEnterFullscreen={onEnterFullscreen}\n onHide={onHide}\n onQuit={onQuit}\n onRunDockRetentionAction={onRunDockRetentionAction}\n onSelectNode={onSelectNode}\n onShowAllWindows={onShowAllWindows}\n openLabel={openLabel}\n quitLabel={quitLabel}\n showAllWindowsLabel={showAllWindowsLabel}\n showOpen={showOpen === true}\n />\n ) : (\n <>\n <div className=\"mb-2.5 flex items-center justify-between\">\n <span className=\"min-w-0 truncate text-sm font-semibold\">\n {label}\n </span>\n </div>\n {isMinimizedStack ? (\n <div\n ref={minimizedStackViewportRef}\n className=\"desktop-dock-popup__minimized-stack-viewport\"\n style={{\n height: minimizedStackViewportHeightPx,\n ...(isLeftMinimizedStack\n ? { paddingLeft: minimizedStackLeftGutterPx }\n : {})\n }}\n >\n <div\n className=\"desktop-dock-popup__minimized-stack-track\"\n style={{\n minHeight: minimizedStackTrackHeightPx,\n transform: `translate(${minimizedStackTrackTranslateXPx}px, ${-minimizedStackScrollOffset}px)`\n }}\n >\n {items.map((item, index) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] !== undefined\n ? capturedPreviewByMemoryKey[previewMemoryKey]\n : readDockPopupPreviewImage(previewMemoryKey);\n const previewState = resolveDockPopupItemPreviewState(\n item,\n capturedPreview,\n Boolean(capturePreview)\n );\n return (\n <WorkbenchHostDockPopupCard\n key={item.node.id}\n ref={registerCard(item.node.id)}\n closeWindowLabel={closeWindowLabel}\n item={item}\n labelMode={resolvedLabelMode}\n onCloseNode={onCloseNode}\n onSelectNode={onSelectNode}\n previewState={previewState}\n style={{\n ...resolvePopupFanCardStyle(\n index,\n items.length,\n placement\n ),\n ...resolvePopupCardMagnificationStyle(\n pointer,\n cardElementsRef.current.get(item.node.id) ?? null\n )\n }}\n variant={resolvedVariant}\n />\n );\n })}\n </div>\n </div>\n ) : (\n <div className=\"grid max-h-[min(52vh,420px)] grid-cols-[repeat(var(--desktop-dock-popup-columns,2),165px)] gap-2 overflow-auto overscroll-contain\">\n {items.map((item) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] !== undefined\n ? capturedPreviewByMemoryKey[previewMemoryKey]\n : readDockPopupPreviewImage(previewMemoryKey);\n const previewState = resolveDockPopupItemPreviewState(\n item,\n capturedPreview,\n Boolean(capturePreview)\n );\n return (\n <WorkbenchHostDockPopupCard\n key={item.node.id}\n ref={registerCard(item.node.id)}\n closeWindowLabel={closeWindowLabel}\n item={item}\n labelMode={resolvedLabelMode}\n onCloseNode={onCloseNode}\n onSelectNode={onSelectNode}\n previewState={previewState}\n variant={resolvedVariant}\n />\n );\n })}\n {showCreateNew !== false ? (\n <button\n className=\"flex h-[103px] w-[165px] min-w-0 flex-col items-center justify-center gap-2 rounded-[8px] border border-dashed border-[var(--border-1)] bg-transparency-block text-center text-[var(--text-secondary)] transition-colors hover:bg-transparency-hover hover:text-[var(--text-primary)]\"\n type=\"button\"\n onClick={onCreateNew}\n >\n <FileCreateIcon\n aria-hidden=\"true\"\n className=\"text-[var(--text-primary)]\"\n size={28}\n />\n <span className=\"text-xs font-semibold text-[var(--text-primary)]\">\n {newWindowLabel}\n </span>\n </button>\n ) : null}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n\n if (typeof document === \"undefined\" || !document.body) {\n return content;\n }\n return createPortal(content, document.body);\n}\n\nfunction WorkbenchHostDockContextMenu({\n canCreateNew,\n canEnterFullscreen,\n canShowAllWindows,\n dockRetention,\n fullscreenLabel,\n hideLabel,\n items,\n newWindowLabel,\n onCreateNew,\n onEnterFullscreen,\n onHide,\n onQuit,\n onRunDockRetentionAction,\n onSelectNode,\n onShowAllWindows,\n openLabel,\n quitLabel,\n showAllWindowsLabel,\n showOpen\n}: {\n canCreateNew: boolean;\n canEnterFullscreen: boolean;\n canShowAllWindows: boolean;\n dockRetention?: WorkbenchHostDockPopupRetentionAction | null;\n fullscreenLabel?: string;\n hideLabel?: string;\n items: WorkbenchHostDockPopupItem[];\n newWindowLabel: string;\n onCreateNew: () => void;\n onEnterFullscreen?: () => void;\n onHide?: () => void;\n onQuit?: () => void;\n onRunDockRetentionAction?: () => void;\n onSelectNode: (nodeId: string) => void;\n onShowAllWindows?: () => void;\n openLabel?: string;\n quitLabel?: string;\n showAllWindowsLabel?: string;\n showOpen: boolean;\n}) {\n const hasOpenWindows = items.length > 0;\n const hasNewWindowCommand = hasOpenWindows && canCreateNew;\n const hasOpenCommand = !hasOpenWindows;\n const hasDockActionGroup =\n Boolean(dockRetention) || hasNewWindowCommand || hasOpenCommand;\n const hasWindowActionGroup = hasOpenWindows;\n\n return (\n <div\n className=\"flex min-w-0 flex-col gap-1\"\n data-desktop-dock-context-menu=\"true\"\n role=\"menu\"\n >\n {hasOpenWindows ? (\n <>\n <div className=\"max-h-48 min-w-0 overflow-auto overscroll-contain\">\n {items.map((item) => (\n <WorkbenchHostDockContextMenuItem\n key={item.node.id}\n checked={!item.isMinimized}\n label={item.title?.trim() || item.node.title}\n onSelect={() => onSelectNode(item.node.id)}\n />\n ))}\n </div>\n </>\n ) : null}\n {hasOpenWindows && (hasDockActionGroup || hasWindowActionGroup) ? (\n <WorkbenchHostDockContextMenuSeparator />\n ) : null}\n {dockRetention ? (\n <WorkbenchHostDockContextMenuItem\n checked={dockRetention.checked}\n checkedIcon={\n <PinFilledIcon\n aria-hidden=\"true\"\n className=\"size-4 text-[var(--tutti-purple)]\"\n />\n }\n disabled={dockRetention.disabled}\n icon={<PinIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={dockRetention.pendingLabel ?? dockRetention.label}\n onSelect={onRunDockRetentionAction}\n />\n ) : null}\n {hasNewWindowCommand ? (\n <WorkbenchHostDockContextMenuItem\n icon={<FileCreateIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={newWindowLabel}\n onSelect={onCreateNew}\n />\n ) : null}\n {hasOpenCommand ? (\n <WorkbenchHostDockContextMenuItem\n disabled={!showOpen}\n icon={<FileCreateIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={openLabel}\n onSelect={onCreateNew}\n />\n ) : null}\n {hasOpenWindows ? (\n <>\n {hasDockActionGroup ? (\n <WorkbenchHostDockContextMenuSeparator />\n ) : null}\n {canShowAllWindows && onShowAllWindows ? (\n <WorkbenchHostDockContextMenuItem\n icon={\n <OverviewLayoutIcon aria-hidden=\"true\" className=\"size-4\" />\n }\n label={showAllWindowsLabel}\n onSelect={onShowAllWindows}\n />\n ) : null}\n <WorkbenchHostDockContextMenuItem\n disabled={!canEnterFullscreen || !onEnterFullscreen}\n icon={<MaximizeIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={fullscreenLabel}\n onSelect={onEnterFullscreen}\n />\n <WorkbenchHostDockContextMenuItem\n disabled={!onHide}\n icon={<MinimizeIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={hideLabel}\n onSelect={onHide}\n />\n <WorkbenchHostDockContextMenuItem\n disabled={!onQuit}\n icon={<CloseIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={quitLabel}\n onSelect={onQuit}\n />\n </>\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchHostDockContextMenuItem({\n checked,\n checkedIcon,\n disabled,\n icon,\n label,\n onSelect\n}: {\n checked?: boolean;\n checkedIcon?: ReactNode;\n disabled?: boolean;\n icon?: ReactNode;\n label?: string;\n onSelect?: () => void;\n}) {\n return (\n <button\n className={cn(\n \"flex h-8 w-full min-w-0 items-center gap-2 rounded-md px-2 text-left text-sm text-[var(--text-primary)] transition-colors\",\n disabled\n ? \"cursor-default opacity-45\"\n : \"hover:bg-transparency-hover focus-visible:bg-transparency-hover focus-visible:outline-none\"\n )}\n disabled={disabled}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n if (disabled || !onSelect) {\n return;\n }\n onSelect();\n }}\n >\n <span className=\"flex size-4 shrink-0 items-center justify-center text-[var(--text-secondary)]\">\n {checked && checkedIcon ? (\n checkedIcon\n ) : checked ? (\n <CheckIcon\n aria-hidden=\"true\"\n className=\"size-4 text-[var(--tutti-purple)]\"\n />\n ) : (\n (icon ?? null)\n )}\n </span>\n <span className=\"min-w-0 truncate\">{label}</span>\n </button>\n );\n}\n\nfunction WorkbenchHostDockContextMenuSeparator() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"mx-2 my-1 h-px bg-[var(--border-1)]\"\n role=\"separator\"\n />\n );\n}\n\nfunction readPersistedDockPreview(\n dockPreviewCache: WorkbenchDockPreviewCache | undefined,\n cacheKey: WorkbenchDockPreviewCacheKey | null\n): Promise<string | null> {\n if (!cacheKey) {\n return Promise.resolve(null);\n }\n return (\n dockPreviewCache?.read(cacheKey).catch(() => null) ?? Promise.resolve(null)\n );\n}\n\nfunction resolveDockPopupPreviewCacheKey(\n cacheKey: WorkbenchDockPreviewCacheKey | null,\n revision: string | null\n): WorkbenchDockPreviewCacheKey | null {\n return cacheKey ? { ...cacheKey, revision } : null;\n}\n\nfunction resolveDockPopupPreviewMemoryKey(\n node: WorkbenchNode<WorkbenchHostNodeData>,\n cacheKey: WorkbenchDockPreviewCacheKey | null\n): string {\n if (!cacheKey) {\n return `node:${node.id}`;\n }\n return `cache:${JSON.stringify({\n instanceId: cacheKey.instanceId,\n instanceKey: cacheKey.instanceKey ?? null,\n nodeId: cacheKey.nodeId,\n typeId: cacheKey.typeId,\n workspaceId: cacheKey.workspaceId\n })}`;\n}\n\nfunction normalizeDockPopupPreviewContentResult(\n preview: WorkbenchDockPreviewContent | string | null | undefined,\n revision: string | null\n): WorkbenchDockPreviewContent | null {\n if (!preview) {\n return null;\n }\n if (typeof preview === \"string\") {\n return { kind: \"image\", revision: revision ?? undefined, src: preview };\n }\n return {\n ...preview,\n revision: preview.revision ?? revision ?? undefined\n };\n}\n\nfunction resolveDockPopupItemPreviewState(\n item: WorkbenchHostDockPopupItem,\n capturedPreview: WorkbenchHostDockPopupCapturedPreview | undefined,\n hasPreviewProvider: boolean\n): WorkbenchHostDockPopupPreviewState {\n const revision = item.previewRevision;\n if (item.preview) {\n return { preview: item.preview, status: \"ready\" };\n }\n if (\n capturedPreview &&\n capturedPreview.revision === revision &&\n capturedPreview.preview\n ) {\n return { preview: capturedPreview.preview, status: \"ready\" };\n }\n if (\n (capturedPreview !== undefined && capturedPreview.revision === revision) ||\n !hasPreviewProvider\n ) {\n return { status: \"fallback\" };\n }\n return { status: \"loading\" };\n}\n\nfunction previewCacheToken(\n preview: WorkbenchDockPreviewContent | null | undefined\n): string {\n if (!preview) {\n return \"\";\n }\n switch (preview.kind) {\n case \"component\":\n return `component:${preview.revision ?? \"\"}`;\n case \"image\":\n return `image:${preview.revision ?? \"\"}:${preview.src}`;\n }\n}\n\nfunction logWorkbenchDockPopupDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n details: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level: \"info\",\n source: \"workbench-dock\"\n })\n ).catch(() => undefined);\n}\n\nfunction rectToDiagnostic(element: HTMLElement): Record<string, number> {\n const rect = element.getBoundingClientRect();\n return {\n bottom: Math.round(rect.bottom),\n height: Math.round(rect.height),\n left: Math.round(rect.left),\n right: Math.round(rect.right),\n top: Math.round(rect.top),\n width: Math.round(rect.width)\n };\n}\n\nfunction styleToDiagnostic(element: HTMLElement): Record<string, string> {\n const style = window.getComputedStyle(element);\n return {\n display: style.display,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n position: style.position,\n transform: style.transform,\n visibility: style.visibility,\n zIndex: style.zIndex\n };\n}\n\ninterface WorkbenchHostDockPopupCardProps {\n closeWindowLabel: (title: string) => string;\n item: WorkbenchHostDockPopupItem;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n onCloseNode: (nodeId: string) => void;\n onSelectNode: (nodeId: string) => void;\n previewState: WorkbenchHostDockPopupPreviewState;\n style?: CSSProperties;\n variant?: WorkbenchHostDockPopupVariant;\n}\n\nconst WorkbenchHostDockPopupCard = forwardRef<\n HTMLDivElement,\n WorkbenchHostDockPopupCardProps\n>(function WorkbenchHostDockPopupCard(\n {\n closeWindowLabel,\n item,\n labelMode,\n onCloseNode,\n onSelectNode,\n previewState,\n style,\n variant\n },\n ref\n) {\n const title = item.title?.trim() || item.node.title;\n const isMinimizedStack = variant === \"minimized-stack\";\n const [isLaunching, setIsLaunching] = useState(false);\n const launchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (launchTimerRef.current !== null) {\n clearTimeout(launchTimerRef.current);\n }\n },\n []\n );\n\n const handleSelect = useCallback(() => {\n if (!isMinimizedStack) {\n onSelectNode(item.node.id);\n return;\n }\n if (launchTimerRef.current !== null) {\n return;\n }\n setIsLaunching(true);\n launchTimerRef.current = setTimeout(() => {\n launchTimerRef.current = null;\n onSelectNode(item.node.id);\n }, dockPopupMinimizedStackLaunchDisappearMs);\n }, [isMinimizedStack, item.node.id, onSelectNode]);\n const handleSelectKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") {\n return;\n }\n event.preventDefault();\n handleSelect();\n },\n [handleSelect]\n );\n const hasReadyPreview = previewState.status === \"ready\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"group/dock-popup-card relative flex h-[103px] w-[165px] min-w-0 flex-col overflow-hidden rounded-[8px] border border-[var(--border-1)] bg-background-fronted text-left text-[var(--text-primary)] transition-[border-color,color] duration-150\",\n item.isMinimized && \"text-[var(--text-secondary)]\"\n )}\n data-active={item.isFocused ? \"true\" : undefined}\n data-desktop-dock-popup-card=\"true\"\n data-fan-card={isMinimizedStack ? \"true\" : undefined}\n data-launching={isLaunching ? \"true\" : undefined}\n data-minimized={item.isMinimized ? \"true\" : undefined}\n style={style}\n >\n <div\n aria-label={title}\n data-active={item.isFocused ? \"true\" : undefined}\n className={cn(\n \"relative flex min-h-0 min-w-0 flex-1 cursor-pointer flex-col overflow-hidden rounded-md bg-transparent text-inherit\",\n hasReadyPreview ? \"p-0\" : \"p-1\"\n )}\n role=\"button\"\n tabIndex={0}\n onClick={handleSelect}\n onKeyDown={handleSelectKeyDown}\n >\n <WorkbenchHostDockPopupCardPreview previewState={previewState} />\n {labelMode === \"hover-overlay\" && item.title?.trim() ? (\n <WorkbenchHostDockPopupCardLabel title={item.title} />\n ) : null}\n </div>\n <Button\n aria-label={closeWindowLabel(title)}\n className=\"absolute top-1.5 right-1.5 z-[2] rounded-full bg-[var(--background-fronted)] opacity-0 transition-[background-color,opacity] duration-150 hover:bg-[var(--background-fronted)] focus-visible:bg-[var(--background-fronted)] group-hover/dock-popup-card:opacity-100 group-focus-within/dock-popup-card:opacity-100 focus-visible:opacity-100\"\n size=\"icon-sm\"\n title={closeWindowLabel(title)}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onCloseNode(item.node.id);\n }}\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n {item.isFocused ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-[3] rounded-md shadow-[inset_0_0_0_2px_var(--border-focus)]\"\n data-desktop-dock-popup-card-active-overlay=\"true\"\n />\n ) : null}\n {isMinimizedStack ? (\n <span className=\"desktop-dock-popup__fan-title-tip\" title={title}>\n {title}\n </span>\n ) : null}\n </div>\n );\n});\n\nfunction WorkbenchHostDockPopupCardPreview({\n previewState\n}: {\n previewState: WorkbenchHostDockPopupPreviewState;\n}) {\n if (previewState.status !== \"ready\") {\n return (\n <span\n className=\"flex min-h-0 min-w-0 flex-1 flex-col justify-center gap-[7px] rounded-md border border-[var(--border-1)] bg-transparency-block px-3 py-[11px]\"\n aria-hidden=\"true\"\n data-preview-state={previewState.status}\n >\n <span className=\"block h-[7px] w-[72%] rounded-full bg-transparency-hover\" />\n <span className=\"block h-[7px] w-[58%] rounded-full bg-transparency-hover\" />\n <span className=\"block h-[7px] w-[34%] rounded-full bg-transparency-hover\" />\n </span>\n );\n }\n\n const preview = previewState.preview;\n if (preview.kind === \"component\") {\n return (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md\"\n aria-hidden=\"true\"\n data-preview-kind={preview.kind}\n data-preview-state={previewState.status}\n >\n {preview.element}\n </span>\n );\n }\n\n return (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md\"\n aria-hidden=\"true\"\n data-preview-kind={preview.kind}\n data-preview-state={previewState.status}\n >\n <img\n alt=\"\"\n className=\"block h-full max-h-full w-full max-w-full object-contain object-center\"\n draggable={false}\n src={preview.src}\n />\n </span>\n );\n}\n\nfunction WorkbenchHostDockPopupCardLabel({ title }: { title: string }) {\n return (\n <span\n className=\"pointer-events-none absolute inset-x-0 bottom-0 z-[1] flex h-[30px] items-end px-[10px] pb-0.5 text-[var(--white-stationary)] opacity-0 transition-opacity duration-150 [text-shadow:0_1px_2px_rgb(0_0_0_/_20%)] group-hover/dock-popup-card:opacity-100 group-focus-within/dock-popup-card:opacity-100\"\n style={{\n background:\n \"linear-gradient(180deg, transparent 0%, color-mix(in srgb, hsl(var(--card)) 28%, transparent) 18%, color-mix(in srgb, hsl(var(--card)) 82%, transparent) 56%, color-mix(in srgb, hsl(var(--card)) 98%, transparent) 100%)\"\n }}\n title={title}\n >\n <span className=\"desktop-dock-popup__title-viewport block min-w-0 flex-1 overflow-hidden whitespace-nowrap\">\n <span className=\"desktop-dock-popup__title-marquee inline-block max-w-full overflow-hidden text-[12px] font-semibold leading-5 text-ellipsis whitespace-nowrap\">\n {title}\n </span>\n </span>\n </span>\n );\n}\n","import type { WorkbenchDockPlacement } from \"../react/types.ts\";\n\nconst minimizedStackViewportMarginPx = 56;\nconst minimizedStackViewportCapPx = 112;\nexport const minimizedStackCardWidthPx = 118;\nexport const minimizedStackLeftPlacementGapPx = 4;\nexport const minimizedStackLeftDockClearancePx = 2;\nexport const workbenchLeftDockLeftInsetPx = 4;\nexport const workbenchLeftDockViewportWidthPx = 124;\nexport const minimizedStackLeftGutterMinPx = 4;\nexport const minimizedStackLeftPopupNudgeLeftPx = 60;\nexport const minimizedStackLeftPopupNudgeDownPx = 32;\nconst minimizedStackLeftGutterBufferPx = 8;\nexport const minimizedStackTitleTipGapPx = 12;\nexport const minimizedStackTitleTipMaxWidthPx = 220;\nexport const minimizedStackFanStepXPx = 6;\nexport const minimizedStackFanStepYPx = 78;\nexport const minimizedStackFanBaseOffsetYPx = 18;\nexport const minimizedStackStackPaddingPx = 96;\n\nexport function resolveMinimizedStackCardHeightPx(): number {\n return Math.round((minimizedStackCardWidthPx * 10) / 16);\n}\n\nexport function resolveMinimizedStackTrackHeightPx(itemCount: number): number {\n const safeCount = Math.max(1, itemCount);\n return (\n minimizedStackFanBaseOffsetYPx +\n Math.max(0, safeCount - 1) * minimizedStackFanStepYPx +\n resolveMinimizedStackCardHeightPx() +\n minimizedStackStackPaddingPx\n );\n}\n\nexport function resolveMaxMinimizedStackTrackTranslateXPx(\n itemCount: number,\n placement: WorkbenchDockPlacement\n): number {\n if (placement !== \"left\" || itemCount <= 1) {\n return 0;\n }\n return (itemCount - 1) * minimizedStackFanStepXPx;\n}\n\nexport function resolveMinimizedStackLeftGutterPx(input: {\n itemCount: number;\n placement: WorkbenchDockPlacement;\n scrollOffset?: number;\n trackHeightPx?: number;\n viewportHeightPx?: number;\n trackTranslateXPx?: number;\n}): number {\n if (input.placement !== \"left\" || input.itemCount <= 0) {\n return 0;\n }\n\n if (\n input.scrollOffset === undefined ||\n input.trackHeightPx === undefined ||\n input.viewportHeightPx === undefined ||\n input.trackTranslateXPx === undefined\n ) {\n return (\n minimizedStackLeftGutterMinPx +\n resolveMaxMinimizedStackTrackTranslateXPx(\n input.itemCount,\n input.placement\n ) +\n minimizedStackLeftGutterBufferPx\n );\n }\n\n const cardHeightPx = resolveMinimizedStackCardHeightPx();\n const visibleTop = input.scrollOffset;\n const visibleBottom = input.scrollOffset + input.viewportHeightPx;\n let minCardLeftPx = 0;\n\n for (let index = 0; index < input.itemCount; index += 1) {\n const cappedIndex = Math.min(index, Math.max(0, input.itemCount - 1));\n const fanYPx =\n -minimizedStackFanBaseOffsetYPx - index * minimizedStackFanStepYPx;\n const cardTop = input.trackHeightPx + fanYPx - cardHeightPx;\n const cardBottom = input.trackHeightPx + fanYPx;\n if (cardBottom < visibleTop || cardTop > visibleBottom) {\n continue;\n }\n\n const fanXPx = -cappedIndex * minimizedStackFanStepXPx;\n const cardLeftPx = input.trackTranslateXPx + fanXPx;\n minCardLeftPx = Math.min(minCardLeftPx, cardLeftPx);\n }\n\n return Math.max(\n minimizedStackLeftGutterMinPx,\n -minCardLeftPx + minimizedStackLeftGutterBufferPx\n );\n}\n\nexport function resolveMinimizedStackPanelWidthPx(\n itemCount: number,\n placement: WorkbenchDockPlacement,\n options?: { leftGutterPx?: number }\n): number {\n const leftGutterPx =\n options?.leftGutterPx ??\n resolveMinimizedStackLeftGutterPx({ itemCount, placement });\n return (\n leftGutterPx +\n minimizedStackCardWidthPx +\n minimizedStackTitleTipGapPx +\n minimizedStackTitleTipMaxWidthPx\n );\n}\n\nexport function resolveMinimizedStackPopupLeftPx(input: {\n anchorLeft: number;\n anchorWidth: number;\n dockRightPx?: number;\n leftGutterPx?: number;\n}): number {\n const fromAnchor =\n input.anchorLeft + input.anchorWidth + minimizedStackLeftPlacementGapPx;\n const dockRight =\n input.dockRightPx ??\n workbenchLeftDockLeftInsetPx + workbenchLeftDockViewportWidthPx;\n const fromDock = dockRight + minimizedStackLeftDockClearancePx;\n const baseLeft = Math.max(fromAnchor, fromDock);\n const leftGutterPx = input.leftGutterPx ?? minimizedStackLeftGutterMinPx;\n return (\n baseLeft -\n Math.max(0, leftGutterPx - minimizedStackLeftGutterMinPx) -\n minimizedStackLeftPopupNudgeLeftPx\n );\n}\n\nexport function resolveMinimizedStackPopupTopPx(input: {\n anchorTop: number;\n}): number {\n return input.anchorTop + minimizedStackLeftPopupNudgeDownPx;\n}\n\nexport function resolveMinimizedStackViewportHeightPx(input: {\n anchorCenterY: number;\n placement: WorkbenchDockPlacement;\n trackHeightPx: number;\n viewportHeightPx?: number;\n}): number {\n const viewportCap =\n input.viewportHeightPx ??\n (typeof window === \"undefined\"\n ? input.trackHeightPx\n : window.innerHeight - minimizedStackViewportCapPx);\n\n if (input.placement === \"left\") {\n const availableAbove = Math.max(\n 160,\n input.anchorCenterY - minimizedStackViewportMarginPx\n );\n return Math.min(input.trackHeightPx, availableAbove, viewportCap);\n }\n\n return Math.min(input.trackHeightPx, viewportCap);\n}\n\nexport function resolveInitialMinimizedStackScrollOffset(input: {\n maxScrollOffset: number;\n}): number {\n return input.maxScrollOffset;\n}\n\nexport function resolveMinimizedStackFocalCardIndex(input: {\n itemCount: number;\n scrollOffset: number;\n trackHeightPx: number;\n viewportHeightPx: number;\n}): number {\n if (input.itemCount <= 1) {\n return 0;\n }\n\n const cardHeightPx = resolveMinimizedStackCardHeightPx();\n const viewportCenterY = input.scrollOffset + input.viewportHeightPx / 2;\n const rawIndex =\n (input.trackHeightPx -\n minimizedStackFanBaseOffsetYPx -\n cardHeightPx / 2 -\n viewportCenterY) /\n minimizedStackFanStepYPx;\n\n return Math.min(input.itemCount - 1, Math.max(0, rawIndex));\n}\n\nexport function resolveMinimizedStackFanXPx(input: {\n focalIndex: number;\n itemCount: number;\n placement: WorkbenchDockPlacement;\n}): number {\n if (input.itemCount <= 0) {\n return 0;\n }\n\n const cappedIndex = Math.min(\n input.focalIndex,\n Math.max(0, input.itemCount - 1)\n );\n const fanDirection = input.placement === \"left\" ? -1 : 1;\n return cappedIndex * minimizedStackFanStepXPx * fanDirection;\n}\n\nexport function resolveMinimizedStackTrackTranslateXPx(input: {\n itemCount: number;\n placement: WorkbenchDockPlacement;\n scrollOffset: number;\n trackHeightPx: number;\n viewportHeightPx: number;\n}): number {\n if (input.itemCount <= 0) {\n return 0;\n }\n\n const focalIndex = resolveMinimizedStackFocalCardIndex({\n itemCount: input.itemCount,\n scrollOffset: input.scrollOffset,\n trackHeightPx: input.trackHeightPx,\n viewportHeightPx: input.viewportHeightPx\n });\n const fanXPx = resolveMinimizedStackFanXPx({\n focalIndex,\n itemCount: input.itemCount,\n placement: input.placement\n });\n\n return -fanXPx;\n}\n","import type { WorkbenchRenderWindowHeader } from \"../react/types.ts\";\nimport type {\n WorkbenchHostNodeData,\n WorkbenchHostNodeHeaderContext\n} from \"./types.ts\";\n\nexport function createWorkbenchHostNodeHeaderWindowActions(\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0],\n input: {\n requestNodeClose?: (nodeId: string) => void;\n } = {}\n): WorkbenchHostNodeHeaderContext[\"windowActions\"] {\n return {\n applyQuickLayout(target) {\n context.controller.commands.applyQuickLayout(context.node.id, target);\n },\n close() {\n if (input.requestNodeClose) {\n input.requestNodeClose(context.node.id);\n return;\n }\n context.controller.commands.closeNode(context.node.id);\n },\n focus() {\n context.controller.commands.focusNode(context.node.id);\n },\n minimize() {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n },\n resize(frame) {\n context.controller.commands.resizeNode(context.node.id, frame);\n },\n toggleDisplayMode() {\n if (context.node.displayMode === \"fullscreen\") {\n context.controller.commands.exitFullscreen(context.node.id);\n return;\n }\n context.controller.commands.enterFullscreen(context.node.id);\n }\n };\n}\n","import { selectFocusedWorkbenchNode } from \"../core/selectors.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader\n} from \"../react/types.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport { createWorkbenchHostNodeHeaderWindowActions } from \"./windowActions.ts\";\nimport type {\n WorkbenchHostExternalStateSource,\n WorkbenchHostHandle,\n WorkbenchHostNodeBodyContext,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostNodeHeaderContext\n} from \"./types.ts\";\n\nexport function createWorkbenchHostNodeBodyContext<\n TExternalNodeState,\n TExternalWorkspaceState\n>({\n context,\n externalStateSource,\n host,\n workspaceId\n}: {\n context: WorkbenchRenderNodeContext<WorkbenchHostNodeData>;\n definition: WorkbenchHostNodeDefinition<\n TExternalNodeState,\n TExternalWorkspaceState\n >;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n workspaceId: string;\n}): WorkbenchHostNodeBodyContext<TExternalNodeState, TExternalWorkspaceState> {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node: context.node,\n workspaceId\n });\n\n return {\n activation: context.node.data.activation ?? null,\n displayMode: context.node.displayMode,\n externalNodeState: externalState.externalNodeState as TExternalNodeState,\n externalWorkspaceState:\n externalState.externalWorkspaceState as TExternalWorkspaceState,\n focus() {\n host.focusNode(context.node.id);\n },\n host,\n instanceId: context.node.data.instanceId,\n instanceKey: context.node.data.instanceKey ?? null,\n isFocused:\n selectFocusedWorkbenchNode(host.getSnapshot())?.id === context.node.id,\n node: context.node,\n setNodeRuntimeState(state) {\n host.setNodeRuntimeState(context.node.id, state);\n },\n setSnapshotNodeState(state) {\n host.setSnapshotNodeState(context.node.id, state);\n }\n };\n}\n\nexport function createWorkbenchHostNodeHeaderContext<\n TExternalNodeState,\n TExternalWorkspaceState\n>({\n context,\n externalStateSource,\n host,\n workspaceId\n}: {\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0];\n definition: WorkbenchHostNodeDefinition<\n TExternalNodeState,\n TExternalWorkspaceState\n >;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n workspaceId: string;\n}): WorkbenchHostNodeHeaderContext<\n TExternalNodeState,\n TExternalWorkspaceState\n> {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node: context.node,\n workspaceId\n });\n\n return {\n activation: context.node.data.activation ?? null,\n defaultActions: context.defaultActions,\n displayMode: context.node.displayMode,\n dragHandleProps: context.dragHandleProps,\n externalNodeState: externalState.externalNodeState as TExternalNodeState,\n externalWorkspaceState:\n externalState.externalWorkspaceState as TExternalWorkspaceState,\n instanceId: context.node.data.instanceId,\n instanceKey: context.node.data.instanceKey ?? null,\n isFocused:\n selectFocusedWorkbenchNode(host.getSnapshot())?.id === context.node.id,\n node: context.node,\n surfaceSize: context.surfaceSize,\n windowActions: createWorkbenchHostNodeHeaderWindowActions(context, {\n requestNodeClose: (nodeId) => host.requestNodeClose(nodeId)\n })\n };\n}\n","import type { WorkbenchWindowActionContext } from \"../react/types.ts\";\nimport { WorkbenchWindowTrafficLights } from \"../react/WorkbenchWindowTrafficLights.tsx\";\nimport type {\n WorkbenchHostHandle,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function WorkbenchHostWindowActions({\n context,\n host,\n i18n,\n nodeDefinitions\n}: {\n context: WorkbenchWindowActionContext<WorkbenchHostNodeData>;\n host: WorkbenchHostHandle;\n i18n: WorkbenchHostI18nRuntime;\n nodeDefinitions: Map<string, WorkbenchHostNodeDefinition>;\n}) {\n const definition = nodeDefinitions.get(context.node.data.typeId);\n if (!definition) {\n return null;\n }\n\n const minimizable = definition.window?.minimizable !== false;\n const closable = definition.window?.closable !== false;\n\n return (\n <WorkbenchWindowTrafficLights\n close={\n closable\n ? {\n label: i18n.t(\"actions.close\"),\n onClick: () => {\n host.requestNodeClose(context.node.id);\n }\n }\n : null\n }\n minimize={\n minimizable\n ? {\n label: i18n.t(\"actions.minimize\"),\n onClick: () => {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n }\n }\n : null\n }\n />\n );\n}\n"],"mappings":"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","names":["useMemo","useLayoutEffect","useRef","useState","useCallback","useState","useState","useCallback","nodeIds","useCallback","useEffect","useMemo","jsx","jsx","useMemo","Fragment","useMemo","jsx","jsxs","jsx","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","Fragment","jsx","jsxs","jsx","jsxs","useMemo","Fragment","useEffect","useEffect","useLayoutEffect","useRef","useCallback","useEffect","useRef","useState","createPortal","Fragment","jsx","jsxs","resolveDockPreviewCacheKey","useRef","useState","useCallback","useEffect","minimizeCommitted","commitMinimize","generation","nodeElement","wasFocusedForCapture","pendingMinimizedNode","anchorKey","dockRect","createPortal","jsx","jsxs","resolveDockPreviewCacheKey","useCallback","useEffect","useEffect","useMemo","useState","normalizeWorkbenchSnapshot","normalizeWorkbenchSnapshot","resolvedFrame","entry","useState","useMemo","useEffect","noop","useCallback","useMemo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","useCallback","useEffect","useRef","slotElement","useEffect","useRef","useState","promotedNodeId","slot","useCallback","useEffect","useLayoutEffect","useRef","useState","createPortal","Button","Fragment","jsx","jsxs","resolveDockPreviewCacheKey","useRef","useState","useEffect","useLayoutEffect","useCallback","createPortal","WorkbenchHostDockPopupCard","Button","jsx","jsxs","useMemo","useRef","useState","useCallback","useEffect","useLayoutEffect","activeHoverPanel","activeLabelTooltip","labelTooltipTarget","dockButton","node","relatedTarget","Button","left","right","top","bottom","jsx","jsx","jsxs","useMemo","useCallback","resolveDockPreviewCacheKey","jsx","noop","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["../src/store/commands.ts","../src/core/types.ts","../src/core/geometry.ts","../src/core/stack.ts","../src/core/reducer.ts","../src/store/subscribe.ts","../src/store/createWorkbenchStore.ts","../src/store/createWorkbenchController.ts","../src/host/WorkbenchHost.tsx","../src/mission-control/WorkbenchMissionControlOverlay.tsx","../src/mission-control/layoutDock.ts","../src/mission-control/useWorkbenchMissionControlPresence.ts","../src/mission-control/useWorkbenchMissionControlState.ts","../src/mission-control/layout.ts","../src/react/WorkbenchSurface.tsx","../src/react/WorkbenchDockFrame.tsx","../src/core/selectors.ts","../src/react/WorkbenchProvider.tsx","../src/react/dockNodeSelectors.ts","../src/react/hooks/useWorkbenchSelector.ts","../src/react/WorkbenchNodeLayer.tsx","../src/react/WorkbenchWindowFrame.tsx","../src/react/WorkbenchWindowTrafficLights.tsx","../src/react/WorkbenchWindowFullscreenToggle.tsx","../src/react/hooks/useWorkbenchDrag.ts","../src/react/hooks/useWorkbenchSnap.ts","../src/react/hooks/workbenchSnapTarget.ts","../src/react/hooks/useWorkbenchResize.ts","../src/react/windowHeader.ts","../src/react/renderedNodeIds.ts","../src/react/hooks/useWorkbenchShortcuts.ts","../src/react/hooks/workbenchShortcutIntent.ts","../src/react/hooks/useWorkbenchSurfaceSize.ts","../src/react/useWorkbenchGenieAnimation.tsx","../src/react/genieAnimation.ts","../src/host/hostConfig.ts","../src/host/useWorkbenchHostRuntime.ts","../src/store/createDerivedSnapshotGetter.ts","../src/host/activations.ts","../src/host/missionControlAdapter.ts","../src/core/snapshot.ts","../src/core/placement.ts","../src/host/nodeIdentity.ts","../src/host/sessionState.ts","../src/host/externalState.ts","../src/host/snapshotSanitizer.ts","../src/host/session.ts","../src/host/useWorkbenchHostSurfaceRenderers.tsx","../src/host/WorkbenchHostDock.tsx","../src/host/dockEntries.ts","../src/host/dockMagnification.ts","../src/host/dockScrollState.ts","../src/host/minimizedDockSlots.ts","../src/host/minimizedDockStackPromotion.ts","../src/host/minimizedDockRestoreIntent.ts","../src/host/WorkbenchHostDockPopup.tsx","../src/host/minimizedStackScroll.ts","../src/host/windowActions.ts","../src/host/hostNodeContext.ts","../src/host/WorkbenchHostWindowActions.tsx"],"sourcesContent":["import type {\n WorkbenchFrame,\n WorkbenchLayoutPreset,\n WorkbenchNode,\n WorkbenchNodeSizeConstraints,\n WorkbenchQuickLayoutTarget,\n WorkbenchLayoutConstraintsInput,\n WorkbenchSize,\n WorkbenchSnapTarget,\n WorkbenchState\n} from \"../core/types.ts\";\nimport type { WorkbenchStore } from \"./types.ts\";\n\nexport interface WorkbenchCommands<TData = unknown> {\n replaceState(state: Partial<WorkbenchState<TData>>): void;\n replaceNodes(nodes: WorkbenchNode<TData>[]): void;\n openNode(node: WorkbenchNode<TData>): void;\n closeNode(nodeID: string): void;\n focusNode(nodeID: string): void;\n minimizeNode(nodeID: string): void;\n restoreNode(nodeID: string): void;\n enterFullscreen(nodeID: string): void;\n exitFullscreen(nodeID: string): void;\n applyQuickLayout(nodeID: string, target: WorkbenchQuickLayoutTarget): void;\n applyLayoutPreset(nodeIDs: string[], preset: WorkbenchLayoutPreset): void;\n applyVisibleLayoutPreset(preset: WorkbenchLayoutPreset): void;\n applyActiveSnapTarget(nodeID: string): void;\n applySnapTarget(nodeID: string, snapTarget: WorkbenchSnapTarget): void;\n dragNode(nodeID: string, frame: WorkbenchFrame): void;\n moveNode(nodeID: string, frame: WorkbenchFrame): void;\n resizeNode(nodeID: string, frame: WorkbenchFrame): void;\n setActiveDragNode(nodeID: string | null): void;\n setActiveResizeNode(nodeID: string | null): void;\n setActiveSnapTarget(snapTarget: WorkbenchSnapTarget): void;\n setSurfaceSize(size: WorkbenchSize): void;\n setLayoutConstraints(constraints: WorkbenchLayoutConstraintsInput): void;\n setNodeSizeConstraints(\n nodeID: string,\n sizeConstraints: WorkbenchNodeSizeConstraints | null\n ): void;\n}\n\nexport function createWorkbenchCommands<TData>(\n store: WorkbenchStore<TData>\n): WorkbenchCommands<TData> {\n return {\n replaceState(state) {\n store.dispatch({ type: \"replaceState\", state });\n },\n replaceNodes(nodes) {\n store.dispatch({ type: \"replaceNodes\", nodes });\n },\n openNode(node) {\n store.dispatch({ type: \"openNode\", node });\n },\n closeNode(nodeID) {\n store.dispatch({ type: \"closeNode\", nodeID });\n },\n focusNode(nodeID) {\n store.dispatch({ type: \"focusNode\", nodeID });\n },\n minimizeNode(nodeID) {\n store.dispatch({ type: \"minimizeNode\", nodeID });\n },\n restoreNode(nodeID) {\n store.dispatch({ type: \"restoreNode\", nodeID });\n },\n enterFullscreen(nodeID) {\n store.dispatch({ type: \"enterFullscreen\", nodeID });\n },\n exitFullscreen(nodeID) {\n store.dispatch({ type: \"exitFullscreen\", nodeID });\n },\n applyQuickLayout(nodeID, target) {\n store.dispatch({ type: \"applyQuickLayout\", nodeID, target });\n },\n applyLayoutPreset(nodeIDs, preset) {\n store.dispatch({ type: \"applyLayoutPreset\", nodeIDs, preset });\n },\n applyVisibleLayoutPreset(preset) {\n store.dispatch({ type: \"applyVisibleLayoutPreset\", preset });\n },\n applyActiveSnapTarget(nodeID) {\n store.dispatch({ type: \"applyActiveSnapTarget\", nodeID });\n },\n applySnapTarget(nodeID, snapTarget) {\n store.dispatch({ type: \"applySnapTarget\", nodeID, snapTarget });\n },\n dragNode(nodeID, frame) {\n store.dispatch({ type: \"dragNode\", nodeID, frame });\n },\n moveNode(nodeID, frame) {\n store.dispatch({ type: \"moveNode\", nodeID, frame });\n },\n resizeNode(nodeID, frame) {\n store.dispatch({ type: \"resizeNode\", nodeID, frame });\n },\n setActiveDragNode(nodeID) {\n store.dispatch({ type: \"setActiveDragNode\", nodeID });\n },\n setActiveResizeNode(nodeID) {\n store.dispatch({ type: \"setActiveResizeNode\", nodeID });\n },\n setActiveSnapTarget(snapTarget) {\n store.dispatch({ type: \"setActiveSnapTarget\", snapTarget });\n },\n setSurfaceSize(size) {\n store.dispatch({ type: \"setSurfaceSize\", size });\n },\n setLayoutConstraints(constraints) {\n store.dispatch({ type: \"setLayoutConstraints\", constraints });\n },\n setNodeSizeConstraints(nodeID, sizeConstraints) {\n store.dispatch({\n type: \"setNodeSizeConstraints\",\n nodeID,\n sizeConstraints\n });\n }\n };\n}\n","import type {\n WorkbenchFrame as WorkbenchSnapshotFrame,\n WorkbenchSnapshotDisplayModeV1\n} from \"@tutti-os/workbench-snapshot\";\n\nexport interface WorkbenchSize {\n width: number;\n height: number;\n}\n\nexport type WorkbenchFrame = WorkbenchSnapshotFrame;\n\nexport interface WorkbenchSafeArea {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport type WorkbenchDisplayMode = WorkbenchSnapshotDisplayModeV1;\nexport type WorkbenchSnapTarget =\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\"\n | null;\nexport type WorkbenchQuickLayoutTarget =\n | \"left\"\n | \"right\"\n | \"top\"\n | \"bottom\"\n | \"center\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\nexport type WorkbenchLayoutPreset =\n | { kind: \"balanced\" }\n | { kind: \"row\" }\n | { kind: \"column\" };\nexport type WorkbenchResizeHandle =\n | \"north\"\n | \"east\"\n | \"south\"\n | \"west\"\n | \"north-east\"\n | \"north-west\"\n | \"south-east\"\n | \"south-west\";\n\nexport interface WorkbenchNode<TData = unknown> {\n id: string;\n kind: string;\n title: string;\n frame: WorkbenchFrame;\n displayMode: WorkbenchDisplayMode;\n restoreFrame: WorkbenchFrame | null;\n isMinimized: boolean;\n minimizedAtUnixMs?: number | null;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n data: TData;\n}\n\nexport interface WorkbenchNodeSizeConstraints {\n minWidth?: number;\n minHeight?: number;\n}\n\nexport interface WorkbenchState<TData = unknown> {\n nodes: WorkbenchNode<TData>[];\n nodeStack: string[];\n activeDragNodeId: string | null;\n activeResizeNodeId: string | null;\n activeSnapTarget: WorkbenchSnapTarget;\n surfaceSize: WorkbenchSize;\n layoutConstraints: WorkbenchLayoutConstraints;\n}\n\nexport interface WorkbenchLayoutConstraints {\n minWidth: number;\n minHeight: number;\n surfacePadding: number;\n safeArea: WorkbenchSafeArea;\n}\n\nexport interface WorkbenchLayoutConstraintsInput extends Partial<\n Omit<WorkbenchLayoutConstraints, \"safeArea\">\n> {\n safeArea?: Partial<WorkbenchSafeArea>;\n}\n\nexport const defaultWorkbenchSafeArea: WorkbenchSafeArea = {\n top: 52,\n right: 0,\n bottom: 88,\n left: 0\n};\n\nexport const defaultWorkbenchLayoutConstraints: WorkbenchLayoutConstraints = {\n minWidth: 280,\n minHeight: 160,\n surfacePadding: 0,\n safeArea: defaultWorkbenchSafeArea\n};\n\nexport const defaultWorkbenchSurfaceSize: WorkbenchSize = {\n width: 1024,\n height: 720\n};\n","import {\n defaultWorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchLayoutPreset,\n type WorkbenchLayoutConstraints,\n type WorkbenchLayoutConstraintsInput,\n type WorkbenchNodeSizeConstraints,\n type WorkbenchQuickLayoutTarget,\n type WorkbenchSafeArea,\n type WorkbenchSize,\n type WorkbenchSnapTarget\n} from \"./types.ts\";\n\nexport const WORKBENCH_MIN_VISIBLE_PX = 40;\nexport const WORKBENCH_LAYOUT_PRESET_GAP_PX = 12;\nexport const WORKBENCH_EDGE_SNAP_THRESHOLD_PX = 24;\n\nexport function normalizeWorkbenchLayoutConstraints(\n constraints: WorkbenchLayoutConstraintsInput = {}\n): WorkbenchLayoutConstraints {\n return {\n minWidth:\n constraints.minWidth ?? defaultWorkbenchLayoutConstraints.minWidth,\n minHeight:\n constraints.minHeight ?? defaultWorkbenchLayoutConstraints.minHeight,\n surfacePadding:\n constraints.surfacePadding ??\n defaultWorkbenchLayoutConstraints.surfacePadding,\n safeArea: normalizeWorkbenchSafeArea(constraints.safeArea)\n };\n}\n\nexport function normalizeWorkbenchSafeArea(\n safeArea: Partial<WorkbenchSafeArea> = {}\n): WorkbenchSafeArea {\n return {\n top: Math.max(0, safeArea.top ?? 0),\n right: Math.max(0, safeArea.right ?? 0),\n bottom: Math.max(0, safeArea.bottom ?? 0),\n left: Math.max(0, safeArea.left ?? 0)\n };\n}\n\nexport function getWorkbenchLayoutFrame(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const width = Math.max(\n normalized.minWidth,\n surfaceSize.width - normalized.safeArea.left - normalized.safeArea.right\n );\n const height = Math.max(\n normalized.minHeight,\n surfaceSize.height - normalized.safeArea.top - normalized.safeArea.bottom\n );\n\n return {\n x: normalized.safeArea.left,\n y: normalized.safeArea.top,\n width,\n height\n };\n}\n\nexport function clampWorkbenchRect(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const frame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n const width = clamp(\n rect.width,\n normalized.minWidth,\n Math.max(normalized.minWidth, frame.width - normalized.surfacePadding * 2)\n );\n const height = clamp(\n rect.height,\n normalized.minHeight,\n Math.max(normalized.minHeight, frame.height - normalized.surfacePadding * 2)\n );\n const maxX = Math.max(\n frame.x + normalized.surfacePadding,\n frame.x + frame.width - width - normalized.surfacePadding\n );\n const maxY = Math.max(\n frame.y + normalized.surfacePadding,\n frame.y + frame.height - height - normalized.surfacePadding\n );\n\n return {\n x: clamp(rect.x, frame.x + normalized.surfacePadding, maxX),\n y: clamp(rect.y, frame.y + normalized.surfacePadding, maxY),\n width,\n height\n };\n}\n\nexport function clampWorkbenchRectToVisibleArea(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n minVisiblePx = WORKBENCH_MIN_VISIBLE_PX,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const visibleFrame = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const sizedRect = clampWorkbenchRect(\n {\n ...rect,\n x: visibleFrame.x,\n y: visibleFrame.y\n },\n surfaceSize,\n normalized\n );\n const minVisibleX = Math.min(minVisiblePx, visibleFrame.width);\n const minVisibleY = Math.min(minVisiblePx, visibleFrame.height);\n const minX = visibleFrame.x + minVisibleX - sizedRect.width;\n const maxX = visibleFrame.x + visibleFrame.width - minVisibleX;\n const minY = visibleFrame.y + minVisibleY - sizedRect.height;\n const maxY = visibleFrame.y + visibleFrame.height - minVisibleY;\n\n return {\n ...sizedRect,\n x: Math.round(clamp(rect.x, minX, maxX)),\n y: Math.round(clamp(rect.y, minY, maxY))\n };\n}\n\nexport function clampWorkbenchDragRect(\n rect: WorkbenchFrame,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const layoutFrame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n const visibleRect = clampWorkbenchRectToVisibleArea(\n rect,\n surfaceSize,\n normalized,\n WORKBENCH_MIN_VISIBLE_PX\n );\n\n return {\n ...visibleRect,\n y: Math.max(layoutFrame.y + normalized.surfacePadding, visibleRect.y)\n };\n}\n\nexport function getWorkbenchFullscreenRect(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const fullscreenSafeArea = {\n ...normalized.safeArea,\n bottom: 0,\n left: 0\n };\n return {\n x: fullscreenSafeArea.left + normalized.surfacePadding,\n y: fullscreenSafeArea.top + normalized.surfacePadding,\n width: Math.max(\n normalized.minWidth,\n surfaceSize.width -\n fullscreenSafeArea.left -\n fullscreenSafeArea.right -\n normalized.surfacePadding * 2\n ),\n height: Math.max(\n normalized.minHeight,\n surfaceSize.height -\n fullscreenSafeArea.top -\n fullscreenSafeArea.bottom -\n normalized.surfacePadding * 2\n )\n };\n}\n\nexport function getWorkbenchSnapRect(\n snapTarget: WorkbenchSnapTarget,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame | null {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const full = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const halfWidth = Math.round(full.width / 2);\n const halfHeight = Math.round(full.height / 2);\n const clampSnapRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n\n switch (snapTarget) {\n case \"left\":\n return clampSnapRect({ ...full, width: halfWidth });\n case \"right\":\n return clampSnapRect({\n ...full,\n x: full.x + full.width - halfWidth,\n width: halfWidth\n });\n case \"top\":\n return clampSnapRect(full);\n case \"bottom\":\n return clampSnapRect({\n ...full,\n y: full.y + full.height - halfHeight,\n height: halfHeight\n });\n case \"top-left\":\n return clampSnapRect({ ...full, width: halfWidth, height: halfHeight });\n case \"top-right\":\n return clampSnapRect({\n ...full,\n x: full.x + full.width - halfWidth,\n width: halfWidth,\n height: halfHeight\n });\n case \"bottom-left\":\n return clampSnapRect({\n ...full,\n y: full.y + full.height - halfHeight,\n width: halfWidth,\n height: halfHeight\n });\n case \"bottom-right\":\n return clampSnapRect({\n ...full,\n x: full.x + full.width - halfWidth,\n y: full.y + full.height - halfHeight,\n width: halfWidth,\n height: halfHeight\n });\n case null:\n return null;\n }\n}\n\nexport function getWorkbenchQuickLayoutRect(\n target: WorkbenchQuickLayoutTarget,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const normalized = resolveWorkbenchRectConstraints(\n constraints,\n sizeConstraints\n );\n const full = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n const halfWidth = Math.round(full.width / 2);\n const halfHeight = Math.round(full.height / 2);\n const clampQuickLayoutRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n\n switch (target) {\n case \"left\":\n return clampQuickLayoutRect({\n ...full,\n width: Math.round(full.width / 4)\n });\n case \"right\": {\n const width = Math.round(full.width / 4);\n return clampQuickLayoutRect({\n ...full,\n x: full.x + full.width - width,\n width\n });\n }\n case \"top\":\n return clampQuickLayoutRect({\n ...full,\n height: Math.round(full.height / 2)\n });\n case \"bottom\": {\n return clampQuickLayoutRect({\n ...full,\n y: full.y + full.height - halfHeight,\n height: halfHeight\n });\n }\n case \"center\": {\n const width = Math.round(full.width * 0.72);\n const height = Math.round(full.height * 0.72);\n return clampQuickLayoutRect({\n x: full.x + Math.round((full.width - width) / 2),\n y: full.y + Math.round((full.height - height) / 2),\n width,\n height\n });\n }\n case \"top-left\":\n return clampQuickLayoutRect({\n ...full,\n width: halfWidth,\n height: halfHeight\n });\n case \"top-right\":\n return clampQuickLayoutRect({\n ...full,\n x: full.x + full.width - halfWidth,\n width: halfWidth,\n height: halfHeight\n });\n case \"bottom-left\":\n return clampQuickLayoutRect({\n ...full,\n y: full.y + full.height - halfHeight,\n width: halfWidth,\n height: halfHeight\n });\n case \"bottom-right\":\n return clampQuickLayoutRect({\n ...full,\n x: full.x + full.width - halfWidth,\n y: full.y + full.height - halfHeight,\n width: halfWidth,\n height: halfHeight\n });\n }\n}\n\nfunction resolveWorkbenchRectConstraints(\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchLayoutConstraints {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n return {\n ...normalized,\n minHeight: Math.max(\n normalized.minHeight,\n normalizeNodeMinimum(sizeConstraints?.minHeight)\n ),\n minWidth: Math.max(\n normalized.minWidth,\n normalizeNodeMinimum(sizeConstraints?.minWidth)\n )\n };\n}\n\nfunction normalizeNodeMinimum(value: number | undefined): number {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : 0;\n}\n\nexport function getWorkbenchLayoutPresetFrames(\n itemCount: number,\n preset: WorkbenchLayoutPreset,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n if (itemCount <= 0) {\n return [];\n }\n\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const frame = getWorkbenchSafeLayoutRect(surfaceSize, normalized);\n switch (preset.kind) {\n case \"balanced\":\n return getBalancedLayoutFrames(itemCount, frame, normalized);\n case \"row\":\n return getGridLayoutFrames(itemCount, itemCount, frame, normalized);\n case \"column\":\n return getSingleColumnLayoutFrames(itemCount, frame, normalized);\n }\n}\n\nfunction getWorkbenchSafeLayoutRect(\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchFrame {\n const normalized = normalizeWorkbenchLayoutConstraints(constraints);\n const frame = getWorkbenchLayoutFrame(surfaceSize, normalized);\n return {\n x: frame.x + normalized.surfacePadding,\n y: frame.y + normalized.surfacePadding,\n width: Math.max(\n normalized.minWidth,\n frame.width - normalized.surfacePadding * 2\n ),\n height: Math.max(\n normalized.minHeight,\n frame.height - normalized.surfacePadding * 2\n )\n };\n}\n\nexport function inferWorkbenchSnapTarget(\n dragPoint: Pick<WorkbenchFrame, \"x\" | \"y\">,\n surfaceSize: WorkbenchSize,\n threshold = 0,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchSnapTarget {\n const frame = getWorkbenchLayoutFrame(surfaceSize, constraints);\n const crossesLeft =\n threshold > 0\n ? dragPoint.x <= frame.x + threshold\n : dragPoint.x < frame.x || (frame.x === 0 && dragPoint.x <= 0);\n const crossesRight =\n threshold > 0\n ? dragPoint.x >= frame.x + frame.width - threshold\n : dragPoint.x > frame.x + frame.width ||\n (frame.x + frame.width === surfaceSize.width &&\n dragPoint.x >= surfaceSize.width);\n const crossesTop =\n threshold > 0\n ? dragPoint.y <= frame.y + threshold\n : dragPoint.y < frame.y || (frame.y === 0 && dragPoint.y <= 0);\n const crossesBottom =\n threshold > 0\n ? dragPoint.y >= frame.y + frame.height - threshold\n : dragPoint.y > frame.y + frame.height ||\n (frame.y + frame.height === surfaceSize.height &&\n dragPoint.y >= surfaceSize.height);\n\n if (crossesTop && crossesLeft) {\n return \"top-left\";\n }\n if (crossesTop && crossesRight) {\n return \"top-right\";\n }\n if (crossesBottom && crossesLeft) {\n return \"bottom-left\";\n }\n if (crossesBottom && crossesRight) {\n return \"bottom-right\";\n }\n if (crossesTop) {\n return \"top\";\n }\n if (crossesBottom) {\n return \"bottom\";\n }\n if (crossesLeft) {\n return \"left\";\n }\n if (crossesRight) {\n return \"right\";\n }\n return null;\n}\n\nexport function rectsEqual(\n left: WorkbenchFrame,\n right: WorkbenchFrame\n): boolean {\n return (\n left.x === right.x &&\n left.y === right.y &&\n left.width === right.width &&\n left.height === right.height\n );\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction getGridLayoutFrames(\n itemCount: number,\n columns: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n const rows = Math.ceil(itemCount / columns);\n const horizontalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, columns - 1);\n const verticalGap = WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, rows - 1);\n const cellWidth = Math.floor((frame.width - horizontalGap) / columns);\n const cellHeight = Math.floor((frame.height - verticalGap) / rows);\n\n if (cellWidth < constraints.minWidth || cellHeight < constraints.minHeight) {\n return null;\n }\n\n const contentHeight =\n rows * cellHeight + (rows - 1) * WORKBENCH_LAYOUT_PRESET_GAP_PX;\n let index = 0;\n const frames: WorkbenchFrame[] = [];\n\n for (let rowIndex = 0; rowIndex < rows; rowIndex += 1) {\n const remaining = itemCount - index;\n const itemsInRow = Math.min(columns, remaining);\n const rowWidth =\n itemsInRow * cellWidth +\n Math.max(0, itemsInRow - 1) * WORKBENCH_LAYOUT_PRESET_GAP_PX;\n const rowX = frame.x + Math.round((frame.width - rowWidth) / 2);\n const rowY =\n frame.y +\n Math.round((frame.height - contentHeight) / 2) +\n rowIndex * (cellHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX);\n\n for (let columnIndex = 0; columnIndex < itemsInRow; columnIndex += 1) {\n frames.push({\n x: rowX + columnIndex * (cellWidth + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n y: rowY,\n width: cellWidth,\n height: cellHeight\n });\n index += 1;\n }\n }\n\n return frames;\n}\n\nfunction getBalancedLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n if (itemCount === 1) {\n return [frame];\n }\n\n if (itemCount === 2) {\n return getGridLayoutFrames(itemCount, 2, frame, constraints);\n }\n\n if (itemCount >= 4) {\n return getBestBalancedGridLayoutFrames(itemCount, frame, constraints);\n }\n\n const gap = WORKBENCH_LAYOUT_PRESET_GAP_PX;\n const primaryWidth = Math.floor((frame.width - gap) * 0.58);\n const secondaryWidth = frame.width - gap - primaryWidth;\n\n if (\n primaryWidth < constraints.minWidth ||\n secondaryWidth < constraints.minWidth\n ) {\n return null;\n }\n\n const secondaryCount = itemCount - 1;\n const verticalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, secondaryCount - 1);\n const secondaryHeight = Math.floor(\n (frame.height - verticalGap) / secondaryCount\n );\n\n if (secondaryHeight < constraints.minHeight) {\n return null;\n }\n\n const frames: WorkbenchFrame[] = [\n {\n x: frame.x,\n y: frame.y,\n width: primaryWidth,\n height: frame.height\n }\n ];\n\n const secondaryX = frame.x + primaryWidth + gap;\n for (let index = 0; index < secondaryCount; index += 1) {\n frames.push({\n x: secondaryX,\n y: frame.y + index * (secondaryHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n width: secondaryWidth,\n height: secondaryHeight\n });\n }\n\n return frames;\n}\n\nfunction getBestBalancedGridLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n let best: {\n columns: number;\n emptySlots: number;\n frames: WorkbenchFrame[];\n shapeDistance: number;\n } | null = null;\n\n for (let columns = 2; columns <= itemCount; columns += 1) {\n const rows = Math.ceil(itemCount / columns);\n const frames = getGridLayoutFrames(itemCount, columns, frame, constraints);\n if (!frames) {\n continue;\n }\n\n const candidate = {\n columns,\n emptySlots: rows * columns - itemCount,\n frames,\n shapeDistance: Math.abs(columns - rows)\n };\n\n if (\n !best ||\n candidate.shapeDistance < best.shapeDistance ||\n (candidate.shapeDistance === best.shapeDistance &&\n candidate.emptySlots < best.emptySlots) ||\n (candidate.shapeDistance === best.shapeDistance &&\n candidate.emptySlots === best.emptySlots &&\n candidate.columns < best.columns)\n ) {\n best = candidate;\n }\n }\n\n return best?.frames ?? null;\n}\n\nfunction getSingleColumnLayoutFrames(\n itemCount: number,\n frame: WorkbenchFrame,\n constraints: WorkbenchLayoutConstraints\n): WorkbenchFrame[] | null {\n const verticalGap =\n WORKBENCH_LAYOUT_PRESET_GAP_PX * Math.max(0, itemCount - 1);\n const cellHeight = Math.floor((frame.height - verticalGap) / itemCount);\n\n if (cellHeight < constraints.minHeight) {\n return null;\n }\n\n const frames: WorkbenchFrame[] = [];\n for (let index = 0; index < itemCount; index += 1) {\n frames.push({\n x: frame.x,\n y: frame.y + index * (cellHeight + WORKBENCH_LAYOUT_PRESET_GAP_PX),\n width: frame.width,\n height: cellHeight\n });\n }\n\n return frames;\n}\n","import type { WorkbenchNode } from \"./types.ts\";\n\nexport function normalizeWorkbenchStack(\n nodes: readonly WorkbenchNode[],\n stack: readonly string[]\n): string[] {\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const normalized = Array.from(new Set(stack)).filter((id) => nodeIDs.has(id));\n\n for (const node of nodes) {\n if (!normalized.includes(node.id)) {\n normalized.push(node.id);\n }\n }\n\n return normalized;\n}\n\nexport function focusWorkbenchStack(\n stack: readonly string[],\n nodeID: string\n): string[] {\n return [...stack.filter((id) => id !== nodeID), nodeID];\n}\n\nexport function removeFromWorkbenchStack(\n stack: readonly string[],\n nodeID: string\n): string[] {\n return stack.filter((id) => id !== nodeID);\n}\n\nexport function orderWorkbenchNodesForRender<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n stack: readonly string[]\n): WorkbenchNode<TData>[] {\n const order = new Map(stack.map((id, index) => [id, index]));\n return [...nodes].sort(\n (left, right) =>\n (order.get(left.id) ?? Number.MAX_SAFE_INTEGER) -\n (order.get(right.id) ?? Number.MAX_SAFE_INTEGER)\n );\n}\n","import type { WorkbenchAction } from \"./actions.ts\";\nimport {\n clampWorkbenchDragRect,\n clampWorkbenchRect,\n clampWorkbenchRectToVisibleArea,\n getWorkbenchFullscreenRect,\n getWorkbenchLayoutPresetFrames,\n getWorkbenchQuickLayoutRect,\n getWorkbenchSnapRect,\n normalizeWorkbenchLayoutConstraints,\n rectsEqual\n} from \"./geometry.ts\";\nimport {\n focusWorkbenchStack,\n normalizeWorkbenchStack,\n removeFromWorkbenchStack\n} from \"./stack.ts\";\nimport {\n defaultWorkbenchSurfaceSize,\n defaultWorkbenchLayoutConstraints,\n type WorkbenchLayoutPreset,\n type WorkbenchNode,\n type WorkbenchState\n} from \"./types.ts\";\n\nexport function createWorkbenchInitialState<TData = unknown>(\n partial: Partial<WorkbenchState<TData>> = {}\n): WorkbenchState<TData> {\n const nodes = partial.nodes ?? [];\n return {\n nodes,\n nodeStack: normalizeWorkbenchStack(nodes, partial.nodeStack ?? []),\n activeDragNodeId: partial.activeDragNodeId ?? null,\n activeResizeNodeId: partial.activeResizeNodeId ?? null,\n activeSnapTarget: partial.activeSnapTarget ?? null,\n surfaceSize: partial.surfaceSize ?? defaultWorkbenchSurfaceSize,\n layoutConstraints: normalizeWorkbenchLayoutConstraints(\n partial.layoutConstraints ?? defaultWorkbenchLayoutConstraints\n )\n };\n}\n\nexport function reduceWorkbenchState<TData>(\n state: WorkbenchState<TData>,\n action: WorkbenchAction<TData>\n): WorkbenchState<TData> {\n switch (action.type) {\n case \"replaceState\": {\n const nextState = createWorkbenchInitialState({\n ...state,\n ...action.state\n });\n if (\n state.nodes === nextState.nodes &&\n state.nodeStack === nextState.nodeStack &&\n state.activeDragNodeId === nextState.activeDragNodeId &&\n state.activeResizeNodeId === nextState.activeResizeNodeId &&\n state.activeSnapTarget === nextState.activeSnapTarget &&\n state.surfaceSize === nextState.surfaceSize &&\n layoutConstraintsEqual(\n state.layoutConstraints,\n nextState.layoutConstraints\n )\n ) {\n return state;\n }\n return nextState;\n }\n\n case \"replaceNodes\": {\n const nodeStack = normalizeWorkbenchStack(action.nodes, state.nodeStack);\n if (state.nodes === action.nodes && state.nodeStack === nodeStack) {\n return state;\n }\n return { ...state, nodes: action.nodes, nodeStack };\n }\n\n case \"openNode\": {\n const existing = state.nodes.some((node) => node.id === action.node.id);\n const nodes = existing\n ? state.nodes.map((node) =>\n node.id === action.node.id ? action.node : node\n )\n : [...state.nodes, action.node];\n return {\n ...state,\n nodes,\n nodeStack: focusWorkbenchStack(\n normalizeWorkbenchStack(nodes, state.nodeStack),\n action.node.id\n )\n };\n }\n\n case \"closeNode\":\n if (!state.nodes.some((node) => node.id === action.nodeID)) {\n return state;\n }\n return {\n ...state,\n nodes: state.nodes.filter((node) => node.id !== action.nodeID),\n nodeStack: removeFromWorkbenchStack(state.nodeStack, action.nodeID)\n };\n\n case \"focusNode\":\n if (!state.nodes.some((node) => node.id === action.nodeID)) {\n return state;\n }\n return {\n ...state,\n nodes: state.nodes.map((node) =>\n node.id === action.nodeID\n ? { ...node, isMinimized: false, minimizedAtUnixMs: null }\n : node\n ),\n nodeStack: focusWorkbenchStack(state.nodeStack, action.nodeID)\n };\n\n case \"minimizeNode\":\n return updateNode(state, action.nodeID, (node) =>\n node.isMinimized\n ? node\n : {\n ...node,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n }\n );\n\n case \"restoreNode\":\n return updateNode(state, action.nodeID, (node) =>\n node.isMinimized\n ? { ...node, isMinimized: false, minimizedAtUnixMs: null }\n : node\n );\n\n case \"enterFullscreen\":\n return updateNode(state, action.nodeID, (node) => {\n if (node.displayMode === \"fullscreen\") {\n return node;\n }\n return {\n ...node,\n displayMode: \"fullscreen\",\n restoreFrame: node.frame,\n isMinimized: false,\n minimizedAtUnixMs: null,\n frame: getWorkbenchFullscreenRect(\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n )\n };\n });\n\n case \"exitFullscreen\":\n return updateNode(state, action.nodeID, (node) => {\n if (node.displayMode !== \"fullscreen\") {\n return node;\n }\n return {\n ...node,\n displayMode: \"floating\",\n frame: node.restoreFrame ?? node.frame,\n restoreFrame: null\n };\n });\n\n case \"applyQuickLayout\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = getWorkbenchQuickLayoutRect(\n action.target,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (\n node.displayMode === \"floating\" &&\n !node.isMinimized &&\n node.restoreFrame === null &&\n rectsEqual(node.frame, frame)\n ) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\" as const,\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n case \"applyLayoutPreset\":\n return applyLayoutPresetToNodes(state, action.nodeIDs, action.preset);\n\n case \"applyVisibleLayoutPreset\":\n return applyLayoutPresetToNodes(\n state,\n state.nodes.filter((node) => !node.isMinimized).map((node) => node.id),\n action.preset\n );\n\n case \"applyActiveSnapTarget\":\n case \"applySnapTarget\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = getWorkbenchSnapRect(\n action.type === \"applySnapTarget\"\n ? action.snapTarget\n : state.activeSnapTarget,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (!frame) {\n return node;\n }\n if (\n node.displayMode === \"floating\" &&\n !node.isMinimized &&\n node.restoreFrame === null &&\n rectsEqual(node.frame, frame)\n ) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n case \"dragNode\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = clampWorkbenchDragRect(\n action.frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (rectsEqual(node.frame, frame)) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame:\n node.displayMode === \"fullscreen\" ? node.restoreFrame : null\n };\n });\n\n case \"moveNode\":\n case \"resizeNode\":\n return updateNode(state, action.nodeID, (node) => {\n const frame = clampWorkbenchRect(\n action.frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n if (rectsEqual(node.frame, frame)) {\n return node;\n }\n return {\n ...node,\n frame,\n displayMode: \"floating\",\n restoreFrame:\n node.displayMode === \"fullscreen\" ? node.restoreFrame : null\n };\n });\n\n case \"setActiveDragNode\":\n if (state.activeDragNodeId === action.nodeID) {\n return state;\n }\n return { ...state, activeDragNodeId: action.nodeID };\n\n case \"setActiveResizeNode\":\n if (state.activeResizeNodeId === action.nodeID) {\n return state;\n }\n return { ...state, activeResizeNodeId: action.nodeID };\n\n case \"setActiveSnapTarget\":\n if (state.activeSnapTarget === action.snapTarget) {\n return state;\n }\n return { ...state, activeSnapTarget: action.snapTarget };\n\n case \"setSurfaceSize\":\n if (\n state.surfaceSize.width === action.size.width &&\n state.surfaceSize.height === action.size.height\n ) {\n return state;\n }\n return {\n ...state,\n surfaceSize: action.size,\n nodes: state.nodes.map((node) =>\n node.displayMode === \"fullscreen\"\n ? {\n ...node,\n frame: getWorkbenchFullscreenRect(\n action.size,\n state.layoutConstraints,\n node.sizeConstraints\n )\n }\n : {\n ...node,\n frame: clampWorkbenchRectToVisibleArea(\n node.frame,\n action.size,\n state.layoutConstraints,\n undefined,\n node.sizeConstraints\n )\n }\n )\n };\n\n case \"setLayoutConstraints\": {\n const constraints = normalizeWorkbenchLayoutConstraints({\n ...state.layoutConstraints,\n ...action.constraints,\n safeArea: {\n ...state.layoutConstraints.safeArea,\n ...action.constraints.safeArea\n }\n });\n if (\n state.layoutConstraints.minWidth === constraints.minWidth &&\n state.layoutConstraints.minHeight === constraints.minHeight &&\n state.layoutConstraints.surfacePadding === constraints.surfacePadding &&\n state.layoutConstraints.safeArea.top === constraints.safeArea.top &&\n state.layoutConstraints.safeArea.right === constraints.safeArea.right &&\n state.layoutConstraints.safeArea.bottom ===\n constraints.safeArea.bottom &&\n state.layoutConstraints.safeArea.left === constraints.safeArea.left\n ) {\n return state;\n }\n return {\n ...state,\n layoutConstraints: constraints,\n nodes: state.nodes.map((node) =>\n node.displayMode === \"fullscreen\"\n ? {\n ...node,\n frame: getWorkbenchFullscreenRect(\n state.surfaceSize,\n constraints,\n node.sizeConstraints\n )\n }\n : {\n ...node,\n frame: clampWorkbenchRectToVisibleArea(\n node.frame,\n state.surfaceSize,\n constraints,\n undefined,\n node.sizeConstraints\n ),\n restoreFrame: node.restoreFrame\n ? clampWorkbenchRectToVisibleArea(\n node.restoreFrame,\n state.surfaceSize,\n constraints,\n undefined,\n node.sizeConstraints\n )\n : null\n }\n )\n };\n }\n\n case \"setNodeSizeConstraints\":\n return updateNode(state, action.nodeID, (node) => {\n if (\n sizeConstraintsEqual(node.sizeConstraints, action.sizeConstraints)\n ) {\n return node;\n }\n const frame =\n node.displayMode === \"fullscreen\"\n ? getWorkbenchFullscreenRect(\n state.surfaceSize,\n state.layoutConstraints,\n action.sizeConstraints\n )\n : clampWorkbenchRectToVisibleArea(\n node.frame,\n state.surfaceSize,\n state.layoutConstraints,\n undefined,\n action.sizeConstraints\n );\n const restoreFrame = node.restoreFrame\n ? clampWorkbenchRectToVisibleArea(\n node.restoreFrame,\n state.surfaceSize,\n state.layoutConstraints,\n undefined,\n action.sizeConstraints\n )\n : null;\n return {\n ...node,\n frame,\n restoreFrame,\n sizeConstraints: action.sizeConstraints\n };\n });\n }\n}\n\nfunction layoutConstraintsEqual(\n left: WorkbenchState[\"layoutConstraints\"],\n right: WorkbenchState[\"layoutConstraints\"]\n): boolean {\n return (\n left.minWidth === right.minWidth &&\n left.minHeight === right.minHeight &&\n left.surfacePadding === right.surfacePadding &&\n left.safeArea.top === right.safeArea.top &&\n left.safeArea.right === right.safeArea.right &&\n left.safeArea.bottom === right.safeArea.bottom &&\n left.safeArea.left === right.safeArea.left\n );\n}\n\nfunction sizeConstraintsEqual(\n left: WorkbenchNode[\"sizeConstraints\"],\n right: WorkbenchNode[\"sizeConstraints\"]\n): boolean {\n return (\n (left?.minWidth ?? null) === (right?.minWidth ?? null) &&\n (left?.minHeight ?? null) === (right?.minHeight ?? null)\n );\n}\n\nfunction updateNode<TData>(\n state: WorkbenchState<TData>,\n nodeID: string,\n update: (node: WorkbenchNode<TData>) => WorkbenchNode<TData>\n): WorkbenchState<TData> {\n let changed = false;\n const nodes = state.nodes.map((node) => {\n if (node.id !== nodeID) {\n return node;\n }\n\n const nextNode = update(node);\n changed = changed || nextNode !== node;\n return nextNode;\n });\n\n if (!changed) {\n return state;\n }\n\n return {\n ...state,\n nodes,\n nodeStack: focusWorkbenchStack(state.nodeStack, nodeID)\n };\n}\n\nfunction applyLayoutPresetToNodes<TData>(\n state: WorkbenchState<TData>,\n inputNodeIDs: readonly string[],\n preset: WorkbenchLayoutPreset\n): WorkbenchState<TData> {\n const nodeIDs = uniqueKnownNodeIDs(state.nodes, inputNodeIDs);\n if (nodeIDs.length === 0) {\n return state;\n }\n\n const frames = getWorkbenchLayoutPresetFrames(\n nodeIDs.length,\n preset,\n state.surfaceSize,\n state.layoutConstraints\n );\n if (!frames) {\n return state;\n }\n\n const frameByNodeID = new Map(\n nodeIDs.map((nodeID, index) => [nodeID, frames[index]] as const)\n );\n const nodes: WorkbenchNode<TData>[] = state.nodes.map((node) => {\n const frame = frameByNodeID.get(node.id);\n if (!frame) {\n return node;\n }\n const nextFrame = clampWorkbenchRect(\n frame,\n state.surfaceSize,\n state.layoutConstraints,\n node.sizeConstraints\n );\n return {\n ...node,\n frame: nextFrame,\n displayMode: \"floating\" as const,\n restoreFrame: null,\n isMinimized: false,\n minimizedAtUnixMs: null\n };\n });\n\n let nodeStack = state.nodeStack;\n for (const nodeID of nodeIDs) {\n nodeStack = focusWorkbenchStack(nodeStack, nodeID);\n }\n\n return { ...state, nodes, nodeStack };\n}\n\nfunction uniqueKnownNodeIDs<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n nodeIDs: readonly string[]\n): string[] {\n const knownNodeIDs = new Set(nodes.map((node) => node.id));\n const orderedNodeIDs: string[] = [];\n\n for (const nodeID of nodeIDs) {\n if (!knownNodeIDs.has(nodeID) || orderedNodeIDs.includes(nodeID)) {\n continue;\n }\n orderedNodeIDs.push(nodeID);\n }\n\n return orderedNodeIDs;\n}\n","import type { WorkbenchListener, WorkbenchUnsubscribe } from \"./types.ts\";\n\nexport function createWorkbenchSubscriptionSet() {\n const listeners = new Set<WorkbenchListener>();\n\n return {\n subscribe(listener: WorkbenchListener): WorkbenchUnsubscribe {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n notify(): void {\n for (const listener of listeners) {\n listener();\n }\n }\n };\n}\n","import type { WorkbenchAction } from \"../core/actions.ts\";\nimport {\n createWorkbenchInitialState,\n reduceWorkbenchState\n} from \"../core/reducer.ts\";\nimport type { WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchSubscriptionSet } from \"./subscribe.ts\";\nimport type { WorkbenchDebugDiagnostics, WorkbenchStore } from \"./types.ts\";\n\nexport function createWorkbenchStore<TData = unknown>(\n initialState: Partial<WorkbenchState<TData>> = {},\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics } = {}\n): WorkbenchStore<TData> {\n let state = createWorkbenchInitialState(initialState);\n const subscriptions = createWorkbenchSubscriptionSet();\n\n return {\n getSnapshot() {\n return state;\n },\n subscribe(listener) {\n return subscriptions.subscribe(listener);\n },\n dispatch(action: WorkbenchAction<TData>) {\n const nextState = reduceWorkbenchState(state, action);\n if (nextState === state) {\n return;\n }\n\n logWorkbenchFrameChanges(action, state, nextState, options);\n state = nextState;\n subscriptions.notify();\n }\n };\n}\n\nfunction logWorkbenchFrameChanges<TData>(\n action: WorkbenchAction<TData>,\n previousState: WorkbenchState<TData>,\n nextState: WorkbenchState<TData>,\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics }\n): void {\n if (!options.debugDiagnostics?.isEnabled()) {\n return;\n }\n\n const previousNodesByID = new Map(\n previousState.nodes.map((node) => [node.id, node])\n );\n const changes = nextState.nodes\n .map((node) => {\n const previousNode = previousNodesByID.get(node.id);\n if (!previousNode) {\n return {\n id: node.id,\n kind: \"opened\",\n nextFrame: node.frame\n };\n }\n if (\n previousNode.frame.x === node.frame.x &&\n previousNode.frame.y === node.frame.y &&\n previousNode.frame.width === node.frame.width &&\n previousNode.frame.height === node.frame.height\n ) {\n return null;\n }\n return {\n id: node.id,\n kind: \"frame-changed\",\n nextFrame: node.frame,\n previousFrame: previousNode.frame\n };\n })\n .filter((change): change is NonNullable<typeof change> => change !== null);\n\n if (changes.length === 0) {\n return;\n }\n\n console.info(\"[workbench:frame]\", {\n action: summarizeWorkbenchAction(action),\n changes,\n nextSurfaceSize: nextState.surfaceSize,\n previousSurfaceSize: previousState.surfaceSize\n });\n void Promise.resolve(\n options.debugDiagnostics.log?.({\n details: {\n action: summarizeWorkbenchAction(action),\n changes,\n nextSurfaceSize: nextState.surfaceSize,\n previousSurfaceSize: previousState.surfaceSize\n },\n event: \"frame-changed\",\n level: \"info\",\n source: \"workbench-frame\"\n })\n ).catch(() => undefined);\n}\n\nfunction summarizeWorkbenchAction<TData>(\n action: WorkbenchAction<TData>\n): Record<string, unknown> {\n switch (action.type) {\n case \"replaceState\":\n return {\n type: action.type,\n nodeCount: action.state.nodes?.length,\n nodeStack: action.state.nodeStack,\n surfaceSize: action.state.surfaceSize\n };\n case \"replaceNodes\":\n return {\n type: action.type,\n nodeIDs: action.nodes.map((node) => node.id)\n };\n case \"openNode\":\n return {\n type: action.type,\n frame: action.node.frame,\n nodeID: action.node.id\n };\n case \"dragNode\":\n case \"moveNode\":\n case \"resizeNode\":\n return {\n type: action.type,\n frame: action.frame,\n nodeID: action.nodeID\n };\n case \"setSurfaceSize\":\n return {\n type: action.type,\n size: action.size\n };\n case \"setLayoutConstraints\":\n return {\n type: action.type,\n constraints: action.constraints\n };\n case \"applyQuickLayout\":\n return {\n type: action.type,\n nodeID: action.nodeID,\n target: action.target\n };\n case \"applyLayoutPreset\":\n return {\n type: action.type,\n nodeIDs: action.nodeIDs,\n preset: action.preset\n };\n case \"applyVisibleLayoutPreset\":\n return {\n type: action.type,\n preset: action.preset\n };\n case \"applySnapTarget\":\n return {\n type: action.type,\n nodeID: action.nodeID,\n snapTarget: action.snapTarget\n };\n default:\n return \"nodeID\" in action\n ? { type: action.type, nodeID: action.nodeID }\n : { type: action.type };\n }\n}\n","import type { WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchCommands } from \"./commands.ts\";\nimport { createWorkbenchStore } from \"./createWorkbenchStore.ts\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"./types.ts\";\n\nexport function createWorkbenchController<TData = unknown>(\n initialState: Partial<WorkbenchState<TData>> = {},\n options: { debugDiagnostics?: WorkbenchDebugDiagnostics } = {}\n): WorkbenchController<TData> {\n const store = createWorkbenchStore(initialState, options);\n\n return {\n ...store,\n commands: createWorkbenchCommands(store)\n };\n}\n","import { useMemo } from \"react\";\nimport {\n WorkbenchMissionControlBackdrop,\n WorkbenchMissionControlOverlay\n} from \"../mission-control/WorkbenchMissionControlOverlay.tsx\";\nimport { useWorkbenchMissionControlPresence } from \"../mission-control/useWorkbenchMissionControlPresence.ts\";\nimport { useWorkbenchMissionControlState } from \"../mission-control/useWorkbenchMissionControlState.ts\";\nimport { WorkbenchSurface } from \"../react/WorkbenchSurface.tsx\";\nimport {\n resolveWorkbenchHostDockEntries,\n resolveWorkbenchHostRuntimeConfig\n} from \"./hostConfig.ts\";\nimport type { WorkbenchHostNodeData, WorkbenchHostProps } from \"./types.ts\";\nimport { useWorkbenchHostRuntime } from \"./useWorkbenchHostRuntime.ts\";\nimport { useWorkbenchHostSurfaceRenderers } from \"./useWorkbenchHostSurfaceRenderers.tsx\";\n\nconst noop = () => {};\n\nexport function WorkbenchHost({\n captureNodePreviewImage,\n className,\n contributions,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockEntries,\n dockStateSource,\n externalStateSource,\n i18n,\n layoutConstraints,\n missionControl,\n minimizeAnimation,\n nodes,\n onDockEntryAction,\n onDockEntryClick,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onMissionControlRequestOpen,\n onNodeCloseRequest,\n projectedNodes,\n renderBottomChrome,\n renderTopChrome,\n snapshotRepository,\n shortcutsEnabled,\n wallpaper,\n windowManagement,\n workspaceId\n}: WorkbenchHostProps) {\n const hostRuntimeConfig = useMemo(\n () =>\n resolveWorkbenchHostRuntimeConfig({\n contributions,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest\n }),\n [\n contributions,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest\n ]\n );\n const hostDockEntries = useMemo(\n () =>\n resolveWorkbenchHostDockEntries({\n contributions,\n dockEntries\n }),\n [contributions, dockEntries]\n );\n const missionControlMode = missionControl?.mode ?? null;\n const missionControlNodeIds = missionControl?.nodeIds;\n const missionControlClose = missionControl?.onRequestClose ?? noop;\n const missionControlEnabled =\n missionControlMode !== null || onMissionControlAdapterReady !== undefined;\n const {\n chromeContext,\n externalStateRevision,\n hostI18n,\n hostSession,\n isHydrating,\n missionControlI18n,\n missionControlAdapter,\n nodeDefinitionByType,\n windowChromeI18n\n } = useWorkbenchHostRuntime({\n debugDiagnostics,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n i18n,\n missionControlEnabled,\n nodes: hostRuntimeConfig.nodes,\n onHandleReady,\n onLaunchRequest: hostRuntimeConfig.onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest: hostRuntimeConfig.onNodeCloseRequest,\n projectedNodes,\n snapshotRepository,\n workspaceId\n });\n const surfaceRenderers = useWorkbenchHostSurfaceRenderers({\n captureNodePreviewImage,\n chromeContext,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockStateSource,\n dockEntries: hostDockEntries,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n externalStateRevision,\n hostI18n,\n hostSession,\n nodeDefinitionByType,\n onDockEntryAction,\n onDockEntryClick,\n onMissionControlRequestOpen,\n renderBottomChrome,\n renderTopChrome,\n workspaceId\n });\n const missionControlState = useWorkbenchMissionControlState({\n adapter: missionControlAdapter,\n mode: missionControlMode,\n nodeIds: missionControlNodeIds,\n onRequestClose: missionControlClose\n });\n const missionControlPresence =\n useWorkbenchMissionControlPresence(missionControlState);\n const missionControlRenderedState = missionControlPresence.state;\n\n return (\n <WorkbenchSurface<WorkbenchHostNodeData>\n className={className}\n captureNodePreviewImage={surfaceRenderers.captureNodePreviewImage}\n controller={hostSession.controller}\n debugDiagnostics={debugDiagnostics}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={!isHydrating}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPresence.phase}\n minimizeAnimation={minimizeAnimation}\n presentation={missionControlState?.presentation ?? null}\n renderBackdrop={\n missionControlRenderedState\n ? () => (\n <WorkbenchMissionControlBackdrop\n onExitTransitionComplete={() =>\n missionControlPresence.completeExitTransition()\n }\n phase={missionControlPresence.phase}\n />\n )\n : undefined\n }\n renderBottomChrome={surfaceRenderers.renderBottomChrome}\n renderDock={surfaceRenderers.renderDock}\n renderNode={surfaceRenderers.renderNode}\n renderNodeGeniePreview={surfaceRenderers.renderNodeGeniePreview}\n renderOverlay={\n missionControlRenderedState\n ? () => (\n <WorkbenchMissionControlOverlay\n i18n={missionControlI18n}\n phase={missionControlPresence.phase}\n state={missionControlRenderedState}\n />\n )\n : undefined\n }\n renderTopChrome={surfaceRenderers.renderTopChrome}\n renderWindowActions={surfaceRenderers.renderWindowActions}\n renderWindowHeader={surfaceRenderers.renderWindowHeader}\n shouldKeepMinimizedNodeMounted={\n surfaceRenderers.shouldKeepMinimizedNodeMounted\n }\n resolveDockPreviewCacheKey={surfaceRenderers.resolveDockPreviewCacheKey}\n resolveFullscreenHeaderMode={surfaceRenderers.resolveFullscreenHeaderMode}\n resolveWindowSurfaceLayer={surfaceRenderers.resolveWindowSurfaceLayer}\n resolveWindowZIndex={surfaceRenderers.resolveWindowZIndex}\n resolveDockAnchorKey={surfaceRenderers.resolveDockAnchorKey}\n shortcutsEnabled={shortcutsEnabled}\n shouldCaptureNodePreviewImage={\n surfaceRenderers.shouldCaptureNodePreviewImage\n }\n wallpaper={wallpaper}\n windowManagement={windowManagement}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={surfaceRenderers.windowChromeMode}\n />\n );\n}\n","import {\n useLayoutEffect,\n useRef,\n useState,\n type ComponentType,\n type TransitionEvent\n} from \"react\";\nimport {\n AppWindowIcon,\n Button,\n GridHorizontalLinedIcon,\n GridVerticalLinedIcon,\n type IconProps\n} from \"@tutti-os/ui-system\";\nimport {\n shouldShowWorkbenchMissionControlLayoutHint,\n shouldShowWorkbenchMissionControlLayoutPreset,\n shouldShowWorkbenchMissionControlNoAvailableLayoutMessage\n} from \"./layoutDock.ts\";\nimport type { WorkbenchMissionControlState } from \"./useWorkbenchMissionControlState.ts\";\nimport type { WorkbenchMissionControlPhase } from \"./useWorkbenchMissionControlPresence.ts\";\nimport type { WorkbenchMissionControlI18nRuntime } from \"./workbenchMissionControlI18n.ts\";\n\nexport interface WorkbenchMissionControlBackdropProps {\n className?: string;\n onExitTransitionComplete?: () => void;\n phase: WorkbenchMissionControlPhase;\n}\n\nexport function WorkbenchMissionControlBackdrop({\n className,\n onExitTransitionComplete,\n phase\n}: WorkbenchMissionControlBackdropProps) {\n return (\n <div\n aria-hidden\n className={[\"workbench-mission-control-backdrop\", className]\n .filter(Boolean)\n .join(\" \")}\n data-phase={phase}\n onTransitionEnd={(event: TransitionEvent<HTMLDivElement>) => {\n if (\n phase !== \"closing\" ||\n event.target !== event.currentTarget ||\n event.propertyName !== \"opacity\"\n ) {\n return;\n }\n onExitTransitionComplete?.();\n }}\n />\n );\n}\n\nexport interface WorkbenchMissionControlOverlayProps {\n i18n: WorkbenchMissionControlI18nRuntime;\n phase: WorkbenchMissionControlPhase;\n state: WorkbenchMissionControlState;\n}\n\nexport function WorkbenchMissionControlOverlay({\n i18n,\n phase,\n state\n}: WorkbenchMissionControlOverlayProps) {\n const layoutDockContentRef = useRef<HTMLDivElement | null>(null);\n const [layoutDockWidth, setLayoutDockWidth] = useState<number | null>(null);\n const layoutPresets: Array<{\n icon: ComponentType<IconProps>;\n key: \"balanced\" | \"row\" | \"column\";\n label: string;\n preset: { kind: \"balanced\" } | { kind: \"row\" } | { kind: \"column\" };\n }> = [\n {\n icon: AppWindowIcon,\n key: \"balanced\" as const,\n label: i18n.t(\"presets.balanced\"),\n preset: { kind: \"balanced\" } as const\n },\n {\n icon: GridHorizontalLinedIcon,\n key: \"row\" as const,\n label: i18n.t(\"presets.row\"),\n preset: { kind: \"row\" } as const\n },\n {\n icon: GridVerticalLinedIcon,\n key: \"column\" as const,\n label: i18n.t(\"presets.column\"),\n preset: { kind: \"column\" } as const\n }\n ].filter((option) =>\n shouldShowWorkbenchMissionControlLayoutPreset(\n state.selectedCount,\n option.preset\n )\n );\n const showLayoutSelectionHint = shouldShowWorkbenchMissionControlLayoutHint(\n state.selectedCount\n );\n const hasUsableLayoutPreset = layoutPresets.some((option) =>\n state.canUsePreset(option.preset)\n );\n const showNoAvailableLayoutMessage =\n shouldShowWorkbenchMissionControlNoAvailableLayoutMessage(\n state.selectedCount,\n hasUsableLayoutPreset\n );\n\n useLayoutEffect(() => {\n const element = layoutDockContentRef.current;\n if (!element) {\n return;\n }\n const computedStyle = window.getComputedStyle(element.parentElement!);\n const horizontalChrome =\n Number.parseFloat(computedStyle.paddingLeft) +\n Number.parseFloat(computedStyle.paddingRight) +\n Number.parseFloat(computedStyle.borderLeftWidth) +\n Number.parseFloat(computedStyle.borderRightWidth);\n setLayoutDockWidth(element.scrollWidth + horizontalChrome);\n }, [\n i18n,\n layoutPresets.length,\n showLayoutSelectionHint,\n showNoAvailableLayoutMessage,\n state.selectedCount\n ]);\n\n return (\n <div\n className=\"workbench-mission-control pointer-events-none absolute inset-0 overflow-hidden\"\n data-phase={phase}\n >\n {state.mode === \"layout\" ? (\n <div className=\"workbench-mission-control__footer-shell pointer-events-none absolute inset-x-0 bottom-0 flex justify-center px-6 pb-6\">\n <div\n className=\"workbench-mission-control__layout-dock desktop-dock-plate pointer-events-auto\"\n style={\n layoutDockWidth === null ? undefined : { width: layoutDockWidth }\n }\n onClick={(event) => event.stopPropagation()}\n >\n <div\n ref={layoutDockContentRef}\n className=\"workbench-mission-control__layout-dock-content\"\n >\n {showLayoutSelectionHint ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"layoutSelectionHint\")}\n </span>\n ) : showNoAvailableLayoutMessage ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"noAvailableLayout\")}\n </span>\n ) : (\n <div className=\"flex items-end gap-2\">\n {layoutPresets.map((option) => {\n const canApply = state.canApplyPreset(option.preset);\n const LayoutIcon = option.icon;\n\n return (\n <Button\n key={option.key}\n aria-label={option.label}\n className=\"workbench-mission-control__layout-dock-button\"\n data-layout-key={option.key}\n disabled={!canApply}\n size=\"icon\"\n title={option.label}\n type=\"button\"\n variant=\"ghost\"\n onClick={() => state.applyPreset(option.preset)}\n >\n <LayoutIcon\n aria-hidden\n className=\"workbench-mission-control__layout-glyph\"\n />\n </Button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n","import type { WorkbenchLayoutPreset } from \"../core/types.ts\";\n\nexport function shouldShowWorkbenchMissionControlLayoutHint(\n selectedCount: number\n): boolean {\n return selectedCount < 2;\n}\n\nexport function shouldShowWorkbenchMissionControlNoAvailableLayoutMessage(\n selectedCount: number,\n hasUsablePreset: boolean\n): boolean {\n return selectedCount >= 2 && !hasUsablePreset;\n}\n\nexport function shouldShowWorkbenchMissionControlLayoutPreset(\n selectedCount: number,\n preset: WorkbenchLayoutPreset\n): boolean {\n if (selectedCount === 2) {\n return preset.kind !== \"balanced\";\n }\n\n if (selectedCount >= 4) {\n return preset.kind === \"balanced\";\n }\n\n return true;\n}\n","import { useCallback, useLayoutEffect, useRef, useState } from \"react\";\nimport type { WorkbenchMissionControlState } from \"./useWorkbenchMissionControlState.ts\";\n\nexport type WorkbenchMissionControlPhase =\n | \"closed\"\n | \"entering\"\n | \"open\"\n | \"closing\";\n\nexport interface WorkbenchMissionControlPresence {\n completeExitTransition(): void;\n phase: WorkbenchMissionControlPhase;\n state: WorkbenchMissionControlState | null;\n}\n\nexport function useWorkbenchMissionControlPresence(\n state: WorkbenchMissionControlState | null\n): WorkbenchMissionControlPresence {\n const [renderedState, setRenderedState] =\n useState<WorkbenchMissionControlState | null>(state);\n const [phase, setPhase] = useState<WorkbenchMissionControlPhase>(\n state ? \"open\" : \"closed\"\n );\n const phaseRef = useRef<WorkbenchMissionControlPhase>(\n state ? \"open\" : \"closed\"\n );\n const enterFrameRef = useRef<number | null>(null);\n const setPresencePhase = useCallback(\n (nextPhase: WorkbenchMissionControlPhase) => {\n phaseRef.current = nextPhase;\n setPhase(nextPhase);\n },\n []\n );\n const completeExitTransition = useCallback(() => {\n if (phaseRef.current !== \"closing\") {\n return;\n }\n setRenderedState(null);\n setPresencePhase(\"closed\");\n }, [setPresencePhase]);\n\n useLayoutEffect(() => {\n if (enterFrameRef.current !== null) {\n window.cancelAnimationFrame(enterFrameRef.current);\n enterFrameRef.current = null;\n }\n\n if (state) {\n setRenderedState(state);\n if (phaseRef.current === \"closed\" || phaseRef.current === \"closing\") {\n setPresencePhase(\"entering\");\n }\n enterFrameRef.current = window.requestAnimationFrame(() => {\n setPresencePhase(\"open\");\n enterFrameRef.current = null;\n });\n\n return () => {\n if (enterFrameRef.current !== null) {\n window.cancelAnimationFrame(enterFrameRef.current);\n enterFrameRef.current = null;\n }\n };\n }\n\n if (renderedState === null) {\n setPresencePhase(\"closed\");\n return undefined;\n }\n\n setPresencePhase(\"closing\");\n return undefined;\n }, [renderedState, setPresencePhase, state]);\n\n return {\n completeExitTransition,\n phase,\n state: renderedState\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n useExternalStoreSnapshot,\n type ExternalStoreSnapshotSource\n} from \"@tutti-os/ui-react-hooks\";\nimport {\n defaultWorkbenchLayoutConstraints,\n defaultWorkbenchSurfaceSize,\n type WorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchLayoutPreset,\n type WorkbenchSize\n} from \"../core/types.ts\";\nimport { getWorkbenchLayoutPresetFrames } from \"../core/geometry.ts\";\nimport type { WorkbenchSurfacePresentation } from \"../react/types.ts\";\nimport {\n orderWorkbenchNodesForMissionControl,\n resolveWorkbenchMissionControlPreviewLayout\n} from \"./layout.ts\";\nimport type {\n WorkbenchMissionControlAdapter,\n WorkbenchMissionControlMode\n} from \"./types.ts\";\n\nconst missionControlStagePaddingX = 24;\nconst missionControlStageTop = 64;\nconst missionControlStageBottom = 104;\nconst inactiveMissionControlSnapshotSource: ExternalStoreSnapshotSource<null> =\n {\n getSnapshot() {\n return null;\n },\n subscribe() {\n return () => {};\n }\n };\n\nexport interface WorkbenchMissionControlState {\n applyPreset(preset: WorkbenchLayoutPreset): void;\n canApplyPreset(preset: WorkbenchLayoutPreset): boolean;\n canUsePreset(preset: WorkbenchLayoutPreset): boolean;\n mode: WorkbenchMissionControlMode;\n presentation: WorkbenchSurfacePresentation;\n selectedCount: number;\n}\n\nexport function useWorkbenchMissionControlState<TData>({\n adapter,\n mode,\n nodeIds,\n onRequestClose\n}: {\n adapter: WorkbenchMissionControlAdapter<TData> | null;\n mode: WorkbenchMissionControlMode | null;\n nodeIds?: readonly string[];\n onRequestClose: () => void;\n}): WorkbenchMissionControlState | null {\n const isActive = mode !== null && adapter !== null;\n const snapshot = useExternalStoreSnapshot(\n isActive\n ? {\n getSnapshot() {\n return adapter.getSnapshot();\n },\n subscribe(listener) {\n return adapter.subscribe(listener);\n }\n }\n : inactiveMissionControlSnapshotSource\n );\n const layoutConstraints: WorkbenchLayoutConstraints =\n snapshot?.layoutConstraints ?? defaultWorkbenchLayoutConstraints;\n const surfaceSize: WorkbenchSize =\n snapshot?.surfaceSize ?? defaultWorkbenchSurfaceSize;\n const scopedNodeIdSet = useMemo(\n () => (nodeIds === undefined ? null : new Set(nodeIds)),\n [nodeIds]\n );\n const visibleNodes = useMemo(() => {\n const nextVisibleNodes = snapshot?.visibleNodes ?? [];\n if (scopedNodeIdSet === null) {\n return nextVisibleNodes;\n }\n return nextVisibleNodes.filter((node) => scopedNodeIdSet.has(node.id));\n }, [scopedNodeIdSet, snapshot?.visibleNodes]);\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n\n useEffect(() => {\n if (mode === null) {\n return;\n }\n setSelectedNodeIds([]);\n }, [mode]);\n\n useEffect(() => {\n if (mode !== null && visibleNodes.length === 0) {\n onRequestClose();\n }\n }, [mode, onRequestClose, visibleNodes.length]);\n\n const orderedNodes = useMemo(\n () => (isActive ? orderWorkbenchNodesForMissionControl(visibleNodes) : []),\n [isActive, visibleNodes]\n );\n const orderedSelectedNodeIds = useMemo(\n () =>\n orderedNodes\n .map((node) => node.id)\n .filter((nodeId) => selectedNodeIds.includes(nodeId)),\n [orderedNodes, selectedNodeIds]\n );\n\n const previewFrame = useMemo<WorkbenchFrame>(\n () =>\n isActive\n ? {\n x: missionControlStagePaddingX,\n y: missionControlStageTop,\n width: Math.max(\n 240,\n surfaceSize.width - missionControlStagePaddingX * 2\n ),\n height: Math.max(\n 180,\n surfaceSize.height -\n missionControlStageTop -\n missionControlStageBottom\n )\n }\n : {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n },\n [isActive, surfaceSize]\n );\n const previewItems = useMemo(\n () =>\n isActive\n ? resolveWorkbenchMissionControlPreviewLayout({\n container: previewFrame,\n nodes: orderedNodes\n })\n : [],\n [isActive, orderedNodes, previewFrame]\n );\n const canUsePreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) =>\n orderedSelectedNodeIds.length < 2\n ? true\n : getWorkbenchLayoutPresetFrames(\n orderedSelectedNodeIds.length,\n nextPreset,\n surfaceSize,\n layoutConstraints\n ) !== null,\n [layoutConstraints, orderedSelectedNodeIds.length, surfaceSize]\n );\n const canApplyPreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) =>\n mode === \"layout\" &&\n orderedSelectedNodeIds.length >= 2 &&\n canUsePreset(nextPreset),\n [canUsePreset, mode, orderedSelectedNodeIds.length]\n );\n const applyActivationAndClose = useCallback(\n (nodeId: string) => {\n const nextAdapter = adapter;\n if (!nextAdapter) {\n return;\n }\n const nextSnapshot = nextAdapter.getSnapshot();\n if (!nextSnapshot.visibleNodes.some((node) => node.id === nodeId)) {\n return;\n }\n onRequestClose();\n window.requestAnimationFrame(() => {\n nextAdapter.focusNode(nodeId);\n });\n },\n [adapter, onRequestClose]\n );\n const applyLayoutAndClose = useCallback(\n (nodeIds: string[], nextPreset: WorkbenchLayoutPreset) => {\n if (!adapter || nodeIds.length < 2) {\n return;\n }\n onRequestClose();\n window.requestAnimationFrame(() => {\n adapter.applyLayoutPreset(nodeIds, nextPreset);\n });\n },\n [adapter, onRequestClose]\n );\n const onPreviewPress = useCallback(\n (nodeId: string) => {\n if (mode === null) {\n return;\n }\n if (mode === \"activate\") {\n applyActivationAndClose(nodeId);\n return;\n }\n\n setSelectedNodeIds((current) =>\n current.includes(nodeId)\n ? current.filter((entry) => entry !== nodeId)\n : [...current, nodeId]\n );\n },\n [applyActivationAndClose, mode]\n );\n const selectedNodeIdSet = useMemo(\n () => new Set(selectedNodeIds),\n [selectedNodeIds]\n );\n const applyPreset = useCallback(\n (nextPreset: WorkbenchLayoutPreset) => {\n if (!canApplyPreset(nextPreset)) {\n return;\n }\n applyLayoutAndClose(orderedSelectedNodeIds, nextPreset);\n },\n [applyLayoutAndClose, canApplyPreset, orderedSelectedNodeIds]\n );\n\n const presentation = useMemo<WorkbenchSurfacePresentation | null>(\n () =>\n mode === null\n ? null\n : {\n frameByNodeId: new Map(\n previewItems.map((item) => [item.node.id, item.frame])\n ),\n interaction: {\n mode,\n onBackdropPress: onRequestClose,\n onNodePress: onPreviewPress,\n selectedNodeIds: selectedNodeIdSet\n },\n mode: \"mission-control\",\n visibleNodeIds: new Set(orderedNodes.map((node) => node.id))\n },\n [\n mode,\n onPreviewPress,\n onRequestClose,\n orderedNodes,\n previewItems,\n selectedNodeIdSet\n ]\n );\n\n useEffect(() => {\n if (mode === null) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onRequestClose();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown, true);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown, true);\n };\n }, [mode, onRequestClose]);\n\n if (mode === null || presentation === null) {\n return null;\n }\n\n return {\n applyPreset,\n canApplyPreset,\n canUsePreset,\n mode,\n presentation,\n selectedCount: orderedSelectedNodeIds.length\n };\n}\n","import type { WorkbenchFrame, WorkbenchNode } from \"../core/types.ts\";\n\nexport const WORKBENCH_MISSION_CONTROL_GAP_PX = 20;\n\nexport interface WorkbenchMissionControlPreviewLayoutItem<TData = unknown> {\n frame: WorkbenchFrame;\n node: WorkbenchNode<TData>;\n}\n\nexport function orderWorkbenchNodesForMissionControl<TData>(\n nodes: readonly WorkbenchNode<TData>[]\n): WorkbenchNode<TData>[] {\n return [...nodes].sort((left, right) => {\n const topDelta = left.frame.y - right.frame.y;\n if (Math.abs(topDelta) > 24) {\n return topDelta;\n }\n\n const leftDelta = left.frame.x - right.frame.x;\n if (leftDelta !== 0) {\n return leftDelta;\n }\n\n return left.id.localeCompare(right.id);\n });\n}\n\nexport function resolveWorkbenchMissionControlPreviewLayout<TData>(input: {\n container: WorkbenchFrame;\n gap?: number;\n nodes: readonly WorkbenchNode<TData>[];\n}): WorkbenchMissionControlPreviewLayoutItem<TData>[] {\n const nodes = orderWorkbenchNodesForMissionControl(input.nodes);\n if (nodes.length === 0) {\n return [];\n }\n\n const gap = input.gap ?? WORKBENCH_MISSION_CONTROL_GAP_PX;\n const container = input.container;\n const scale = resolveBestPreviewScale(nodes, container, gap);\n if (scale <= 0) {\n return [];\n }\n const rows = packNodesIntoRows(nodes, container.width, gap, scale);\n if (rows.length === 0) {\n return [];\n }\n\n const totalHeight =\n rows.reduce((sum, row) => sum + row.height, 0) +\n Math.max(0, rows.length - 1) * gap;\n const startY = container.y + (container.height - totalHeight) / 2;\n const layout: WorkbenchMissionControlPreviewLayoutItem<TData>[] = [];\n let cursorY = startY;\n\n rows.forEach((row) => {\n let cursorX = container.x + (container.width - row.width) / 2;\n\n row.items.forEach((item) => {\n layout.push({\n frame: {\n x: cursorX,\n y: cursorY + (row.height - item.height) / 2,\n width: item.width,\n height: item.height\n },\n node: item.node\n });\n cursorX += item.width + gap;\n });\n\n cursorY += row.height + gap;\n });\n\n return layout;\n}\n\nfunction resolveBestPreviewScale<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n container: WorkbenchFrame,\n gap: number\n): number {\n if (container.width <= 0 || container.height <= 0) {\n return 0;\n }\n\n let lowerBound = 0;\n let upperBound = 1;\n\n while (\n scaleFitsInsideContainer(\n nodes,\n container.width,\n container.height,\n gap,\n upperBound\n )\n ) {\n lowerBound = upperBound;\n upperBound *= 2;\n\n if (upperBound > 64) {\n return lowerBound;\n }\n }\n\n for (let iteration = 0; iteration < 20; iteration += 1) {\n const next = (lowerBound + upperBound) / 2;\n\n if (\n scaleFitsInsideContainer(\n nodes,\n container.width,\n container.height,\n gap,\n next\n )\n ) {\n lowerBound = next;\n } else {\n upperBound = next;\n }\n }\n\n return lowerBound;\n}\n\nfunction scaleFitsInsideContainer<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n containerWidth: number,\n containerHeight: number,\n gap: number,\n scale: number\n): boolean {\n if (scale <= 0) {\n return false;\n }\n\n const rows = packNodesIntoRows(nodes, containerWidth, gap, scale);\n if (rows.length === 0) {\n return false;\n }\n\n const totalHeight =\n rows.reduce((sum, row) => sum + row.height, 0) +\n Math.max(0, rows.length - 1) * gap;\n return totalHeight <= containerHeight;\n}\n\nfunction packNodesIntoRows<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n containerWidth: number,\n gap: number,\n scale: number\n): PackedPreviewRow<TData>[] {\n const rows: PackedPreviewRow<TData>[] = [];\n let currentRow: PackedPreviewRow<TData> | null = null;\n\n const commitCurrentRow = () => {\n if (currentRow && currentRow.items.length > 0) {\n rows.push(currentRow);\n }\n };\n\n for (const node of nodes) {\n const width = Math.max(1, node.frame.width * scale);\n const height = Math.max(1, node.frame.height * scale);\n\n if (width > containerWidth) {\n return [];\n }\n\n if (!currentRow) {\n currentRow = {\n height,\n items: [{ height, node, width }],\n width\n };\n continue;\n }\n\n const nextWidth = currentRow.width + gap + width;\n if (nextWidth > containerWidth) {\n commitCurrentRow();\n currentRow = {\n height,\n items: [{ height, node, width }],\n width\n };\n continue;\n }\n\n currentRow.items.push({ height, node, width });\n currentRow.width = nextWidth;\n currentRow.height = Math.max(currentRow.height, height);\n }\n\n commitCurrentRow();\n\n return rows;\n}\n\ninterface PackedPreviewRow<TData> {\n height: number;\n items: Array<{\n height: number;\n node: WorkbenchNode<TData>;\n width: number;\n }>;\n width: number;\n}\n","import {\n useCallback,\n useEffect,\n type CSSProperties,\n type ReactNode\n} from \"react\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type {\n WorkbenchLayoutConstraintsInput,\n WorkbenchNode\n} from \"../core/types.ts\";\nimport { WorkbenchDockFrame } from \"./WorkbenchDockFrame.tsx\";\nimport { WorkbenchNodeLayer } from \"./WorkbenchNodeLayer.tsx\";\nimport {\n WorkbenchProvider,\n useWorkbenchController\n} from \"./WorkbenchProvider.tsx\";\nimport type { WorkbenchDebugDiagnostics } from \"../store/types.ts\";\nimport { useWorkbenchShortcuts } from \"./hooks/useWorkbenchShortcuts.ts\";\nimport type { WorkbenchWindowManagementShortcutPreset } from \"./hooks/workbenchShortcutIntent.ts\";\nimport { useWorkbenchSurfaceSize } from \"./hooks/useWorkbenchSurfaceSize.ts\";\nimport { useWorkbenchGenieAnimation } from \"./useWorkbenchGenieAnimation.tsx\";\nimport type { WorkbenchNodeGeniePreviewRenderer } from \"./useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockContext,\n WorkbenchDockPlacement,\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchMinimizeAnimation,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\n WorkbenchResolveWindowSurfaceLayer,\n WorkbenchResolveWindowZIndex,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\n\nexport interface WorkbenchSurfaceProps<TData = unknown> {\n captureNodePreviewImage?: (\n node: WorkbenchNode<TData>\n ) => Promise<string | null> | string | null;\n className?: string;\n controller: WorkbenchController<TData>;\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchDockPlacement;\n interactive?: boolean;\n layoutConstraints?: WorkbenchLayoutConstraintsInput;\n missionControlPhase?: \"closed\" | \"entering\" | \"open\" | \"closing\";\n minimizeAnimation?: WorkbenchMinimizeAnimation;\n presentation?: WorkbenchSurfacePresentation | null;\n renderBackdrop?: () => ReactNode;\n renderBottomChrome?: () => ReactNode;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n renderNode: WorkbenchRenderNode<TData>;\n renderNodeGeniePreview?: WorkbenchNodeGeniePreviewRenderer<TData>;\n renderOverlay?: () => ReactNode;\n renderTopChrome?: () => ReactNode;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n resolveWindowSurfaceLayer?: WorkbenchResolveWindowSurfaceLayer<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shortcutsEnabled?: boolean;\n shouldCaptureNodePreviewImage?: (node: WorkbenchNode<TData>) => boolean;\n wallpaper?: WorkbenchSurfaceWallpaper;\n windowManagement?: WorkbenchWindowManagementConfig;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport interface WorkbenchWindowManagementConfig {\n edgeSnapEnabled?: boolean;\n shortcutPreset?: WorkbenchWindowManagementShortcutPreset | null;\n}\n\nexport type WorkbenchSurfaceWallpaperFit =\n | \"contain\"\n | \"cover\"\n | \"stretch\"\n | \"center\";\n\nexport interface WorkbenchSurfaceWallpaper {\n appearance?: \"dark\" | \"light\";\n fit?: WorkbenchSurfaceWallpaperFit;\n position?: string;\n url: string;\n}\n\nexport function WorkbenchSurface<TData>({\n captureNodePreviewImage,\n className,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n interactive,\n layoutConstraints,\n missionControlPhase,\n minimizeAnimation,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveWindowSurfaceLayer,\n resolveWindowZIndex,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n shouldCaptureNodePreviewImage,\n wallpaper,\n windowManagement,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchSurfaceProps<TData>) {\n return (\n <WorkbenchProvider controller={controller}>\n <WorkbenchSurfaceInner\n captureNodePreviewImage={captureNodePreviewImage}\n className={className}\n debugDiagnostics={debugDiagnostics}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={interactive}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPhase}\n minimizeAnimation={minimizeAnimation}\n presentation={presentation}\n renderBackdrop={renderBackdrop}\n renderBottomChrome={renderBottomChrome}\n renderDock={renderDock}\n renderNode={renderNode}\n renderNodeGeniePreview={renderNodeGeniePreview}\n renderOverlay={renderOverlay}\n renderTopChrome={renderTopChrome}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n resolveWindowSurfaceLayer={resolveWindowSurfaceLayer}\n resolveWindowZIndex={resolveWindowZIndex}\n resolveDockAnchorKey={resolveDockAnchorKey}\n resolveDockPreviewCacheKey={resolveDockPreviewCacheKey}\n shortcutsEnabled={shortcutsEnabled}\n shouldCaptureNodePreviewImage={shouldCaptureNodePreviewImage}\n wallpaper={wallpaper}\n windowManagement={windowManagement}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n </WorkbenchProvider>\n );\n}\n\nfunction WorkbenchSurfaceInner<TData>({\n captureNodePreviewImage,\n className,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n interactive = true,\n layoutConstraints,\n missionControlPhase,\n minimizeAnimation,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveWindowSurfaceLayer,\n resolveWindowZIndex,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n shouldCaptureNodePreviewImage,\n wallpaper,\n windowManagement,\n windowChromeMode,\n windowChromeI18n\n}: Omit<WorkbenchSurfaceProps<TData>, \"controller\">) {\n const controller = useWorkbenchController<TData>();\n const onSizeChange = useCallback(\n (size: { width: number; height: number }) => {\n controller.commands.setSurfaceSize(size);\n },\n [controller]\n );\n const ref = useWorkbenchSurfaceSize<HTMLDivElement>(onSizeChange);\n const genie = useWorkbenchGenieAnimation({\n captureNodePreviewImage,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n minimizeAnimation,\n renderNodeGeniePreview,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shouldCaptureNodePreviewImage\n });\n useWorkbenchShortcuts<TData>({\n enabled: (shortcutsEnabled ?? true) && interactive,\n windowManagementShortcutPreset: windowManagement?.shortcutPreset ?? null\n });\n useEffect(() => {\n if (!layoutConstraints) {\n return;\n }\n controller.commands.setLayoutConstraints(layoutConstraints);\n }, [controller, layoutConstraints]);\n const wallpaperStyle: CSSProperties | undefined = wallpaper\n ? {\n backgroundImage: `url(${JSON.stringify(wallpaper.url)})`,\n backgroundPosition: wallpaper.position ?? \"center\",\n backgroundSize: resolveWorkbenchSurfaceWallpaperBackgroundSize(\n wallpaper.fit ?? \"cover\"\n )\n }\n : undefined;\n\n return (\n <div\n ref={ref}\n className={[\"workbench-surface\", className].filter(Boolean).join(\" \")}\n data-mission-control-phase={missionControlPhase ?? \"closed\"}\n data-presentation-mode={presentation?.mode ?? \"default\"}\n data-workbench-interactive={interactive ? \"true\" : \"false\"}\n >\n {wallpaper ? (\n <div\n className=\"workbench-surface__wallpaper\"\n style={wallpaperStyle}\n aria-hidden\n />\n ) : null}\n {renderTopChrome ? (\n <div className=\"workbench-surface__top-chrome\">{renderTopChrome()}</div>\n ) : null}\n {renderBackdrop ? renderBackdrop() : null}\n <WorkbenchNodeLayer\n genie={genie}\n interactive={interactive}\n presentation={presentation}\n renderNode={renderNode}\n edgeSnapEnabled={windowManagement?.edgeSnapEnabled === true}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n resolveWindowSurfaceLayer={resolveWindowSurfaceLayer}\n resolveWindowZIndex={resolveWindowZIndex}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n <WorkbenchDockFrame\n dockPlacement={dockPlacement}\n genie={genie}\n interactive={interactive}\n renderDock={renderDock}\n />\n {renderBottomChrome ? (\n <div className=\"workbench-surface__bottom-chrome\">\n {renderBottomChrome()}\n </div>\n ) : null}\n {renderOverlay ? renderOverlay() : null}\n {genie.genieLayer}\n </div>\n );\n}\n\nfunction resolveWorkbenchSurfaceWallpaperBackgroundSize(\n fit: WorkbenchSurfaceWallpaperFit\n): string {\n switch (fit) {\n case \"contain\":\n return \"contain\";\n case \"cover\":\n return \"cover\";\n case \"stretch\":\n return \"100% 100%\";\n case \"center\":\n return \"auto\";\n }\n}\n","import { useMemo, type ReactNode } from \"react\";\nimport {\n selectFocusedWorkbenchNode,\n selectFullscreenNodeToExitBeforeDockLaunch\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchDockContext, WorkbenchDockPlacement } from \"./types.ts\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { createWorkbenchDockNodesSelector } from \"./dockNodeSelectors.ts\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\n\nexport interface WorkbenchDockFrameProps<TData = unknown> {\n dockPlacement?: WorkbenchDockPlacement;\n genie: WorkbenchGenieController<TData>;\n interactive?: boolean;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n}\n\nexport function WorkbenchDockFrame<TData>({\n dockPlacement = \"bottom\",\n genie,\n interactive = true,\n renderDock\n}: WorkbenchDockFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const selectDockNodes = useMemo(\n () => createWorkbenchDockNodesSelector<TData>(),\n []\n );\n const hasFullscreenNode = useWorkbenchSelector((state) =>\n state.nodes.some(\n (node) => node.displayMode === \"fullscreen\" && !node.isMinimized\n )\n );\n const nodes = useWorkbenchSelector<TData, readonly WorkbenchNode<TData>[]>(\n selectDockNodes\n );\n const minimizedNodesWithPending = useMemo(\n () =>\n mergePendingMinimizedDockNode(\n nodes.filter((node) => node.isMinimized),\n genie.pendingMinimizedNode\n ),\n [genie.pendingMinimizedNode, nodes]\n );\n const minimizedNodes = useMemo(\n () => minimizedNodesWithPending.filter((node) => node.isMinimized),\n [minimizedNodesWithPending]\n );\n const focusedNodeId = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id ?? null\n );\n\n if (!renderDock && minimizedNodes.length === 0) {\n return null;\n }\n\n return (\n <>\n {hasFullscreenNode ? (\n <div\n className=\"workbench-dock-frame__immersive-hover-zone\"\n data-dock-placement={dockPlacement}\n aria-hidden\n />\n ) : null}\n <div\n className=\"workbench-dock-frame\"\n data-dock-placement={dockPlacement}\n data-immersive-state={hasFullscreenNode ? \"hidden\" : \"disabled\"}\n >\n {renderDock\n ? renderDock({\n controller,\n focusedNodeId,\n genie: {\n launchNodeFromAnchor: (anchorKey, nodeID, launch) => {\n const fullscreenNode = interactive\n ? selectFullscreenNodeToExitBeforeDockLaunch(\n controller.getSnapshot(),\n nodeID\n )\n : null;\n if (fullscreenNode) {\n controller.commands.exitFullscreen(fullscreenNode.id);\n }\n genie.launchNodeFromAnchor(anchorKey, nodeID, launch);\n },\n registerDockAnchor: (anchorKey, element) => {\n genie.registerDockAnchor(anchorKey, element);\n },\n shouldAnimateMinimizedDockEnter: (nodeID) => {\n return genie.shouldAnimateMinimizedDockEnter(nodeID);\n },\n isPendingMinimizedDockNode: (nodeID) => {\n return genie.isPendingMinimizedDockNode(nodeID);\n }\n },\n minimizedNodes,\n nodes\n })\n : null}\n </div>\n </>\n );\n}\n\nfunction mergePendingMinimizedDockNode<TData>(\n nodes: readonly WorkbenchNode<TData>[],\n pendingNode: WorkbenchNode<TData> | null\n): readonly WorkbenchNode<TData>[] {\n if (!pendingNode) {\n return nodes;\n }\n\n const existingNode = nodes.find((node) => node.id === pendingNode.id);\n if (existingNode?.isMinimized) {\n return nodes;\n }\n\n return [...nodes.filter((node) => node.id !== pendingNode.id), pendingNode];\n}\n","import { getWorkbenchSnapRect } from \"./geometry.ts\";\nimport { orderWorkbenchNodesForRender } from \"./stack.ts\";\nimport type { WorkbenchFrame, WorkbenchNode, WorkbenchState } from \"./types.ts\";\n\nexport function selectVisibleWorkbenchNodes<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData>[] {\n return state.nodes.filter((node) => !node.isMinimized);\n}\n\nexport function selectFocusedWorkbenchNode<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData> | null {\n const focusedID = state.nodeStack.at(-1);\n return state.nodes.find((node) => node.id === focusedID) ?? null;\n}\n\nexport function selectFocusedVisibleWorkbenchNode<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData> | null {\n const nodeByID = new Map(state.nodes.map((node) => [node.id, node]));\n for (let index = state.nodeStack.length - 1; index >= 0; index -= 1) {\n const node = nodeByID.get(state.nodeStack[index] ?? \"\");\n if (node && !node.isMinimized) {\n return node;\n }\n }\n return state.nodes.find((node) => !node.isMinimized) ?? null;\n}\n\nexport function selectFullscreenNodeToExitBeforeDockLaunch<TData>(\n state: WorkbenchState<TData>,\n targetNodeID?: string\n): WorkbenchNode<TData> | null {\n const nodeByID = new Map(state.nodes.map((node) => [node.id, node]));\n const isVisibleFullscreenNode = (\n node: WorkbenchNode<TData> | undefined\n ): node is WorkbenchNode<TData> => {\n return (\n node !== undefined &&\n node.displayMode === \"fullscreen\" &&\n !node.isMinimized\n );\n };\n\n let target: WorkbenchNode<TData> | undefined;\n for (let index = state.nodeStack.length - 1; index >= 0; index -= 1) {\n const stackedNode = nodeByID.get(state.nodeStack[index] ?? \"\");\n if (isVisibleFullscreenNode(stackedNode)) {\n target = stackedNode;\n break;\n }\n }\n target ??= state.nodes.find(isVisibleFullscreenNode);\n\n if (!target || target.id === targetNodeID) {\n return null;\n }\n return target;\n}\n\nexport function selectOrderedWorkbenchNodes<TData>(\n state: WorkbenchState<TData>\n): WorkbenchNode<TData>[] {\n return orderWorkbenchNodesForRender(\n selectVisibleWorkbenchNodes(state),\n state.nodeStack\n );\n}\n\nexport function selectWorkbenchNodeZIndex(\n state: WorkbenchState,\n nodeID: string\n): number {\n const index = state.nodeStack.indexOf(nodeID);\n return index < 0 ? 1 : index + 1;\n}\n\nexport function selectWorkbenchSnapPreviewRect(\n state: WorkbenchState\n): WorkbenchFrame | null {\n return getWorkbenchSnapRect(\n state.activeSnapTarget,\n state.surfaceSize,\n state.layoutConstraints\n );\n}\n","import { createContext, useContext, type PropsWithChildren } from \"react\";\nimport type { WorkbenchController } from \"../store/types.ts\";\n\nconst WorkbenchContext = createContext<WorkbenchController | null>(null);\n\nexport interface WorkbenchProviderProps<\n TData = unknown\n> extends PropsWithChildren {\n controller: WorkbenchController<TData>;\n}\n\nexport function WorkbenchProvider<TData>({\n children,\n controller\n}: WorkbenchProviderProps<TData>) {\n return (\n <WorkbenchContext.Provider value={controller}>\n {children}\n </WorkbenchContext.Provider>\n );\n}\n\nexport function useWorkbenchController<\n TData = unknown\n>(): WorkbenchController<TData> {\n const controller = useContext(WorkbenchContext);\n if (!controller) {\n throw new Error(\"WorkbenchProvider is missing.\");\n }\n return controller as WorkbenchController<TData>;\n}\n","import type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\n\nexport function createWorkbenchDockNodesSelector<TData>(): (\n state: WorkbenchState<TData>\n) => readonly WorkbenchNode<TData>[] {\n let previousNodes: readonly WorkbenchNode<TData>[] | null = null;\n\n return (state) => {\n if (\n previousNodes &&\n areWorkbenchDockNodesEqual(previousNodes, state.nodes)\n ) {\n return previousNodes;\n }\n\n previousNodes = state.nodes;\n return state.nodes;\n };\n}\n\nfunction areWorkbenchDockNodesEqual<TData>(\n previousNodes: readonly WorkbenchNode<TData>[],\n nextNodes: readonly WorkbenchNode<TData>[]\n): boolean {\n if (previousNodes.length !== nextNodes.length) {\n return false;\n }\n\n return previousNodes.every((previousNode, index) => {\n const nextNode = nextNodes[index];\n return (\n nextNode !== undefined &&\n previousNode.id === nextNode.id &&\n previousNode.kind === nextNode.kind &&\n previousNode.title === nextNode.title &&\n previousNode.displayMode === nextNode.displayMode &&\n previousNode.isMinimized === nextNode.isMinimized &&\n previousNode.minimizedAtUnixMs === nextNode.minimizedAtUnixMs &&\n previousNode.frame.width === nextNode.frame.width &&\n previousNode.frame.height === nextNode.frame.height &&\n previousNode.data === nextNode.data\n );\n });\n}\n","import { useExternalStoreSelector } from \"@tutti-os/ui-react-hooks\";\nimport type { WorkbenchState } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchSelector<TData, TResult>(\n selector: (state: WorkbenchState<TData>) => TResult\n): TResult {\n const controller = useWorkbenchController<TData>();\n return useExternalStoreSelector(controller, selector);\n}\n","import { Fragment, memo, useMemo } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n selectFocusedWorkbenchNode,\n selectWorkbenchNodeZIndex,\n selectWorkbenchSnapPreviewRect\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\n WorkbenchResolveWindowSurfaceLayer,\n WorkbenchResolveWindowZIndex,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { WorkbenchWindowFrame } from \"./WorkbenchWindowFrame.tsx\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport { createRenderedWorkbenchNodeIDsSelector } from \"./renderedNodeIds.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\nimport { resolveWorkbenchWindowChromeMode } from \"./windowHeader.ts\";\n\nexport interface WorkbenchNodeLayerProps<TData = unknown> {\n genie: WorkbenchGenieController<TData>;\n edgeSnapEnabled?: boolean;\n interactive?: boolean;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n resolveWindowSurfaceLayer?: WorkbenchResolveWindowSurfaceLayer<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport function WorkbenchNodeLayer<TData>({\n genie,\n edgeSnapEnabled = false,\n interactive = true,\n presentation,\n renderNode,\n shouldKeepMinimizedNodeMounted,\n renderWindowActions,\n renderWindowHeader,\n resolveFullscreenHeaderMode,\n resolveWindowSurfaceLayer,\n resolveWindowZIndex,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchNodeLayerProps<TData>) {\n const selectRenderedNodeIDs = useMemo(\n () =>\n createRenderedWorkbenchNodeIDsSelector(shouldKeepMinimizedNodeMounted),\n [shouldKeepMinimizedNodeMounted]\n );\n const nodeIDs = useWorkbenchSelector<TData, readonly string[]>(\n selectRenderedNodeIDs\n );\n const { defaultNodeIDs, dialogPopoverNodeIDs } = useWorkbenchSelector<\n TData,\n {\n defaultNodeIDs: readonly string[];\n dialogPopoverNodeIDs: readonly string[];\n }\n >((state) => {\n if (\n !resolveWindowSurfaceLayer ||\n presentation?.mode === \"mission-control\"\n ) {\n return {\n defaultNodeIDs: nodeIDs,\n dialogPopoverNodeIDs: [] as string[]\n };\n }\n\n const nodeByID = new Map(state.nodes.map((node) => [node.id, node]));\n const nextDefaultNodeIDs: string[] = [];\n const nextDialogPopoverNodeIDs: string[] = [];\n\n for (const nodeID of nodeIDs) {\n const node = nodeByID.get(nodeID);\n if (node && resolveWindowSurfaceLayer({ node }) === \"dialog-popover\") {\n nextDialogPopoverNodeIDs.push(nodeID);\n } else {\n nextDefaultNodeIDs.push(nodeID);\n }\n }\n\n return {\n defaultNodeIDs: nextDefaultNodeIDs,\n dialogPopoverNodeIDs: nextDialogPopoverNodeIDs\n };\n });\n const snapPreviewRect = useWorkbenchSelector(selectWorkbenchSnapPreviewRect);\n const presentationInteraction =\n interactive && presentation?.mode === \"mission-control\"\n ? (presentation.interaction ?? null)\n : null;\n const dialogPopoverLayer =\n dialogPopoverNodeIDs.length > 0 ? (\n <WorkbenchNodeLayerGroup\n className=\"workbench-node-layer workbench-node-layer--dialog-popover\"\n edgeSnapEnabled={edgeSnapEnabled}\n fullscreenHeaderMode={resolveFullscreenHeaderMode}\n genie={genie}\n interactive={interactive}\n nodeIDs={dialogPopoverNodeIDs}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n resolveWindowZIndex={resolveWindowZIndex}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n ) : null;\n\n return (\n <Fragment>\n <WorkbenchNodeLayerGroup\n className=\"workbench-node-layer\"\n edgeSnapEnabled={edgeSnapEnabled}\n fullscreenHeaderMode={resolveFullscreenHeaderMode}\n genie={genie}\n interactive={interactive}\n nodeIDs={defaultNodeIDs}\n onBackdropPress={presentationInteraction?.onBackdropPress}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n resolveWindowZIndex={resolveWindowZIndex}\n snapPreviewRect={snapPreviewRect}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n {typeof document === \"undefined\"\n ? dialogPopoverLayer\n : dialogPopoverLayer\n ? createPortal(dialogPopoverLayer, document.body)\n : null}\n </Fragment>\n );\n}\n\ninterface WorkbenchNodeLayerGroupProps<TData = unknown> {\n className: string;\n edgeSnapEnabled: boolean;\n fullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n genie: WorkbenchGenieController<TData>;\n interactive: boolean;\n nodeIDs: readonly string[];\n onBackdropPress?: () => void;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n snapPreviewRect?: ReturnType<typeof selectWorkbenchSnapPreviewRect>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nfunction WorkbenchNodeLayerGroup<TData>({\n className,\n edgeSnapEnabled,\n fullscreenHeaderMode,\n genie,\n interactive,\n nodeIDs,\n onBackdropPress,\n presentation,\n renderNode,\n renderWindowActions,\n renderWindowHeader,\n resolveWindowZIndex,\n snapPreviewRect,\n windowChromeI18n,\n windowChromeMode\n}: WorkbenchNodeLayerGroupProps<TData>) {\n return (\n <div\n className={className}\n data-workbench-interactive={interactive ? \"true\" : \"false\"}\n onClick={\n onBackdropPress\n ? (event) => {\n if (event.target !== event.currentTarget) {\n return;\n }\n onBackdropPress();\n }\n : undefined\n }\n >\n {snapPreviewRect ? (\n <div\n className=\"workbench-snap-preview\"\n style={{\n height: snapPreviewRect.height,\n left: snapPreviewRect.x,\n top: snapPreviewRect.y,\n width: snapPreviewRect.width\n }}\n />\n ) : null}\n {nodeIDs.map((nodeID) => (\n <MemoizedWorkbenchNodeLayerItem\n key={nodeID}\n fullscreenHeaderMode={fullscreenHeaderMode}\n genie={genie}\n edgeSnapEnabled={edgeSnapEnabled}\n interactive={interactive}\n nodeID={nodeID}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n resolveWindowZIndex={resolveWindowZIndex}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n ))}\n </div>\n );\n}\n\ninterface WorkbenchNodeLayerItemProps<TData = unknown> {\n fullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n genie: WorkbenchGenieController<TData>;\n edgeSnapEnabled: boolean;\n interactive: boolean;\n nodeID: string;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nfunction WorkbenchNodeLayerItem<TData>({\n fullscreenHeaderMode,\n genie,\n edgeSnapEnabled,\n interactive,\n nodeID,\n presentation,\n renderNode,\n renderWindowActions,\n renderWindowHeader,\n resolveWindowZIndex,\n windowChromeI18n,\n windowChromeMode\n}: WorkbenchNodeLayerItemProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const node = useWorkbenchSelector<TData, WorkbenchNode<TData> | null>(\n (state) => state.nodes.find((candidate) => candidate.id === nodeID) ?? null\n );\n const isFocused = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id === nodeID\n );\n const zIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, nodeID)\n );\n\n if (!node) {\n return null;\n }\n\n return (\n <WorkbenchWindowFrame\n edgeSnapEnabled={edgeSnapEnabled}\n hiddenMounted={node.isMinimized}\n interactive={interactive}\n presentation={presentation}\n node={node}\n genie={genie}\n resolveWindowZIndex={resolveWindowZIndex}\n fullscreenHeaderMode={fullscreenHeaderMode?.({\n controller,\n node\n })}\n renderActions={renderWindowActions}\n renderHeader={renderWindowHeader}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={resolveWorkbenchWindowChromeMode({\n controller,\n node,\n windowChromeMode\n })}\n >\n {renderNode({\n node,\n layout: {\n frame: node.frame,\n presentation,\n zIndex,\n isFocused\n },\n controller\n })}\n </WorkbenchWindowFrame>\n );\n}\n\nconst MemoizedWorkbenchNodeLayerItem = memo(\n WorkbenchNodeLayerItem\n) as typeof WorkbenchNodeLayerItem;\n","import { type ReactNode } from \"react\";\nimport { createI18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport { Checkbox } from \"@tutti-os/ui-system\";\nimport {\n selectFocusedWorkbenchNode,\n selectWorkbenchNodeZIndex\n} from \"../core/selectors.ts\";\nimport type { WorkbenchNode, WorkbenchResizeHandle } from \"../core/types.ts\";\nimport { useWorkbenchController } from \"./WorkbenchProvider.tsx\";\nimport { WorkbenchWindowFullscreenToggle } from \"./WorkbenchWindowFullscreenToggle.tsx\";\nimport { useWorkbenchDrag } from \"./hooks/useWorkbenchDrag.ts\";\nimport { useWorkbenchResize } from \"./hooks/useWorkbenchResize.ts\";\nimport { useWorkbenchSelector } from \"./hooks/useWorkbenchSelector.ts\";\nimport {\n createWorkbenchWindowChromeI18nRuntime,\n workbenchWindowChromeI18nResources,\n type WorkbenchWindowChromeI18nRuntime\n} from \"./workbenchWindowI18n.ts\";\nimport type {\n WorkbenchFullscreenHeaderMode,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowZIndex,\n WorkbenchSurfacePresentation,\n WorkbenchWindowChromeMode\n} from \"./types.ts\";\nimport type { WorkbenchGenieController } from \"./useWorkbenchGenieAnimation.tsx\";\nimport { resolveWorkbenchWindowHeader } from \"./windowHeader.ts\";\n\nexport interface WorkbenchWindowFrameProps<TData = unknown> {\n children: ReactNode;\n genie: WorkbenchGenieController;\n edgeSnapEnabled?: boolean;\n hiddenMounted?: boolean;\n interactive?: boolean;\n node: WorkbenchNode<TData>;\n presentation?: WorkbenchSurfacePresentation | null;\n renderActions?: WorkbenchRenderWindowActions<TData>;\n renderHeader?: WorkbenchRenderWindowHeader<TData>;\n resolveWindowZIndex?: WorkbenchResolveWindowZIndex<TData>;\n fullscreenHeaderMode?: WorkbenchFullscreenHeaderMode;\n windowChromeMode?: WorkbenchWindowChromeMode;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nconst resizeHandles: WorkbenchResizeHandle[] = [\n \"north\",\n \"east\",\n \"south\",\n \"west\",\n \"north-east\",\n \"north-west\",\n \"south-east\",\n \"south-west\"\n];\n\nconst defaultWindowChromeI18n = createWorkbenchWindowChromeI18nRuntime(\n createI18nRuntime({\n dictionaries: [workbenchWindowChromeI18nResources.en]\n })\n);\n\nfunction resolveWorkbenchNodeLaunchSource(data: unknown): string | undefined {\n if (\n data &&\n typeof data === \"object\" &&\n \"launchSource\" in data &&\n typeof data.launchSource === \"string\" &&\n data.launchSource.length > 0\n ) {\n return data.launchSource;\n }\n return undefined;\n}\n\nfunction resolveWorkbenchNodeTypeId(data: unknown): string | undefined {\n if (\n data &&\n typeof data === \"object\" &&\n \"typeId\" in data &&\n typeof data.typeId === \"string\"\n ) {\n return data.typeId;\n }\n\n return undefined;\n}\n\nexport function WorkbenchWindowFrame<TData>({\n children,\n edgeSnapEnabled = false,\n genie,\n hiddenMounted = false,\n interactive = true,\n node,\n presentation = null,\n renderActions,\n renderHeader,\n resolveWindowZIndex,\n windowChromeMode = \"system\",\n windowChromeI18n\n}: WorkbenchWindowFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const baseZIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, node.id)\n );\n const zIndex =\n resolveWindowZIndex?.({\n baseZIndex,\n node\n }) ?? baseZIndex;\n const isFocused = useWorkbenchSelector(\n (state) => selectFocusedWorkbenchNode(state)?.id === node.id\n );\n const isDragging = useWorkbenchSelector(\n (state) => state.activeDragNodeId === node.id\n );\n const isResizing = useWorkbenchSelector(\n (state) => state.activeResizeNodeId === node.id\n );\n const onDragStart = useWorkbenchDrag(node, { edgeSnapEnabled });\n const onHeaderDoubleClick = () => {\n if (!interactive) {\n return;\n }\n controller.commands.focusNode(node.id);\n controller.commands.applySnapTarget(node.id, \"top\");\n };\n const genieControls = {\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => {\n genie.minimizeNodeToAnchor(nodeID, minimize);\n }\n } as const;\n const defaultActions = interactive ? (\n <div\n className=\"workbench-window__traffic-light-actions\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n {renderActions\n ? renderActions({\n controller,\n genie: genieControls,\n node\n })\n : null}\n <WorkbenchWindowFullscreenToggle\n controller={controller}\n i18n={windowChromeI18n ?? defaultWindowChromeI18n}\n node={node}\n />\n </div>\n ) : null;\n const resolvedHeader = resolveWorkbenchWindowHeader({\n controller,\n defaultActions,\n genie: genieControls,\n node,\n onDoubleClick: onHeaderDoubleClick,\n onDragStart,\n renderHeader: interactive ? renderHeader : undefined,\n windowChromeMode\n });\n const shouldRenderCustomHeader =\n resolvedHeader.windowChromeMode === \"custom-header\";\n const resolvedFullscreenHeaderMode: WorkbenchFullscreenHeaderMode =\n \"persistent\";\n const presentationMode = presentation?.mode ?? null;\n const presentationFrame = presentation?.frameByNodeId.get(node.id) ?? null;\n const isPresentationHidden =\n presentationMode === \"mission-control\" &&\n !presentation?.visibleNodeIds.has(node.id);\n const presentationInteraction =\n interactive &&\n presentationMode === \"mission-control\" &&\n !isPresentationHidden\n ? (presentation?.interaction ?? null)\n : null;\n const isMissionControlSelected =\n presentationInteraction?.selectedNodeIds.has(node.id) ?? false;\n const presentationScale =\n presentationMode === \"mission-control\" && presentationFrame\n ? Math.min(\n presentationFrame.width / Math.max(1, node.frame.width),\n presentationFrame.height / Math.max(1, node.frame.height)\n )\n : 1;\n const presentationOffsetX =\n presentationMode === \"mission-control\" && presentationFrame\n ? presentationFrame.x +\n Math.max(\n 0,\n (presentationFrame.width - node.frame.width * presentationScale) / 2\n ) -\n node.frame.x\n : 0;\n const presentationOffsetY =\n presentationMode === \"mission-control\" && presentationFrame\n ? presentationFrame.y +\n Math.max(\n 0,\n (presentationFrame.height - node.frame.height * presentationScale) / 2\n ) -\n node.frame.y\n : 0;\n const shellTransform =\n presentationMode === \"mission-control\" && presentationFrame\n ? `matrix(${presentationScale}, 0, 0, ${presentationScale}, ${presentationOffsetX}, ${presentationOffsetY})`\n : undefined;\n\n return (\n <section\n aria-hidden={hiddenMounted || isPresentationHidden ? true : undefined}\n className=\"workbench-window-shell\"\n data-focused={isFocused ? \"true\" : \"false\"}\n data-display-mode={node.displayMode}\n data-genie-state={genie.isNodeGenieHidden(node.id) ? \"hidden\" : \"visible\"}\n data-launch-source={resolveWorkbenchNodeLaunchSource(node.data)}\n data-minimized-mount={hiddenMounted ? \"hidden\" : \"visible\"}\n data-presentation-mode={presentationMode ?? \"default\"}\n data-presentation-visibility={isPresentationHidden ? \"hidden\" : \"visible\"}\n data-slot=\"viewport-menu-boundary\"\n data-workbench-node-type-id={resolveWorkbenchNodeTypeId(node.data)}\n data-workbench-window-id={node.id}\n data-window-drag-state={isDragging ? \"dragging\" : \"idle\"}\n data-window-resize-state={isResizing ? \"resizing\" : \"idle\"}\n style={{\n height: node.frame.height,\n left: node.frame.x,\n top: node.frame.y,\n transform: shellTransform,\n transformOrigin: \"top left\",\n width: node.frame.width,\n zIndex\n }}\n onPointerDown={\n hiddenMounted ||\n isPresentationHidden ||\n !interactive ||\n presentationMode === \"mission-control\"\n ? undefined\n : () => controller.commands.focusNode(node.id)\n }\n >\n <div className=\"workbench-window-shell__content\">\n <div\n className=\"workbench-window\"\n data-focused={isFocused ? \"true\" : \"false\"}\n data-display-mode={node.displayMode}\n data-fullscreen-header-mode={resolvedFullscreenHeaderMode}\n data-window-chrome-mode={resolvedHeader.windowChromeMode}\n data-workbench-window-capture=\"true\"\n data-window-drag-state={isDragging ? \"dragging\" : \"idle\"}\n data-window-resize-state={isResizing ? \"resizing\" : \"idle\"}\n >\n <div\n className={[\n \"workbench-window__header\",\n shouldRenderCustomHeader\n ? \"workbench-window__header--custom\"\n : null\n ]\n .filter(Boolean)\n .join(\" \")}\n onDoubleClick={\n shouldRenderCustomHeader || !interactive\n ? undefined\n : onHeaderDoubleClick\n }\n onPointerDown={\n shouldRenderCustomHeader || !interactive ? undefined : onDragStart\n }\n >\n {shouldRenderCustomHeader ? (\n resolvedHeader.customHeader\n ) : (\n <>\n {defaultActions}\n <div className=\"workbench-window__title\">{node.title}</div>\n </>\n )}\n </div>\n <div className=\"workbench-window__body\">{children}</div>\n </div>\n {node.displayMode === \"floating\" &&\n !hiddenMounted &&\n presentationMode !== \"mission-control\" &&\n interactive\n ? resizeHandles.map((handle) => (\n <ResizeHandle key={handle} handle={handle} node={node} />\n ))\n : null}\n </div>\n {presentationInteraction ? (\n <button\n aria-label={node.title}\n aria-pressed={\n presentationInteraction.mode === \"layout\"\n ? isMissionControlSelected\n : undefined\n }\n className=\"absolute inset-0 z-10 block appearance-none rounded-lg border-0 bg-transparent p-0 text-left outline-none focus-visible:ring-2 focus-visible:ring-ring/60\"\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n presentationInteraction.onNodePress(node.id);\n }}\n >\n {presentationInteraction.mode === \"layout\" &&\n isMissionControlSelected ? (\n <div className=\"pointer-events-none absolute inset-0 rounded-lg border-2 border-[var(--tutti-purple)] transition-[border-color,transform] duration-150 ease-out\" />\n ) : null}\n </button>\n ) : null}\n {presentationInteraction?.mode === \"layout\" &&\n isMissionControlSelected ? (\n <Checkbox\n aria-hidden=\"true\"\n checked\n className=\"pointer-events-none absolute right-3 bottom-3 z-20 size-6 rounded-md text-[var(--white-stationary)] shadow-[0_2px_8px_rgb(0_0_0_/_0.18)] data-[state=checked]:border-[var(--tutti-purple)] data-[state=checked]:bg-[var(--tutti-purple)] [&_[data-slot=checkbox-indicator]>svg]:size-4\"\n tabIndex={-1}\n />\n ) : null}\n </section>\n );\n}\n\nfunction ResizeHandle<TData>({\n handle,\n node\n}: {\n handle: WorkbenchResizeHandle;\n node: WorkbenchNode<TData>;\n}) {\n const onPointerDown = useWorkbenchResize(node, handle);\n return (\n <div\n className=\"workbench-window__resize-handle\"\n data-handle={handle}\n onPointerDown={onPointerDown}\n />\n );\n}\n","import type { HTMLAttributes, MouseEvent, PointerEvent } from \"react\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger\n} from \"@tutti-os/ui-system\";\n\ntype WorkbenchWindowTrafficLightTone = \"close\" | \"minimize\" | \"maximize\";\n\nexport interface WorkbenchWindowTrafficLightAction {\n disabled?: boolean;\n label: string;\n onClick: (event: MouseEvent<HTMLButtonElement>) => void;\n pressed?: boolean;\n}\n\nexport interface WorkbenchWindowTrafficLightsProps extends HTMLAttributes<HTMLDivElement> {\n close?: WorkbenchWindowTrafficLightAction | null;\n maximize?: WorkbenchWindowTrafficLightAction | null;\n minimize?: WorkbenchWindowTrafficLightAction | null;\n}\n\nexport function WorkbenchWindowTrafficLights({\n className,\n close,\n maximize,\n minimize,\n onDoubleClick,\n onPointerDown,\n ...props\n}: WorkbenchWindowTrafficLightsProps) {\n return (\n <div\n {...props}\n className={[\"workbench-window-traffic-lights\", className ?? null]\n .filter(Boolean)\n .join(\" \")}\n onDoubleClick={(event) => {\n event.stopPropagation();\n onDoubleClick?.(event);\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n onPointerDown?.(event);\n }}\n >\n {close ? (\n <WorkbenchWindowTrafficLightButton\n action=\"close\"\n input={close}\n tone=\"close\"\n />\n ) : null}\n {minimize ? (\n <WorkbenchWindowTrafficLightButton\n action=\"minimize\"\n input={minimize}\n tone=\"minimize\"\n />\n ) : null}\n {maximize ? (\n <WorkbenchWindowTrafficLightButton\n action=\"fullscreen\"\n input={maximize}\n tone=\"maximize\"\n />\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchWindowTrafficLightButton({\n action,\n input,\n tone\n}: {\n action: \"close\" | \"fullscreen\" | \"minimize\";\n input: WorkbenchWindowTrafficLightAction;\n tone: WorkbenchWindowTrafficLightTone;\n}) {\n const handleClick = (event: MouseEvent<HTMLButtonElement>): void => {\n event.stopPropagation();\n if (input.disabled) {\n return;\n }\n input.onClick(event);\n };\n const stopPointer = (event: PointerEvent<HTMLButtonElement>): void => {\n event.stopPropagation();\n };\n\n const button = (\n <button\n aria-label={input.label}\n aria-pressed={input.pressed}\n className=\"workbench-window-traffic-light\"\n data-workbench-action={action}\n data-workbench-traffic-light={tone}\n disabled={input.disabled}\n type=\"button\"\n onClick={handleClick}\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={stopPointer}\n />\n );\n\n return (\n <TooltipProvider delayDuration={250} skipDelayDuration={0}>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{input.label}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\nimport { WorkbenchWindowTrafficLights } from \"./WorkbenchWindowTrafficLights.tsx\";\n\nexport function WorkbenchWindowFullscreenToggle<TData>({\n controller,\n disabled = false,\n i18n,\n node\n}: {\n controller: WorkbenchController<TData>;\n disabled?: boolean;\n i18n: WorkbenchWindowChromeI18nRuntime;\n node: WorkbenchNode<TData>;\n}) {\n const isFullscreen = node.displayMode === \"fullscreen\";\n const label = i18n.t(isFullscreen ? \"exitFullscreen\" : \"enterFullscreen\");\n\n return (\n <WorkbenchWindowTrafficLights\n maximize={{\n disabled,\n label,\n onClick: (event) => {\n controller.commands.focusNode(node.id);\n\n if (isFullscreen) {\n controller.commands.exitFullscreen(node.id);\n return;\n }\n\n event.currentTarget.blur();\n controller.commands.enterFullscreen(node.id);\n },\n pressed: isFullscreen\n }}\n />\n );\n}\n","import { useCallback } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { WorkbenchNode } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\nimport { useWorkbenchSnap } from \"./useWorkbenchSnap.ts\";\n\nexport function useWorkbenchDrag<TData>(\n node: WorkbenchNode<TData>,\n options: { edgeSnapEnabled?: boolean } = {}\n) {\n const controller = useWorkbenchController<TData>();\n const updateSnap = useWorkbenchSnap<TData>();\n const edgeSnapEnabled = options.edgeSnapEnabled === true;\n\n return useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n controller.commands.focusNode(node.id);\n\n event.currentTarget.setPointerCapture(event.pointerId);\n controller.commands.setActiveDragNode(node.id);\n\n const origin = { x: event.clientX, y: event.clientY };\n const initialFrame = node.frame;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const nextFrame = {\n ...initialFrame,\n x: initialFrame.x + moveEvent.clientX - origin.x,\n y: initialFrame.y + moveEvent.clientY - origin.y\n };\n updateSnap(\n { x: moveEvent.clientX, y: moveEvent.clientY },\n { edgeSnapEnabled }\n );\n controller.commands.dragNode(node.id, nextFrame);\n };\n\n const clearListeners = () => {\n controller.commands.setActiveDragNode(null);\n controller.commands.setActiveSnapTarget(null);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", finishDrag);\n window.removeEventListener(\"pointercancel\", cancelDrag);\n };\n\n const finishDrag = (upEvent: PointerEvent) => {\n if (\n updateSnap(\n { x: upEvent.clientX, y: upEvent.clientY },\n { edgeSnapEnabled }\n ) !== null\n ) {\n controller.commands.applyActiveSnapTarget(node.id);\n }\n clearListeners();\n };\n\n const cancelDrag = () => {\n clearListeners();\n };\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", finishDrag);\n window.addEventListener(\"pointercancel\", cancelDrag);\n },\n [controller, edgeSnapEnabled, node.frame, node.id, updateSnap]\n );\n}\n","import { useCallback } from \"react\";\nimport {\n inferWorkbenchSnapTarget,\n WORKBENCH_EDGE_SNAP_THRESHOLD_PX\n} from \"../../core/geometry.ts\";\nimport type { WorkbenchSnapTarget } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\nimport { resolveWorkbenchActiveSnapTarget } from \"./workbenchSnapTarget.ts\";\n\nexport function useWorkbenchSnap<TData = unknown>() {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (\n pointerClientPoint: { x: number; y: number },\n options: { edgeSnapEnabled?: boolean } = {}\n ): WorkbenchSnapTarget => {\n const target = inferWorkbenchSnapTarget(\n pointerClientPoint,\n controller.getSnapshot().surfaceSize,\n options.edgeSnapEnabled ? WORKBENCH_EDGE_SNAP_THRESHOLD_PX : 0,\n controller.getSnapshot().layoutConstraints\n );\n const activeTarget = resolveWorkbenchActiveSnapTarget(target, options);\n controller.commands.setActiveSnapTarget(activeTarget);\n return activeTarget;\n },\n [controller]\n );\n}\n","import type { WorkbenchSnapTarget } from \"../../core/types.ts\";\n\nexport function resolveWorkbenchActiveSnapTarget(\n target: WorkbenchSnapTarget,\n options: { edgeSnapEnabled?: boolean } = {}\n): WorkbenchSnapTarget {\n if (options.edgeSnapEnabled) {\n return target;\n }\n switch (target) {\n case \"top\":\n case \"top-left\":\n case \"top-right\":\n return \"top\";\n default:\n return null;\n }\n}\n","import { useCallback } from \"react\";\nimport type { PointerEvent as ReactPointerEvent } from \"react\";\nimport type { WorkbenchNode, WorkbenchResizeHandle } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchResize<TData>(\n node: WorkbenchNode<TData>,\n handle: WorkbenchResizeHandle\n) {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (event: ReactPointerEvent<HTMLElement>) => {\n if (event.button !== 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.setPointerCapture(event.pointerId);\n controller.commands.focusNode(node.id);\n controller.commands.setActiveResizeNode(node.id);\n\n const origin = { x: event.clientX, y: event.clientY };\n const initialFrame = node.frame;\n\n const onPointerMove = (moveEvent: PointerEvent) => {\n const deltaX = moveEvent.clientX - origin.x;\n const deltaY = moveEvent.clientY - origin.y;\n controller.commands.resizeNode(\n node.id,\n resizeFrame(initialFrame, handle, deltaX, deltaY)\n );\n };\n\n const cleanup = () => {\n controller.commands.setActiveResizeNode(null);\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", cleanup);\n window.removeEventListener(\"pointercancel\", cleanup);\n };\n\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", cleanup);\n window.addEventListener(\"pointercancel\", cleanup);\n },\n [controller, handle, node.frame, node.id]\n );\n}\n\nfunction resizeFrame(\n frame: WorkbenchNode[\"frame\"],\n handle: WorkbenchResizeHandle,\n deltaX: number,\n deltaY: number\n): WorkbenchNode[\"frame\"] {\n const next = { ...frame };\n if (handle.includes(\"east\")) {\n next.width += deltaX;\n }\n if (handle.includes(\"south\")) {\n next.height += deltaY;\n }\n if (handle.includes(\"west\")) {\n next.x += deltaX;\n next.width -= deltaX;\n }\n if (handle.includes(\"north\")) {\n next.y += deltaY;\n next.height -= deltaY;\n }\n return next;\n}\n","import type { ReactNode } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type {\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowChromeMode,\n WorkbenchWindowHeaderContext,\n WorkbenchWindowHeaderDragHandleProps\n} from \"./types.ts\";\n\ntype WorkbenchHeaderGenieControls = {\n minimizeNodeToAnchor(nodeID: string, minimize?: () => void): void;\n};\n\nexport interface ResolveWorkbenchWindowHeaderInput<TData = unknown> {\n controller: WorkbenchController<TData>;\n defaultActions: ReactNode;\n genie: WorkbenchHeaderGenieControls;\n node: WorkbenchNode<TData>;\n onDoubleClick: WorkbenchWindowHeaderDragHandleProps[\"onDoubleClick\"];\n onDragStart: WorkbenchWindowHeaderDragHandleProps[\"onPointerDown\"];\n renderHeader?: WorkbenchRenderWindowHeader<TData>;\n windowChromeMode?: WorkbenchWindowChromeMode;\n}\n\nexport interface ResolvedWorkbenchWindowHeader<TData = unknown> {\n context: WorkbenchWindowHeaderContext<TData>;\n customHeader: ReactNode | null;\n windowChromeMode: WorkbenchWindowChromeMode;\n}\n\nexport function resolveWorkbenchWindowChromeMode<TData>({\n controller,\n node,\n windowChromeMode\n}: {\n controller: WorkbenchController<TData>;\n node: WorkbenchNode<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n}): WorkbenchWindowChromeMode {\n if (typeof windowChromeMode === \"function\") {\n return windowChromeMode({ controller, node });\n }\n\n return windowChromeMode ?? \"system\";\n}\n\nexport function resolveWorkbenchWindowHeader<TData>({\n controller,\n defaultActions,\n genie,\n node,\n onDoubleClick,\n onDragStart,\n renderHeader,\n windowChromeMode = \"system\"\n}: ResolveWorkbenchWindowHeaderInput<TData>): ResolvedWorkbenchWindowHeader<TData> {\n const context: WorkbenchWindowHeaderContext<TData> = {\n controller,\n defaultActions,\n dragHandleProps: {\n \"data-workbench-drag-handle\": \"true\",\n onDoubleClick,\n onPointerDown: onDragStart\n },\n genie,\n node,\n surfaceSize: controller.getSnapshot().surfaceSize\n };\n\n const customHeader =\n windowChromeMode === \"custom-header\" && renderHeader\n ? renderHeader(context)\n : null;\n\n return {\n context,\n customHeader,\n windowChromeMode: customHeader === null ? \"system\" : \"custom-header\"\n };\n}\n","import type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\nimport type { WorkbenchKeepMinimizedNodeMounted } from \"./types.ts\";\n\nexport function createRenderedWorkbenchNodeIDsSelector<TData>(\n shouldKeepMinimizedNodeMounted:\n | WorkbenchKeepMinimizedNodeMounted<TData>\n | undefined = undefined\n): (state: WorkbenchState<TData>) => readonly string[] {\n let previousIDs: readonly string[] | null = null;\n\n return (state) => {\n const nextIDs = state.nodes\n .filter((node) =>\n shouldRenderWorkbenchNode(node, shouldKeepMinimizedNodeMounted)\n )\n .map((node) => node.id);\n\n if (previousIDs && stringArraysEqual(previousIDs, nextIDs)) {\n return previousIDs;\n }\n\n previousIDs = nextIDs;\n return nextIDs;\n };\n}\n\nfunction shouldRenderWorkbenchNode<TData>(\n node: WorkbenchNode<TData>,\n shouldKeepMinimizedNodeMounted:\n | WorkbenchKeepMinimizedNodeMounted<TData>\n | undefined\n): boolean {\n return !node.isMinimized || shouldKeepMinimizedNodeMounted?.(node) === true;\n}\n\nfunction stringArraysEqual(left: readonly string[], right: readonly string[]) {\n if (left.length !== right.length) {\n return false;\n }\n\n return left.every((value, index) => value === right[index]);\n}\n","import { useEffect } from \"react\";\nimport { selectFocusedVisibleWorkbenchNode } from \"../../core/selectors.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\nimport {\n resolveWorkbenchShortcutIntent,\n type WorkbenchWindowManagementShortcutPreset\n} from \"./workbenchShortcutIntent.ts\";\n\nexport function useWorkbenchShortcuts<TData = unknown>(\n options: {\n enabled?: boolean;\n windowManagementShortcutPreset?: WorkbenchWindowManagementShortcutPreset | null;\n } = {}\n): void {\n const controller = useWorkbenchController<TData>();\n const enabled = options.enabled ?? true;\n const windowManagementShortcutPreset =\n options.windowManagementShortcutPreset ?? null;\n\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n const intent = resolveWorkbenchShortcutIntent(event, {\n windowManagementShortcutPreset\n });\n if (!intent) {\n return;\n }\n\n let handled = false;\n const focusedNode = selectFocusedVisibleWorkbenchNode(\n controller.getSnapshot()\n );\n if (intent.type === \"exitFullscreen\") {\n if (focusedNode?.displayMode === \"fullscreen\") {\n controller.commands.exitFullscreen(focusedNode.id);\n handled = true;\n }\n } else if (intent.type === \"applyFocusedSnapTarget\") {\n if (focusedNode) {\n controller.commands.applySnapTarget(\n focusedNode.id,\n intent.snapTarget\n );\n handled = true;\n }\n } else if (intent.type === \"applyFocusedQuickLayout\") {\n if (focusedNode) {\n controller.commands.applyQuickLayout(focusedNode.id, intent.target);\n handled = true;\n }\n } else {\n controller.commands.applyVisibleLayoutPreset(intent.preset);\n handled = true;\n }\n\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [controller, enabled, windowManagementShortcutPreset]);\n}\n","import type {\n WorkbenchLayoutPreset,\n WorkbenchQuickLayoutTarget,\n WorkbenchSnapTarget\n} from \"../../core/types.ts\";\n\nexport type WorkbenchShortcutIntent =\n | { type: \"exitFullscreen\" }\n | {\n type: \"applyFocusedSnapTarget\";\n snapTarget: Exclude<WorkbenchSnapTarget, null>;\n }\n | {\n type: \"applyFocusedQuickLayout\";\n target: WorkbenchQuickLayoutTarget;\n }\n | {\n type: \"applyVisibleLayoutPreset\";\n preset: WorkbenchLayoutPreset;\n };\n\nexport type WorkbenchWindowManagementShortcutPreset =\n | \"commandArrows\"\n | \"commandShiftArrows\";\n\ninterface WorkbenchShortcutEventLike {\n altKey?: boolean;\n ctrlKey?: boolean;\n defaultPrevented?: boolean;\n key: string;\n metaKey?: boolean;\n shiftKey?: boolean;\n target?: EventTarget | null;\n}\n\nexport function resolveWorkbenchShortcutIntent(\n event: WorkbenchShortcutEventLike,\n options: {\n windowManagementShortcutPreset?: WorkbenchWindowManagementShortcutPreset | null;\n } = {}\n): WorkbenchShortcutIntent | null {\n if (\n event.defaultPrevented ||\n isEditableShortcutTarget(event.target ?? null)\n ) {\n return null;\n }\n\n if (\n event.key === \"Escape\" &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey &&\n !event.shiftKey\n ) {\n return { type: \"exitFullscreen\" };\n }\n\n if (\n !matchesWindowManagementShortcutPreset(\n event,\n options.windowManagementShortcutPreset ?? null\n )\n ) {\n return null;\n }\n\n switch (event.key) {\n case \"ArrowLeft\":\n return { type: \"applyFocusedSnapTarget\", snapTarget: \"left\" };\n case \"ArrowRight\":\n return { type: \"applyFocusedSnapTarget\", snapTarget: \"right\" };\n case \"ArrowUp\":\n return { type: \"applyFocusedQuickLayout\", target: \"top\" };\n case \"ArrowDown\":\n return { type: \"applyFocusedQuickLayout\", target: \"bottom\" };\n case \"0\":\n return {\n type: \"applyVisibleLayoutPreset\",\n preset: { kind: \"balanced\" }\n };\n default:\n return null;\n }\n}\n\nfunction matchesWindowManagementShortcutPreset(\n event: WorkbenchShortcutEventLike,\n preset: WorkbenchWindowManagementShortcutPreset | null\n): boolean {\n if (preset === null) {\n return false;\n }\n if (!event.metaKey || event.ctrlKey || event.altKey) {\n return false;\n }\n switch (preset) {\n case \"commandArrows\":\n return !event.shiftKey;\n case \"commandShiftArrows\":\n return event.shiftKey === true;\n }\n}\n\nfunction isEditableShortcutTarget(target: EventTarget | null): boolean {\n const candidate = target as {\n isContentEditable?: boolean;\n tagName?: string;\n } | null;\n const tagName = candidate?.tagName?.toUpperCase();\n return (\n candidate?.isContentEditable === true ||\n tagName === \"INPUT\" ||\n tagName === \"TEXTAREA\" ||\n tagName === \"SELECT\"\n );\n}\n","import { useLayoutEffect, useRef, type RefObject } from \"react\";\nimport type { WorkbenchSize } from \"../../core/types.ts\";\n\nexport function useWorkbenchSurfaceSize<TElement extends HTMLElement>(\n onSizeChange: (size: WorkbenchSize) => void\n): RefObject<TElement | null> {\n const ref = useRef<TElement | null>(null);\n\n useLayoutEffect(() => {\n const element = ref.current;\n if (!element) {\n return;\n }\n\n const publish = () => {\n const rect = element.getBoundingClientRect();\n onSizeChange({\n width: Math.max(0, Math.round(rect.width)),\n height: Math.max(0, Math.round(rect.height))\n });\n };\n\n publish();\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", publish);\n return () => {\n window.removeEventListener(\"resize\", publish);\n };\n }\n\n const observer = new ResizeObserver(publish);\n observer.observe(element);\n return () => {\n observer.disconnect();\n };\n }, [onSizeChange]);\n\n return ref;\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ReactNode\n} from \"react\";\nimport { createPortal, flushSync } from \"react-dom\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"../store/types.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchMinimizeAnimation } from \"./types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport {\n centerPointFromRect,\n cloneMeaningfulGenieElement,\n easeInQuadratic,\n isUsableGenieRect,\n renderGenieScanlines,\n viewportRectFromElement,\n type WorkbenchGenieDirection,\n type WorkbenchGenieMeaningfulImageClone,\n type WorkbenchGenieViewportRect\n} from \"./genieAnimation.ts\";\n\nconst genieDurationMs = 400;\nconst previewCaptureRaceTimeoutMs = 120;\nconst scaleMinimizeDurationMs = 220;\nconst genieMaxDevicePixelRatio = 2;\nconst genieSnapshotScale = 1;\nconst renderedGeniePreviewHeaderOffsetPx = 40;\nconst minimizedDockSlotEnterAnimationMs = 720;\nconst dockAnchorResolveMaxAnimationFrames = 3;\nconst dockPreviewMaxWidth = 260;\nconst dockPreviewMaxHeight = 170;\nconst dockPreviewImageCacheMaxEntries = 96;\nconst inlineImageResourceCacheMaxEntries = 160;\nconst dockAnchorFallbackSizePx = 43.2;\nconst genieInlineImageMaxDevicePixelRatio = 2;\nconst dockPreviewImageByNodeID = new Map<string, string>();\nconst inlineImageResourceByUrl = new Map<string, Promise<string | null>>();\n\ninterface CapturedGenieTexture {\n canvas: HTMLCanvasElement;\n rect: WorkbenchGenieViewportRect;\n}\n\ninterface PreparedGenieTextureCapture {\n clone: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n rect: WorkbenchGenieViewportRect;\n}\n\ninterface PendingRenderedGeniePreviewCapture {\n id: number;\n nodeID: string;\n preview: ReactNode;\n rect: WorkbenchGenieViewportRect;\n usedFallbackPreview: boolean;\n}\n\nfunction resolveWorkbenchCaptureElement(\n windowElement: HTMLElement\n): HTMLElement {\n return (\n windowElement.querySelector<HTMLElement>(\n '[data-workbench-window-capture=\"true\"]'\n ) ??\n windowElement.querySelector<HTMLElement>(\".workbench-window\") ??\n windowElement\n );\n}\n\nfunction waitForNextAnimationFrame(): Promise<void> {\n return new Promise((resolve) => {\n window.requestAnimationFrame(() => resolve());\n });\n}\n\nfunction racePreviewImageCapture(\n promise: Promise<string | null>,\n timeoutMs: number\n): Promise<{\n previewImageUrl: string | null;\n status: \"pending\" | \"resolved\";\n}> {\n return new Promise((resolve) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) {\n return;\n }\n settled = true;\n resolve({ previewImageUrl: null, status: \"pending\" });\n }, timeoutMs);\n promise.then((previewImageUrl) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n resolve({ previewImageUrl, status: \"resolved\" });\n });\n });\n}\n\nfunction isFocusedWorkbenchNode<TData>(\n controller: WorkbenchController<TData>,\n nodeID: string\n): boolean {\n return controller.getSnapshot().nodeStack.at(-1) === nodeID;\n}\n\nfunction isEmptyGeniePreview(preview: ReactNode): boolean {\n return preview === null || preview === undefined || preview === false;\n}\n\nfunction logWorkbenchGenieDiagnostic(\n debugDiagnostics: WorkbenchDebugDiagnostics | undefined,\n event: string,\n details: Record<string, unknown>,\n level: \"debug\" | \"info\" | \"warn\" = \"info\"\n): void {\n if (!debugDiagnostics?.isEnabled() || !debugDiagnostics.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level,\n source: \"workbench-genie\"\n })\n ).catch(() => undefined);\n}\n\nfunction describeGenieNode<TData>(\n node: WorkbenchNode<TData> | null | undefined\n): Record<string, unknown> {\n if (!node) {\n return {};\n }\n const data =\n node.data && typeof node.data === \"object\"\n ? (node.data as Record<string, unknown>)\n : {};\n return {\n displayMode: node.displayMode,\n instanceId: typeof data.instanceId === \"string\" ? data.instanceId : null,\n isMinimized: node.isMinimized,\n minimizedAtUnixMs: node.minimizedAtUnixMs,\n nodeId: node.id,\n title: node.title,\n typeId: typeof data.typeId === \"string\" ? data.typeId : null\n };\n}\n\nexport interface WorkbenchGenieController<TData = unknown> {\n genieLayer: ReactNode;\n isNodeGenieHidden: (nodeID: string) => boolean;\n isPendingMinimizedDockNode: (nodeID: string) => boolean;\n launchNodeFromAnchor: (\n anchorKey: string,\n nodeID: string,\n launch: () => Promise<string | null | void> | string | null | void\n ) => void;\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => void;\n pendingMinimizedNode: WorkbenchNode<TData> | null;\n registerDockAnchor: (anchorKey: string, element: HTMLElement | null) => void;\n shouldAnimateMinimizedDockEnter: (nodeID: string) => boolean;\n}\n\nexport type WorkbenchNodePreviewImageCapture<TData = unknown> = (\n node: WorkbenchNode<TData>\n) => Promise<string | null> | string | null;\n\nexport type WorkbenchNodeGeniePreviewRenderer<TData = unknown> = (\n node: WorkbenchNode<TData>,\n input: { previewViewport: { height: number; width: number } }\n) => ReactNode;\n\nfunction shouldReduceMotion(): boolean {\n return (\n window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches === true\n );\n}\n\nfunction clampProgress(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nfunction resolveGenieAnimationProgress(\n direction: WorkbenchGenieDirection,\n progress: number\n): number {\n return direction === \"open\" ? easeInQuadratic(progress) : progress;\n}\n\nfunction blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n if (typeof reader.result === \"string\") {\n resolve(reader.result);\n return;\n }\n reject(new Error(\"image blob reader produced a non-string result\"));\n });\n reader.addEventListener(\"error\", () => {\n reject(reader.error ?? new Error(\"image blob reader failed\"));\n });\n reader.readAsDataURL(blob);\n });\n}\n\nasync function fetchInlineImageResource(\n imageUrl: string\n): Promise<string | null> {\n try {\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new Error(`image fetch failed with status ${response.status}`);\n }\n const blob = await response.blob();\n return await blobToDataUrl(blob);\n } catch {\n return null;\n }\n}\n\nfunction readInlineImageResource(imageUrl: string): Promise<string | null> {\n if (imageUrl.startsWith(\"data:\")) {\n return Promise.resolve(imageUrl);\n }\n\n const cached = inlineImageResourceByUrl.get(imageUrl);\n if (cached) {\n inlineImageResourceByUrl.delete(imageUrl);\n inlineImageResourceByUrl.set(imageUrl, cached);\n return cached;\n }\n\n const promise = fetchInlineImageResource(imageUrl);\n inlineImageResourceByUrl.set(imageUrl, promise);\n while (inlineImageResourceByUrl.size > inlineImageResourceCacheMaxEntries) {\n const oldestImageUrl = inlineImageResourceByUrl.keys().next().value;\n if (typeof oldestImageUrl !== \"string\") {\n break;\n }\n inlineImageResourceByUrl.delete(oldestImageUrl);\n }\n return promise;\n}\n\nasync function inlineCloneImageResources({\n cloneRoot,\n images\n}: {\n cloneRoot: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n}): Promise<void> {\n const cloneImages = Array.from(cloneRoot.querySelectorAll(\"img\"));\n\n await Promise.all(\n images.map(async (imageInfo, index) => {\n const cloneImage = cloneImages[index];\n if (!cloneImage) {\n return;\n }\n\n cloneImage.removeAttribute(\"srcset\");\n cloneImage.removeAttribute(\"sizes\");\n const imageUrl = imageInfo.url;\n if (!imageUrl) {\n return;\n }\n const inlineImageUrl =\n (await readInlineImageResource(imageUrl)) ?? imageUrl;\n const resizedImageUrl = await resizeInlineImageResourceForGenieTexture(\n inlineImageUrl,\n imageInfo\n );\n if (resizedImageUrl && resizedImageUrl !== inlineImageUrl) {\n cloneImage.src = resizedImageUrl;\n return;\n }\n cloneImage.src = inlineImageUrl;\n })\n );\n}\n\nasync function loadImageFromSvg(svg: string): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n await image.decode();\n return image;\n}\n\nfunction resolveGenieInlineImageTargetSize({\n displayHeight,\n displayWidth\n}: WorkbenchGenieMeaningfulImageClone): {\n height: number;\n width: number;\n} | null {\n if (displayWidth <= 0 || displayHeight <= 0) {\n return null;\n }\n const scale = Math.min(\n window.devicePixelRatio || 1,\n genieInlineImageMaxDevicePixelRatio\n );\n return {\n height: Math.max(1, Math.ceil(displayHeight * scale)),\n width: Math.max(1, Math.ceil(displayWidth * scale))\n };\n}\n\nasync function resizeInlineImageResourceForGenieTexture(\n imageUrl: string,\n imageInfo: WorkbenchGenieMeaningfulImageClone\n): Promise<string | null> {\n const targetSize = resolveGenieInlineImageTargetSize(imageInfo);\n if (!targetSize) {\n return null;\n }\n\n const image = new Image();\n image.src = imageUrl;\n try {\n await image.decode();\n } catch {\n return null;\n }\n if (\n image.naturalWidth <= targetSize.width &&\n image.naturalHeight <= targetSize.height\n ) {\n return null;\n }\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = targetSize.width;\n canvas.height = targetSize.height;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n try {\n context.drawImage(image, 0, 0, targetSize.width, targetSize.height);\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n}\n\nfunction prepareElementTextureCapture(\n element: HTMLElement\n): PreparedGenieTextureCapture | null {\n const windowRect = viewportRectFromElement(element);\n if (!isUsableGenieRect(windowRect)) {\n return null;\n }\n\n const clonedElement = cloneMeaningfulGenieElement(element, windowRect);\n if (!clonedElement) {\n return null;\n }\n const { clone, images } = clonedElement;\n clone.setAttribute(\"xmlns\", \"http://www.w3.org/1999/xhtml\");\n clone.style.position = \"relative\";\n clone.style.left = \"0\";\n clone.style.top = \"0\";\n clone.style.width = `${windowRect.width}px`;\n clone.style.height = `${windowRect.height}px`;\n clone.style.transform = \"none\";\n clone.style.opacity = \"1\";\n clone.style.visibility = \"visible\";\n clone.style.pointerEvents = \"none\";\n return {\n clone,\n images,\n rect: windowRect\n };\n}\n\nfunction prepareRenderedGeniePreviewCloneForTexture(\n clone: HTMLElement,\n textureRect: WorkbenchGenieViewportRect\n): void {\n clone.style.width = `${textureRect.width}px`;\n clone.style.height = `${textureRect.height}px`;\n\n const previewElement = clone.querySelector<HTMLElement>(\n \".workbench-genie-preview-capture__preview\"\n );\n if (!previewElement) {\n return;\n }\n\n previewElement.style.display = \"block\";\n previewElement.style.width = `${textureRect.width}px`;\n previewElement.style.height = `${textureRect.height}px`;\n previewElement.style.padding = \"0\";\n previewElement.style.border = \"0\";\n previewElement.style.borderRadius = \"0\";\n previewElement.style.background = \"var(--background-panel)\";\n previewElement.style.boxShadow = \"none\";\n previewElement.style.transform = `translateY(${renderedGeniePreviewHeaderOffsetPx}px)`;\n}\n\nasync function renderPreparedElementTexture({\n clone,\n images,\n rect\n}: PreparedGenieTextureCapture): Promise<CapturedGenieTexture | null> {\n await inlineCloneImageResources({\n cloneRoot: clone,\n images\n });\n\n const svgTexture = createGenieSvgTexture(clone, rect);\n const image = await loadImageFromSvg(svgTexture);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(rect.width * genieSnapshotScale));\n canvas.height = Math.max(1, Math.round(rect.height * genieSnapshotScale));\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.imageSmoothingEnabled = true;\n context.imageSmoothingQuality = \"high\";\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n return { canvas, rect };\n}\n\nasync function captureElementTexture(\n element: HTMLElement\n): Promise<CapturedGenieTexture | null> {\n const preparedCapture = prepareElementTextureCapture(element);\n return preparedCapture ? renderPreparedElementTexture(preparedCapture) : null;\n}\n\nfunction createDockPreviewDataUrl(canvas: HTMLCanvasElement): string | null {\n if (canvas.width <= 0 || canvas.height <= 0) {\n return null;\n }\n\n const scale = Math.min(\n 1,\n dockPreviewMaxWidth / canvas.width,\n dockPreviewMaxHeight / canvas.height\n );\n const output = document.createElement(\"canvas\");\n output.width = Math.max(1, Math.round(canvas.width * scale));\n output.height = Math.max(1, Math.round(canvas.height * scale));\n const context = output.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.drawImage(canvas, 0, 0, output.width, output.height);\n return output.toDataURL(\"image/png\");\n}\n\nasync function renderPreviewImageTexture({\n previewImageUrl,\n rect\n}: {\n previewImageUrl: string;\n rect: WorkbenchGenieViewportRect;\n}): Promise<CapturedGenieTexture | null> {\n if (!isUsableGenieRect(rect)) {\n return null;\n }\n\n const image = new Image();\n image.src = previewImageUrl;\n await image.decode();\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(rect.width * genieSnapshotScale));\n canvas.height = Math.max(1, Math.round(rect.height * genieSnapshotScale));\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.imageSmoothingEnabled = true;\n context.imageSmoothingQuality = \"high\";\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n return { canvas, rect };\n}\n\nfunction readDockAnchorFallbackSize(element: HTMLElement): number {\n const cssValue = window\n .getComputedStyle(element)\n .getPropertyValue(\"--desktop-dock-size\");\n const parsed = Number.parseFloat(cssValue);\n return Number.isFinite(parsed) && parsed > 0\n ? parsed\n : dockAnchorFallbackSizePx;\n}\n\nfunction resolveDockAnchorViewportRect(\n element: HTMLElement\n): WorkbenchGenieViewportRect {\n const rect = viewportRectFromElement(element);\n if (\n element.dataset.desktopDockSlot !== \"true\" ||\n element.dataset.nodeState !== \"minimized\"\n ) {\n return rect;\n }\n\n const isLayoutAnimating =\n element.dataset.presence === \"entering\" ||\n element.dataset.collapsing === \"true\";\n if (!isLayoutAnimating) {\n return rect;\n }\n\n const fallbackSize = readDockAnchorFallbackSize(element);\n const minimumUsableSize = fallbackSize * 0.5;\n return {\n ...rect,\n height: rect.height >= minimumUsableSize ? rect.height : fallbackSize,\n width: rect.width >= minimumUsableSize ? rect.width : fallbackSize\n };\n}\n\nexport function writeCachedWorkbenchNodePreviewImage(\n nodeID: string,\n previewImageUrl: string | null | undefined\n): void {\n if (previewImageUrl) {\n dockPreviewImageByNodeID.delete(nodeID);\n dockPreviewImageByNodeID.set(nodeID, previewImageUrl);\n while (dockPreviewImageByNodeID.size > dockPreviewImageCacheMaxEntries) {\n const oldestNodeID = dockPreviewImageByNodeID.keys().next().value;\n if (typeof oldestNodeID !== \"string\") {\n break;\n }\n dockPreviewImageByNodeID.delete(oldestNodeID);\n }\n }\n}\n\nexport function readCachedWorkbenchNodePreviewImage(\n nodeID: string\n): string | null {\n return dockPreviewImageByNodeID.get(nodeID) ?? null;\n}\n\nexport async function captureWorkbenchNodePreviewImage(\n nodeID: string,\n options: { bypassCache?: boolean } = {}\n): Promise<string | null> {\n if (!options.bypassCache) {\n const cachedPreviewImageUrl = readCachedWorkbenchNodePreviewImage(nodeID);\n if (cachedPreviewImageUrl) {\n return cachedPreviewImageUrl;\n }\n }\n\n const windowElement =\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-workbench-window-id]\")\n ).find((candidate) => candidate.dataset.workbenchWindowId === nodeID) ??\n null;\n const captureTarget = windowElement\n ? resolveWorkbenchCaptureElement(windowElement)\n : null;\n if (!captureTarget) {\n return null;\n }\n\n const texture = await captureElementTexture(captureTarget).catch(() => null);\n const previewImageUrl = texture\n ? createDockPreviewDataUrl(texture.canvas)\n : null;\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n return previewImageUrl;\n}\n\nasync function captureProvidedWorkbenchNodePreviewImageForNode<TData>(\n node: WorkbenchNode<TData>,\n input: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n } = {}\n): Promise<string | null> {\n const previewImageUrl = await Promise.resolve(\n input.captureNodePreviewImage?.(node) ?? null\n ).catch(() => null);\n if (!previewImageUrl) {\n return null;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, previewImageUrl);\n persistWorkbenchNodePreviewImage(node, previewImageUrl, input);\n return previewImageUrl;\n}\n\nfunction persistWorkbenchNodePreviewImage<TData>(\n node: WorkbenchNode<TData>,\n previewImageUrl: string | null | undefined,\n input: {\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n }\n): void {\n if (!previewImageUrl || !input.dockPreviewCache) {\n return;\n }\n const key = input.resolveDockPreviewCacheKey?.(node) ?? null;\n if (!key) {\n return;\n }\n input.dockPreviewCache.write({ key, previewImageUrl });\n}\n\nfunction createGenieSvgTexture(\n element: HTMLElement,\n rect: WorkbenchGenieViewportRect\n): string {\n const svgNamespace = \"http://www.w3.org/2000/svg\";\n const svgDocument = document.implementation.createDocument(\n svgNamespace,\n \"svg\",\n null\n );\n const svg = svgDocument.documentElement;\n svg.setAttribute(\"xmlns\", svgNamespace);\n svg.setAttribute(\"width\", String(rect.width));\n svg.setAttribute(\"height\", String(rect.height));\n svg.setAttribute(\"viewBox\", `0 0 ${rect.width} ${rect.height}`);\n\n const foreignObject = svgDocument.createElementNS(\n svgNamespace,\n \"foreignObject\"\n );\n foreignObject.setAttribute(\"width\", \"100%\");\n foreignObject.setAttribute(\"height\", \"100%\");\n foreignObject.setAttribute(\"x\", \"0\");\n foreignObject.setAttribute(\"y\", \"0\");\n foreignObject.appendChild(svgDocument.importNode(element, true));\n svg.appendChild(foreignObject);\n\n return new XMLSerializer().serializeToString(svgDocument);\n}\n\nexport function useWorkbenchGenieAnimation<TData>({\n captureNodePreviewImage,\n controller,\n debugDiagnostics,\n dockPreviewCache,\n minimizeAnimation = \"genie\",\n renderNodeGeniePreview,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shouldCaptureNodePreviewImage\n}: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n controller: WorkbenchController<TData>;\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n minimizeAnimation?: WorkbenchMinimizeAnimation;\n renderNodeGeniePreview?: WorkbenchNodeGeniePreviewRenderer<TData>;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shouldCaptureNodePreviewImage?: (node: WorkbenchNode<TData>) => boolean;\n}): WorkbenchGenieController<TData> {\n const dockAnchorElementsRef = useRef(new Map<string, HTMLElement>());\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const rafRef = useRef<number | null>(null);\n const animationGenerationRef = useRef(0);\n const animationCleanupRef = useRef<(() => void) | null>(null);\n const minimizedDockEnterAnimationNodeIdsRef = useRef(new Set<string>());\n const minimizedDockEnterAnimationTimersRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const minimizedGenieTextureByNodeIDRef = useRef(\n new Map<string, CapturedGenieTexture>()\n );\n const renderedPreviewCaptureIDRef = useRef(0);\n const renderedPreviewCaptureElementRef = useRef<HTMLDivElement | null>(null);\n const pendingRenderedPreviewCaptureRef =\n useRef<PendingRenderedGeniePreviewCapture | null>(null);\n const [isCanvasActive, setIsCanvasActive] = useState(false);\n const [genieHiddenNodeIDs, setGenieHiddenNodeIDs] = useState(\n () => new Set<string>()\n );\n const [pendingMinimizedNode, setPendingMinimizedNode] =\n useState<WorkbenchNode<TData> | null>(null);\n const [pendingRenderedPreviewCapture, setPendingRenderedPreviewCapture] =\n useState<PendingRenderedGeniePreviewCapture | null>(null);\n\n const registerDockAnchor = useCallback(\n (anchorKey: string, element: HTMLElement | null) => {\n if (element) {\n dockAnchorElementsRef.current.set(anchorKey, element);\n return;\n }\n dockAnchorElementsRef.current.delete(anchorKey);\n },\n []\n );\n\n const resolveDockAnchorRect = useCallback((anchorKey: string) => {\n const element = dockAnchorElementsRef.current.get(anchorKey) ?? null;\n if (!element) {\n return null;\n }\n return resolveDockAnchorViewportRect(element);\n }, []);\n\n const resolveDockAnchorRectAfterRender = useCallback(\n async (anchorKey: string, isCurrent: () => boolean) => {\n let dockRect = resolveDockAnchorRect(anchorKey);\n for (\n let frame = 0;\n (!dockRect || !isUsableGenieRect(dockRect)) &&\n frame < dockAnchorResolveMaxAnimationFrames;\n frame += 1\n ) {\n await waitForNextAnimationFrame();\n if (!isCurrent()) {\n return null;\n }\n dockRect = resolveDockAnchorRect(anchorKey);\n }\n return dockRect;\n },\n [resolveDockAnchorRect]\n );\n\n const resolveNodeElement = useCallback((nodeID: string) => {\n return (\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-workbench-window-id]\")\n ).find((candidate) => candidate.dataset.workbenchWindowId === nodeID) ??\n null\n );\n }, []);\n\n const resolveAnchorKeyForNode = useCallback(\n (node: WorkbenchNode<TData>) => resolveDockAnchorKey?.(node) ?? node.id,\n [resolveDockAnchorKey]\n );\n\n const releaseMinimizedDockEnterAnimation = useCallback((nodeID: string) => {\n const timer = minimizedDockEnterAnimationTimersRef.current.get(nodeID);\n if (timer) {\n clearTimeout(timer);\n minimizedDockEnterAnimationTimersRef.current.delete(nodeID);\n }\n minimizedDockEnterAnimationNodeIdsRef.current.delete(nodeID);\n }, []);\n\n const registerMinimizedDockEnterAnimation = useCallback(\n (nodeID: string) => {\n releaseMinimizedDockEnterAnimation(nodeID);\n minimizedDockEnterAnimationNodeIdsRef.current.add(nodeID);\n },\n [releaseMinimizedDockEnterAnimation]\n );\n\n const scheduleReleaseMinimizedDockEnterAnimation = useCallback(\n (nodeID: string, delayMs = minimizedDockSlotEnterAnimationMs) => {\n const existing = minimizedDockEnterAnimationTimersRef.current.get(nodeID);\n if (existing) {\n clearTimeout(existing);\n }\n minimizedDockEnterAnimationTimersRef.current.set(\n nodeID,\n setTimeout(() => {\n minimizedDockEnterAnimationTimersRef.current.delete(nodeID);\n minimizedDockEnterAnimationNodeIdsRef.current.delete(nodeID);\n }, delayMs)\n );\n },\n []\n );\n\n const shouldAnimateMinimizedDockEnter = useCallback((nodeID: string) => {\n return minimizedDockEnterAnimationNodeIdsRef.current.has(nodeID);\n }, []);\n\n const readMinimizedGenieTexture = useCallback((nodeID: string) => {\n return minimizedGenieTextureByNodeIDRef.current.get(nodeID) ?? null;\n }, []);\n\n const writeMinimizedGenieTexture = useCallback(\n (nodeID: string, texture: CapturedGenieTexture) => {\n const cache = minimizedGenieTextureByNodeIDRef.current;\n cache.delete(nodeID);\n cache.set(nodeID, texture);\n },\n []\n );\n\n const clearMinimizedGenieTexture = useCallback((nodeID: string) => {\n minimizedGenieTextureByNodeIDRef.current.delete(nodeID);\n }, []);\n\n const pruneMinimizedGenieTextures = useCallback(\n (retainNodeID?: string) => {\n const minimizedNodeIDs = new Set(\n controller\n .getSnapshot()\n .nodes.filter((node) => node.isMinimized === true)\n .map((node) => node.id)\n );\n if (retainNodeID) {\n minimizedNodeIDs.add(retainNodeID);\n }\n for (const nodeID of minimizedGenieTextureByNodeIDRef.current.keys()) {\n if (!minimizedNodeIDs.has(nodeID)) {\n minimizedGenieTextureByNodeIDRef.current.delete(nodeID);\n }\n }\n },\n [controller]\n );\n\n const hideNodeForGenie = useCallback((nodeID: string) => {\n setGenieHiddenNodeIDs((current) => {\n if (current.has(nodeID)) {\n return current;\n }\n return new Set([...current, nodeID]);\n });\n }, []);\n\n const showNodeForGenie = useCallback((nodeID: string) => {\n setGenieHiddenNodeIDs((current) => {\n if (!current.has(nodeID)) {\n return current;\n }\n const next = new Set(current);\n next.delete(nodeID);\n return next;\n });\n }, []);\n\n const clearPendingMinimizedNode = useCallback((nodeID: string) => {\n setPendingMinimizedNode((current) =>\n current?.id === nodeID ? null : current\n );\n }, []);\n\n const clearRenderedPreviewCapture = useCallback((id: number) => {\n if (pendingRenderedPreviewCaptureRef.current?.id !== id) {\n return;\n }\n pendingRenderedPreviewCaptureRef.current = null;\n renderedPreviewCaptureElementRef.current = null;\n setPendingRenderedPreviewCapture(null);\n }, []);\n\n const requestRenderedGeniePreviewTexture = useCallback(\n async ({\n node,\n textureRect\n }: {\n node: WorkbenchNode<TData>;\n textureRect: WorkbenchGenieViewportRect;\n }): Promise<CapturedGenieTexture | null> => {\n if (!isUsableGenieRect(textureRect)) {\n return null;\n }\n\n const previewViewport = {\n height: textureRect.height,\n width: textureRect.width\n };\n let preview: ReactNode = null;\n try {\n preview =\n renderNodeGeniePreview?.(node, {\n previewViewport\n }) ?? null;\n } catch {\n preview = null;\n }\n if (isEmptyGeniePreview(preview)) {\n return null;\n }\n const captureID = renderedPreviewCaptureIDRef.current + 1;\n renderedPreviewCaptureIDRef.current = captureID;\n const pendingCapture: PendingRenderedGeniePreviewCapture = {\n id: captureID,\n nodeID: node.id,\n preview,\n rect: textureRect,\n usedFallbackPreview: false\n };\n\n pendingRenderedPreviewCaptureRef.current = pendingCapture;\n flushSync(() => {\n setPendingRenderedPreviewCapture(pendingCapture);\n });\n\n try {\n await waitForNextAnimationFrame();\n await waitForNextAnimationFrame();\n\n if (pendingRenderedPreviewCaptureRef.current?.id !== captureID) {\n return null;\n }\n\n const element = renderedPreviewCaptureElementRef.current;\n if (!element) {\n return null;\n }\n\n const preparedCapture = prepareElementTextureCapture(element);\n if (!preparedCapture) {\n return null;\n }\n\n prepareRenderedGeniePreviewCloneForTexture(\n preparedCapture.clone,\n textureRect\n );\n const texture = await renderPreparedElementTexture({\n ...preparedCapture,\n rect: textureRect\n });\n return texture;\n } catch {\n return null;\n } finally {\n clearRenderedPreviewCapture(captureID);\n }\n },\n [clearRenderedPreviewCapture, renderNodeGeniePreview]\n );\n\n const setupCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n return null;\n }\n const devicePixelRatio = Math.min(\n window.devicePixelRatio || 1,\n genieMaxDevicePixelRatio\n );\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n canvas.width = Math.max(1, Math.round(viewportWidth * devicePixelRatio));\n canvas.height = Math.max(1, Math.round(viewportHeight * devicePixelRatio));\n canvas.style.width = `${viewportWidth}px`;\n canvas.style.height = `${viewportHeight}px`;\n const context = canvas.getContext(\"2d\");\n if (!context) {\n return null;\n }\n context.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);\n return { context, viewportHeight, viewportWidth };\n }, []);\n\n const clearCanvas = useCallback(() => {\n const canvas = canvasRef.current;\n const context = canvas?.getContext(\"2d\") ?? null;\n if (canvas && context) {\n context.clearRect(0, 0, canvas.width, canvas.height);\n }\n setIsCanvasActive(false);\n }, []);\n\n const stopAnimation = useCallback((runCleanup = true) => {\n animationGenerationRef.current += 1;\n if (rafRef.current !== null) {\n window.cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n const cleanup = animationCleanupRef.current;\n animationCleanupRef.current = null;\n if (runCleanup) {\n cleanup?.();\n }\n }, []);\n\n const runGenieAnimation = useCallback(\n ({\n direction,\n dockRect,\n onComplete,\n onCancel,\n skipStop,\n texture\n }: {\n direction: WorkbenchGenieDirection;\n dockRect: WorkbenchGenieViewportRect;\n onCancel?: () => void;\n onComplete: () => void;\n skipStop?: boolean;\n texture: CapturedGenieTexture;\n }) => {\n if (!skipStop) {\n stopAnimation();\n }\n const setup = setupCanvas();\n if (!setup) {\n onComplete();\n return;\n }\n\n const generation = animationGenerationRef.current;\n const dockPoint = centerPointFromRect(dockRect);\n let startTime: number | null = null;\n animationCleanupRef.current = onCancel ?? null;\n setIsCanvasActive(true);\n renderGenieScanlines(\n setup.context,\n setup.viewportWidth,\n setup.viewportHeight,\n {\n direction,\n dockPoint,\n progress: 0,\n texture: texture.canvas,\n textureRect: texture.rect\n }\n );\n\n const drawFrame = (timestamp: number) => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n startTime ??= timestamp;\n const progress = clampProgress(\n (timestamp - startTime) / genieDurationMs\n );\n const animationProgress = resolveGenieAnimationProgress(\n direction,\n progress\n );\n renderGenieScanlines(\n setup.context,\n setup.viewportWidth,\n setup.viewportHeight,\n {\n direction,\n dockPoint,\n progress: animationProgress,\n texture: texture.canvas,\n textureRect: texture.rect\n }\n );\n\n if (progress < 1) {\n rafRef.current = window.requestAnimationFrame(drawFrame);\n return;\n }\n\n rafRef.current = null;\n animationCleanupRef.current = null;\n onComplete();\n };\n\n rafRef.current = window.requestAnimationFrame(drawFrame);\n },\n [setupCanvas, stopAnimation]\n );\n\n const runScaleWindowAnimation = useCallback(\n ({\n direction,\n dockRect,\n nodeElement,\n onCancel,\n onComplete,\n skipStop\n }: {\n direction: WorkbenchGenieDirection;\n dockRect: WorkbenchGenieViewportRect;\n nodeElement: HTMLElement;\n onCancel: () => void;\n onComplete: () => void;\n skipStop?: boolean;\n }) => {\n if (!skipStop) {\n stopAnimation();\n }\n const windowRect = viewportRectFromElement(nodeElement);\n if (!isUsableGenieRect(windowRect) || !isUsableGenieRect(dockRect)) {\n onComplete();\n return;\n }\n\n const generation = animationGenerationRef.current;\n const fromCenter = centerPointFromRect(windowRect);\n const toCenter = centerPointFromRect(dockRect);\n const targetScale = Math.max(\n 0.04,\n Math.min(\n 0.32,\n dockRect.width / Math.max(1, windowRect.width),\n dockRect.height / Math.max(1, windowRect.height)\n )\n );\n const previousPointerEvents = nodeElement.style.pointerEvents;\n const previousTransformOrigin = nodeElement.style.transformOrigin;\n const previousVisibility = nodeElement.style.visibility;\n const previousZIndex = nodeElement.style.zIndex;\n nodeElement.style.pointerEvents = \"none\";\n nodeElement.style.transformOrigin = \"center center\";\n nodeElement.style.visibility = \"visible\";\n nodeElement.style.zIndex = \"var(--z-workbench-genie)\";\n\n const dockTransform = `translate3d(${toCenter.x - fromCenter.x}px, ${\n toCenter.y - fromCenter.y\n }px, 0) scale(${targetScale})`;\n const windowTransform = \"translate3d(0, 0, 0) scale(1)\";\n const keyframes =\n direction === \"open\"\n ? [\n {\n opacity: 0,\n transform: dockTransform\n },\n {\n opacity: 1,\n transform: windowTransform\n }\n ]\n : [\n {\n opacity: 1,\n transform: windowTransform\n },\n {\n opacity: 0,\n transform: dockTransform\n }\n ];\n const animation = nodeElement.animate(keyframes, {\n duration: scaleMinimizeDurationMs,\n easing: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n fill: \"forwards\"\n });\n\n const restoreElement = () => {\n animation.cancel();\n nodeElement.style.pointerEvents = previousPointerEvents;\n nodeElement.style.transformOrigin = previousTransformOrigin;\n nodeElement.style.visibility = previousVisibility;\n nodeElement.style.zIndex = previousZIndex;\n };\n\n animationCleanupRef.current = () => {\n restoreElement();\n onCancel();\n };\n animation.finished\n .then(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n animationCleanupRef.current = null;\n restoreElement();\n onComplete();\n })\n .catch(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n animationCleanupRef.current = null;\n restoreElement();\n onComplete();\n });\n },\n [stopAnimation]\n );\n\n useEffect(() => () => stopAnimation(false), [stopAnimation]);\n\n const startOpenOrRestoreAnimation = useCallback(\n async (\n nodeID: string,\n anchorKey: string,\n generation: number,\n dockRectFallback: WorkbenchGenieViewportRect | null,\n minimizedNode: WorkbenchNode<TData> | null\n ) => {\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n if (effectiveMinimizeAnimation === \"off\") {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n const resolvedDockRect = resolveDockAnchorRect(anchorKey);\n const dockRect =\n resolvedDockRect && isUsableGenieRect(resolvedDockRect)\n ? resolvedDockRect\n : dockRectFallback;\n const nodeElement = resolveNodeElement(nodeID);\n if (effectiveMinimizeAnimation === \"scale\") {\n if (!dockRect || !nodeElement || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n runScaleWindowAnimation({\n direction: \"open\",\n dockRect,\n nodeElement,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n }\n });\n return;\n }\n\n if (!dockRect || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n const cachedTexture = readMinimizedGenieTexture(nodeID);\n const restoredWindowRect = nodeElement\n ? viewportRectFromElement(nodeElement)\n : null;\n const shouldRestoreFromRenderedPreview =\n minimizedNode !== null &&\n (shouldCaptureNodePreviewImage?.(minimizedNode) ?? true) === false;\n const renderedPreviewTexture =\n cachedTexture ||\n !shouldRestoreFromRenderedPreview ||\n !restoredWindowRect ||\n !isUsableGenieRect(restoredWindowRect)\n ? null\n : await requestRenderedGeniePreviewTexture({\n node: minimizedNode,\n textureRect: restoredWindowRect\n }).catch(() => null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n const captureTarget =\n cachedTexture || renderedPreviewTexture || !nodeElement\n ? null\n : resolveWorkbenchCaptureElement(nodeElement);\n if (!cachedTexture && !renderedPreviewTexture && !captureTarget) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n const texture =\n cachedTexture ??\n renderedPreviewTexture ??\n (captureTarget\n ? await captureElementTexture(captureTarget).catch(() => null)\n : null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n clearMinimizedGenieTexture(nodeID);\n return;\n }\n\n runGenieAnimation({\n direction: \"open\",\n dockRect,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n minimizeAnimation,\n readMinimizedGenieTexture,\n requestRenderedGeniePreviewTexture,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n runScaleWindowAnimation,\n shouldCaptureNodePreviewImage,\n showNodeForGenie\n ]\n );\n\n const launchNodeFromAnchor = useCallback(\n (\n anchorKey: string,\n nodeID: string,\n launch: () => Promise<string | null | void> | string | null | void\n ) => {\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n if (target.isMinimized !== true) {\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n if (effectiveMinimizeAnimation === \"off\") {\n stopAnimation();\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n void Promise.resolve(launch()).catch(() => {});\n return;\n }\n\n stopAnimation();\n const dockRectFallback = resolveDockAnchorRect(anchorKey);\n hideNodeForGenie(nodeID);\n animationCleanupRef.current = () => {\n if (rafRef.current !== null) {\n window.cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearMinimizedGenieTexture(nodeID);\n clearCanvas();\n };\n const generation = animationGenerationRef.current;\n rafRef.current = window.requestAnimationFrame(() => {\n rafRef.current = null;\n if (generation !== animationGenerationRef.current) {\n return;\n }\n void Promise.resolve(launch())\n .catch(() => null)\n .then(() => {\n if (generation !== animationGenerationRef.current) {\n return;\n }\n void startOpenOrRestoreAnimation(\n nodeID,\n anchorKey,\n generation,\n dockRectFallback,\n target\n );\n });\n });\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n controller,\n hideNodeForGenie,\n minimizeAnimation,\n resolveDockAnchorRect,\n showNodeForGenie,\n startOpenOrRestoreAnimation,\n stopAnimation\n ]\n );\n\n const minimizeNodeToAnchor = useCallback(\n (nodeID: string, minimize?: () => void) => {\n void (async () => {\n pruneMinimizedGenieTextures();\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n nodeId: nodeID,\n reason: \"target_missing\"\n },\n \"warn\"\n );\n return;\n }\n clearMinimizedGenieTexture(nodeID);\n const runMinimize =\n minimize ?? (() => controller.commands.minimizeNode(nodeID));\n const effectiveMinimizeAnimation = shouldReduceMotion()\n ? \"off\"\n : minimizeAnimation;\n const shouldCapturePreview =\n shouldCaptureNodePreviewImage?.(target) ?? true;\n if (effectiveMinimizeAnimation === \"off\") {\n stopAnimation();\n let frameID: number | null = null;\n let timerID: ReturnType<typeof setTimeout> | null = null;\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n if (frameID !== null) {\n window.cancelAnimationFrame(frameID);\n frameID = null;\n }\n if (timerID !== null) {\n clearTimeout(timerID);\n timerID = null;\n }\n animationCleanupRef.current = null;\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n runMinimize();\n });\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n };\n animationCleanupRef.current = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n commitMinimize();\n };\n registerMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n hideNodeForGenie(nodeID);\n setPendingMinimizedNode({\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n });\n });\n if (shouldCapturePreview) {\n void captureProvidedWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n frameID = window.requestAnimationFrame(() => {\n frameID = null;\n timerID = setTimeout(commitMinimize, 0);\n });\n return;\n }\n\n if (effectiveMinimizeAnimation === \"scale\") {\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n if (!nodeElement) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"scale\",\n reason: \"node_element_missing\"\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const wasFocusedForCapture =\n shouldCapturePreview && isFocusedWorkbenchNode(controller, nodeID);\n if (shouldCapturePreview && !wasFocusedForCapture) {\n flushSync(() => {\n controller.commands.focusNode(nodeID);\n });\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n }\n\n if (shouldCapturePreview) {\n void captureProvidedWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n runMinimize();\n };\n const cleanupPendingMinimize = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n commitMinimize();\n });\n };\n const pendingMinimizedNode: WorkbenchNode<TData> = {\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n };\n registerMinimizedDockEnterAnimation(nodeID);\n\n flushSync(() => {\n setPendingMinimizedNode(pendingMinimizedNode);\n });\n animationCleanupRef.current = cleanupPendingMinimize;\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const anchorKey = resolveAnchorKeyForNode(pendingMinimizedNode);\n const dockRect = await resolveDockAnchorRectAfterRender(\n anchorKey,\n () => generation === animationGenerationRef.current\n );\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (\n !nodeElement.isConnected ||\n !dockRect ||\n !isUsableGenieRect(dockRect)\n ) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n anchorKey,\n dockRect,\n mode: \"scale\",\n nodeElementConnected: nodeElement.isConnected,\n registeredDockAnchorKeys: Array.from(\n dockAnchorElementsRef.current.keys()\n ).filter((key) => key.startsWith(\"minimized:\")),\n reason: \"dock_rect_unusable\"\n },\n \"warn\"\n );\n cleanupPendingMinimize();\n return;\n }\n\n runScaleWindowAnimation({\n direction: \"minimize\",\n dockRect,\n nodeElement,\n onCancel: () => {\n cleanupPendingMinimize();\n },\n onComplete: () => {\n animationCleanupRef.current = null;\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n commitMinimize();\n });\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n },\n skipStop: true\n });\n return;\n }\n\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n if (!nodeElement) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"node_element_missing\"\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const windowRect = viewportRectFromElement(nodeElement);\n if (!isUsableGenieRect(windowRect)) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"window_rect_unusable\",\n windowRect\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n const pendingMinimizedNode: WorkbenchNode<TData> = {\n ...target,\n isMinimized: true,\n minimizedAtUnixMs: Date.now()\n };\n const componentPreviewTexture = shouldCapturePreview\n ? null\n : await requestRenderedGeniePreviewTexture({\n node: pendingMinimizedNode,\n textureRect: windowRect\n }).catch(() => null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!shouldCapturePreview) {\n if (!componentPreviewTexture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.texture.missing\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"component_preview_texture_missing\",\n shouldCapturePreview,\n windowRect\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n }\n\n const captureTarget = resolveWorkbenchCaptureElement(nodeElement);\n const preparedTexture = shouldCapturePreview\n ? prepareElementTextureCapture(captureTarget)\n : null;\n if (!preparedTexture) {\n if (!componentPreviewTexture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n reason: \"prepared_texture_missing\",\n shouldCapturePreview\n },\n \"warn\"\n );\n runMinimize();\n return;\n }\n }\n const wasFocusedForCapture = isFocusedWorkbenchNode(controller, nodeID);\n if (shouldCapturePreview && !wasFocusedForCapture) {\n flushSync(() => {\n controller.commands.focusNode(nodeID);\n });\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n }\n const previewImageUrlPromise = shouldCapturePreview\n ? Promise.resolve(captureNodePreviewImage?.(target) ?? null).catch(\n () => null\n )\n : Promise.resolve(null);\n const previewCaptureOutcome = await racePreviewImageCapture(\n previewImageUrlPromise,\n previewCaptureRaceTimeoutMs\n );\n const previewImageUrl = previewCaptureOutcome.previewImageUrl;\n if (previewCaptureOutcome.status === \"pending\") {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.preview_capture.deferred\",\n {\n ...describeGenieNode(target),\n mode: \"genie\",\n timeoutMs: previewCaptureRaceTimeoutMs\n },\n \"debug\"\n );\n void previewImageUrlPromise.then((latePreviewImageUrl) => {\n if (\n !latePreviewImageUrl ||\n generation !== animationGenerationRef.current\n ) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(nodeID, latePreviewImageUrl);\n persistWorkbenchNodePreviewImage(target, latePreviewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n });\n }\n const previewImageTexture =\n shouldCapturePreview && previewImageUrl\n ? await renderPreviewImageTexture({\n previewImageUrl,\n rect: windowRect\n }).catch(() => null)\n : null;\n const texture =\n componentPreviewTexture ??\n previewImageTexture ??\n (preparedTexture\n ? await renderPreparedElementTexture(preparedTexture).catch(\n () => null\n )\n : null);\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n hasComponentPreviewTexture: Boolean(componentPreviewTexture),\n hasPreparedDomTexture: Boolean(preparedTexture),\n hasPreviewImageTexture: Boolean(previewImageTexture),\n mode: \"genie\",\n reason: \"texture_missing\",\n shouldCapturePreview\n },\n \"warn\"\n );\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n persistWorkbenchNodePreviewImage(target, previewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n runMinimize();\n return;\n }\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(nodeID, previewImageUrl);\n persistWorkbenchNodePreviewImage(target, previewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n } else {\n const capturedPreviewImageUrl = createDockPreviewDataUrl(\n texture.canvas\n );\n writeCachedWorkbenchNodePreviewImage(nodeID, capturedPreviewImageUrl);\n persistWorkbenchNodePreviewImage(target, capturedPreviewImageUrl, {\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n }\n writeMinimizedGenieTexture(nodeID, texture);\n pruneMinimizedGenieTextures(nodeID);\n\n let minimizeCommitted = false;\n const commitMinimize = () => {\n if (minimizeCommitted) {\n return;\n }\n minimizeCommitted = true;\n runMinimize();\n };\n const cleanupPendingGenieMinimize = () => {\n releaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n commitMinimize();\n });\n clearCanvas();\n };\n animationCleanupRef.current = cleanupPendingGenieMinimize;\n\n registerMinimizedDockEnterAnimation(nodeID);\n\n flushSync(() => {\n setPendingMinimizedNode(pendingMinimizedNode);\n });\n\n await waitForNextAnimationFrame();\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const anchorKey = resolveAnchorKeyForNode(pendingMinimizedNode);\n const dockRect = await resolveDockAnchorRectAfterRender(\n anchorKey,\n () => generation === animationGenerationRef.current\n );\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!dockRect || !isUsableGenieRect(dockRect)) {\n logWorkbenchGenieDiagnostic(\n debugDiagnostics,\n \"workbench.genie.minimize.skipped\",\n {\n ...describeGenieNode(target),\n anchorKey,\n dockRect,\n mode: \"genie\",\n registeredDockAnchorKeys: Array.from(\n dockAnchorElementsRef.current.keys()\n ).filter((key) => key.startsWith(\"minimized:\")),\n reason: \"dock_rect_unusable\"\n },\n \"warn\"\n );\n animationCleanupRef.current = null;\n cleanupPendingGenieMinimize();\n return;\n }\n\n runGenieAnimation({\n direction: \"minimize\",\n dockRect,\n onCancel: () => {\n cleanupPendingGenieMinimize();\n },\n onComplete: () => {\n scheduleReleaseMinimizedDockEnterAnimation(nodeID);\n flushSync(() => {\n clearPendingMinimizedNode(nodeID);\n showNodeForGenie(nodeID);\n commitMinimize();\n });\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n flushSync(() => {\n hideNodeForGenie(nodeID);\n });\n })();\n },\n [\n clearCanvas,\n clearMinimizedGenieTexture,\n controller,\n captureNodePreviewImage,\n clearPendingMinimizedNode,\n debugDiagnostics,\n dockPreviewCache,\n hideNodeForGenie,\n minimizeAnimation,\n pruneMinimizedGenieTextures,\n registerMinimizedDockEnterAnimation,\n releaseMinimizedDockEnterAnimation,\n requestRenderedGeniePreviewTexture,\n resolveAnchorKeyForNode,\n resolveDockPreviewCacheKey,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n runScaleWindowAnimation,\n scheduleReleaseMinimizedDockEnterAnimation,\n shouldCaptureNodePreviewImage,\n setupCanvas,\n showNodeForGenie,\n stopAnimation,\n writeMinimizedGenieTexture\n ]\n );\n\n useEffect(\n () => () => {\n for (const timer of minimizedDockEnterAnimationTimersRef.current.values()) {\n clearTimeout(timer);\n }\n minimizedDockEnterAnimationTimersRef.current.clear();\n minimizedDockEnterAnimationNodeIdsRef.current.clear();\n minimizedGenieTextureByNodeIDRef.current.clear();\n },\n []\n );\n\n return {\n genieLayer:\n typeof document === \"undefined\"\n ? null\n : createPortal(\n <>\n <canvas\n ref={canvasRef}\n className=\"workbench-genie-layer\"\n data-workbench-genie-layer-state={\n isCanvasActive ? \"active\" : \"idle\"\n }\n aria-hidden\n />\n {pendingRenderedPreviewCapture ? (\n <div\n ref={renderedPreviewCaptureElementRef}\n className=\"workbench-genie-preview-capture\"\n data-workbench-genie-preview-capture-id={\n pendingRenderedPreviewCapture.id\n }\n data-workbench-genie-preview-node-id={\n pendingRenderedPreviewCapture.nodeID\n }\n data-workbench-genie-preview-used-fallback={\n pendingRenderedPreviewCapture.usedFallbackPreview\n ? \"true\"\n : \"false\"\n }\n style={{\n height: pendingRenderedPreviewCapture.rect.height,\n width: pendingRenderedPreviewCapture.rect.width\n }}\n aria-hidden\n >\n {pendingRenderedPreviewCapture.preview}\n </div>\n ) : null}\n </>,\n document.body\n ),\n isNodeGenieHidden: useCallback(\n (nodeID: string) => genieHiddenNodeIDs.has(nodeID),\n [genieHiddenNodeIDs]\n ),\n isPendingMinimizedDockNode: useCallback(\n (nodeID: string) => pendingMinimizedNode?.id === nodeID,\n [pendingMinimizedNode]\n ),\n launchNodeFromAnchor,\n minimizeNodeToAnchor,\n pendingMinimizedNode,\n registerDockAnchor,\n shouldAnimateMinimizedDockEnter\n };\n}\n","export interface WorkbenchGenieViewportRect {\n height: number;\n left: number;\n top: number;\n width: number;\n}\n\nexport type WorkbenchGenieDirection = \"open\" | \"minimize\";\n\nexport interface WorkbenchGeniePoint {\n x: number;\n y: number;\n}\n\nexport interface WorkbenchGenieScanlineFrame {\n direction: WorkbenchGenieDirection;\n dockPoint: WorkbenchGeniePoint;\n progress: number;\n texture: HTMLCanvasElement;\n textureRect: WorkbenchGenieViewportRect;\n}\n\nexport interface WorkbenchGenieMeaningfulElementClone {\n clone: HTMLElement;\n images: WorkbenchGenieMeaningfulImageClone[];\n}\n\nexport interface WorkbenchGenieMeaningfulImageClone {\n displayHeight: number;\n displayWidth: number;\n url: string | null;\n}\n\nconst genieHorizontalRowStagger = 0.65;\nconst genieVerticalRowStagger = 0.2;\nconst genieDockGlowRadius = 55;\nconst genieScanlineStrideThresholdPx = 640;\nconst genieMaxScanlineStride = 3;\n\nexport function clampGenieProgress(value: number): number {\n return Math.max(0, Math.min(1, value));\n}\n\nexport function easeInOutCubic(value: number): number {\n const progress = clampGenieProgress(value);\n return progress < 0.5\n ? 4 * progress * progress * progress\n : 1 - Math.pow(-2 * progress + 2, 3) / 2;\n}\n\nexport function easeInQuadratic(value: number): number {\n const progress = clampGenieProgress(value);\n return progress * progress;\n}\n\nexport function easeOutQuadratic(value: number): number {\n const progress = clampGenieProgress(value);\n return 1 - (1 - progress) * (1 - progress);\n}\n\nexport function lerpGenieValue(\n from: number,\n to: number,\n progress: number\n): number {\n return from + (to - from) * progress;\n}\n\nexport function viewportRectFromElement(\n element: HTMLElement\n): WorkbenchGenieViewportRect {\n const rect = element.getBoundingClientRect();\n return {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n };\n}\n\nexport function isUsableGenieRect(rect: WorkbenchGenieViewportRect): boolean {\n return rect.width > 0 && rect.height > 0;\n}\n\nexport function centerPointFromRect(\n rect: WorkbenchGenieViewportRect\n): WorkbenchGeniePoint {\n return {\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2\n };\n}\n\nfunction resolveGenieScanlineStride(textureHeight: number): number {\n return Math.max(\n 1,\n Math.min(\n genieMaxScanlineStride,\n Math.ceil(textureHeight / genieScanlineStrideThresholdPx)\n )\n );\n}\n\nfunction resolveGenieDirtyRect({\n dockPoint,\n textureRect,\n viewportHeight,\n viewportWidth\n}: {\n dockPoint: WorkbenchGeniePoint;\n textureRect: WorkbenchGenieViewportRect;\n viewportHeight: number;\n viewportWidth: number;\n}): WorkbenchGenieViewportRect {\n const padding = genieDockGlowRadius + 4;\n const left = Math.max(\n 0,\n Math.floor(Math.min(textureRect.left, dockPoint.x) - padding)\n );\n const top = Math.max(\n 0,\n Math.floor(Math.min(textureRect.top, dockPoint.y) - padding)\n );\n const right = Math.min(\n viewportWidth,\n Math.ceil(\n Math.max(textureRect.left + textureRect.width, dockPoint.x) + padding\n )\n );\n const bottom = Math.min(\n viewportHeight,\n Math.ceil(\n Math.max(textureRect.top + textureRect.height, dockPoint.y) + padding\n )\n );\n\n return {\n height: Math.max(0, bottom - top),\n left,\n top,\n width: Math.max(0, right - left)\n };\n}\n\nfunction resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger\n}: {\n direction: WorkbenchGenieDirection;\n progress: number;\n rowProgress: number;\n stagger: number;\n}): number {\n const start =\n direction === \"minimize\"\n ? (1 - rowProgress) * stagger\n : rowProgress * stagger;\n return clampGenieProgress((progress - start) / (1 - start));\n}\n\nfunction resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY,\n textureHeight,\n textureRect\n}: {\n direction: WorkbenchGenieDirection;\n dockPoint: WorkbenchGeniePoint;\n progress: number;\n sourceY: number;\n textureHeight: number;\n textureRect: WorkbenchGenieViewportRect;\n}): number {\n const rowProgress = clampGenieProgress(sourceY / textureHeight);\n const verticalProgress = resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger: genieVerticalRowStagger\n });\n const verticalEase = easeInQuadratic(verticalProgress);\n return direction === \"minimize\"\n ? lerpGenieValue(textureRect.top + sourceY, dockPoint.y, verticalEase)\n : lerpGenieValue(dockPoint.y, textureRect.top + sourceY, verticalEase);\n}\n\nfunction canInlineComputedStyle(\n element: Element\n): element is HTMLElement | SVGElement {\n return (\n element instanceof HTMLElement ||\n (typeof SVGElement !== \"undefined\" && element instanceof SVGElement)\n );\n}\n\nfunction isHiddenForGenieTexture(computed: CSSStyleDeclaration): boolean {\n return (\n computed.display === \"none\" ||\n computed.visibility === \"hidden\" ||\n computed.visibility === \"collapse\" ||\n Number.parseFloat(computed.opacity || \"1\") <= 0\n );\n}\n\nfunction rectsIntersect(\n a: WorkbenchGenieViewportRect,\n b: WorkbenchGenieViewportRect\n): boolean {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\ntype WorkbenchGenieElementSkipReason =\n | \"hidden\"\n | \"offscreen\"\n | \"unsupported\"\n | \"zero-size\";\n\nfunction resolveElementSkipReasonForGenieTexture(\n element: Element,\n rootRect: WorkbenchGenieViewportRect,\n computed: CSSStyleDeclaration\n): WorkbenchGenieElementSkipReason | null {\n if (isHiddenForGenieTexture(computed)) {\n return \"hidden\";\n }\n const tagName = element.tagName.toLowerCase();\n if (tagName === \"script\" || tagName === \"style\" || tagName === \"template\") {\n return \"unsupported\";\n }\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return \"zero-size\";\n }\n return rectsIntersect(\n {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n rootRect\n )\n ? null\n : \"offscreen\";\n}\n\nfunction hasMeaningfulTextNode(node: Node): boolean {\n return node.textContent?.trim() ? true : false;\n}\n\nfunction cloneMeaningfulGenieNode(\n source: Node,\n rootRect: WorkbenchGenieViewportRect,\n images: WorkbenchGenieMeaningfulImageClone[],\n forceInclude = false\n): Node | null {\n if (source.nodeType === Node.TEXT_NODE) {\n if (!hasMeaningfulTextNode(source)) {\n return null;\n }\n return source.cloneNode(false);\n }\n if (source.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n\n const sourceElement = source as Element;\n if (!canInlineComputedStyle(sourceElement)) {\n return null;\n }\n const computed = window.getComputedStyle(sourceElement);\n const skipReason = resolveElementSkipReasonForGenieTexture(\n sourceElement,\n rootRect,\n computed\n );\n const includeSelf = forceInclude || skipReason === null;\n if (!includeSelf && skipReason === \"hidden\") {\n return null;\n }\n\n const clone = sourceElement.cloneNode(false) as Element;\n copyGenieComputedStyle(sourceElement, clone, computed);\n\n for (const child of Array.from(source.childNodes)) {\n const childClone = cloneMeaningfulGenieNode(child, rootRect, images);\n if (childClone) {\n clone.appendChild(childClone);\n }\n }\n\n if (!includeSelf && clone.childNodes.length === 0) {\n return null;\n }\n\n if (sourceElement instanceof HTMLImageElement) {\n const rect = sourceElement.getBoundingClientRect();\n images.push({\n displayHeight: rect.height,\n displayWidth: rect.width,\n url:\n sourceElement.currentSrc ||\n sourceElement.src ||\n sourceElement.getAttribute(\"src\") ||\n null\n });\n }\n return clone;\n}\n\nfunction copyGenieComputedStyle(\n source: Element,\n clone: Element,\n computed = window.getComputedStyle(source)\n): void {\n if (!canInlineComputedStyle(source) || !canInlineComputedStyle(clone)) {\n return;\n }\n if (computed.cssText) {\n clone.style.cssText = computed.cssText;\n } else {\n for (let index = 0; index < computed.length; index += 1) {\n const propertyName = computed.item(index);\n if (!propertyName) {\n continue;\n }\n clone.style.setProperty(\n propertyName,\n computed.getPropertyValue(propertyName),\n computed.getPropertyPriority(propertyName)\n );\n }\n }\n clone.style.animation = \"none\";\n clone.style.opacity = \"1\";\n clone.style.transition = \"none\";\n clone.style.visibility = \"visible\";\n}\n\nexport function cloneMeaningfulGenieElement(\n source: HTMLElement,\n rootRect: WorkbenchGenieViewportRect\n): WorkbenchGenieMeaningfulElementClone | null {\n const images: WorkbenchGenieMeaningfulImageClone[] = [];\n const clone = cloneMeaningfulGenieNode(source, rootRect, images, true);\n if (!(clone instanceof HTMLElement)) {\n return null;\n }\n return { clone, images };\n}\n\nexport function renderGenieScanlines(\n context: CanvasRenderingContext2D,\n viewportWidth: number,\n viewportHeight: number,\n frame: WorkbenchGenieScanlineFrame\n): void {\n const { direction, dockPoint, texture, textureRect } = frame;\n const progress = clampGenieProgress(frame.progress);\n const sourceWidth = Math.max(1, texture.width);\n const sourceHeight = Math.max(1, texture.height);\n const destinationWidth = Math.max(1, textureRect.width);\n const destinationHeight = Math.max(1, textureRect.height);\n const scanlineStride = resolveGenieScanlineStride(sourceHeight);\n const dirtyRect = resolveGenieDirtyRect({\n dockPoint,\n textureRect,\n viewportHeight,\n viewportWidth\n });\n\n context.clearRect(\n dirtyRect.left,\n dirtyRect.top,\n dirtyRect.width,\n dirtyRect.height\n );\n\n for (let y = 0; y < sourceHeight; y += scanlineStride) {\n const sourceSliceHeight = Math.min(scanlineStride, sourceHeight - y);\n const sourceMidY = y + sourceSliceHeight / 2;\n const rowProgress = sourceMidY / sourceHeight;\n const horizontalProgress = resolveGenieRowProgress({\n direction,\n progress,\n rowProgress,\n stagger: genieHorizontalRowStagger\n });\n const horizontalEase = easeInOutCubic(horizontalProgress);\n\n const left =\n direction === \"minimize\"\n ? lerpGenieValue(textureRect.left, dockPoint.x, horizontalEase)\n : lerpGenieValue(dockPoint.x, textureRect.left, horizontalEase);\n const right =\n direction === \"minimize\"\n ? lerpGenieValue(\n textureRect.left + destinationWidth,\n dockPoint.x,\n horizontalEase\n )\n : lerpGenieValue(\n dockPoint.x,\n textureRect.left + destinationWidth,\n horizontalEase\n );\n const destinationSourceTop = (y / sourceHeight) * destinationHeight;\n const destinationSourceBottom =\n ((y + sourceSliceHeight) / sourceHeight) * destinationHeight;\n const targetTop = resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY: destinationSourceTop,\n textureHeight: destinationHeight,\n textureRect\n });\n const targetBottom = resolveGenieRowTargetY({\n direction,\n dockPoint,\n progress,\n sourceY: destinationSourceBottom,\n textureHeight: destinationHeight,\n textureRect\n });\n const targetY = Math.min(targetTop, targetBottom) - 0.5;\n const targetHeight = Math.max(1, Math.abs(targetBottom - targetTop) + 1);\n const rowWidth = right - left;\n\n if (rowWidth < 0.8) {\n continue;\n }\n\n context.drawImage(\n texture,\n 0,\n y,\n sourceWidth,\n sourceSliceHeight,\n left,\n targetY,\n rowWidth,\n targetHeight\n );\n }\n\n const glowProgress = direction === \"minimize\" ? progress : 1 - progress;\n if (glowProgress <= 0.75) {\n return;\n }\n\n const glowAlpha = easeOutQuadratic((glowProgress - 0.75) / 0.25) * 0.3;\n const dockGlow = context.createRadialGradient(\n dockPoint.x,\n dockPoint.y,\n 0,\n dockPoint.x,\n dockPoint.y,\n genieDockGlowRadius\n );\n dockGlow.addColorStop(0, `rgba(255, 255, 255, ${glowAlpha})`);\n dockGlow.addColorStop(1, \"rgba(255, 255, 255, 0)\");\n context.fillStyle = dockGlow;\n context.fillRect(\n dirtyRect.left,\n dirtyRect.top,\n dirtyRect.width,\n dirtyRect.height\n );\n}\n","import type {\n WorkbenchContribution,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostClosePreparer,\n WorkbenchHostLaunchRequest,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps\n} from \"./types.ts\";\n\nexport interface ResolvedWorkbenchHostConfig {\n dockEntries: readonly WorkbenchHostDockEntry[];\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: WorkbenchHostProps[\"onLaunchRequest\"];\n onNodeCloseRequest?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n prepareHostClose?: WorkbenchHostClosePreparer;\n}\n\nexport interface ResolvedWorkbenchHostRuntimeConfig {\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: WorkbenchHostProps[\"onLaunchRequest\"];\n onNodeCloseRequest?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n}\n\nexport function resolveWorkbenchHostConfig(\n props: Pick<\n WorkbenchHostProps,\n | \"contributions\"\n | \"dockEntries\"\n | \"externalStateSource\"\n | \"nodes\"\n | \"onLaunchRequest\"\n | \"onNodeCloseRequest\"\n >\n): ResolvedWorkbenchHostConfig {\n const contributions = props.contributions ?? [];\n\n return {\n dockEntries: resolveWorkbenchHostDockEntries(props),\n ...resolveWorkbenchHostRuntimeConfig(props),\n prepareHostClose: resolveHostClosePreparer(contributions)\n };\n}\n\nexport function resolveWorkbenchHostDockEntries(\n props: Pick<WorkbenchHostProps, \"contributions\" | \"dockEntries\">\n): readonly WorkbenchHostDockEntry[] {\n const contributions = props.contributions ?? [];\n return mergeByKey(\n contributions.flatMap((contribution) => contribution.dockEntries ?? []),\n props.dockEntries ?? [],\n (entry) => entry.id\n );\n}\n\nexport function resolveWorkbenchHostRuntimeConfig(\n props: Pick<\n WorkbenchHostProps,\n | \"contributions\"\n | \"externalStateSource\"\n | \"nodes\"\n | \"onLaunchRequest\"\n | \"onNodeCloseRequest\"\n >\n): ResolvedWorkbenchHostRuntimeConfig {\n const contributions = props.contributions ?? [];\n\n return {\n externalStateSource:\n props.externalStateSource ??\n combineContributionExternalStateSources(contributions),\n nodes: mergeByKey(\n contributions.flatMap((contribution) => contribution.nodes ?? []),\n props.nodes ?? [],\n (definition) => definition.typeId\n ),\n onLaunchRequest: resolveLaunchRequestHandler({\n contributions,\n explicitHandler: props.onLaunchRequest\n }),\n onNodeCloseRequest: resolveNodeCloseRequestHandler({\n contributions,\n explicitHandler: props.onNodeCloseRequest\n })\n };\n}\n\nfunction mergeByKey<T>(\n contributionItems: readonly T[],\n explicitItems: readonly T[],\n getKey: (item: T) => string\n): readonly T[] {\n const merged = new Map<string, T>();\n for (const item of [...contributionItems, ...explicitItems]) {\n const key = getKey(item);\n merged.delete(key);\n merged.set(key, item);\n }\n return [...merged.values()];\n}\n\nfunction combineContributionExternalStateSources(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostExternalStateSource | undefined {\n const sources = contributions\n .map((contribution) => contribution.externalStateSource)\n .filter((source): source is WorkbenchHostExternalStateSource =>\n Boolean(source)\n );\n\n if (sources.length === 0) {\n return undefined;\n }\n\n return {\n getNodeState(input) {\n for (const source of sources) {\n const state = source.getNodeState(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n getSnapshotNodeState(input) {\n for (const source of sources) {\n const state = source.getSnapshotNodeState?.(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n getWorkspaceState(input) {\n for (const source of sources) {\n const state = source.getWorkspaceState(input);\n if (state !== null && state !== undefined) {\n return state;\n }\n }\n return null;\n },\n subscribe(listener) {\n const disposers = sources\n .map((source) => source.subscribe?.(listener))\n .filter((dispose): dispose is () => void => Boolean(dispose));\n return () => {\n for (const dispose of disposers) {\n dispose();\n }\n };\n }\n };\n}\n\nfunction resolveLaunchRequestHandler(input: {\n contributions: readonly WorkbenchContribution[];\n explicitHandler?: WorkbenchHostProps[\"onLaunchRequest\"];\n}): WorkbenchHostProps[\"onLaunchRequest\"] {\n const contributionHandlers = input.contributions\n .map((contribution) => contribution.onLaunchRequest)\n .filter(\n (\n handler\n ): handler is NonNullable<WorkbenchContribution[\"onLaunchRequest\"]> =>\n Boolean(handler)\n );\n\n if (!input.explicitHandler && contributionHandlers.length === 0) {\n return undefined;\n }\n\n return async (request: WorkbenchHostLaunchRequest) => {\n const explicitResult = await input.explicitHandler?.(request);\n if (explicitResult !== null && explicitResult !== undefined) {\n return explicitResult;\n }\n\n for (const handler of contributionHandlers) {\n const result = await handler(request);\n if (result !== null && result !== undefined) {\n return result;\n }\n }\n\n return null;\n };\n}\n\nfunction resolveNodeCloseRequestHandler(input: {\n contributions: readonly WorkbenchContribution[];\n explicitHandler?: WorkbenchHostProps[\"onNodeCloseRequest\"];\n}): WorkbenchHostProps[\"onNodeCloseRequest\"] {\n const contributionHandlers = input.contributions\n .map((contribution) => contribution.onNodeCloseRequest)\n .filter(\n (\n handler\n ): handler is NonNullable<WorkbenchContribution[\"onNodeCloseRequest\"]> =>\n Boolean(handler)\n );\n\n if (!input.explicitHandler && contributionHandlers.length === 0) {\n return undefined;\n }\n\n return async (request: WorkbenchHostNodeCloseRequest) => {\n const explicitResult = await input.explicitHandler?.(request);\n if (explicitResult !== undefined) {\n return explicitResult;\n }\n\n for (const handler of contributionHandlers) {\n const result = await handler(request);\n if (result !== undefined) {\n return result;\n }\n }\n\n return undefined;\n };\n}\n\nexport function resolveWorkbenchHostPrepareClose(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostClosePreparer | undefined {\n return resolveHostClosePreparer(contributions);\n}\n\nfunction resolveHostClosePreparer(\n contributions: readonly WorkbenchContribution[]\n): WorkbenchHostClosePreparer | undefined {\n const preparers = contributions\n .map((contribution) => contribution.prepareHostClose)\n .filter(\n (\n prepare\n ): prepare is NonNullable<WorkbenchContribution[\"prepareHostClose\"]> =>\n Boolean(prepare)\n );\n\n if (preparers.length === 0) {\n return undefined;\n }\n\n return async (context) => {\n for (const prepare of preparers) {\n if (!(await prepare(context))) {\n return false;\n }\n }\n\n return true;\n };\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { createWorkbenchMissionControlI18nRuntime } from \"../mission-control/workbenchMissionControlI18n.ts\";\nimport { createWorkbenchWindowChromeI18nRuntime } from \"../react/workbenchWindowI18n.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport { createWorkbenchHostMissionControlAdapter } from \"./missionControlAdapter.ts\";\nimport type { ResolvedWorkbenchHostConfig } from \"./hostConfig.ts\";\nimport { createWorkbenchHostSession } from \"./session.ts\";\nimport type {\n WorkbenchHostChromeRenderContext,\n WorkbenchHostNodeData,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport { createWorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostRuntime({\n debugDiagnostics,\n externalStateSource,\n i18n,\n missionControlEnabled,\n nodes,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest,\n projectedNodes,\n snapshotRepository,\n workspaceId\n}: Pick<\n WorkbenchHostProps,\n | \"debugDiagnostics\"\n | \"i18n\"\n | \"onHandleReady\"\n | \"onMissionControlAdapterReady\"\n | \"projectedNodes\"\n | \"snapshotRepository\"\n | \"workspaceId\"\n> &\n Pick<\n ResolvedWorkbenchHostConfig,\n \"externalStateSource\" | \"nodes\" | \"onLaunchRequest\" | \"onNodeCloseRequest\"\n > & {\n missionControlEnabled: boolean;\n }) {\n const [externalStateRevision, bumpExternalStateRevision] = useState(0);\n const [, bumpHydrationRevision] = useState(0);\n const hostSession = useMemo(() => {\n logWorkbenchHostDebug(\"create-session\", debugDiagnostics, {\n nodeTypeIDs: nodes.map((node) => node.typeId),\n projectedNodeCount: projectedNodes?.length ?? 0,\n workspaceId\n });\n return createWorkbenchHostSession({\n debugDiagnostics,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest,\n projectedNodes: projectedNodes ?? [],\n snapshotRepository,\n workspaceId\n });\n }, [\n debugDiagnostics,\n externalStateSource,\n nodes,\n onLaunchRequest,\n onNodeCloseRequest,\n snapshotRepository,\n workspaceId\n ]);\n const hostI18n = useMemo(() => createWorkbenchHostI18nRuntime(i18n), [i18n]);\n const missionControlI18n = useMemo(\n () => createWorkbenchMissionControlI18nRuntime(i18n),\n [i18n]\n );\n const windowChromeI18n = useMemo(\n () => createWorkbenchWindowChromeI18nRuntime(i18n),\n [i18n]\n );\n const nodeDefinitionByType = useMemo(\n () => new Map(nodes.map((definition) => [definition.typeId, definition])),\n [nodes]\n );\n const isHydrating = hostSession.isHydrating?.() ?? false;\n const missionControlAdapter = useMemo(\n () =>\n missionControlEnabled && !isHydrating\n ? createWorkbenchHostMissionControlAdapter({\n activateNode: hostSession.activateNode.bind(hostSession),\n controller: hostSession.controller\n })\n : null,\n [hostSession.controller, isHydrating, missionControlEnabled]\n );\n const chromeController = useMemo(\n () =>\n isHydrating\n ? createReadOnlyWorkbenchController(hostSession.controller)\n : hostSession.controller,\n [hostSession.controller, isHydrating]\n );\n const chromeContext = useMemo<WorkbenchHostChromeRenderContext>(\n () => ({\n activateNode: hostSession.activateNode.bind(hostSession),\n controller: chromeController,\n focusNode: hostSession.focusNode.bind(hostSession),\n launchNode: hostSession.launchNode.bind(hostSession)\n }),\n [chromeController, hostSession]\n );\n\n useEffect(() => {\n let isCurrent = true;\n void hostSession.load().finally(() => {\n if (isCurrent) {\n bumpHydrationRevision((revision) => revision + 1);\n }\n });\n\n return () => {\n isCurrent = false;\n logWorkbenchHostDebug(\"dispose-session\", debugDiagnostics, {\n workspaceId\n });\n hostSession.dispose();\n };\n }, [debugDiagnostics, hostSession, workspaceId]);\n\n useEffect(() => {\n onHandleReady?.(hostSession);\n return () => {\n onHandleReady?.(null);\n };\n }, [hostSession, onHandleReady]);\n\n useEffect(() => {\n if (!onMissionControlAdapterReady) {\n return undefined;\n }\n\n onMissionControlAdapterReady(missionControlAdapter);\n return () => {\n onMissionControlAdapterReady(null);\n };\n }, [missionControlAdapter, onMissionControlAdapterReady]);\n\n useEffect(() => {\n hostSession.reconcileProjectedNodes(projectedNodes ?? []);\n }, [hostSession, projectedNodes]);\n\n useEffect(() => {\n if (!externalStateSource?.subscribe) {\n return undefined;\n }\n\n return externalStateSource.subscribe(() => {\n bumpExternalStateRevision((revision) => revision + 1);\n });\n }, [externalStateSource, workspaceId]);\n\n return {\n chromeContext,\n externalStateRevision,\n hostI18n,\n isHydrating,\n hostSession,\n missionControlI18n,\n missionControlAdapter,\n nodeDefinitionByType,\n windowChromeI18n\n };\n}\n\nconst noop = () => {};\n\nconst readOnlyWorkbenchCommands = new Proxy(\n {},\n {\n get: () => noop\n }\n) as WorkbenchController<WorkbenchHostNodeData>[\"commands\"];\n\nfunction createReadOnlyWorkbenchController(\n controller: WorkbenchController<WorkbenchHostNodeData>\n): WorkbenchController<WorkbenchHostNodeData> {\n return {\n commands: readOnlyWorkbenchCommands,\n dispatch: noop,\n getSnapshot: controller.getSnapshot.bind(controller),\n subscribe: controller.subscribe.bind(controller)\n };\n}\n\nfunction logWorkbenchHostDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n payload: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.isEnabled()) {\n return;\n }\n\n console.info(\"[workbench:host]\", {\n event,\n ...payload\n });\n void Promise.resolve(\n debugDiagnostics.log?.({\n details: payload,\n event,\n level: \"info\",\n source: \"workbench-host\",\n workspaceId:\n typeof payload.workspaceId === \"string\" ? payload.workspaceId : null\n })\n ).catch(() => undefined);\n}\n","export function createDerivedSnapshotGetter<TSourceSnapshot, TSnapshot>(input: {\n deriveSnapshot: (sourceSnapshot: TSourceSnapshot) => TSnapshot;\n getSourceSnapshot: () => TSourceSnapshot;\n}): () => TSnapshot {\n let cachedSourceSnapshot: TSourceSnapshot | null = null;\n let cachedSnapshot: TSnapshot | null = null;\n let hasCachedSnapshot = false;\n\n return () => {\n const sourceSnapshot = input.getSourceSnapshot();\n if (hasCachedSnapshot && cachedSourceSnapshot === sourceSnapshot) {\n return cachedSnapshot as TSnapshot;\n }\n\n const snapshot = input.deriveSnapshot(sourceSnapshot);\n cachedSourceSnapshot = sourceSnapshot;\n cachedSnapshot = snapshot;\n hasCachedSnapshot = true;\n return snapshot;\n };\n}\n","export const workbenchFocusInputActivationType = \"focus-input\";\n","import { selectVisibleWorkbenchNodes } from \"../core/selectors.ts\";\nimport { createDerivedSnapshotGetter } from \"../store/createDerivedSnapshotGetter.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport type { WorkbenchMissionControlAdapter } from \"../mission-control/types.ts\";\nimport { workbenchFocusInputActivationType } from \"./activations.ts\";\nimport type {\n WorkbenchHostActivationTarget,\n WorkbenchHostNodeData\n} from \"./types.ts\";\n\nexport function createWorkbenchHostMissionControlAdapter(input: {\n activateNode?: (\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ) => void;\n controller: WorkbenchController<WorkbenchHostNodeData>;\n}): WorkbenchMissionControlAdapter<WorkbenchHostNodeData> {\n const getSnapshot = createDerivedSnapshotGetter<\n ReturnType<WorkbenchController<WorkbenchHostNodeData>[\"getSnapshot\"]>,\n ReturnType<\n WorkbenchMissionControlAdapter<WorkbenchHostNodeData>[\"getSnapshot\"]\n >\n >({\n deriveSnapshot(controllerSnapshot) {\n return {\n layoutConstraints: controllerSnapshot.layoutConstraints,\n surfaceSize: controllerSnapshot.surfaceSize,\n visibleNodes: selectVisibleWorkbenchNodes(controllerSnapshot)\n };\n },\n getSourceSnapshot() {\n return input.controller.getSnapshot();\n }\n });\n\n return {\n applyLayoutPreset(nodeIds, preset) {\n input.controller.commands.applyLayoutPreset(nodeIds, preset);\n },\n focusNode(nodeId) {\n if (input.activateNode) {\n input.activateNode(\n { nodeId },\n { type: workbenchFocusInputActivationType }\n );\n return;\n }\n input.controller.commands.focusNode(nodeId);\n },\n getSnapshot,\n subscribe(listener) {\n return input.controller.subscribe(listener);\n }\n };\n}\n","import {\n normalizeWorkbenchSnapshot,\n workbenchSnapshotSchemaVersion,\n type WorkbenchSnapshot,\n type WorkbenchSnapshotNode\n} from \"@tutti-os/workbench-snapshot\";\nimport type { WorkbenchNode, WorkbenchState } from \"./types.ts\";\n\nexport interface CreateWorkbenchNodeInput<TData = unknown> {\n data: TData;\n displayMode?: WorkbenchNode<TData>[\"displayMode\"];\n frame: WorkbenchNode<TData>[\"frame\"];\n id: string;\n isMinimized?: boolean;\n kind: string;\n minimizedAtUnixMs?: WorkbenchNode<TData>[\"minimizedAtUnixMs\"];\n restoreFrame?: WorkbenchNode<TData>[\"restoreFrame\"];\n sizeConstraints?: WorkbenchNode<TData>[\"sizeConstraints\"];\n title: string;\n}\n\nexport interface CreateWorkbenchSnapshotFromStateOptions {\n activeSpaceId?: WorkbenchSnapshot[\"activeSpaceId\"];\n metadata?: WorkbenchSnapshot[\"metadata\"];\n spaces?: WorkbenchSnapshot[\"spaces\"];\n}\n\nexport function createWorkbenchNode<TData = unknown>(\n input: CreateWorkbenchNodeInput<TData>\n): WorkbenchNode<TData> {\n return {\n id: input.id,\n kind: input.kind,\n title: input.title,\n frame: input.frame,\n displayMode: input.displayMode ?? \"floating\",\n restoreFrame: input.restoreFrame ?? null,\n isMinimized: input.isMinimized ?? false,\n minimizedAtUnixMs:\n input.isMinimized === true ? (input.minimizedAtUnixMs ?? null) : null,\n sizeConstraints: input.sizeConstraints ?? null,\n data: input.data\n };\n}\n\nexport function createWorkbenchNodeFromSnapshot<TData = unknown>(\n snapshotNode: WorkbenchSnapshotNode\n): WorkbenchNode<TData> {\n return createWorkbenchNode<TData>({\n id: snapshotNode.id,\n kind: snapshotNode.kind,\n title: snapshotNode.title,\n frame: snapshotNode.frame,\n displayMode: snapshotNode.displayMode,\n restoreFrame: snapshotNode.restoreFrame ?? null,\n isMinimized: snapshotNode.isMinimized,\n minimizedAtUnixMs: snapshotNode.minimizedAtUnixMs ?? null,\n data: snapshotNode.data as TData\n });\n}\n\nexport function createWorkbenchStateFromSnapshot<TData = unknown>(\n snapshot: WorkbenchSnapshot\n): Pick<WorkbenchState<TData>, \"nodeStack\" | \"nodes\"> {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n const nodes = normalized.nodes.map((node) =>\n createWorkbenchNodeFromSnapshot<TData>(node)\n );\n\n return {\n nodes,\n nodeStack: normalized.nodeStack ?? nodes.map((node) => node.id)\n };\n}\n\nexport function createWorkbenchSnapshotFromState<TData = unknown>(\n state: Pick<WorkbenchState<TData>, \"nodeStack\" | \"nodes\">,\n options: CreateWorkbenchSnapshotFromStateOptions = {}\n): WorkbenchSnapshot {\n return normalizeWorkbenchSnapshot({\n schemaVersion: workbenchSnapshotSchemaVersion,\n nodes: state.nodes.map((node) => ({\n id: node.id,\n kind: node.kind,\n title: node.title,\n frame: node.frame,\n displayMode: node.displayMode,\n restoreFrame: node.restoreFrame,\n isMinimized: node.isMinimized,\n minimizedAtUnixMs: node.minimizedAtUnixMs,\n data: node.data\n })),\n nodeStack: state.nodeStack,\n activeNodeId: state.nodeStack.at(-1) ?? null,\n spaces: options.spaces,\n activeSpaceId: options.activeSpaceId,\n metadata: options.metadata\n });\n}\n","import { clampWorkbenchRect } from \"./geometry.ts\";\nimport {\n defaultWorkbenchLayoutConstraints,\n type WorkbenchLayoutConstraints,\n type WorkbenchFrame,\n type WorkbenchNode,\n type WorkbenchNodeSizeConstraints,\n type WorkbenchSize\n} from \"./types.ts\";\n\nexport const WORKBENCH_WINDOW_CASCADE_OFFSET = 28;\n\nexport function createWorkbenchInitialRect(\n index: number,\n surfaceSize: WorkbenchSize,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints,\n sizeConstraints?: WorkbenchNodeSizeConstraints | null\n): WorkbenchFrame {\n const frameOrigin = {\n x: constraints.safeArea.left + constraints.surfacePadding,\n y: constraints.safeArea.top + constraints.surfacePadding\n };\n const baseWidth = Math.min(760, Math.max(360, surfaceSize.width * 0.62));\n const baseHeight = Math.min(520, Math.max(260, surfaceSize.height * 0.62));\n const offset = (index % 8) * WORKBENCH_WINDOW_CASCADE_OFFSET;\n\n return clampWorkbenchRect(\n {\n x: frameOrigin.x + offset,\n y: frameOrigin.y + offset,\n width: baseWidth,\n height: baseHeight\n },\n surfaceSize,\n constraints,\n sizeConstraints\n );\n}\n\nexport function resolveWorkbenchCascadedRect<TData>(input: {\n constraints?: WorkbenchLayoutConstraints;\n currentNodeStack: readonly string[];\n existingNodes: readonly WorkbenchNode<TData>[];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchSize;\n}): WorkbenchFrame {\n const activeNode =\n input.existingNodes.find(\n (node) => node.id === input.currentNodeStack.at(-1)\n ) ?? input.existingNodes.at(-1);\n\n if (!activeNode) {\n return clampWorkbenchRect(\n input.preferredFrame,\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n }\n\n return clampWorkbenchRect(\n {\n x: activeNode.frame.x + WORKBENCH_WINDOW_CASCADE_OFFSET,\n y: activeNode.frame.y + WORKBENCH_WINDOW_CASCADE_OFFSET,\n width: input.preferredFrame.width,\n height: input.preferredFrame.height\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function placeWorkbenchNode<TData>(\n node: Omit<WorkbenchNode<TData>, \"frame\"> & { frame?: WorkbenchFrame },\n index: number,\n surfaceSize: WorkbenchSize\n): WorkbenchNode<TData> {\n return {\n ...node,\n frame: node.frame ?? createWorkbenchInitialRect(index, surfaceSize)\n };\n}\n","export interface WorkbenchHostNodeIdentityInput {\n instanceId: string;\n typeId: string;\n}\n\nexport function createWorkbenchHostProjectedNodeId(\n input: WorkbenchHostNodeIdentityInput\n): string {\n return `${input.typeId}:${input.instanceId}`;\n}\n\nexport function createWorkbenchHostLaunchedNodeId(\n input: WorkbenchHostNodeIdentityInput\n): string {\n return input.instanceId === input.typeId\n ? input.typeId\n : createWorkbenchHostProjectedNodeId(input);\n}\n","import type { WorkbenchSnapshot } from \"@tutti-os/workbench-snapshot\";\nimport {\n clampWorkbenchRect,\n getWorkbenchFullscreenRect,\n getWorkbenchLayoutFrame,\n rectsEqual\n} from \"../core/geometry.ts\";\nimport { resolveWorkbenchCascadedRect } from \"../core/placement.ts\";\nimport {\n createWorkbenchNode,\n createWorkbenchStateFromSnapshot\n} from \"../core/snapshot.ts\";\nimport type {\n WorkbenchFrame,\n WorkbenchNode,\n WorkbenchNodeSizeConstraints,\n WorkbenchState\n} from \"../core/types.ts\";\nimport {\n createWorkbenchHostLaunchedNodeId,\n createWorkbenchHostProjectedNodeId\n} from \"./nodeIdentity.ts\";\nimport type {\n WorkbenchHostActivation,\n WorkbenchHostLaunchFramePolicy,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProjectedNode\n} from \"./types.ts\";\n\nconst initializedMetadataKeys = [\n \"tuttiWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\nexport const COMPACT_LAUNCH_WIDTH_THRESHOLD = 1440;\nexport const COMPACT_LAUNCH_FRAME_SCALE = 0.85;\nexport const closedDockWindowFramesMetadataKey =\n \"workbenchHostClosedDockWindowFrames\";\nconst maxClosedDockWindowFrameEntries = 128;\n\nexport interface ClosedDockWindowFrameEntry {\n dockEntryId: string;\n frame: WorkbenchFrame;\n typeId: string;\n}\n\nexport function createDefaultLaunchResult(\n definition: WorkbenchHostNodeDefinition,\n input?: Pick<WorkbenchHostLaunchResult, \"dockEntryId\" | \"launchSource\">\n): WorkbenchHostLaunchResult {\n return {\n defaultFrame: definition.frame,\n dockEntryId: input?.dockEntryId,\n instanceId: definition.typeId,\n framePolicy: \"cascade\",\n launchSource: input?.launchSource ?? null,\n sizeConstraints: definition.sizeConstraints ?? null,\n title: definition.title,\n typeId: definition.typeId\n };\n}\n\nexport function createWorkbenchProjectedHostNode(input: {\n definition: WorkbenchHostNodeDefinition;\n projectedNode: WorkbenchHostProjectedNode;\n restoredNode: WorkbenchNode<WorkbenchHostNodeData> | null;\n}): WorkbenchNode<WorkbenchHostNodeData> {\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: null,\n dockEntryId: input.projectedNode.dockEntryId ?? null,\n ...(input.restoredNode?.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: input.restoredNode.data.snapshotNodeState }),\n instanceId: input.projectedNode.instanceId,\n instanceKey: input.projectedNode.instanceKey ?? null,\n isProjected: true,\n projectionSubject: input.projectedNode.subject ?? null,\n typeId: input.definition.typeId\n },\n displayMode: input.restoredNode?.displayMode,\n frame:\n input.restoredNode?.frame ??\n input.projectedNode.defaultFrame ??\n input.definition.frame,\n id: createProjectedNodeID(\n input.definition.typeId,\n input.projectedNode.instanceId\n ),\n isMinimized: input.restoredNode?.isMinimized,\n kind: input.definition.typeId,\n restoreFrame: input.restoredNode?.restoreFrame,\n sizeConstraints:\n input.projectedNode.sizeConstraints ??\n input.restoredNode?.sizeConstraints ??\n input.definition.sizeConstraints ??\n null,\n title: input.projectedNode.title\n });\n}\n\nexport function createWorkbenchLaunchedHostNode(input: {\n activation: WorkbenchHostActivation | null;\n definition: WorkbenchHostNodeDefinition;\n resolvedFrame: WorkbenchNode<WorkbenchHostNodeData>[\"frame\"];\n result: WorkbenchHostLaunchResult;\n}): WorkbenchNode<WorkbenchHostNodeData> {\n const preferredFrame = input.result.defaultFrame ?? input.definition.frame;\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: input.activation,\n dockEntryId: input.result.dockEntryId ?? null,\n instanceId: input.result.instanceId,\n instanceKey: input.result.instanceKey ?? null,\n isProjected: false,\n launchSource: input.result.launchSource ?? null,\n projectionSubject: null,\n typeId: input.definition.typeId\n },\n displayMode: input.result.displayMode,\n frame: input.resolvedFrame,\n id: createLaunchedNodeID(input.definition.typeId, input.result.instanceId),\n kind: input.definition.typeId,\n restoreFrame:\n input.result.displayMode === \"fullscreen\" ? preferredFrame : null,\n sizeConstraints: resolveWorkbenchHostNodeSizeConstraints(\n input.result,\n input.definition\n ),\n title: input.result.title ?? input.definition.title\n });\n}\n\nexport function resolveWorkbenchLaunchedHostNodeFrame(input: {\n currentState: Pick<\n WorkbenchState<WorkbenchHostNodeData>,\n \"layoutConstraints\" | \"nodeStack\" | \"nodes\" | \"surfaceSize\"\n >;\n definition: WorkbenchHostNodeDefinition;\n result: WorkbenchHostLaunchResult;\n}): WorkbenchNode<WorkbenchHostNodeData>[\"frame\"] {\n const preferredFrame = input.result.defaultFrame ?? input.definition.frame;\n const sizeConstraints = resolveWorkbenchHostNodeSizeConstraints(\n input.result,\n input.definition\n );\n\n if (input.result.displayMode === \"fullscreen\") {\n return getWorkbenchFullscreenRect(\n input.currentState.surfaceSize,\n input.currentState.layoutConstraints,\n sizeConstraints\n );\n }\n\n const framePolicy = resolveLaunchFramePolicy(input.result);\n\n if (framePolicy === \"absolute\") {\n return preferredFrame;\n }\n\n const responsivePreferredFrame = resolveCompactWorkbenchPreferredFrame({\n constraints: input.currentState.layoutConstraints,\n preferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize\n });\n\n if (framePolicy === \"cascade-same-type-centered\") {\n const existingSameTypeNodes = input.currentState.nodes.filter(\n (node) => node.data.typeId === input.result.typeId\n );\n const existingSameTypeNodeIds = new Set(\n existingSameTypeNodes.map((node) => node.id)\n );\n\n return resolveWorkbenchCascadedRect({\n currentNodeStack: input.currentState.nodeStack.filter((nodeId) =>\n existingSameTypeNodeIds.has(nodeId)\n ),\n existingNodes: existingSameTypeNodes,\n preferredFrame: resolveWorkbenchCenteredPreferredFrame({\n constraints: input.currentState.layoutConstraints,\n preferredFrame: responsivePreferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize\n }),\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize,\n constraints: input.currentState.layoutConstraints\n });\n }\n\n return resolveWorkbenchCascadedRect({\n currentNodeStack: input.currentState.nodeStack,\n existingNodes: input.currentState.nodes,\n preferredFrame: responsivePreferredFrame,\n sizeConstraints,\n surfaceSize: input.currentState.surfaceSize,\n constraints: input.currentState.layoutConstraints\n });\n}\n\nexport function closedDockWindowFrameEntryKey(input: {\n dockEntryId: string;\n typeId: string;\n}): string {\n return JSON.stringify([input.typeId, input.dockEntryId]);\n}\n\nexport function readClosedDockWindowFrameEntries(\n metadata: WorkbenchSnapshot[\"metadata\"]\n): Map<string, ClosedDockWindowFrameEntry> {\n const value = metadata?.[closedDockWindowFramesMetadataKey];\n if (\n !isRecord(value) ||\n value.version !== 1 ||\n !Array.isArray(value.entries)\n ) {\n return new Map();\n }\n\n const entries = new Map<string, ClosedDockWindowFrameEntry>();\n for (const entry of value.entries.slice(0, maxClosedDockWindowFrameEntries)) {\n const normalized = normalizeClosedDockWindowFrameEntry(entry);\n if (!normalized) {\n continue;\n }\n entries.set(closedDockWindowFrameEntryKey(normalized), normalized);\n }\n return entries;\n}\n\nexport function writeClosedDockWindowFrameEntries(\n metadata: WorkbenchSnapshot[\"metadata\"],\n entries: Iterable<ClosedDockWindowFrameEntry>\n): WorkbenchSnapshot[\"metadata\"] {\n const normalizedEntries = Array.from(entries)\n .map(normalizeClosedDockWindowFrameEntry)\n .filter((entry): entry is ClosedDockWindowFrameEntry => entry !== null)\n .slice(-maxClosedDockWindowFrameEntries);\n const nextMetadata = { ...(metadata ?? {}) };\n if (normalizedEntries.length === 0) {\n delete nextMetadata[closedDockWindowFramesMetadataKey];\n } else {\n nextMetadata[closedDockWindowFramesMetadataKey] = {\n version: 1,\n entries: normalizedEntries\n };\n }\n return Object.keys(nextMetadata).length > 0 ? nextMetadata : undefined;\n}\n\nfunction normalizeClosedDockWindowFrameEntry(\n value: unknown\n): ClosedDockWindowFrameEntry | null {\n if (!isRecord(value)) {\n return null;\n }\n const typeId = normalizeNonEmptyString(value.typeId);\n const dockEntryId = normalizeNonEmptyString(value.dockEntryId);\n const frame = normalizeWorkbenchFrame(value.frame);\n if (!typeId || !dockEntryId || !frame) {\n return null;\n }\n\n return {\n dockEntryId,\n frame,\n typeId\n };\n}\n\nfunction normalizeWorkbenchFrame(value: unknown): WorkbenchFrame | null {\n if (!isRecord(value)) {\n return null;\n }\n const x = normalizeFiniteNumber(value.x);\n const y = normalizeFiniteNumber(value.y);\n const width = normalizeFiniteNumber(value.width);\n const height = normalizeFiniteNumber(value.height);\n if (x === null || y === null || width === null || height === null) {\n return null;\n }\n if (width < 160 || height < 120) {\n return null;\n }\n\n return { height, width, x, y };\n}\n\nfunction normalizeFiniteNumber(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n return null;\n }\n return Math.round(value);\n}\n\nfunction normalizeNonEmptyString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction resolveLaunchFramePolicy(\n result: WorkbenchHostLaunchResult\n): WorkbenchHostLaunchFramePolicy {\n return result.framePolicy;\n}\n\nfunction resolveWorkbenchCenteredPreferredFrame(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchFrame {\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n\n return clampWorkbenchRect(\n {\n height: input.preferredFrame.height,\n width: input.preferredFrame.width,\n x: Math.round(\n layoutFrame.x + (layoutFrame.width - input.preferredFrame.width) / 2\n ),\n y: Math.round(\n layoutFrame.y + (layoutFrame.height - input.preferredFrame.height) / 2\n )\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function resolveCompactWorkbenchPreferredFrame(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n preferredFrame: WorkbenchFrame;\n sizeConstraints?: WorkbenchNodeSizeConstraints | null;\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchFrame {\n if (!shouldUseCompactWorkbenchFrame(input.surfaceSize)) {\n return input.preferredFrame;\n }\n\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n const width = Math.round(\n input.preferredFrame.width * COMPACT_LAUNCH_FRAME_SCALE\n );\n const height = Math.round(\n input.preferredFrame.height * COMPACT_LAUNCH_FRAME_SCALE\n );\n\n return clampWorkbenchRect(\n {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n },\n input.surfaceSize,\n input.constraints,\n input.sizeConstraints\n );\n}\n\nexport function compactRestoredWorkbenchHostNodes(input: {\n constraints: WorkbenchState<WorkbenchHostNodeData>[\"layoutConstraints\"];\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"];\n}): WorkbenchNode<WorkbenchHostNodeData>[] {\n if (!shouldUseCompactWorkbenchFrame(input.surfaceSize)) {\n return [...input.nodes];\n }\n\n return input.nodes.map((node) => {\n const sizeConstraints =\n node.sizeConstraints ??\n input.nodeDefinitionByType.get(node.data.typeId)?.sizeConstraints ??\n null;\n if (node.displayMode === \"fullscreen\") {\n return {\n ...node,\n frame: getWorkbenchFullscreenRect(\n input.surfaceSize,\n input.constraints,\n sizeConstraints\n )\n };\n }\n\n const defaultFrame =\n input.nodeDefinitionByType.get(node.data.typeId)?.frame ?? node.frame;\n const compactWidth = Math.round(\n defaultFrame.width * COMPACT_LAUNCH_FRAME_SCALE\n );\n const compactHeight = Math.round(\n defaultFrame.height * COMPACT_LAUNCH_FRAME_SCALE\n );\n const width = Math.min(node.frame.width, compactWidth);\n const height = Math.min(node.frame.height, compactHeight);\n const sizeChanged =\n width !== node.frame.width || height !== node.frame.height;\n const layoutFrame = getWorkbenchLayoutFrame(\n input.surfaceSize,\n input.constraints\n );\n const frame = clampWorkbenchRect(\n sizeChanged\n ? {\n height,\n width,\n x: Math.round(layoutFrame.x + (layoutFrame.width - width) / 2),\n y: Math.round(layoutFrame.y + (layoutFrame.height - height) / 2)\n }\n : node.frame,\n input.surfaceSize,\n input.constraints,\n sizeConstraints\n );\n\n return rectsEqual(node.frame, frame) ? node : { ...node, frame };\n });\n}\n\nfunction shouldUseCompactWorkbenchFrame(\n surfaceSize: WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"]\n): boolean {\n return surfaceSize.width < COMPACT_LAUNCH_WIDTH_THRESHOLD;\n}\n\nexport function createProjectedNodeID(\n typeId: string,\n instanceId: string\n): string {\n return createWorkbenchHostProjectedNodeId({ instanceId, typeId });\n}\n\nexport function persistedWorkbenchState(\n state: Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\">,\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>\n): Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\"> {\n return {\n nodeStack: state.nodeStack,\n nodes: state.nodes\n .filter((node) => {\n return (\n nodeDefinitionByType.get(node.data.typeId)?.window?.persists !== false\n );\n })\n .map((node) => ({\n ...node,\n data: {\n dockEntryId: node.data.dockEntryId ?? null,\n ...(node.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: node.data.snapshotNodeState }),\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n ...(node.data.isProjected === true ? { isProjected: true } : {}),\n typeId: node.data.typeId\n }\n }))\n };\n}\n\nexport function stateFromSnapshotOrDefinitions(\n snapshot: WorkbenchSnapshot | null,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[],\n projectedNodes: readonly WorkbenchHostProjectedNode[] = []\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n if (!snapshot) {\n return mergeProjectedNodesIntoState(\n createDefaultWorkbenchState(nodeDefinitions),\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n }\n\n const snapshotState = createWorkbenchStateFromSnapshot<unknown>(snapshot);\n const nodes = snapshotState.nodes\n .map((node) => {\n const definition = resolveDefinitionForRestoredNode(\n node,\n nodeDefinitions\n );\n if (!definition) {\n return null;\n }\n if (readWorkbenchHostNodeData(node.data)?.isProjected === true) {\n return null;\n }\n return createRestoredNode(definition, node);\n })\n .filter(\n (node): node is WorkbenchNode<WorkbenchHostNodeData> => node !== null\n )\n .filter((node) => {\n const definition = nodeDefinitions.find(\n (candidate) => candidate.typeId === node.data.typeId\n );\n return (\n definition?.window?.persists !== false &&\n definition?.window?.restoreOnLoad !== false\n );\n });\n\n if (nodes.length === 0 && !isSnapshotInitialized(snapshot)) {\n return mergeProjectedNodesIntoState(\n createDefaultWorkbenchState(nodeDefinitions),\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n }\n\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const nodeStack = snapshotState.nodeStack.filter((nodeID) =>\n nodeIDs.has(nodeID)\n );\n for (const node of nodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n\n return mergeProjectedNodesIntoState(\n {\n nodeStack,\n nodes\n },\n {\n nodeDefinitions,\n projectedNodes,\n snapshot\n }\n );\n}\n\nexport function restoredSnapshotNodesByID(\n snapshot: WorkbenchSnapshot | null,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): Map<string, WorkbenchNode<WorkbenchHostNodeData>> {\n if (!snapshot) {\n return new Map();\n }\n\n const nodes = createWorkbenchStateFromSnapshot<unknown>(snapshot)\n .nodes.map((node) => {\n const definition = resolveDefinitionForRestoredNode(\n node,\n nodeDefinitions\n );\n if (!definition) {\n return null;\n }\n return createRestoredNode(definition, node);\n })\n .filter(\n (node): node is WorkbenchNode<WorkbenchHostNodeData> => node !== null\n );\n\n return new Map(nodes.map((node) => [node.id, node]));\n}\n\nexport function updateProjectedNodeFromInput(\n node: WorkbenchNode<WorkbenchHostNodeData>,\n projectedNode: WorkbenchHostProjectedNode,\n definition?: WorkbenchHostNodeDefinition\n): WorkbenchNode<WorkbenchHostNodeData> {\n const nextInstanceKey = projectedNode.instanceKey ?? null;\n const nextSubject = projectedNode.subject ?? null;\n const nextDockEntryId = projectedNode.dockEntryId ?? null;\n const nextSizeConstraints =\n projectedNode.sizeConstraints ?? definition?.sizeConstraints ?? null;\n if (\n node.title === projectedNode.title &&\n node.data.dockEntryId === nextDockEntryId &&\n node.data.instanceId === projectedNode.instanceId &&\n node.data.instanceKey === nextInstanceKey &&\n node.data.isProjected === true &&\n projectedSubjectsEqual(node.data.projectionSubject ?? null, nextSubject) &&\n node.sizeConstraints?.minWidth === nextSizeConstraints?.minWidth &&\n node.sizeConstraints?.minHeight === nextSizeConstraints?.minHeight &&\n node.data.typeId === projectedNode.typeId\n ) {\n return node;\n }\n\n return {\n ...node,\n data: {\n dockEntryId: nextDockEntryId,\n ...(node.data.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: node.data.snapshotNodeState }),\n instanceId: projectedNode.instanceId,\n instanceKey: nextInstanceKey,\n activation: node.data.activation ?? null,\n isProjected: true,\n projectionSubject: nextSubject,\n ...(node.data.runtimeNodeState === undefined\n ? {}\n : { runtimeNodeState: node.data.runtimeNodeState }),\n typeId: projectedNode.typeId\n },\n sizeConstraints: nextSizeConstraints,\n title: projectedNode.title\n };\n}\n\nexport function projectedWorkbenchNodeStack(input: {\n currentNodeStack: readonly string[];\n nextNodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n snapshot: WorkbenchSnapshot | null;\n}): string[] {\n const nodeIDs = new Set(input.nextNodes.map((node) => node.id));\n const nodeStack = input.currentNodeStack.filter((nodeID) =>\n nodeIDs.has(nodeID)\n );\n const snapshotState = input.snapshot\n ? createWorkbenchStateFromSnapshot<unknown>(input.snapshot)\n : null;\n for (const nodeID of snapshotState?.nodeStack ?? []) {\n if (nodeIDs.has(nodeID) && !nodeStack.includes(nodeID)) {\n nodeStack.push(nodeID);\n }\n }\n for (const node of input.nextNodes) {\n if (!nodeStack.includes(node.id)) {\n nodeStack.push(node.id);\n }\n }\n return nodeStack;\n}\n\nexport function shallowArrayEqual<T>(\n left: readonly T[],\n right: readonly T[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => entry === right[index])\n );\n}\n\nexport function stringArrayEqual(\n left: readonly string[],\n right: readonly string[]\n): boolean {\n return (\n left.length === right.length &&\n left.every((entry, index) => entry === right[index])\n );\n}\n\nfunction createWorkbenchHostNode(input: {\n definition: WorkbenchHostNodeDefinition;\n descriptor: {\n frame?: WorkbenchNode<WorkbenchHostNodeData>[\"frame\"];\n instanceId?: string;\n instanceKey?: string | null;\n title?: string;\n };\n}): WorkbenchNode<WorkbenchHostNodeData> {\n const strategy = input.definition.instance;\n const instanceId =\n input.descriptor.instanceId ??\n (strategy?.mode === \"multi\"\n ? `${input.definition.typeId}-instance`\n : input.definition.typeId);\n const nodeId =\n strategy?.mode === \"multi\"\n ? `${input.definition.typeId}:${instanceId}`\n : input.definition.typeId;\n\n return createWorkbenchNode<WorkbenchHostNodeData>({\n data: {\n activation: null,\n dockEntryId: null,\n instanceId,\n instanceKey: input.descriptor.instanceKey ?? null,\n isProjected: false,\n projectionSubject: null,\n typeId: input.definition.typeId\n },\n frame: input.descriptor.frame ?? input.definition.frame,\n id: nodeId,\n kind: input.definition.typeId,\n sizeConstraints: input.definition.sizeConstraints ?? null,\n title: input.descriptor.title ?? input.definition.title\n });\n}\n\nfunction createLaunchedNodeID(typeId: string, instanceId: string): string {\n return createWorkbenchHostLaunchedNodeId({ instanceId, typeId });\n}\n\nfunction createDefaultWorkbenchState(\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n const nodes = nodeDefinitions\n .filter((definition) => definition.window?.defaultOpen !== false)\n .filter((definition) => definition.instance?.mode !== \"multi\")\n .map((definition) =>\n createWorkbenchHostNode({\n definition,\n descriptor: {\n frame: definition.frame,\n instanceId: definition.typeId,\n title: definition.title\n }\n })\n );\n return {\n nodeStack: nodes.map((node) => node.id),\n nodes\n };\n}\n\nfunction createRestoredNode(\n definition: WorkbenchHostNodeDefinition,\n node: WorkbenchNode<unknown>\n): WorkbenchNode<WorkbenchHostNodeData> {\n const restoredData = readWorkbenchHostNodeData(node.data);\n return {\n ...node,\n data: {\n dockEntryId: restoredData?.dockEntryId ?? null,\n ...(restoredData?.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: restoredData.snapshotNodeState }),\n instanceId:\n restoredData?.instanceId ??\n (definition.instance?.mode === \"multi\"\n ? deriveInstanceIdFromNodeID(definition.typeId, node.id)\n : definition.typeId),\n instanceKey: restoredData?.instanceKey ?? null,\n activation: null,\n isProjected: false,\n projectionSubject: null,\n typeId: definition.typeId\n },\n kind: definition.typeId,\n sizeConstraints: definition.sizeConstraints ?? null,\n title: definition.instance?.mode === \"multi\" ? node.title : definition.title\n };\n}\n\nexport function resolveWorkbenchHostNodeSizeConstraints(\n result: Pick<WorkbenchHostLaunchResult, \"sizeConstraints\">,\n definition: Pick<WorkbenchHostNodeDefinition, \"sizeConstraints\">\n): WorkbenchNodeSizeConstraints | null {\n return result.sizeConstraints ?? definition.sizeConstraints ?? null;\n}\n\nfunction deriveInstanceIdFromNodeID(typeId: string, nodeId: string): string {\n const prefix = `${typeId}:`;\n return nodeId.startsWith(prefix) ? nodeId.slice(prefix.length) : nodeId;\n}\n\nfunction isSnapshotInitialized(snapshot: WorkbenchSnapshot | null): boolean {\n if (!snapshot) {\n return false;\n }\n\n for (const key of initializedMetadataKeys) {\n if (snapshot.metadata?.[key] === true) {\n return true;\n }\n }\n return false;\n}\n\nfunction readWorkbenchHostNodeData(\n value: unknown\n): WorkbenchHostNodeData | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const typed = value as Partial<WorkbenchHostNodeData>;\n if (\n typeof typed.typeId !== \"string\" ||\n typeof typed.instanceId !== \"string\"\n ) {\n return null;\n }\n\n return {\n dockEntryId:\n typeof typed.dockEntryId === \"string\" || typed.dockEntryId === null\n ? typed.dockEntryId\n : null,\n ...(typed.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: typed.snapshotNodeState }),\n instanceId: typed.instanceId,\n instanceKey:\n typeof typed.instanceKey === \"string\" || typed.instanceKey === null\n ? typed.instanceKey\n : null,\n activation: null,\n isProjected: typed.isProjected === true,\n launchSource: null,\n projectionSubject: null,\n typeId: typed.typeId\n };\n}\n\nfunction resolveDefinitionForRestoredNode(\n node: WorkbenchNode<unknown>,\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[]\n): WorkbenchHostNodeDefinition | null {\n const data = readWorkbenchHostNodeData(node.data);\n if (data) {\n return (\n nodeDefinitions.find((definition) => definition.typeId === data.typeId) ??\n null\n );\n }\n\n return (\n nodeDefinitions.find((definition) => {\n if (definition.instance?.mode === \"multi\") {\n return node.id.startsWith(`${definition.typeId}:`);\n }\n return node.id === definition.typeId;\n }) ?? null\n );\n}\n\nfunction mergeProjectedNodesIntoState(\n state: Partial<WorkbenchState<WorkbenchHostNodeData>>,\n input: {\n nodeDefinitions: readonly WorkbenchHostNodeDefinition[];\n projectedNodes: readonly WorkbenchHostProjectedNode[];\n snapshot: WorkbenchSnapshot | null;\n }\n): Partial<WorkbenchState<WorkbenchHostNodeData>> {\n if (input.projectedNodes.length === 0) {\n return state;\n }\n\n const nodeDefinitionByType = new Map(\n input.nodeDefinitions.map((definition) => [definition.typeId, definition])\n );\n const nodes = state.nodes ? [...state.nodes] : [];\n const nodeIDs = new Set(nodes.map((node) => node.id));\n const restoredNodesByID = restoredSnapshotNodesByID(\n input.snapshot,\n input.nodeDefinitions\n );\n\n for (const projectedNode of input.projectedNodes) {\n const definition = nodeDefinitionByType.get(projectedNode.typeId);\n if (!definition) {\n continue;\n }\n const nodeID = createProjectedNodeID(\n projectedNode.typeId,\n projectedNode.instanceId\n );\n if (nodeIDs.has(nodeID)) {\n continue;\n }\n\n const nextNode = createWorkbenchProjectedHostNode({\n definition,\n projectedNode,\n restoredNode: restoredNodesByID.get(nodeID) ?? null\n });\n nodes.push(nextNode);\n nodeIDs.add(nextNode.id);\n }\n\n return {\n ...state,\n nodeStack: projectedWorkbenchNodeStack({\n currentNodeStack: state.nodeStack ?? [],\n nextNodes: nodes,\n snapshot: input.snapshot\n }),\n nodes\n };\n}\n\nfunction projectedSubjectsEqual(\n left: WorkbenchHostNodeData[\"projectionSubject\"],\n right: WorkbenchHostNodeData[\"projectionSubject\"]\n): boolean {\n return left?.id === right?.id && left?.type === right?.type;\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostExternalStateSource,\n WorkbenchHostNodeData\n} from \"./types.ts\";\n\nexport interface WorkbenchHostExternalState {\n externalNodeState: unknown;\n externalWorkspaceState: unknown;\n}\n\nexport function readWorkbenchHostExternalState(input: {\n externalStateSource?: WorkbenchHostExternalStateSource;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n workspaceId: string;\n}): WorkbenchHostExternalState {\n if (!input.externalStateSource) {\n return {\n externalNodeState: null,\n externalWorkspaceState: null\n };\n }\n\n const nodeStateInput = {\n instanceId: input.node.data.instanceId,\n instanceKey: input.node.data.instanceKey ?? null,\n nodeId: input.node.id,\n typeId: input.node.data.typeId,\n workspaceId: input.workspaceId,\n ...(input.node.data.projectionSubject\n ? { subject: input.node.data.projectionSubject }\n : {})\n };\n\n const sourceNodeState =\n input.externalStateSource.getNodeState(nodeStateInput);\n\n return {\n externalNodeState:\n sourceNodeState ?? input.node.data.snapshotNodeState ?? null,\n externalWorkspaceState: input.externalStateSource.getWorkspaceState({\n workspaceId: input.workspaceId\n })\n };\n}\n","import {\n normalizeWorkbenchSnapshot,\n type WorkbenchSnapshot,\n type WorkbenchSnapshotNode,\n type WorkbenchSnapshotSpaceV1\n} from \"@tutti-os/workbench-snapshot\";\nimport {\n closedDockWindowFramesMetadataKey,\n readClosedDockWindowFrameEntries,\n writeClosedDockWindowFrameEntries\n} from \"./sessionState.ts\";\n\nexport interface WorkbenchHostSnapshotNodeData {\n dockEntryId?: string | null;\n instanceId: string;\n instanceKey?: string | null;\n isProjected?: true;\n snapshotNodeState?: unknown;\n typeId: string;\n}\n\nconst allowedMetadataKeys = [\n \"tuttiWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\n\nexport function sanitizeWorkbenchHostSnapshot(\n snapshot: WorkbenchSnapshot\n): WorkbenchSnapshot {\n const normalized = normalizeWorkbenchSnapshot(snapshot);\n return normalizeWorkbenchSnapshot({\n schemaVersion: normalized.schemaVersion,\n nodes: normalized.nodes.map(sanitizeNode),\n nodeStack: normalized.nodeStack,\n activeNodeId: normalized.activeNodeId,\n spaces: normalized.spaces?.map(sanitizeSpace),\n activeSpaceId: normalized.activeSpaceId,\n metadata: sanitizeMetadata(normalized.metadata)\n });\n}\n\nfunction sanitizeNode(node: WorkbenchSnapshotNode): WorkbenchSnapshotNode {\n return {\n id: node.id,\n kind: node.kind,\n title: node.title,\n frame: node.frame,\n displayMode: node.displayMode,\n restoreFrame: node.restoreFrame,\n isMinimized: node.isMinimized,\n data: sanitizeNodeData(node.data)\n };\n}\n\nfunction sanitizeNodeData(\n value: unknown\n): WorkbenchHostSnapshotNodeData | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const typed = value as Partial<WorkbenchHostSnapshotNodeData>;\n if (\n typeof typed.typeId !== \"string\" ||\n typeof typed.instanceId !== \"string\"\n ) {\n return undefined;\n }\n\n return {\n dockEntryId:\n typeof typed.dockEntryId === \"string\" || typed.dockEntryId === null\n ? typed.dockEntryId\n : null,\n instanceId: typed.instanceId,\n instanceKey:\n typeof typed.instanceKey === \"string\" || typed.instanceKey === null\n ? typed.instanceKey\n : null,\n ...(typed.isProjected === true ? { isProjected: true } : {}),\n ...(typed.snapshotNodeState === undefined\n ? {}\n : { snapshotNodeState: typed.snapshotNodeState }),\n typeId: typed.typeId\n };\n}\n\nfunction sanitizeSpace(\n space: WorkbenchSnapshotSpaceV1\n): WorkbenchSnapshotSpaceV1 {\n return {\n id: space.id,\n name: space.name,\n nodeIds: space.nodeIds,\n frame: space.frame\n };\n}\n\nfunction sanitizeMetadata(\n metadata: WorkbenchSnapshot[\"metadata\"]\n): WorkbenchSnapshot[\"metadata\"] {\n const sanitized: Record<string, unknown> = {};\n for (const key of allowedMetadataKeys) {\n if (metadata?.[key] === true) {\n sanitized[key] = true;\n }\n }\n if (metadata?.[closedDockWindowFramesMetadataKey] !== undefined) {\n return writeClosedDockWindowFrameEntries(\n sanitized,\n readClosedDockWindowFrameEntries(metadata).values()\n );\n }\n\n return Object.keys(sanitized).length > 0 ? sanitized : undefined;\n}\n","import type { WorkbenchSnapshot } from \"@tutti-os/workbench-snapshot\";\nimport { createWorkbenchSnapshotFromState } from \"../core/snapshot.ts\";\nimport type { WorkbenchNode, WorkbenchState } from \"../core/types.ts\";\nimport { createWorkbenchController } from \"../store/createWorkbenchController.ts\";\nimport type {\n WorkbenchController,\n WorkbenchDebugDiagnostics\n} from \"../store/types.ts\";\nimport {\n type ClosedDockWindowFrameEntry,\n compactRestoredWorkbenchHostNodes,\n createDefaultLaunchResult,\n createProjectedNodeID,\n createWorkbenchLaunchedHostNode,\n createWorkbenchProjectedHostNode,\n closedDockWindowFrameEntryKey,\n persistedWorkbenchState,\n projectedWorkbenchNodeStack,\n readClosedDockWindowFrameEntries,\n resolveWorkbenchLaunchedHostNodeFrame,\n restoredSnapshotNodesByID,\n shallowArrayEqual,\n stateFromSnapshotOrDefinitions,\n stringArrayEqual,\n updateProjectedNodeFromInput,\n writeClosedDockWindowFrameEntries\n} from \"./sessionState.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport { sanitizeWorkbenchHostSnapshot } from \"./snapshotSanitizer.ts\";\nimport type { WorkbenchHostNodeData } from \"./types.ts\";\nimport type {\n WorkbenchHostActivation,\n WorkbenchHostActivationTarget,\n WorkbenchHostCloseEffect,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchInput,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeLeaseHandle,\n WorkbenchHostNodeCloseDecision,\n WorkbenchHostNodeCloseRequest,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProjectedNode,\n WorkbenchHostRuntimeHandle,\n WorkbenchHostSnapshotRepository\n} from \"./types.ts\";\n\nconst initializedMetadataKey = \"workbenchHostInitialized\";\nconst snapshotSaveDelayMs = 400;\nconst launchDiagnosticTextMaxLength = 800;\n\nexport function createWorkbenchHostSession(input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n}): WorkbenchHostRuntimeHandle {\n return new WorkbenchHostSessionController(input);\n}\n\nclass WorkbenchHostSessionController implements WorkbenchHostRuntimeHandle {\n readonly controller: WorkbenchController<WorkbenchHostNodeData>;\n private readonly input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n };\n\n private readonly nodeDefinitions: readonly WorkbenchHostNodeDefinition[];\n private readonly nodeDefinitionByType = new Map<\n string,\n WorkbenchHostNodeDefinition\n >();\n private isHydratingInitialSnapshot = true;\n private isDisposed = false;\n private isSnapshotLoaded = false;\n private loadedSnapshot: WorkbenchSnapshot | null;\n private closedDockWindowFrameEntries = new Map<\n string,\n ClosedDockWindowFrameEntry\n >();\n private loadGeneration = 0;\n private loadPromise: Promise<void> | null = null;\n private readonly nodeLeases = new Map<string, WorkbenchHostNodeLeaseHandle>();\n private nextActivationSequence = 1;\n private hasAppliedInitialCompactRestoredFrames = false;\n private hasReceivedSurfaceSize = false;\n private observedSurfaceSize:\n | WorkbenchState<WorkbenchHostNodeData>[\"surfaceSize\"]\n | null = null;\n private pendingProjectedNodeReconciliation = false;\n private projectedNodes: readonly WorkbenchHostProjectedNode[];\n private readyPromise: Promise<void>;\n private resolveReady: () => void = noop;\n private saveTimer: ReturnType<typeof globalThis.setTimeout> | null = null;\n private externalStateUnsubscribe: (() => void) | null = null;\n private leaseUnsubscribe: (() => void) | null = null;\n private unsubscribe: (() => void) | null = null;\n\n constructor(input: {\n debugDiagnostics?: WorkbenchDebugDiagnostics;\n externalStateSource?: WorkbenchHostExternalStateSource;\n nodes: readonly WorkbenchHostNodeDefinition[];\n onLaunchRequest?: (\n request: WorkbenchHostLaunchRequest\n ) =>\n | Promise<WorkbenchHostLaunchResult | null | void>\n | WorkbenchHostLaunchResult\n | null\n | void;\n onNodeCloseRequest?: (\n request: WorkbenchHostNodeCloseRequest\n ) =>\n | Promise<WorkbenchHostNodeCloseDecision | void>\n | WorkbenchHostNodeCloseDecision\n | void;\n projectedNodes?: readonly WorkbenchHostProjectedNode[];\n snapshotRepository: WorkbenchHostSnapshotRepository;\n workspaceId: string;\n }) {\n this.input = input;\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n this.nodeDefinitions = input.nodes;\n for (const definition of input.nodes) {\n this.nodeDefinitionByType.set(definition.typeId, definition);\n }\n this.loadedSnapshot = this.readCachedSnapshot();\n this.closedDockWindowFrameEntries = readClosedDockWindowFrameEntries(\n this.loadedSnapshot?.metadata\n );\n this.projectedNodes = input.projectedNodes ?? [];\n this.controller = createWorkbenchController<WorkbenchHostNodeData>(\n stateFromSnapshotOrDefinitions(\n this.loadedSnapshot,\n this.nodeDefinitions,\n this.projectedNodes\n ),\n { debugDiagnostics: input.debugDiagnostics }\n );\n this.observedSurfaceSize = this.controller.getSnapshot().surfaceSize;\n this.leaseUnsubscribe = this.controller.subscribe(() => {\n this.noteSurfaceSizeChange();\n this.reconcileNodeLeases();\n this.applyInitialCompactRestoredFrames();\n });\n this.isSnapshotLoaded = this.loadedSnapshot !== null;\n if (this.isSnapshotLoaded) {\n this.applyInitialCompactRestoredFrames();\n this.subscribeToPersistence();\n }\n }\n\n activateNode(\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.activateNodeNow(target, activation);\n });\n }\n\n private activateNodeNow(\n target: WorkbenchHostActivationTarget,\n activation: {\n payload?: unknown;\n type: string;\n }\n ): void {\n if (!activation.type.trim()) {\n return;\n }\n\n const node = this.findExistingNodeByTarget(target);\n if (!node) {\n return;\n }\n\n const envelope: WorkbenchHostActivation = {\n sequence: this.nextActivationSequence++,\n type: activation.type,\n ...(activation.payload === undefined\n ? {}\n : { payload: activation.payload })\n };\n this.restoreAndFocusNode(node.id);\n this.controller.commands.replaceState({\n nodes: this.controller.getSnapshot().nodes.map((entry) =>\n entry.id === node.id\n ? {\n ...entry,\n data: {\n ...entry.data,\n activation: envelope\n }\n }\n : entry\n )\n });\n }\n\n clearNodeActivation(nodeId: string, sequence: number): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.clearNodeActivationNow(nodeId, sequence);\n });\n }\n\n private clearNodeActivationNow(nodeId: string, sequence: number): void {\n const snapshot = this.controller.getSnapshot();\n const node = snapshot.nodes.find((entry) => entry.id === nodeId);\n if (node?.data.activation?.sequence !== sequence) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((entry) =>\n entry.id === nodeId\n ? {\n ...entry,\n data: {\n ...entry.data,\n activation: null\n }\n }\n : entry\n )\n });\n }\n\n async collectWindowCloseEffects(): Promise<\n readonly WorkbenchHostCloseEffect[]\n > {\n const snapshot = this.controller.getSnapshot();\n const effects = await Promise.all(\n snapshot.nodes.map(async (node) => {\n const definition = this.nodeDefinitionByType.get(node.data.typeId);\n if (!definition?.getWindowCloseEffect) {\n return null;\n }\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: this.input.externalStateSource,\n node,\n workspaceId: this.input.workspaceId\n });\n const effect = await definition.getWindowCloseEffect({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n node,\n workspaceId: this.input.workspaceId\n });\n return effect ?? null;\n })\n );\n return effects.filter(\n (effect): effect is WorkbenchHostCloseEffect => effect !== null\n );\n }\n\n closeNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.rememberClosedDockWindowFrame(nodeId);\n this.controller.commands.closeNode(nodeId);\n });\n }\n\n dispose(): void {\n this.isDisposed = true;\n this.loadGeneration++;\n this.loadPromise = null;\n this.markReady();\n this.leaseUnsubscribe?.();\n this.leaseUnsubscribe = null;\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.externalStateUnsubscribe?.();\n this.externalStateUnsubscribe = null;\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n this.saveTimer = null;\n this.saveSnapshot();\n }\n this.disposeNodeLeases();\n }\n\n focusNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.restoreAndFocusNode(nodeId);\n });\n }\n\n minimizeNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.controller.commands.minimizeNode(nodeId);\n });\n }\n\n exitFullscreenNode(nodeId: string): void {\n this.runWhenReady(this.loadGeneration, () => {\n this.controller.commands.exitFullscreen(nodeId);\n });\n }\n\n getSnapshot(): ReturnType<\n WorkbenchController<WorkbenchHostNodeData>[\"getSnapshot\"]\n > {\n return this.controller.getSnapshot();\n }\n\n isHydrating(): boolean {\n return this.isHydratingInitialSnapshot;\n }\n\n async launchNode(input: WorkbenchHostLaunchInput): Promise<string | null> {\n const generation = this.loadGeneration;\n if (!(await this.waitUntilReady(generation))) {\n return null;\n }\n\n const definition = this.nodeDefinitionByType.get(input.typeId);\n if (!definition) {\n return null;\n }\n\n const launchSource = resolveWorkbenchHostLaunchSource(input);\n const currentState = this.controller.getSnapshot();\n const request: WorkbenchHostLaunchRequest = {\n ...input,\n layoutConstraints: currentState.layoutConstraints,\n surfaceSize: currentState.surfaceSize,\n workspaceId: this.input.workspaceId\n };\n if (launchSource !== null) {\n request.launchSource = launchSource;\n }\n\n let result: WorkbenchHostLaunchResult | null | void;\n try {\n result = this.input.onLaunchRequest\n ? await this.input.onLaunchRequest(request)\n : createDefaultLaunchResult(definition, {\n dockEntryId: input.dockEntryId,\n launchSource\n });\n } catch (error) {\n this.logLaunchFailure(request, error);\n return null;\n }\n if (this.isDisposed || !result || generation !== this.loadGeneration) {\n return null;\n }\n\n return this.openLaunchResult({\n ...result,\n launchSource: result.launchSource ?? launchSource\n });\n }\n\n private logLaunchFailure(\n request: WorkbenchHostLaunchRequest,\n error: unknown\n ): void {\n void Promise.resolve(\n this.input.debugDiagnostics?.log?.({\n details: {\n dockEntryId: request.dockEntryId ?? null,\n error: diagnosticErrorDetails(error),\n launchSource: request.launchSource ?? null,\n payload: diagnosticValueSummary(request.payload),\n reason: request.reason,\n typeId: request.typeId\n },\n event: \"host.launch.failed\",\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: request.workspaceId\n })\n ).catch(() => undefined);\n }\n\n async load(): Promise<void> {\n if (this.loadPromise && !this.isDisposed) {\n return this.loadPromise;\n }\n\n const generation = ++this.loadGeneration;\n if (!this.isHydratingInitialSnapshot) {\n this.resetHydrationBarrier();\n }\n this.isDisposed = false;\n this.loadPromise = this.loadInitialSnapshot(generation);\n return this.loadPromise;\n }\n\n private async loadInitialSnapshot(generation: number): Promise<void> {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.externalStateUnsubscribe?.();\n this.externalStateUnsubscribe = null;\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n this.saveTimer = null;\n }\n\n try {\n const snapshot = await this.input.snapshotRepository.load(\n this.input.workspaceId\n );\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n\n this.loadedSnapshot = snapshot;\n this.closedDockWindowFrameEntries = readClosedDockWindowFrameEntries(\n snapshot?.metadata\n );\n this.controller.commands.replaceState(\n stateFromSnapshotOrDefinitions(\n snapshot,\n this.nodeDefinitions,\n this.projectedNodes\n )\n );\n this.applyProjectedNodes(this.projectedNodes);\n } catch {\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n this.loadedSnapshot = null;\n this.closedDockWindowFrameEntries = new Map();\n this.controller.commands.replaceState(\n stateFromSnapshotOrDefinitions(\n null,\n this.nodeDefinitions,\n this.projectedNodes\n )\n );\n this.applyProjectedNodes(this.projectedNodes);\n }\n\n this.reconcileNodeLeases();\n this.isSnapshotLoaded = true;\n this.applyInitialCompactRestoredFrames();\n this.subscribeToPersistence();\n this.markReady();\n }\n\n requestNodeClose(nodeId: string): void {\n const generation = this.loadGeneration;\n this.runWhenReady(generation, () => {\n this.requestNodeCloseNow(nodeId, generation);\n });\n }\n\n private requestNodeCloseNow(nodeId: string, generation: number): void {\n const node =\n this.controller\n .getSnapshot()\n .nodes.find((entry) => entry.id === nodeId) ?? null;\n if (!node) {\n return;\n }\n\n const request = {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n isProjected: node.data.isProjected === true,\n nodeId: node.id,\n subject: node.data.projectionSubject ?? null,\n typeId: node.data.typeId,\n workspaceId: this.input.workspaceId\n };\n if (node.data.isProjected === true && !this.input.onNodeCloseRequest) {\n return;\n }\n const decision = this.input.onNodeCloseRequest?.(request);\n void Promise.resolve(decision).then((resolvedDecision) => {\n if (\n this.isDisposed ||\n resolvedDecision === \"keep-open\" ||\n generation !== this.loadGeneration\n ) {\n return;\n }\n this.rememberClosedDockWindowFrame(node.id);\n this.controller.commands.closeNode(node.id);\n }, noop);\n }\n\n setNodeRuntimeState(nodeId: string, state: unknown): void {\n const snapshot = this.controller.getSnapshot();\n if (!snapshot.nodes.some((node) => node.id === nodeId)) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((node) =>\n node.id === nodeId\n ? {\n ...node,\n data:\n state === undefined\n ? withoutRuntimeNodeState(node.data)\n : {\n ...node.data,\n runtimeNodeState: state\n }\n }\n : node\n )\n });\n }\n\n setNodeSizeConstraints(\n nodeId: string,\n sizeConstraints: WorkbenchNode[\"sizeConstraints\"]\n ): void {\n this.controller.commands.setNodeSizeConstraints(\n nodeId,\n sizeConstraints ?? null\n );\n }\n\n setNodeTitle(nodeId: string, title: string): void {\n const nextTitle = title.trim();\n if (!nextTitle) {\n return;\n }\n\n const snapshot = this.controller.getSnapshot();\n const node = snapshot.nodes.find((entry) => entry.id === nodeId);\n if (!node || node.title === nextTitle) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((entry) =>\n entry.id === nodeId\n ? {\n ...entry,\n title: nextTitle\n }\n : entry\n )\n });\n }\n\n setSnapshotNodeState(nodeId: string, state: unknown): void {\n const snapshot = this.controller.getSnapshot();\n if (!snapshot.nodes.some((node) => node.id === nodeId)) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodes: snapshot.nodes.map((node) =>\n node.id === nodeId\n ? {\n ...node,\n data:\n state === undefined\n ? withoutSnapshotNodeState(node.data)\n : {\n ...node.data,\n snapshotNodeState: state\n }\n }\n : node\n )\n });\n }\n\n reconcileProjectedNodes(\n projectedNodes: readonly WorkbenchHostProjectedNode[]\n ): void {\n this.projectedNodes = projectedNodes;\n if (this.isHydratingInitialSnapshot) {\n this.queueProjectedNodeReconciliation();\n return;\n }\n\n this.applyProjectedNodes(projectedNodes);\n }\n\n private applyProjectedNodes(\n projectedNodes: readonly WorkbenchHostProjectedNode[]\n ): void {\n const projectedNodesByID = new Map(\n projectedNodes.map((node) => [\n createProjectedNodeID(node.typeId, node.instanceId),\n node\n ])\n );\n const currentState = this.controller.getSnapshot();\n const snapshotNodesByID = restoredSnapshotNodesByID(\n this.loadedSnapshot,\n this.nodeDefinitions\n );\n\n const nextNodes = currentState.nodes\n .filter(\n (node) => !node.data.isProjected || projectedNodesByID.has(node.id)\n )\n .map((node) => {\n const projectedNode = projectedNodesByID.get(node.id);\n return projectedNode\n ? updateProjectedNodeFromInput(\n node,\n projectedNode,\n this.nodeDefinitionByType.get(projectedNode.typeId)\n )\n : node;\n });\n const nextNodeIDs = new Set(nextNodes.map((node) => node.id));\n\n for (const projectedNode of projectedNodes) {\n const nodeID = createProjectedNodeID(\n projectedNode.typeId,\n projectedNode.instanceId\n );\n if (nextNodeIDs.has(nodeID)) {\n continue;\n }\n\n const definition = this.nodeDefinitionByType.get(projectedNode.typeId);\n if (!definition) {\n continue;\n }\n\n const nextNode = createWorkbenchProjectedHostNode({\n definition,\n projectedNode,\n restoredNode: snapshotNodesByID.get(nodeID) ?? null\n });\n nextNodes.push(nextNode);\n nextNodeIDs.add(nextNode.id);\n }\n\n const nodeStack = projectedWorkbenchNodeStack({\n currentNodeStack: currentState.nodeStack,\n nextNodes,\n snapshot: this.loadedSnapshot\n });\n if (\n shallowArrayEqual(currentState.nodes, nextNodes) &&\n stringArrayEqual(currentState.nodeStack, nodeStack)\n ) {\n return;\n }\n\n this.controller.commands.replaceState({\n nodeStack,\n nodes: nextNodes\n });\n }\n\n private openLaunchResult(result: WorkbenchHostLaunchResult): string | null {\n const definition = this.nodeDefinitionByType.get(result.typeId);\n if (!definition) {\n return null;\n }\n const launchResult = this.applyClosedDockWindowFrame(result);\n\n const exactExisting = this.findExistingNodeByTarget({\n instanceId: launchResult.instanceId,\n typeId: launchResult.typeId\n });\n const dockEntryExisting = exactExisting\n ? null\n : this.findExistingNodeByDockEntry(launchResult);\n const existing = exactExisting ?? dockEntryExisting;\n if (existing) {\n this.controller.commands.setNodeSizeConstraints(\n existing.id,\n launchResult.sizeConstraints ?? definition.sizeConstraints ?? null\n );\n if (\n exactExisting &&\n launchResult.framePolicy === \"cascade-same-type-centered\"\n ) {\n const currentState = this.controller.getSnapshot();\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: {\n ...currentState,\n nodes: currentState.nodes.filter((node) => node.id !== existing.id),\n nodeStack: currentState.nodeStack.filter(\n (nodeId) => nodeId !== existing.id\n )\n },\n definition,\n result: launchResult\n });\n this.controller.commands.resizeNode(existing.id, resolvedFrame);\n }\n this.restoreAndFocusNode(existing.id);\n if (launchResult.activation) {\n this.activateNodeNow({ nodeId: existing.id }, launchResult.activation);\n }\n return existing.id;\n }\n\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: this.controller.getSnapshot(),\n definition,\n result: launchResult\n });\n const nextNode = createWorkbenchLaunchedHostNode({\n activation: this.createActivationEnvelope(launchResult.activation),\n definition,\n resolvedFrame,\n result: launchResult\n });\n this.controller.commands.openNode(nextNode);\n this.controller.commands.focusNode(nextNode.id);\n return nextNode.id;\n }\n\n private createActivationEnvelope(\n activation: WorkbenchHostLaunchResult[\"activation\"]\n ): WorkbenchHostActivation | null {\n if (!activation?.type.trim()) {\n return null;\n }\n\n return {\n sequence: this.nextActivationSequence++,\n type: activation.type,\n ...(activation.payload === undefined\n ? {}\n : { payload: activation.payload })\n };\n }\n\n private findExistingNodeByTarget(\n target: WorkbenchHostActivationTarget\n ): WorkbenchNode<WorkbenchHostNodeData> | null {\n const snapshot = this.controller.getSnapshot();\n if (\"nodeId\" in target) {\n return snapshot.nodes.find((node) => node.id === target.nodeId) ?? null;\n }\n\n const definition = this.nodeDefinitionByType.get(target.typeId);\n if (!definition) {\n return null;\n }\n const nodes = snapshot.nodes.filter(\n (node) => node.data.typeId === definition.typeId\n );\n if (target.instanceId) {\n return (\n nodes.find((node) => node.data.instanceId === target.instanceId) ?? null\n );\n }\n\n if (definition.instance?.mode === \"multi\") {\n return null;\n }\n\n return nodes[0] ?? null;\n }\n\n private findExistingNodeByDockEntry(\n result: WorkbenchHostLaunchResult\n ): WorkbenchNode<WorkbenchHostNodeData> | null {\n const dockEntryId = result.dockEntryId?.trim();\n if (!result.reuseDockEntryNode || !dockEntryId) {\n return null;\n }\n\n const snapshot = this.controller.getSnapshot();\n const nodesByID = new Map(snapshot.nodes.map((node) => [node.id, node]));\n for (let index = snapshot.nodeStack.length - 1; index >= 0; index -= 1) {\n const node = nodesByID.get(snapshot.nodeStack[index] ?? \"\");\n if (\n node?.data.typeId === result.typeId &&\n node.data.dockEntryId === dockEntryId\n ) {\n return node;\n }\n }\n\n return (\n snapshot.nodes.find(\n (node) =>\n node.data.typeId === result.typeId &&\n node.data.dockEntryId === dockEntryId\n ) ?? null\n );\n }\n\n private readCachedSnapshot(): WorkbenchSnapshot | null {\n if (!this.input.snapshotRepository.hasLoaded?.(this.input.workspaceId)) {\n return null;\n }\n\n return (\n this.input.snapshotRepository.readCached?.(this.input.workspaceId) ?? null\n );\n }\n\n private markReady(): void {\n if (!this.isHydratingInitialSnapshot) {\n return;\n }\n\n this.isHydratingInitialSnapshot = false;\n this.resolveReady();\n }\n\n private resetHydrationBarrier(): void {\n this.isHydratingInitialSnapshot = true;\n this.hasAppliedInitialCompactRestoredFrames = false;\n this.readyPromise = new Promise((resolve) => {\n this.resolveReady = resolve;\n });\n }\n\n private noteSurfaceSizeChange(): void {\n const currentSurfaceSize = this.controller.getSnapshot().surfaceSize;\n if (\n this.observedSurfaceSize &&\n (this.observedSurfaceSize.width !== currentSurfaceSize.width ||\n this.observedSurfaceSize.height !== currentSurfaceSize.height)\n ) {\n this.hasReceivedSurfaceSize = true;\n }\n this.observedSurfaceSize = currentSurfaceSize;\n }\n\n private applyInitialCompactRestoredFrames(): void {\n if (\n this.hasAppliedInitialCompactRestoredFrames ||\n !this.isSnapshotLoaded ||\n !this.hasReceivedSurfaceSize\n ) {\n return;\n }\n\n const snapshot = this.controller.getSnapshot();\n const compactedNodes = compactRestoredWorkbenchHostNodes({\n constraints: snapshot.layoutConstraints,\n nodeDefinitionByType: this.nodeDefinitionByType,\n nodes: snapshot.nodes,\n surfaceSize: snapshot.surfaceSize\n });\n this.hasAppliedInitialCompactRestoredFrames = true;\n if (shallowArrayEqual(snapshot.nodes, compactedNodes)) {\n return;\n }\n this.controller.commands.replaceNodes(compactedNodes);\n }\n\n private queueProjectedNodeReconciliation(): void {\n if (this.pendingProjectedNodeReconciliation) {\n return;\n }\n\n const generation = this.loadGeneration;\n this.pendingProjectedNodeReconciliation = true;\n void this.readyPromise.then(() => {\n this.pendingProjectedNodeReconciliation = false;\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n this.applyProjectedNodes(this.projectedNodes);\n });\n }\n\n private runWhenReady(generation: number, action: () => void): void {\n if (!this.isHydratingInitialSnapshot) {\n if (!this.isDisposed && generation === this.loadGeneration) {\n action();\n }\n return;\n }\n\n void this.readyPromise.then(() => {\n if (this.isDisposed || generation !== this.loadGeneration) {\n return;\n }\n action();\n });\n }\n\n private async waitUntilReady(generation: number): Promise<boolean> {\n if (!this.isHydratingInitialSnapshot) {\n return !this.isDisposed && generation === this.loadGeneration;\n }\n\n await this.readyPromise;\n return !this.isDisposed && generation === this.loadGeneration;\n }\n\n private restoreAndFocusNode(nodeId: string): void {\n const existing = this.controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeId);\n if (!existing) {\n return;\n }\n if (existing.isMinimized) {\n this.controller.commands.restoreNode(existing.id);\n }\n this.controller.commands.focusNode(existing.id);\n }\n\n private saveSnapshot(): void {\n if (!this.isSnapshotLoaded) {\n return;\n }\n\n const snapshot = sanitizeWorkbenchHostSnapshot(\n createWorkbenchSnapshotFromState(\n this.applyExternalSnapshotNodeState(\n persistedWorkbenchState(\n this.controller.getSnapshot(),\n this.nodeDefinitionByType\n )\n ),\n {\n activeSpaceId: this.loadedSnapshot?.activeSpaceId,\n metadata: writeClosedDockWindowFrameEntries(\n {\n ...(this.loadedSnapshot?.metadata ?? {}),\n [initializedMetadataKey]: true\n },\n this.closedDockWindowFrameEntries.values()\n ),\n spaces: this.loadedSnapshot?.spaces\n }\n )\n );\n if (workbenchSnapshotSaveKey(snapshot) === this.loadedSnapshotSaveKey()) {\n return;\n }\n void Promise.resolve(\n this.input.snapshotRepository.save(this.input.workspaceId, snapshot)\n ).then((savedSnapshot) => {\n this.loadedSnapshot = savedSnapshot;\n }, noop);\n }\n\n private rememberClosedDockWindowFrame(nodeId: string): void {\n const node = this.controller\n .getSnapshot()\n .nodes.find((entry) => entry.id === nodeId);\n const dockEntryId = node?.data.dockEntryId?.trim();\n if (!node || !dockEntryId) {\n return;\n }\n\n const entry: ClosedDockWindowFrameEntry = {\n dockEntryId,\n frame:\n node.displayMode === \"fullscreen\" && node.restoreFrame\n ? node.restoreFrame\n : node.frame,\n typeId: node.data.typeId\n };\n this.closedDockWindowFrameEntries.set(\n closedDockWindowFrameEntryKey(entry),\n entry\n );\n }\n\n private applyClosedDockWindowFrame(\n result: WorkbenchHostLaunchResult\n ): WorkbenchHostLaunchResult {\n const dockEntryId = result.dockEntryId?.trim();\n if (!dockEntryId) {\n return result;\n }\n\n const entry = this.closedDockWindowFrameEntries.get(\n closedDockWindowFrameEntryKey({\n dockEntryId,\n typeId: result.typeId\n })\n );\n if (!entry) {\n return result;\n }\n\n return {\n ...result,\n defaultFrame: entry.frame,\n framePolicy: \"absolute\"\n };\n }\n\n private loadedSnapshotSaveKey(): string | null {\n if (!this.loadedSnapshot) {\n return null;\n }\n return workbenchSnapshotSaveKey(\n sanitizeWorkbenchHostSnapshot(this.loadedSnapshot)\n );\n }\n\n private schedulePersistedSnapshotWrite(): void {\n if (!this.isSnapshotLoaded || this.isDisposed) {\n return;\n }\n\n if (this.saveTimer !== null) {\n globalThis.clearTimeout(this.saveTimer);\n }\n this.saveTimer = globalThis.setTimeout(() => {\n this.saveTimer = null;\n this.saveSnapshot();\n }, snapshotSaveDelayMs);\n }\n\n private subscribeToPersistence(): void {\n if (this.unsubscribe !== null) {\n return;\n }\n\n this.unsubscribe = this.controller.subscribe(() => {\n this.schedulePersistedSnapshotWrite();\n });\n if (this.externalStateUnsubscribe === null) {\n const source = this.input.externalStateSource;\n const canReadSnapshotNodeState =\n typeof source?.getSnapshotNodeState === \"function\";\n if (!canReadSnapshotNodeState) {\n return;\n }\n this.externalStateUnsubscribe =\n source?.subscribe?.(() => {\n this.schedulePersistedSnapshotWrite();\n }) ?? null;\n }\n }\n\n private disposeNodeLeases(): void {\n for (const lease of this.nodeLeases.values()) {\n lease.release();\n }\n this.nodeLeases.clear();\n }\n\n private applyExternalSnapshotNodeState(\n state: Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\">\n ): Pick<WorkbenchState<WorkbenchHostNodeData>, \"nodeStack\" | \"nodes\"> {\n const source = this.input.externalStateSource;\n const getSnapshotNodeState = source?.getSnapshotNodeState?.bind(source);\n if (!getSnapshotNodeState) {\n return state;\n }\n\n return {\n ...state,\n nodes: state.nodes.map((node) => {\n const lookupInput = {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId: this.input.workspaceId,\n ...(node.data.projectionSubject\n ? { subject: node.data.projectionSubject }\n : {})\n };\n const snapshotNodeState = getSnapshotNodeState(lookupInput);\n const nextSnapshotNodeState =\n snapshotNodeState ?? node.data.snapshotNodeState;\n if (nextSnapshotNodeState === undefined) {\n return node;\n }\n return {\n ...node,\n data: {\n ...node.data,\n snapshotNodeState: nextSnapshotNodeState\n }\n };\n })\n };\n }\n\n private reconcileNodeLeases(): void {\n const activeNodes = this.controller.getSnapshot().nodes;\n const nextNodeIDs = new Set(activeNodes.map((node) => node.id));\n\n for (const [nodeID, lease] of this.nodeLeases) {\n if (nextNodeIDs.has(nodeID)) {\n continue;\n }\n lease.release();\n this.nodeLeases.delete(nodeID);\n }\n\n for (const node of activeNodes) {\n if (this.nodeLeases.has(node.id)) {\n continue;\n }\n const definition = this.nodeDefinitionByType.get(node.data.typeId);\n const lease = definition?.createLease?.({\n node,\n workspaceId: this.input.workspaceId\n });\n if (lease) {\n this.nodeLeases.set(node.id, lease);\n }\n }\n }\n}\n\nfunction withoutRuntimeNodeState(\n data: WorkbenchHostNodeData\n): WorkbenchHostNodeData {\n const next = { ...data };\n delete next.runtimeNodeState;\n return next;\n}\n\nfunction withoutSnapshotNodeState(\n data: WorkbenchHostNodeData\n): WorkbenchHostNodeData {\n const next = { ...data };\n delete next.snapshotNodeState;\n return next;\n}\n\nfunction workbenchSnapshotSaveKey(snapshot: WorkbenchSnapshot): string {\n return JSON.stringify(snapshot);\n}\n\nfunction resolveWorkbenchHostLaunchSource(\n input: WorkbenchHostLaunchInput\n): string | null {\n if (input.launchSource?.trim()) {\n return input.launchSource.trim();\n }\n switch (input.reason) {\n case \"dock\":\n return \"dock\";\n case \"launchpad\":\n return \"launchpad\";\n case \"shortcut\":\n return \"keyboard\";\n case \"command\":\n return \"command\";\n case \"host\":\n return null;\n }\n}\n\nfunction diagnosticErrorDetails(error: unknown): Record<string, unknown> {\n if (error instanceof Error) {\n return {\n message: limitLaunchDiagnosticText(error.message),\n name: error.name,\n stack: limitLaunchDiagnosticText(error.stack)\n };\n }\n return {\n message: diagnosticValueSummary(error),\n name: typeof error\n };\n}\n\nfunction diagnosticValueSummary(value: unknown): string | null {\n if (value === undefined) {\n return null;\n }\n if (typeof value === \"string\") {\n return limitLaunchDiagnosticText(value) ?? \"\";\n }\n if (\n value === null ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n try {\n return limitLaunchDiagnosticText(JSON.stringify(value)) ?? null;\n } catch {\n return Object.prototype.toString.call(value);\n }\n}\n\nfunction limitLaunchDiagnosticText(value: string | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed) {\n return null;\n }\n return trimmed.length > launchDiagnosticTextMaxLength\n ? `${trimmed.slice(0, launchDiagnosticTextMaxLength)}...`\n : trimmed;\n}\n\nfunction noop(): void {}\n","import { Component, useCallback, useMemo } from \"react\";\nimport type { ErrorInfo, ReactNode } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowSurfaceLayer,\n WorkbenchResolveWindowZIndex,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowActionContext\n} from \"../react/types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport {\n renderMinimizedDockPreviewContent,\n WorkbenchHostDock\n} from \"./WorkbenchHostDock.tsx\";\nimport {\n createWorkbenchHostNodeBodyContext,\n createWorkbenchHostNodeHeaderContext\n} from \"./hostNodeContext.ts\";\nimport { WorkbenchHostWindowActions } from \"./WorkbenchHostWindowActions.tsx\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport {\n isWorkbenchMinimizedDockEligibleNode,\n resolveWorkbenchMinimizedDockAnchorKeyForNode,\n resolveWorkbenchMinimizedDockSlots\n} from \"./minimizedDockSlots.ts\";\nimport type {\n WorkbenchHostChromeRenderContext,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostNodeBodyContext,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps,\n WorkbenchHostRuntimeHandle\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostSurfaceRenderers(input: {\n captureNodePreviewImage?: WorkbenchHostProps[\"captureNodePreviewImage\"];\n chromeContext: WorkbenchHostChromeRenderContext;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockStateSource?: WorkbenchHostProps[\"dockStateSource\"];\n externalStateSource?: WorkbenchHostExternalStateSource;\n externalStateRevision: number;\n hostI18n: WorkbenchHostI18nRuntime;\n hostSession: WorkbenchHostRuntimeHandle;\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: WorkbenchHostProps[\"onDockEntryAction\"];\n onDockEntryClick?: WorkbenchHostProps[\"onDockEntryClick\"];\n onMissionControlRequestOpen?: WorkbenchHostProps[\"onMissionControlRequestOpen\"];\n renderBottomChrome?: WorkbenchHostProps[\"renderBottomChrome\"];\n renderTopChrome?: WorkbenchHostProps[\"renderTopChrome\"];\n workspaceId: string;\n}) {\n const renderBottomChrome = useMemo(() => {\n const renderChrome = input.renderBottomChrome;\n return renderChrome\n ? () => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n chromeSlot: \"bottom\"\n }}\n event=\"workbench.chrome.render_error\"\n fallbackKind=\"bottom-chrome\"\n resetKey={`${input.workspaceId}:bottom-chrome`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostChromeRenderer\n context={input.chromeContext}\n renderChrome={renderChrome}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n )\n : undefined;\n }, [\n input.chromeContext,\n input.debugDiagnostics,\n input.renderBottomChrome,\n input.workspaceId\n ]);\n const renderTopChrome = useMemo(() => {\n const renderChrome = input.renderTopChrome;\n return renderChrome\n ? () => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n chromeSlot: \"top\"\n }}\n event=\"workbench.chrome.render_error\"\n fallbackKind=\"top-chrome\"\n resetKey={`${input.workspaceId}:top-chrome`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostChromeRenderer\n context={input.chromeContext}\n renderChrome={renderChrome}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n )\n : undefined;\n }, [\n input.chromeContext,\n input.debugDiagnostics,\n input.renderTopChrome,\n input.workspaceId\n ]);\n\n const captureNodePreviewImage = useCallback(\n async (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(node.data.typeId);\n const minimizedDock = definition?.window?.minimizedDock;\n const capturePreview =\n minimizedDock?.kind === \"snapshot\"\n ? minimizedDock.capturePreview\n : undefined;\n const snapshot = input.hostSession.getSnapshot();\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: input.externalStateSource,\n node,\n workspaceId: input.workspaceId\n });\n const nodePreview =\n (await Promise.resolve(\n capturePreview?.({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host: input.hostSession,\n isFocused: snapshot.nodeStack.at(-1) === node.id,\n isMinimized: node.isMinimized,\n node\n }) ?? null\n ).catch(() => null)) ??\n (await Promise.resolve(\n input.captureNodePreviewImage?.(node) ?? null\n ).catch(() => null));\n return nodePreview;\n },\n [\n input.captureNodePreviewImage,\n input.externalStateSource,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const renderDock = useCallback(\n (context: Parameters<typeof WorkbenchHostDock>[0][\"context\"]) => (\n <WorkbenchHostSurfaceRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n details={{\n dockEntryCount: input.dockEntries.length,\n dockPlacement: input.dockPlacement ?? null\n }}\n event=\"workbench.dock.render_error\"\n fallbackKind=\"dock\"\n resetKey={`${input.workspaceId}:dock`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostDock\n captureNodePreviewImage={captureNodePreviewImage}\n context={context}\n debugDiagnostics={input.debugDiagnostics}\n dockEntries={input.dockEntries}\n dockPlacement={input.dockPlacement}\n dockPreviewCache={input.dockPreviewCache}\n dockStateSource={input.dockStateSource}\n externalStateSource={input.externalStateSource}\n host={input.hostSession}\n i18n={input.hostI18n}\n nodeDefinitions={input.nodeDefinitionByType}\n onDockEntryAction={input.onDockEntryAction}\n onDockEntryClick={input.onDockEntryClick}\n onMissionControlRequestOpen={input.onMissionControlRequestOpen}\n workspaceId={input.workspaceId}\n />\n </WorkbenchHostSurfaceRenderErrorBoundary>\n ),\n [\n captureNodePreviewImage,\n input.debugDiagnostics,\n input.dockEntries,\n input.dockPlacement,\n input.dockPreviewCache,\n input.dockStateSource,\n input.externalStateSource,\n input.hostI18n,\n input.hostSession,\n input.nodeDefinitionByType,\n input.onDockEntryAction,\n input.onDockEntryClick,\n input.onMissionControlRequestOpen,\n input.workspaceId\n ]\n );\n\n const renderNode = useCallback(\n (context: WorkbenchRenderNodeContext<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(\n context.node.data.typeId\n );\n if (!definition) {\n return null;\n }\n\n const bodyContext = createWorkbenchHostNodeBodyContext({\n context,\n definition,\n externalStateSource: input.externalStateSource,\n host: input.hostSession,\n workspaceId: input.workspaceId\n });\n\n return (\n <WorkbenchHostNodeRenderErrorBoundary\n debugDiagnostics={input.debugDiagnostics}\n node={context.node}\n resetKey={`${context.node.id}:${context.node.data.typeId}:${input.externalStateRevision}`}\n workspaceId={input.workspaceId}\n >\n <WorkbenchHostNodeBodyRenderer\n context={bodyContext}\n definition={definition}\n />\n </WorkbenchHostNodeRenderErrorBoundary>\n );\n },\n [\n input.debugDiagnostics,\n input.externalStateSource,\n input.externalStateRevision,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const renderWindowActions = useCallback(\n (context: WorkbenchWindowActionContext<WorkbenchHostNodeData>) => (\n <WorkbenchHostWindowActions\n context={context}\n host={input.hostSession}\n i18n={input.hostI18n}\n nodeDefinitions={input.nodeDefinitionByType}\n />\n ),\n [input.hostI18n, input.hostSession, input.nodeDefinitionByType]\n );\n\n const renderWindowHeader = useCallback(\n (\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0]\n ) => {\n const definition = input.nodeDefinitionByType.get(\n context.node.data.typeId\n );\n if (!definition?.renderHeader) {\n return null;\n }\n\n return definition.renderHeader(\n createWorkbenchHostNodeHeaderContext({\n context,\n definition,\n externalStateSource: input.externalStateSource,\n host: input.hostSession,\n workspaceId: input.workspaceId\n })\n );\n },\n [\n input.externalStateSource,\n input.externalStateRevision,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const shouldKeepMinimizedNodeMounted = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const capability = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.keepMountedWhenMinimized;\n return typeof capability === \"function\"\n ? capability(node)\n : capability === true;\n },\n [input.nodeDefinitionByType]\n );\n\n const shouldCaptureNodePreviewImage = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const minimizedDock = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.minimizedDock;\n return minimizedDock?.kind !== \"component\";\n },\n [input.nodeDefinitionByType]\n );\n\n const renderNodeGeniePreview = useCallback(\n (\n node: WorkbenchNode<WorkbenchHostNodeData>,\n {\n previewViewport\n }: { previewViewport: { height: number; width: number } }\n ) => {\n const minimizedDock = input.nodeDefinitionByType.get(node.data.typeId)\n ?.window?.minimizedDock;\n if (minimizedDock?.kind !== \"component\") {\n return null;\n }\n\n const externalState = readWorkbenchHostExternalState({\n externalStateSource: input.externalStateSource,\n node,\n workspaceId: input.workspaceId\n });\n const preview = minimizedDock.providePreview({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host: input.hostSession,\n isFocused: input.hostSession.getSnapshot().nodeStack.at(-1) === node.id,\n isMinimized: node.isMinimized,\n node,\n previewViewport\n });\n return preview\n ? renderMinimizedDockPreviewContent(\n preview,\n \"workbench-genie-preview-capture__preview\"\n )\n : null;\n },\n [\n input.externalStateSource,\n input.hostSession,\n input.nodeDefinitionByType,\n input.workspaceId\n ]\n );\n\n const resolveDockAnchorKey = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n if (\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitionByType\n })\n ) {\n const snapshotNodes = input.hostSession.getSnapshot().nodes;\n const slotNodes = snapshotNodes.some(\n (snapshotNode) => snapshotNode.id === node.id\n )\n ? snapshotNodes.map((snapshotNode) =>\n snapshotNode.id === node.id ? node : snapshotNode\n )\n : [...snapshotNodes, node];\n const minimizedAnchorKey =\n resolveWorkbenchMinimizedDockAnchorKeyForNode({\n nodeId: node.id,\n slots: resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions: input.nodeDefinitionByType,\n nodes: slotNodes\n })\n });\n if (minimizedAnchorKey) {\n return minimizedAnchorKey;\n }\n }\n\n if (typeof node.data.dockEntryId === \"string\") {\n const dockEntry = input.dockEntries.find(\n (entry) => entry.id === node.data.dockEntryId\n );\n return dockEntry?.anchorKey ?? node.data.dockEntryId;\n }\n\n return node.data.typeId;\n },\n [input.dockEntries, input.hostSession, input.nodeDefinitionByType]\n );\n\n const resolveDockPreviewCacheKey = useCallback(\n (\n node: WorkbenchNode<WorkbenchHostNodeData>\n ): WorkbenchDockPreviewCacheKey | null => ({\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId: input.workspaceId\n }),\n [input.workspaceId]\n );\n\n const windowChromeMode = useCallback<\n WorkbenchResolveWindowChromeMode<WorkbenchHostNodeData>\n >(\n ({ node }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.renderHeader\n ? \"custom-header\"\n : \"system\",\n [input.nodeDefinitionByType]\n );\n\n const resolveWindowZIndex = useCallback<\n WorkbenchResolveWindowZIndex<WorkbenchHostNodeData>\n >(({ baseZIndex }) => baseZIndex, []);\n\n const resolveWindowSurfaceLayer = useCallback<\n WorkbenchResolveWindowSurfaceLayer<WorkbenchHostNodeData>\n >(\n ({ node }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.window?.surfaceLayer ??\n \"default\",\n [input.nodeDefinitionByType]\n );\n\n const resolveFullscreenHeaderMode = useCallback(\n ({ node }: { node: WorkbenchNode<WorkbenchHostNodeData> }) =>\n input.nodeDefinitionByType.get(node.data.typeId)?.window\n ?.fullscreenHeaderMode,\n [input.nodeDefinitionByType]\n );\n\n return {\n captureNodePreviewImage,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderNodeGeniePreview,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldCaptureNodePreviewImage,\n shouldKeepMinimizedNodeMounted,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n resolveFullscreenHeaderMode,\n resolveWindowSurfaceLayer,\n resolveWindowZIndex,\n windowChromeMode\n };\n}\n\ninterface WorkbenchHostNodeRenderErrorBoundaryProps {\n children: ReactNode;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n node: WorkbenchNode<WorkbenchHostNodeData>;\n resetKey: string;\n workspaceId: string;\n}\n\ninterface WorkbenchHostSurfaceRenderErrorBoundaryProps {\n children: ReactNode;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n details?: Record<string, unknown>;\n event: string;\n fallbackKind: string;\n resetKey: string;\n workspaceId: string;\n}\n\ninterface WorkbenchHostNodeRenderErrorBoundaryState {\n hasError: boolean;\n}\n\ninterface WorkbenchHostSurfaceRenderErrorBoundaryState {\n hasError: boolean;\n}\n\nclass WorkbenchHostSurfaceRenderErrorBoundary extends Component<\n WorkbenchHostSurfaceRenderErrorBoundaryProps,\n WorkbenchHostSurfaceRenderErrorBoundaryState\n> {\n override state: WorkbenchHostSurfaceRenderErrorBoundaryState = {\n hasError: false\n };\n\n static getDerivedStateFromError(): WorkbenchHostSurfaceRenderErrorBoundaryState {\n return { hasError: true };\n }\n\n override componentDidUpdate(\n previousProps: WorkbenchHostSurfaceRenderErrorBoundaryProps\n ): void {\n if (this.state.hasError && previousProps.resetKey !== this.props.resetKey) {\n this.setState({ hasError: false });\n }\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n try {\n const result = this.props.debugDiagnostics?.log?.({\n details: {\n ...(this.props.details ?? {}),\n componentStack: info.componentStack ?? null,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorName: error instanceof Error ? error.name : typeof error,\n errorStack: error instanceof Error ? (error.stack ?? null) : null\n },\n event: this.props.event,\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: this.props.workspaceId\n });\n void Promise.resolve(result).catch(() => undefined);\n } catch {\n // Rendering recovery must not depend on diagnostics transport.\n }\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div\n data-workbench-surface-render-error={this.props.fallbackKind}\n style={{ height: \"100%\", width: \"100%\" }}\n />\n );\n }\n\n return this.props.children;\n }\n}\n\nclass WorkbenchHostNodeRenderErrorBoundary extends Component<\n WorkbenchHostNodeRenderErrorBoundaryProps,\n WorkbenchHostNodeRenderErrorBoundaryState\n> {\n override state: WorkbenchHostNodeRenderErrorBoundaryState = {\n hasError: false\n };\n\n static getDerivedStateFromError(): WorkbenchHostNodeRenderErrorBoundaryState {\n return { hasError: true };\n }\n\n override componentDidUpdate(\n previousProps: WorkbenchHostNodeRenderErrorBoundaryProps\n ): void {\n if (this.state.hasError && previousProps.resetKey !== this.props.resetKey) {\n this.setState({ hasError: false });\n }\n }\n\n override componentDidCatch(error: unknown, info: ErrorInfo): void {\n try {\n const result = this.props.debugDiagnostics?.log?.({\n details: {\n componentStack: info.componentStack ?? null,\n dockEntryId: this.props.node.data.dockEntryId ?? null,\n displayMode: this.props.node.displayMode,\n errorMessage: error instanceof Error ? error.message : String(error),\n errorName: error instanceof Error ? error.name : typeof error,\n errorStack: error instanceof Error ? (error.stack ?? null) : null,\n frame: this.props.node.frame,\n instanceId: this.props.node.data.instanceId,\n instanceKey: this.props.node.data.instanceKey ?? null,\n isMinimized: this.props.node.isMinimized,\n launchSource: this.props.node.data.launchSource ?? null,\n nodeId: this.props.node.id,\n typeId: this.props.node.data.typeId\n },\n event: \"workbench.node.render_error\",\n level: \"error\",\n source: \"workbench-host\",\n workspaceId: this.props.workspaceId\n });\n void Promise.resolve(result).catch(() => undefined);\n } catch {\n // Rendering recovery must not depend on diagnostics transport.\n }\n }\n\n override render(): ReactNode {\n if (this.state.hasError) {\n return (\n <div\n data-workbench-node-render-error=\"true\"\n style={{\n alignItems: \"center\",\n boxSizing: \"border-box\",\n color: \"var(--text-secondary, #6b7280)\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n height: \"100%\",\n justifyContent: \"center\",\n padding: 24,\n textAlign: \"center\",\n width: \"100%\"\n }}\n >\n <div\n data-workbench-node-render-error-message=\"true\"\n style={{\n color: \"var(--text-primary, #111827)\",\n fontSize: 14,\n fontWeight: 600\n }}\n >\n This workspace view failed to render.\n </div>\n <div style={{ fontSize: 12 }}>\n Try selecting another conversation or reopen the window.\n </div>\n <button\n type=\"button\"\n onClick={() => this.setState({ hasError: false })}\n style={{\n border: \"1px solid var(--line-2, #d1d5db)\",\n borderRadius: 6,\n background: \"var(--background-fronted, #ffffff)\",\n color: \"var(--text-primary, #111827)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontWeight: 600,\n marginTop: 4,\n padding: \"6px 10px\"\n }}\n >\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\nfunction WorkbenchHostNodeBodyRenderer({\n context,\n definition\n}: {\n context: WorkbenchHostNodeBodyContext;\n definition: WorkbenchHostNodeDefinition;\n}): ReactNode {\n return definition.renderBody(context);\n}\n\nfunction WorkbenchHostChromeRenderer({\n context,\n renderChrome\n}: {\n context: WorkbenchHostChromeRenderContext;\n renderChrome: NonNullable<WorkbenchHostProps[\"renderTopChrome\"]>;\n}): ReactNode {\n return renderChrome(context);\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type Dispatch,\n type FocusEvent as ReactFocusEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type RefObject,\n type SetStateAction\n} from \"react\";\nimport {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n ChevronDownIcon,\n ChevronUpIcon\n} from \"@tutti-os/ui-system\";\nimport type { WorkbenchDockContext } from \"../react/types.ts\";\nimport {\n captureWorkbenchNodePreviewImage,\n readCachedWorkbenchNodePreviewImage,\n writeCachedWorkbenchNodePreviewImage\n} from \"../react/useWorkbenchGenieAnimation.tsx\";\nimport {\n resolveWorkbenchDockEntries,\n resolveWorkbenchDockEntryClick,\n type ResolvedWorkbenchHostDockEntry\n} from \"./dockEntries.ts\";\nimport {\n DOCK_ICON_BASE_SIZE,\n DOCK_ICON_PEAK_SIZE,\n useDockMagnification\n} from \"./dockMagnification.ts\";\nimport {\n resolveWorkbenchHostDockScrollState,\n type WorkbenchHostDockScrollState\n} from \"./dockScrollState.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport {\n resolveWorkbenchMinimizedDockSlots,\n type WorkbenchMinimizedDockNode,\n type WorkbenchMinimizedDockSlot\n} from \"./minimizedDockSlots.ts\";\nimport { useMinimizedDockStackPromotion } from \"./minimizedDockStackPromotion.ts\";\nimport {\n resolveWorkbenchMinimizedDockRestoreIntent,\n type WorkbenchMinimizedDockRestoreIntent\n} from \"./minimizedDockRestoreIntent.ts\";\nimport {\n WorkbenchHostDockPopup,\n type WorkbenchHostDockPopupAnchorRect,\n type WorkbenchHostDockPopupState\n} from \"./WorkbenchHostDockPopup.tsx\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport type {\n WorkbenchDockPreviewContent,\n WorkbenchHostDockEntry,\n WorkbenchHostDockEntryStateSource,\n WorkbenchHostExternalStateSource,\n WorkbenchHostHandle,\n WorkbenchHostNodeDefinition,\n WorkbenchHostNodeData,\n WorkbenchHostNodeInstanceStrategy,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport type { createWorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\ntype WorkbenchMinimizedDockNodeSlotRestoreIntent = Extract<\n WorkbenchMinimizedDockRestoreIntent,\n { kind: \"node-slot\" }\n>;\n\ntype WorkbenchMinimizedDockStackPopupCardRestoreIntent = Extract<\n WorkbenchMinimizedDockRestoreIntent,\n { kind: \"stack-popup-card\" }\n>;\n\ntype WorkbenchDockWallpaperTone = \"dark\" | \"light\";\n\nconst minimizedDockPreviewViewport = {\n height: 34.2,\n width: 46.8\n};\n\nfunction stripDockDescriptionTerminalPunctuation(value: string): string {\n const trimmed = value.trim();\n if (!trimmed || trimmed.endsWith(\"...\") || trimmed.endsWith(\"…\")) {\n return trimmed;\n }\n return trimmed.replace(/[。..]+$/u, \"\");\n}\n\nfunction activateDockButtonFromKeyboard(\n event: ReactKeyboardEvent<HTMLElement>,\n disabled = false\n) {\n if (disabled || (event.key !== \"Enter\" && event.key !== \" \")) {\n return;\n }\n\n event.preventDefault();\n event.currentTarget.click();\n}\n\nfunction isDockVisualMutationActive(element: HTMLElement | null): boolean {\n if (!element) {\n return false;\n }\n\n return (\n element.hasAttribute(\"data-dock-pointer-active\") ||\n element.hasAttribute(\"data-dock-hover-panel-open\") ||\n element.querySelector(\n '[data-collapsing=\"true\"], [data-presence=\"entering\"], [data-presence=\"exiting\"], [data-stack-dispatching=\"true\"], [data-promoted-from-stack=\"true\"]'\n ) !== null\n );\n}\n\nexport function WorkbenchHostDock({\n captureNodePreviewImage,\n context,\n debugDiagnostics,\n dockEntries,\n dockPlacement = \"bottom\",\n dockPreviewCache,\n dockStateSource,\n externalStateSource,\n host,\n i18n,\n nodeDefinitions,\n onDockEntryAction,\n onDockEntryClick,\n onMissionControlRequestOpen,\n workspaceId\n}: {\n captureNodePreviewImage?: WorkbenchHostProps[\"captureNodePreviewImage\"];\n context: WorkbenchDockContext<WorkbenchHostNodeData>;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockStateSource?: WorkbenchHostDockEntryStateSource;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n i18n: ReturnType<typeof createWorkbenchHostI18nRuntime>;\n nodeDefinitions: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: (input: {\n actionId: string;\n entryId: string;\n host: WorkbenchHostHandle;\n }) => Promise<void> | void;\n onDockEntryClick?: (input: {\n entryId: string;\n host: WorkbenchHostHandle;\n nodeId?: string;\n }) => Promise<void> | void;\n onMissionControlRequestOpen?: WorkbenchHostProps[\"onMissionControlRequestOpen\"];\n workspaceId: string;\n}) {\n const minimizedNodeIDs = useMemo(\n () => new Set(context.minimizedNodes.map((node) => node.id)),\n [context.minimizedNodes]\n );\n const dockMeasureRef = useRef<HTMLDivElement | null>(null);\n const dockItemsRef = useRef<HTMLDivElement | null>(null);\n const hoverPanelRef = useRef<HTMLDivElement | null>(null);\n const hoverPanelCloseTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hoverPanelOpenTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const labelTooltipOpenTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const hoverPanelScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const labelTooltipScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const hoverPanelRestTargetRef = useRef<{\n anchorKey: string;\n entryId: string;\n } | null>(null);\n const activeHoverPanelRef = useRef<WorkbenchHostDockHoverPanelState | null>(\n null\n );\n const activeLabelTooltipRef =\n useRef<WorkbenchHostDockLabelTooltipState | null>(null);\n const pendingDockStateRefreshRef = useRef(false);\n const slotRefs = useRef(new Map<string, HTMLElement>());\n const wallpaperToneElementRefs = useRef(new Map<string, HTMLElement>());\n const dockSlotRefCallbacksRef = useRef(\n new Map<string, (element: HTMLElement | null) => void>()\n );\n const previousAttentionTokenByEntryId = useRef(new Map<string, unknown>());\n const dockEntryClickThrottleUntilRef = useRef(new Map<string, number>());\n const attentionTimeouts = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const [activeAttentionEntryIds, setActiveAttentionEntryIds] = useState<\n Set<string>\n >(new Set());\n const [activePopup, setActivePopup] =\n useState<WorkbenchHostDockPopupState | null>(null);\n const [activeHoverPanel, setActiveHoverPanel] =\n useState<WorkbenchHostDockHoverPanelState | null>(null);\n const [activeLabelTooltip, setActiveLabelTooltip] =\n useState<WorkbenchHostDockLabelTooltipState | null>(null);\n const [activeMinimizedStackPopup, setActiveMinimizedStackPopup] =\n useState<WorkbenchHostDockPopupAnchorRect | null>(null);\n const [pendingActionKeys, setPendingActionKeys] = useState<Set<string>>(\n () => new Set()\n );\n const [dockFrameSize, setDockFrameSize] = useState<number | null>(null);\n const { triggerDockBounce } = useDockBounce(slotRefs);\n const [dockScrollState, setDockScrollState] =\n useState<WorkbenchHostDockScrollState>(() => ({\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n }));\n const [dockStateRevision, setDockStateRevision] = useState(0);\n const [externalStateRevision, setExternalStateRevision] = useState(0);\n const [\n collapsingMinimizedLaunchAnchorKeys,\n setCollapsingMinimizedLaunchAnchorKeys\n ] = useState<Set<string>>(() => new Set());\n const collapsingMinimizedLaunchTimerRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n\n const clearHoverPanelCloseTimer = useCallback(() => {\n if (hoverPanelCloseTimerRef.current === null) {\n return;\n }\n clearTimeout(hoverPanelCloseTimerRef.current);\n hoverPanelCloseTimerRef.current = null;\n }, []);\n\n const clearHoverPanelOpenTimer = useCallback(() => {\n if (hoverPanelOpenTimerRef.current === null) {\n return;\n }\n clearTimeout(hoverPanelOpenTimerRef.current);\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n }, []);\n\n const clearLabelTooltipOpenTimer = useCallback(() => {\n if (labelTooltipOpenTimerRef.current === null) {\n return;\n }\n clearTimeout(labelTooltipOpenTimerRef.current);\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n }, []);\n\n useEffect(\n () => () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n for (const timer of collapsingMinimizedLaunchTimerRef.current.values()) {\n clearTimeout(timer);\n }\n collapsingMinimizedLaunchTimerRef.current.clear();\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n clearLabelTooltipOpenTimer\n ]\n );\n\n const clearCollapsingMinimizedLaunch = useCallback((anchorKey: string) => {\n const timer = collapsingMinimizedLaunchTimerRef.current.get(anchorKey);\n if (timer) {\n clearTimeout(timer);\n collapsingMinimizedLaunchTimerRef.current.delete(anchorKey);\n }\n const slotElement = slotRefs.current.get(anchorKey);\n slotElement?.removeAttribute(\"data-collapsing\");\n slotElement?.style.removeProperty(\"--desktop-dock-collapse-inline-size\");\n slotElement?.style.removeProperty(\"--desktop-dock-collapse-block-size\");\n setCollapsingMinimizedLaunchAnchorKeys((current) => {\n if (!current.has(anchorKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(anchorKey);\n return next;\n });\n }, []);\n\n const scheduleCollapsingMinimizedLaunchClear = useCallback(\n (anchorKey: string) => {\n const existing = collapsingMinimizedLaunchTimerRef.current.get(anchorKey);\n if (existing) {\n clearTimeout(existing);\n }\n collapsingMinimizedLaunchTimerRef.current.set(\n anchorKey,\n setTimeout(() => {\n clearCollapsingMinimizedLaunch(anchorKey);\n }, minimizedDockSlotLayoutAnimationMs)\n );\n },\n [clearCollapsingMinimizedLaunch]\n );\n\n useLayoutEffect(() => {\n const element = dockMeasureRef.current;\n if (!element || typeof window === \"undefined\") {\n return undefined;\n }\n\n let frameId: number | null = null;\n const updateDockFrameSize = () => {\n frameId = null;\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n return;\n }\n const rect = element.getBoundingClientRect();\n const nextSize = Math.ceil(\n (dockPlacement === \"left\" ? rect.height : rect.width) +\n desktopDockPlateChromeWidth\n );\n setDockFrameSize((current) =>\n current === nextSize ? current : nextSize\n );\n };\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(updateDockFrameSize);\n };\n\n updateDockFrameSize();\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(element);\n window.addEventListener(\"resize\", scheduleUpdate);\n\n return () => {\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n };\n }, [dockPlacement]);\n\n const flushPendingDockStateRefresh = useCallback(() => {\n if (!pendingDockStateRefreshRef.current) {\n return;\n }\n pendingDockStateRefreshRef.current = false;\n setDockStateRevision((revision) => revision + 1);\n }, []);\n\n useEffect(() => {\n if (!dockStateSource) {\n return undefined;\n }\n return dockStateSource.subscribe(() => {\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n pendingDockStateRefreshRef.current = true;\n return;\n }\n setDockStateRevision((revision) => revision + 1);\n });\n }, [dockStateSource]);\n\n const renderedDockEntries = useMemo(\n () =>\n dockEntries.map((entry) => {\n const dynamicState = dockStateSource?.getEntryState(entry.id);\n return dynamicState ? { ...entry, ...dynamicState } : entry;\n }),\n [dockEntries, dockStateRevision, dockStateSource]\n );\n const resolvedEntries = useMemo(\n () =>\n resolveWorkbenchDockEntries({\n dockEntries: renderedDockEntries,\n minimizedNodeIds: minimizedNodeIDs,\n nodes: context.nodes\n }),\n [context.nodes, minimizedNodeIDs, renderedDockEntries]\n );\n const minimizedDockSlots = useMemo(\n () =>\n resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions,\n nodes: context.minimizedNodes\n }),\n [context.minimizedNodes, nodeDefinitions]\n );\n const { promotedNodeId, stackDispatching } =\n useMinimizedDockStackPromotion(minimizedDockSlots);\n const dockItems = useMemo(\n () =>\n createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n }),\n [minimizedDockSlots, resolvedEntries]\n );\n const presentDockItems = useDockPresenceItems(dockItems, (nodeId) =>\n context.genie.shouldAnimateMinimizedDockEnter(nodeId)\n );\n const presentDockItemKeys = useMemo(\n () => presentDockItems.map((item) => item.key).join(\"\\n\"),\n [presentDockItems]\n );\n const wallpaperTones = useDockWallpaperTones({\n dockItemsRef,\n elementRefs: wallpaperToneElementRefs,\n itemKeys: presentDockItemKeys\n });\n const dockWidth = useMemo(\n () => resolveWorkbenchHostDockItemsWidth(dockItems),\n [dockItems]\n );\n const {\n clearSlotMagnification,\n handlePointerLeave: handleDockPointerLeave,\n handlePointerMove: handleDockPointerMove,\n pauseMagnification: pauseDockMagnification,\n resetMagnification: resetDockMagnification\n } = useDockMagnification({\n dockPlacement,\n dockRootRef: dockMeasureRef,\n slotRefs\n });\n const clearSlotMagnificationRef = useRef<(anchorKey: string) => void>(() => {\n return;\n });\n const registerDockAnchorRef = useRef(\n (anchorKey: string, element: HTMLElement | null) => {\n context.genie.registerDockAnchor(anchorKey, element);\n }\n );\n clearSlotMagnificationRef.current = (anchorKey) => {\n clearSlotMagnification(anchorKey);\n };\n registerDockAnchorRef.current = (anchorKey, element) => {\n context.genie.registerDockAnchor(anchorKey, element);\n };\n const registerWallpaperToneElement = useCallback(\n (key: string) => (element: HTMLElement | null) => {\n if (element) {\n wallpaperToneElementRefs.current.set(key, element);\n return;\n }\n wallpaperToneElementRefs.current.delete(key);\n },\n []\n );\n\n const setDockHoverPanelOpen = useCallback((open: boolean) => {\n if (open) {\n dockMeasureRef.current?.setAttribute(\n \"data-dock-hover-panel-open\",\n \"true\"\n );\n return;\n }\n dockMeasureRef.current?.removeAttribute(\"data-dock-hover-panel-open\");\n }, []);\n\n useEffect(() => {\n activeHoverPanelRef.current = activeHoverPanel;\n }, [activeHoverPanel]);\n\n useEffect(() => {\n activeLabelTooltipRef.current = activeLabelTooltip;\n }, [activeLabelTooltip]);\n\n const closeLabelTooltipImmediate = useCallback(\n (targetKey?: string) => {\n clearLabelTooltipOpenTimer();\n if (\n targetKey !== undefined &&\n activeLabelTooltipRef.current?.key !== targetKey\n ) {\n return;\n }\n if (activeLabelTooltipRef.current === null) {\n return;\n }\n activeLabelTooltipRef.current = null;\n setActiveLabelTooltip(null);\n },\n [clearLabelTooltipOpenTimer]\n );\n\n const closeHoverPanelImmediate = useCallback(\n (entryId?: string) => {\n clearHoverPanelOpenTimer();\n clearHoverPanelCloseTimer();\n if (\n entryId !== undefined &&\n activeHoverPanelRef.current?.entryId !== entryId\n ) {\n return;\n }\n if (activeHoverPanelRef.current === null) {\n return;\n }\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n activeHoverPanelRef.current = null;\n setActiveHoverPanel(null);\n flushPendingDockStateRefresh();\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n flushPendingDockStateRefresh,\n setDockHoverPanelOpen\n ]\n );\n\n const scheduleHoverPanelClose = useCallback(\n (entryId?: string) => {\n clearHoverPanelOpenTimer();\n clearHoverPanelCloseTimer();\n hoverPanelCloseTimerRef.current = setTimeout(() => {\n hoverPanelCloseTimerRef.current = null;\n closeHoverPanelImmediate(entryId);\n handleDockPointerLeave();\n }, dockHoverPanelCloseDelayMs);\n },\n [\n clearHoverPanelCloseTimer,\n clearHoverPanelOpenTimer,\n closeHoverPanelImmediate,\n handleDockPointerLeave\n ]\n );\n\n const showHoverPanel = useCallback(\n (entryId: string, anchorKey: string, anchorElement: HTMLElement): void => {\n const dockElement = dockMeasureRef.current;\n if (!dockElement) {\n return;\n }\n\n pauseDockMagnification();\n const dockRect = dockElement.getBoundingClientRect();\n const anchorRect = anchorElement.getBoundingClientRect();\n clearHoverPanelCloseTimer();\n const nextHoverPanel = {\n anchorKey,\n anchorRect: {\n height: anchorRect.height,\n left: anchorRect.left - dockRect.left,\n top: anchorRect.top - dockRect.top,\n width: anchorRect.width\n },\n entryId\n };\n setDockHoverPanelOpen(true);\n activeHoverPanelRef.current = nextHoverPanel;\n setActiveHoverPanel(nextHoverPanel);\n },\n [clearHoverPanelCloseTimer, pauseDockMagnification, setDockHoverPanelOpen]\n );\n\n const scheduleHoverPanelAfterRest = useCallback(\n (entryId: string, anchorKey: string) => {\n hoverPanelRestTargetRef.current = { anchorKey, entryId };\n clearHoverPanelOpenTimer();\n hoverPanelScheduledPointRef.current = null;\n hoverPanelOpenTimerRef.current = setTimeout(() => {\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n const pending = hoverPanelRestTargetRef.current;\n if (!pending || pending.entryId !== entryId) {\n return;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n showHoverPanel(entryId, anchorKey, slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearHoverPanelOpenTimer, showHoverPanel]\n );\n\n const showLabelTooltip = useCallback(\n (\n target: WorkbenchHostDockLabelTooltipTarget,\n anchorKey: string,\n anchorElement: HTMLElement\n ): void => {\n const dockElement = dockMeasureRef.current;\n if (!dockElement) {\n return;\n }\n\n const dockRect = dockElement.getBoundingClientRect();\n const anchorRect = resolveDockLabelTooltipAnchorRect({\n dockPlacement,\n slotElement: anchorElement\n });\n clearLabelTooltipOpenTimer();\n const nextTooltip = {\n anchorKey,\n anchorRect: {\n height: anchorRect.height,\n left: anchorRect.left - dockRect.left,\n top: anchorRect.top - dockRect.top,\n width: anchorRect.width\n },\n key: target.key,\n label: target.label\n };\n activeLabelTooltipRef.current = nextTooltip;\n setActiveLabelTooltip(nextTooltip);\n },\n [clearLabelTooltipOpenTimer, dockPlacement]\n );\n\n const scheduleLabelTooltipAfterRest = useCallback(\n (target: WorkbenchHostDockLabelTooltipTarget, anchorKey: string) => {\n clearLabelTooltipOpenTimer();\n labelTooltipScheduledPointRef.current = null;\n labelTooltipOpenTimerRef.current = setTimeout(() => {\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n showLabelTooltip(target, anchorKey, slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearLabelTooltipOpenTimer, showLabelTooltip]\n );\n\n const resolveHoverPanelTargetAtPoint = useCallback(\n (\n clientX: number,\n clientY: number\n ): {\n anchorKey: string;\n entryId: string;\n slotElement: HTMLElement;\n } | null => {\n for (const [anchorKey, slotElement] of slotRefs.current) {\n const entryId = slotElement.dataset.dockHoverPanelEntryId;\n if (!entryId) {\n continue;\n }\n\n const rect = slotElement.getBoundingClientRect();\n if (\n clientX >= rect.left - dockHoverPanelHitSlopPx &&\n clientX <= rect.right + dockHoverPanelHitSlopPx &&\n clientY >= rect.top - dockHoverPanelHitSlopPx &&\n clientY <= rect.bottom + dockHoverPanelHitSlopPx\n ) {\n return { anchorKey, entryId, slotElement };\n }\n }\n return null;\n },\n []\n );\n\n const resolveLabelTooltipTargetAtPoint = useCallback(\n (\n clientX: number,\n clientY: number\n ): {\n anchorKey: string;\n slotElement: HTMLElement;\n target: WorkbenchHostDockLabelTooltipTarget;\n } | null => {\n for (const [anchorKey, slotElement] of slotRefs.current) {\n if (slotElement.dataset.dockHoverPanelEntryId) {\n continue;\n }\n const key = slotElement.dataset.dockLabelTooltipKey;\n const label = slotElement.dataset.dockLabelTooltipLabel?.trim() ?? \"\";\n if (!key || !label) {\n continue;\n }\n\n const rect = slotElement.getBoundingClientRect();\n if (\n clientX >= rect.left - dockHoverPanelHitSlopPx &&\n clientX <= rect.right + dockHoverPanelHitSlopPx &&\n clientY >= rect.top - dockHoverPanelHitSlopPx &&\n clientY <= rect.bottom + dockHoverPanelHitSlopPx\n ) {\n return {\n anchorKey,\n slotElement,\n target: {\n key,\n label\n }\n };\n }\n }\n return null;\n },\n []\n );\n\n const isPointerInsideActiveHoverPanelRegion = useCallback(\n (clientX: number, clientY: number): boolean => {\n const activeHoverPanel = activeHoverPanelRef.current;\n if (!activeHoverPanel) {\n return false;\n }\n\n const anchorSlot = slotRefs.current.get(activeHoverPanel.anchorKey);\n const panel = hoverPanelRef.current;\n if (\n !anchorSlot ||\n !panel ||\n !anchorSlot.isConnected ||\n !panel.isConnected\n ) {\n return false;\n }\n\n const anchorRect = anchorSlot.getBoundingClientRect();\n const panelRect = panel.getBoundingClientRect();\n return (\n rectContainsPoint(\n anchorRect,\n clientX,\n clientY,\n dockHoverPanelHitSlopPx\n ) ||\n rectContainsPoint(\n panelRect,\n clientX,\n clientY,\n dockHoverPanelHitSlopPx\n ) ||\n rectContainsPoint(\n createHoverPanelBridgeRect(anchorRect, panelRect),\n clientX,\n clientY,\n dockHoverPanelBridgeSlopPx\n )\n );\n },\n []\n );\n\n const scheduleHoverPanelAtPointAfterRest = useCallback(\n (clientX: number, clientY: number) => {\n const scheduledPoint = hoverPanelScheduledPointRef.current;\n if (\n hoverPanelOpenTimerRef.current !== null &&\n scheduledPoint &&\n Math.abs(clientX - scheduledPoint.clientX) <=\n dockHoverPanelPointerRestTolerancePx &&\n Math.abs(clientY - scheduledPoint.clientY) <=\n dockHoverPanelPointerRestTolerancePx\n ) {\n return;\n }\n\n clearHoverPanelOpenTimer();\n hoverPanelScheduledPointRef.current = { clientX, clientY };\n hoverPanelOpenTimerRef.current = setTimeout(() => {\n hoverPanelOpenTimerRef.current = null;\n hoverPanelScheduledPointRef.current = null;\n if (activeHoverPanelRef.current !== null) {\n return;\n }\n const target = resolveHoverPanelTargetAtPoint(clientX, clientY);\n if (!target) {\n hoverPanelRestTargetRef.current = null;\n return;\n }\n hoverPanelRestTargetRef.current = {\n anchorKey: target.anchorKey,\n entryId: target.entryId\n };\n showHoverPanel(target.entryId, target.anchorKey, target.slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [clearHoverPanelOpenTimer, resolveHoverPanelTargetAtPoint, showHoverPanel]\n );\n\n const scheduleLabelTooltipAtPointAfterRest = useCallback(\n (clientX: number, clientY: number) => {\n if (activeLabelTooltipRef.current !== null) {\n return;\n }\n\n const scheduledPoint = labelTooltipScheduledPointRef.current;\n if (\n labelTooltipOpenTimerRef.current !== null &&\n scheduledPoint &&\n Math.abs(clientX - scheduledPoint.clientX) <=\n dockHoverPanelPointerRestTolerancePx &&\n Math.abs(clientY - scheduledPoint.clientY) <=\n dockHoverPanelPointerRestTolerancePx\n ) {\n return;\n }\n\n clearLabelTooltipOpenTimer();\n labelTooltipScheduledPointRef.current = { clientX, clientY };\n labelTooltipOpenTimerRef.current = setTimeout(() => {\n labelTooltipOpenTimerRef.current = null;\n labelTooltipScheduledPointRef.current = null;\n if (activeHoverPanelRef.current !== null) {\n return;\n }\n const target = resolveLabelTooltipTargetAtPoint(clientX, clientY);\n if (!target) {\n return;\n }\n showLabelTooltip(target.target, target.anchorKey, target.slotElement);\n }, dockHoverPanelOpenDelayMs);\n },\n [\n clearLabelTooltipOpenTimer,\n resolveLabelTooltipTargetAtPoint,\n showLabelTooltip\n ]\n );\n\n const beginDockIconInteraction = useCallback(\n (anchorKey: string) => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n triggerDockBounce(anchorKey);\n },\n [\n clearHoverPanelOpenTimer,\n closeHoverPanelImmediate,\n closeLabelTooltipImmediate,\n triggerDockBounce\n ]\n );\n\n const isDockEntryClickThrottled = useCallback(\n (anchorKey: string): boolean => {\n const throttledUntil =\n dockEntryClickThrottleUntilRef.current.get(anchorKey);\n return throttledUntil !== undefined && Date.now() < throttledUntil;\n },\n []\n );\n\n const claimDockEntryClick = useCallback((anchorKey: string): void => {\n dockEntryClickThrottleUntilRef.current.set(\n anchorKey,\n Date.now() + DOCK_ENTRY_CLICK_THROTTLE_MS\n );\n }, []);\n\n const beginDockMinimizedInteraction = useCallback(\n (anchorKey?: string): boolean => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n pauseDockMagnification();\n\n if (!anchorKey) {\n return false;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return false;\n }\n clearSlotMagnification(anchorKey);\n if (slotElement.dataset.collapsing === \"true\") {\n return true;\n }\n const rect = slotElement.getBoundingClientRect();\n slotElement.style.setProperty(\n \"--desktop-dock-collapse-inline-size\",\n `${rect.width}px`\n );\n slotElement.style.setProperty(\n \"--desktop-dock-collapse-block-size\",\n `${rect.height}px`\n );\n slotElement.dataset.collapsing = \"true\";\n return true;\n },\n [\n clearHoverPanelOpenTimer,\n clearLabelTooltipOpenTimer,\n clearSlotMagnification,\n closeHoverPanelImmediate,\n closeLabelTooltipImmediate,\n pauseDockMagnification\n ]\n );\n\n const runDockMinimizedLaunchAfterCollapse = useCallback(\n (\n intent: WorkbenchMinimizedDockNodeSlotRestoreIntent,\n launch: (intent: WorkbenchMinimizedDockNodeSlotRestoreIntent) => void\n ) => {\n const { anchorKey } = intent;\n beginDockMinimizedInteraction(anchorKey);\n setCollapsingMinimizedLaunchAnchorKeys((current) => {\n const next = new Set(current);\n next.add(anchorKey);\n return next;\n });\n scheduleCollapsingMinimizedLaunchClear(anchorKey);\n launch(intent);\n },\n [beginDockMinimizedInteraction, scheduleCollapsingMinimizedLaunchClear]\n );\n\n const runDockMinimizedStackLaunch = useCallback(\n (\n intent: WorkbenchMinimizedDockStackPopupCardRestoreIntent,\n launch: (\n intent: WorkbenchMinimizedDockStackPopupCardRestoreIntent\n ) => void\n ) => {\n beginDockMinimizedInteraction();\n launch(intent);\n },\n [beginDockMinimizedInteraction]\n );\n\n const handleDockPointerTravel = useCallback(\n (clientX: number, clientY: number) => {\n if (activeHoverPanelRef.current !== null) {\n closeLabelTooltipImmediate();\n if (isPointerInsideActiveHoverPanelRegion(clientX, clientY)) {\n clearHoverPanelCloseTimer();\n return;\n }\n scheduleHoverPanelClose(activeHoverPanelRef.current.entryId);\n handleDockPointerLeave();\n return;\n }\n\n const activeLabelTooltip = activeLabelTooltipRef.current;\n if (activeLabelTooltip) {\n const target = resolveLabelTooltipTargetAtPoint(clientX, clientY);\n if (target?.target.key !== activeLabelTooltip.key) {\n closeLabelTooltipImmediate(activeLabelTooltip.key);\n }\n }\n\n handleDockPointerMove(clientX, clientY);\n scheduleHoverPanelAtPointAfterRest(clientX, clientY);\n scheduleLabelTooltipAtPointAfterRest(clientX, clientY);\n },\n [\n clearHoverPanelCloseTimer,\n closeLabelTooltipImmediate,\n handleDockPointerMove,\n handleDockPointerLeave,\n isPointerInsideActiveHoverPanelRegion,\n resolveLabelTooltipTargetAtPoint,\n scheduleHoverPanelClose,\n scheduleHoverPanelAtPointAfterRest,\n scheduleLabelTooltipAtPointAfterRest\n ]\n );\n\n const updateDockScrollState = useCallback(() => {\n const scrollElement = dockItemsRef.current;\n const viewportElement = dockMeasureRef.current;\n if (!scrollElement || !viewportElement) {\n setDockScrollState((current) =>\n current.hasOverflow ||\n current.canScrollBackward ||\n current.canScrollForward\n ? {\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n }\n : current\n );\n return;\n }\n\n const isVertical = dockPlacement === \"left\";\n const viewportSize = isVertical\n ? viewportElement.clientHeight\n : viewportElement.clientWidth;\n const scrollSize = isVertical\n ? scrollElement.scrollHeight\n : scrollElement.scrollWidth;\n const scrollOffset = isVertical\n ? scrollElement.scrollTop\n : scrollElement.scrollLeft;\n const nextState = resolveWorkbenchHostDockScrollState({\n contentSize: dockWidth,\n scrollOffset,\n scrollSize,\n viewportSize\n });\n\n setDockScrollState((current) =>\n current.canScrollBackward === nextState.canScrollBackward &&\n current.canScrollForward === nextState.canScrollForward &&\n current.hasOverflow === nextState.hasOverflow\n ? current\n : nextState\n );\n }, [dockPlacement, dockWidth]);\n\n useLayoutEffect(() => {\n const element = dockItemsRef.current;\n if (!element || typeof window === \"undefined\") {\n return undefined;\n }\n\n let frameId: number | null = null;\n const scheduleUpdate = () => {\n if (isDockVisualMutationActive(dockMeasureRef.current)) {\n return;\n }\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(() => {\n frameId = null;\n updateDockScrollState();\n });\n };\n\n updateDockScrollState();\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n resizeObserver?.observe(element);\n window.addEventListener(\"resize\", scheduleUpdate);\n element.addEventListener(\"scroll\", scheduleUpdate, { passive: true });\n\n return () => {\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n element.removeEventListener(\"scroll\", scheduleUpdate);\n };\n }, [dockPlacement, presentDockItems.length, updateDockScrollState]);\n\n const hasMinimizedPreviewCapture = minimizedDockSlots.some((slot) =>\n minimizedDockSlotNodes(slot).some((node) =>\n (() => {\n if (context.genie.isPendingMinimizedDockNode(node.id)) {\n return false;\n }\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return (\n minimizedDock?.kind === \"snapshot\" &&\n Boolean(minimizedDock.capturePreview)\n );\n })()\n )\n );\n\n useEffect(() => {\n const shouldSubscribe = activePopup !== null || hasMinimizedPreviewCapture;\n if (!shouldSubscribe || !externalStateSource?.subscribe) {\n return undefined;\n }\n return externalStateSource.subscribe(() => {\n setExternalStateRevision((revision) => revision + 1);\n });\n }, [activePopup, externalStateSource, hasMinimizedPreviewCapture]);\n\n useEffect(() => {\n const nextAttentionIds = new Set<string>();\n\n for (const entry of renderedDockEntries) {\n const nextToken = entry.attentionToken ?? null;\n const previousToken =\n previousAttentionTokenByEntryId.current.get(entry.id) ?? null;\n if (nextToken !== null && nextToken !== previousToken) {\n nextAttentionIds.add(entry.id);\n }\n previousAttentionTokenByEntryId.current.set(entry.id, nextToken);\n }\n\n if (nextAttentionIds.size === 0) {\n return;\n }\n\n setActiveAttentionEntryIds((current) => {\n const next = new Set(current);\n for (const entryId of nextAttentionIds) {\n next.add(entryId);\n }\n return next;\n });\n\n for (const entryId of nextAttentionIds) {\n const existingTimeout = attentionTimeouts.current.get(entryId);\n if (existingTimeout) {\n globalThis.clearTimeout(existingTimeout);\n }\n attentionTimeouts.current.set(\n entryId,\n globalThis.setTimeout(() => {\n attentionTimeouts.current.delete(entryId);\n setActiveAttentionEntryIds((current) => {\n if (!current.has(entryId)) {\n return current;\n }\n const next = new Set(current);\n next.delete(entryId);\n return next;\n });\n }, 900)\n );\n }\n }, [renderedDockEntries]);\n\n useEffect(\n () => () => {\n for (const timeout of attentionTimeouts.current.values()) {\n globalThis.clearTimeout(timeout);\n }\n attentionTimeouts.current.clear();\n },\n []\n );\n\n const captureMinimizedNodePreview = useCallback(\n async (node: WorkbenchMinimizedDockNode) => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n const capturePreview =\n minimizedDock?.kind === \"snapshot\"\n ? minimizedDock.capturePreview\n : undefined;\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n return (\n (await Promise.resolve(\n capturePreview?.({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node\n }) ?? null\n ).catch(() => null)) ??\n (await Promise.resolve(captureNodePreviewImage?.(node) ?? null).catch(\n () => null\n ))\n );\n },\n [\n captureNodePreviewImage,\n context.focusedNodeId,\n externalStateRevision,\n externalStateSource,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n const provideMinimizedNodePreview = useCallback(\n (node: WorkbenchMinimizedDockNode): WorkbenchDockPreviewContent | null => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n if (minimizedDock?.kind !== \"component\") {\n return null;\n }\n\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n return minimizedDock.providePreview({\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node,\n previewViewport: minimizedDockPreviewViewport\n });\n },\n [\n context.focusedNodeId,\n externalStateSource,\n host,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n const provideMinimizedNodePreviewForNode = useCallback(\n (node: WorkbenchMinimizedDockNode) => {\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return minimizedDock?.kind === \"component\"\n ? provideMinimizedNodePreview\n : undefined;\n },\n [nodeDefinitions, provideMinimizedNodePreview]\n );\n\n if (dockItems.length === 0 && presentDockItems.length === 0) {\n return null;\n }\n\n const closePopup = () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n setActivePopup(null);\n setActiveHoverPanel(null);\n closeLabelTooltipImmediate();\n setActiveMinimizedStackPopup(null);\n };\n\n const scrollDockItems = (direction: WorkbenchHostDockScrollDirection) => {\n const element = dockItemsRef.current;\n if (!element) {\n return;\n }\n\n resetDockMagnification();\n closeHoverPanelImmediate();\n closeLabelTooltipImmediate();\n hoverPanelRestTargetRef.current = null;\n\n const isVertical = dockPlacement === \"left\";\n const viewportSize = isVertical\n ? element.clientHeight\n : element.clientWidth;\n const delta =\n Math.max(DOCK_ICON_PEAK_SIZE * 2, viewportSize * 0.72) *\n (direction === \"forward\" ? 1 : -1);\n\n element.scrollBy({\n behavior: \"smooth\",\n left: isVertical ? 0 : delta,\n top: isVertical ? delta : 0\n });\n };\n\n const registerDockSlot = useCallback((anchorKey: string) => {\n const existing = dockSlotRefCallbacksRef.current.get(anchorKey);\n if (existing) {\n return existing;\n }\n\n const callback = (element: HTMLElement | null) => {\n if (element) {\n slotRefs.current.set(anchorKey, element);\n wallpaperToneElementRefs.current.set(anchorKey, element);\n } else {\n slotRefs.current.delete(anchorKey);\n wallpaperToneElementRefs.current.delete(anchorKey);\n if (!dockMeasureRef.current?.hasAttribute(\"data-dock-pointer-active\")) {\n clearSlotMagnificationRef.current(anchorKey);\n }\n }\n registerDockAnchorRef.current(anchorKey, element);\n };\n dockSlotRefCallbacksRef.current.set(anchorKey, callback);\n return callback;\n }, []);\n\n const runDockEntryAction = useCallback(\n (entryId: string, actionId: string) => {\n const actionKey = dockActionKey(entryId, actionId);\n if (pendingActionKeys.has(actionKey)) {\n return;\n }\n setPendingActionKeys((current) => {\n const next = new Set(current);\n next.add(actionKey);\n return next;\n });\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId,\n entryId,\n host\n });\n } catch {\n // Keep dock action failures contained.\n } finally {\n setPendingActionKeys((current) => {\n if (!current.has(actionKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(actionKey);\n return next;\n });\n }\n })();\n },\n [host, onDockEntryAction, pendingActionKeys]\n );\n\n const popupEntry =\n activePopup === null\n ? null\n : (resolvedEntries.find(\n (entry) => entry.entry.id === activePopup.entryId\n ) ?? null);\n const activeMinimizedStackSlot =\n activeMinimizedStackPopup === null\n ? null\n : (minimizedDockSlots.find(\n (\n slot\n ): slot is Extract<WorkbenchMinimizedDockSlot, { kind: \"stack\" }> =>\n slot.kind === \"stack\"\n ) ?? null);\n const openDockContextMenuNodeIds =\n popupEntry?.matchedNodes.map((node) => node.id) ?? [];\n const dockContextMenuInstanceMode =\n popupEntry === null\n ? undefined\n : resolveDockEntryInstanceMode(popupEntry.entry, nodeDefinitions);\n const canShowAllWindowsFromDockContextMenu =\n onMissionControlRequestOpen !== undefined &&\n dockContextMenuInstanceMode === \"multi\" &&\n openDockContextMenuNodeIds.length > 1;\n const fullscreenNodeFromDockContextMenu =\n popupEntry === null\n ? null\n : resolveDockContextMenuFullscreenNode({\n focusedNodeId: context.focusedNodeId,\n minimizedNodeIDs,\n nodeDefinitions,\n nodes: popupEntry.matchedNodes\n });\n const canOpenFromDockContextMenu =\n popupEntry !== null &&\n popupEntry.matchedNodes.length === 0 &&\n resolveWorkbenchDockEntryClick({\n entry: popupEntry.entry,\n instanceMode: dockContextMenuInstanceMode,\n matchedNodes: popupEntry.matchedNodes\n }).kind === \"launch\";\n\n return (\n <div\n className=\"flex justify-center pointer-events-none\"\n data-dock-placement={dockPlacement}\n >\n <div\n className=\"desktop-dock-plate\"\n style={\n dockFrameSize === null\n ? undefined\n : ({\n \"--desktop-dock-frame-size\": `${dockFrameSize}px`\n } as WorkbenchHostDockPlateStyle)\n }\n >\n <div\n ref={dockMeasureRef}\n aria-label={i18n.t(\"dockLabel\")}\n className=\"desktop-dock\"\n data-dock-placement={dockPlacement}\n data-desktop-dock-root=\"true\"\n data-scroll-overflow={\n dockScrollState.hasOverflow ? \"true\" : undefined\n }\n data-scroll-backward={\n dockScrollState.canScrollBackward ? \"true\" : undefined\n }\n data-scroll-forward={\n dockScrollState.canScrollForward ? \"true\" : undefined\n }\n onPointerLeave={() => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate();\n closeHoverPanelImmediate();\n handleDockPointerLeave();\n flushPendingDockStateRefresh();\n }}\n onPointerMoveCapture={(event) => {\n handleDockPointerTravel(event.clientX, event.clientY);\n }}\n role=\"toolbar\"\n style={\n dockPlacement === \"left\"\n ? { height: dockWidth }\n : { width: dockWidth }\n }\n >\n <span\n className=\"desktop-dock__pointer-rail\"\n data-desktop-dock-pointer-rail=\"true\"\n aria-hidden\n />\n <button\n aria-label={i18n.t(\n dockPlacement === \"left\" ? \"scrollDockUp\" : \"scrollDockLeft\"\n )}\n className=\"desktop-dock__scroll-button desktop-dock__scroll-button--backward\"\n data-scroll-button=\"backward\"\n disabled={!dockScrollState.canScrollBackward}\n onClick={() => scrollDockItems(\"backward\")}\n type=\"button\"\n >\n {dockPlacement === \"left\" ? (\n <ChevronUpIcon size={16} />\n ) : (\n <ArrowLeftIcon size={16} />\n )}\n </button>\n <div ref={dockItemsRef} className=\"desktop-dock__items\">\n {presentDockItems.map((dockItem) => {\n if (dockItem.item.kind === \"separator\") {\n return (\n <span\n ref={registerWallpaperToneElement(dockItem.key)}\n className=\"desktop-dock__separator\"\n aria-hidden=\"true\"\n data-presence={dockItem.presence}\n data-wallpaper-tone={wallpaperTones.get(dockItem.key)}\n key={dockItem.key}\n />\n );\n }\n\n if (dockItem.item.kind === \"entry\") {\n const resolvedEntry = dockItem.item.resolvedEntry;\n const { anchorKey, entry } = resolvedEntry;\n const currentPopup =\n activePopup?.entryId === entry.id ? activePopup : null;\n const instanceMode = resolveDockEntryInstanceMode(\n entry,\n nodeDefinitions\n );\n const clickResolution = resolveWorkbenchDockEntryClick({\n entry,\n instanceMode,\n matchedNodes: resolvedEntry.matchedNodes\n });\n const hasHoverPanel = dockEntryHasHoverPanel(entry);\n const labelTooltipTarget = hasHoverPanel\n ? null\n : dockLabelTooltipTarget(`entry:${entry.id}`, entry.label);\n const dockButton = (\n <button\n aria-expanded={currentPopup ? true : undefined}\n aria-haspopup={\n clickResolution.kind === \"open-popup\"\n ? \"dialog\"\n : undefined\n }\n aria-label={i18n.t(\"launch\", { title: entry.label })}\n aria-disabled={\n clickResolution.kind === \"blocked\" ? true : undefined\n }\n className=\"desktop-dock__btn\"\n data-interactive={\n clickResolution.kind === \"blocked\" ? \"false\" : \"true\"\n }\n type=\"button\"\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n if (clickResolution.kind === \"blocked\") {\n return;\n }\n if (isDockEntryClickThrottled(anchorKey)) {\n return;\n }\n beginDockIconInteraction(anchorKey);\n }}\n onClick={(event) => {\n if (clickResolution.kind === \"blocked\") {\n return;\n }\n if (isDockEntryClickThrottled(anchorKey)) {\n return;\n }\n claimDockEntryClick(anchorKey);\n logWorkbenchDockDebug(\"dock.click\", debugDiagnostics, {\n anchorKey,\n clickResolution,\n dockDiagnostics: entry.diagnostics ?? null,\n dockNodeState: resolvedEntry.dockNodeState,\n entryId: entry.id,\n entryLaunchBehavior: entry.launchBehavior ?? \"enabled\",\n entryOrder: entry.order ?? null,\n entryState: entry.state ?? { kind: \"enabled\" },\n entryVisibility: entry.visibility ?? \"always\",\n hoverActions:\n entry.hoverActions?.map((action) => ({\n disabled: action.disabled === true,\n id: action.id,\n pending: Boolean(action.pendingLabel)\n })) ?? [],\n instanceMode: instanceMode ?? null,\n matchedNodeCount: resolvedEntry.matchedNodes.length,\n matchedNodeIds: resolvedEntry.matchedNodes.map(\n (node) => node.id\n ),\n typeId: entry.typeId,\n workspaceId\n });\n switch (clickResolution.kind) {\n case \"focus-node\":\n closePopup();\n void (async () => {\n try {\n await onDockEntryClick?.({\n entryId: entry.id,\n host,\n nodeId: clickResolution.nodeId\n });\n } catch {\n // Keep dock click failures contained.\n }\n })();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n clickResolution.nodeId,\n () => {\n host.focusNode(clickResolution.nodeId);\n }\n );\n return;\n case \"open-popup\": {\n const rect =\n event.currentTarget.getBoundingClientRect();\n logWorkbenchDockDebug(\n \"dock.popup.toggle\",\n debugDiagnostics,\n {\n anchorKey,\n entryId: entry.id,\n matchedNodeCount:\n resolvedEntry.matchedNodes.length,\n nextOpen: currentPopup === null,\n typeId: entry.typeId,\n workspaceId\n }\n );\n setActivePopup((current) =>\n current?.entryId === entry.id\n ? null\n : {\n anchorRect: {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n kind: \"preview\",\n entryId: entry.id\n }\n );\n return;\n }\n case \"action\":\n closePopup();\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId: clickResolution.actionId,\n entryId: entry.id,\n host\n });\n } catch {\n // Keep dock action failures contained.\n }\n })();\n return;\n case \"launch\":\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n entry.id,\n () =>\n host.launchNode({\n dockEntryId: entry.id,\n payload: entry.launchPayload,\n reason: \"dock\",\n typeId: entry.typeId\n })\n );\n return;\n }\n }}\n onContextMenu={(event) => {\n if (\n clickResolution.kind === \"blocked\" ||\n !dockEntryHasContextMenu(entry, resolvedEntry)\n ) {\n return;\n }\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n logWorkbenchDockDebug(\n \"dock.popup.context_menu\",\n debugDiagnostics,\n {\n anchorKey,\n entryId: entry.id,\n matchedNodeCount: resolvedEntry.matchedNodes.length,\n typeId: entry.typeId,\n workspaceId\n }\n );\n setActivePopup({\n anchorRect: {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n },\n kind: \"context-menu\",\n entryId: entry.id\n });\n }}\n >\n <span\n className=\"desktop-dock__icon-shell\"\n data-desktop-dock-icon-shell=\"true\"\n data-entry-state={entry.state?.kind ?? \"enabled\"}\n aria-hidden\n >\n <span className=\"desktop-dock__icon-content\">\n {entry.icon}\n </span>\n {renderDockBadge(\n entry,\n resolvedEntry.matchedNodes.length\n )}\n </span>\n </button>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(anchorKey)}\n className=\"desktop-dock__slot\"\n data-attention-active={\n activeAttentionEntryIds.has(entry.id) ? \"true\" : undefined\n }\n data-desktop-dock-anchor-key={anchorKey}\n data-desktop-dock-slot=\"true\"\n data-entry-state={entry.state?.kind ?? \"enabled\"}\n data-dock-hover-panel-entry-id={\n hasHoverPanel ? entry.id : undefined\n }\n data-dock-label-tooltip-key={labelTooltipTarget?.key}\n data-dock-label-tooltip-label={labelTooltipTarget?.label}\n data-icon-size={entry.iconSize ?? \"default\"}\n data-node-state={resolvedEntry.dockNodeState}\n data-popup-active={currentPopup ? \"true\" : undefined}\n data-presence={dockItem.presence}\n data-section-id={entry.sectionId}\n data-wallpaper-tone={wallpaperTones.get(anchorKey)}\n onBlur={(event) => {\n if (\n hasHoverPanel &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeHoverPanelImmediate(entry.id);\n }\n if (\n labelTooltipTarget &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n if (hasHoverPanel) {\n showHoverPanel(\n entry.id,\n anchorKey,\n event.currentTarget\n );\n return;\n }\n if (labelTooltipTarget) {\n showLabelTooltip(\n labelTooltipTarget,\n anchorKey,\n event.currentTarget\n );\n }\n }}\n onPointerEnter={() => {\n if (hasHoverPanel) {\n scheduleHoverPanelAfterRest(entry.id, anchorKey);\n return;\n }\n if (labelTooltipTarget) {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n anchorKey\n );\n }\n }}\n onPointerLeave={(event) => {\n if (!hasHoverPanel) {\n if (labelTooltipTarget) {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }\n return;\n }\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n hoverPanelRef.current?.contains(relatedTarget)\n ) {\n return;\n }\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleHoverPanelAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n return;\n }\n if (\n hoverPanelRestTargetRef.current?.anchorKey === anchorKey\n ) {\n hoverPanelRestTargetRef.current = null;\n }\n clearHoverPanelOpenTimer();\n closeHoverPanelImmediate(entry.id);\n handleDockPointerLeave();\n }}\n >\n {dockButton}\n </span>\n );\n }\n\n const slot = dockItem.item.slot;\n if (slot.kind === \"stack\") {\n const stackPopupActive =\n activeMinimizedStackPopup !== null ? true : undefined;\n const stackLabel = i18n.t(\"minimizedWindows\");\n const labelTooltipTarget = dockLabelTooltipTarget(\n `minimized-stack:${slot.anchorKey}`,\n stackLabel\n );\n const stackButton = (\n <span\n aria-expanded={stackPopupActive}\n aria-haspopup=\"dialog\"\n aria-label={stackLabel}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive=\"true\"\n role=\"button\"\n tabIndex={0}\n onKeyDown={activateDockButtonFromKeyboard}\n onPointerDown={(event) => {\n if (event.button !== 0) {\n return;\n }\n beginDockMinimizedInteraction();\n }}\n onClick={(event) => {\n setActivePopup(null);\n const rect = event.currentTarget.getBoundingClientRect();\n const dockRect =\n dockMeasureRef.current?.getBoundingClientRect();\n setActiveMinimizedStackPopup((current) =>\n current\n ? null\n : {\n dockRight: Math.max(\n rect.right,\n dockRect?.right ?? rect.right\n ),\n height: rect.height,\n left: rect.left,\n top: rect.top,\n width: rect.width\n }\n );\n }}\n >\n <span\n className=\"desktop-dock__minimized-stack-icon\"\n data-desktop-dock-icon-shell=\"true\"\n data-stack-folded={\n slot.nodes.length > 1 ? \"true\" : undefined\n }\n aria-hidden\n >\n {Array.from(\n {\n length:\n slot.nodes.length > 1\n ? 3\n : Math.min(slot.nodes.length, 1)\n },\n (_, index) => {\n const node = slot.nodes[index];\n if (index === 0 && node) {\n return (\n <WorkbenchHostDockMinimizedNodePreview\n key={minimizedDockPreviewFreezeKey(node)}\n capturePreview={captureMinimizedNodePreview}\n className={`desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index}`}\n dockPreviewCache={dockPreviewCache}\n node={node}\n providePreview={provideMinimizedNodePreviewForNode(\n node\n )}\n workspaceId={workspaceId}\n />\n );\n }\n return (\n <span\n key={`${slot.anchorKey}-stack-back-${index}`}\n aria-hidden=\"true\"\n className={`desktop-dock__minimized-preview desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index} desktop-dock__minimized-stack-layer-back`}\n />\n );\n }\n )}\n <span className=\"desktop-dock__count-badge\">\n {slot.nodes.length}\n </span>\n </span>\n </span>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(slot.anchorKey)}\n className=\"desktop-dock__slot desktop-dock__slot--minimized\"\n data-desktop-dock-anchor-key={slot.anchorKey}\n data-desktop-dock-slot=\"true\"\n data-dock-label-tooltip-key={labelTooltipTarget.key}\n data-dock-label-tooltip-label={labelTooltipTarget.label}\n data-node-state=\"minimized\"\n data-popup-active={stackPopupActive}\n data-presence={dockItem.presence}\n data-section-id=\"minimized\"\n data-stack-dispatching={\n stackDispatching ? \"true\" : undefined\n }\n data-wallpaper-tone={wallpaperTones.get(slot.anchorKey)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n showLabelTooltip(\n labelTooltipTarget,\n slot.anchorKey,\n event.currentTarget\n );\n }}\n onPointerEnter={() => {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n slot.anchorKey\n );\n }}\n onPointerLeave={(event) => {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }}\n >\n {stackButton}\n </span>\n );\n }\n\n const node = slot.node;\n const isPendingMinimizedNode =\n context.genie.isPendingMinimizedDockNode(node.id);\n const labelTooltipTarget = dockLabelTooltipTarget(\n `minimized-node:${node.id}`,\n node.title\n );\n const dockButton = (\n <span\n aria-label={i18n.t(\"launch\", { title: node.title })}\n aria-disabled={isPendingMinimizedNode ? true : undefined}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive={isPendingMinimizedNode ? \"false\" : \"true\"}\n role=\"button\"\n tabIndex={isPendingMinimizedNode ? -1 : 0}\n onKeyDown={(event) =>\n activateDockButtonFromKeyboard(\n event,\n isPendingMinimizedNode\n )\n }\n onPointerDown={(event) => {\n if (event.button !== 0 || isPendingMinimizedNode) {\n return;\n }\n const restoreIntent =\n resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId: node.id,\n slots: minimizedDockSlots,\n source: {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\"\n }\n });\n if (restoreIntent?.kind !== \"node-slot\") {\n clearCollapsingMinimizedLaunch(slot.anchorKey);\n return;\n }\n beginDockMinimizedInteraction();\n }}\n onClick={() => {\n if (isPendingMinimizedNode) {\n return;\n }\n const restoreIntent =\n resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId: node.id,\n slots: minimizedDockSlots,\n source: {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\"\n }\n });\n if (restoreIntent?.kind !== \"node-slot\") {\n clearCollapsingMinimizedLaunch(slot.anchorKey);\n return;\n }\n closePopup();\n runDockMinimizedLaunchAfterCollapse(\n restoreIntent,\n (intent) => {\n context.genie.launchNodeFromAnchor(\n intent.anchorKey,\n intent.nodeId,\n () => {\n host.focusNode(intent.nodeId);\n }\n );\n }\n );\n }}\n >\n <WorkbenchHostDockMinimizedNodePreview\n key={minimizedDockPreviewFreezeKey(node)}\n capturePreview={\n isPendingMinimizedNode\n ? undefined\n : captureMinimizedNodePreview\n }\n deferPreview={isPendingMinimizedNode}\n dockPreviewCache={\n isPendingMinimizedNode ? undefined : dockPreviewCache\n }\n node={node}\n providePreview={\n isPendingMinimizedNode\n ? undefined\n : provideMinimizedNodePreviewForNode(node)\n }\n workspaceId={workspaceId}\n />\n </span>\n );\n\n return (\n <span\n key={dockItem.key}\n ref={registerDockSlot(slot.anchorKey)}\n className=\"desktop-dock__slot desktop-dock__slot--minimized\"\n data-collapsing={\n collapsingMinimizedLaunchAnchorKeys.has(slot.anchorKey)\n ? \"true\"\n : undefined\n }\n data-desktop-dock-anchor-key={slot.anchorKey}\n data-desktop-dock-slot=\"true\"\n data-dock-label-tooltip-key={labelTooltipTarget.key}\n data-dock-label-tooltip-label={labelTooltipTarget.label}\n data-node-state=\"minimized\"\n data-pending-minimize={\n isPendingMinimizedNode ? \"true\" : undefined\n }\n data-presence={dockItem.presence}\n data-promoted-from-stack={\n promotedNodeId === node.id ? \"true\" : undefined\n }\n data-section-id=\"minimized\"\n data-wallpaper-tone={wallpaperTones.get(slot.anchorKey)}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n }\n }}\n onFocus={(event) => {\n showLabelTooltip(\n labelTooltipTarget,\n slot.anchorKey,\n event.currentTarget\n );\n }}\n onPointerEnter={() => {\n scheduleLabelTooltipAfterRest(\n labelTooltipTarget,\n slot.anchorKey\n );\n }}\n onPointerLeave={(event) => {\n clearLabelTooltipOpenTimer();\n closeLabelTooltipImmediate(labelTooltipTarget.key);\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n dockMeasureRef.current?.contains(relatedTarget)\n ) {\n scheduleLabelTooltipAtPointAfterRest(\n event.clientX,\n event.clientY\n );\n }\n }}\n >\n {dockButton}\n </span>\n );\n })}\n </div>\n <button\n aria-label={i18n.t(\n dockPlacement === \"left\" ? \"scrollDockDown\" : \"scrollDockRight\"\n )}\n className=\"desktop-dock__scroll-button desktop-dock__scroll-button--forward\"\n data-scroll-button=\"forward\"\n disabled={!dockScrollState.canScrollForward}\n onClick={() => scrollDockItems(\"forward\")}\n type=\"button\"\n >\n {dockPlacement === \"left\" ? (\n <ChevronDownIcon size={16} />\n ) : (\n <ArrowRightIcon size={16} />\n )}\n </button>\n {activeHoverPanel ? (\n <WorkbenchHostDockHoverPanel\n entry={\n resolvedEntries.find(\n (entry) => entry.entry.id === activeHoverPanel.entryId\n )?.entry ?? null\n }\n host={host}\n onDockEntryAction={onDockEntryAction}\n pendingActionKeys={pendingActionKeys}\n placement={dockPlacement}\n hoverPanelRef={hoverPanelRef}\n setPendingActionKeys={setPendingActionKeys}\n state={activeHoverPanel}\n onBlur={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n closeHoverPanelImmediate(activeHoverPanel.entryId);\n }\n }}\n onFocus={clearHoverPanelCloseTimer}\n onPointerEnter={clearHoverPanelCloseTimer}\n onPointerLeave={(event) => {\n const relatedTarget = event.relatedTarget;\n const anchorSlot = slotRefs.current.get(\n activeHoverPanel.anchorKey\n );\n if (\n relatedTarget instanceof Node &&\n anchorSlot?.contains(relatedTarget)\n ) {\n return;\n }\n scheduleHoverPanelClose(activeHoverPanel.entryId);\n handleDockPointerLeave();\n }}\n />\n ) : null}\n {activeLabelTooltip ? (\n <WorkbenchHostDockLabelTooltip\n placement={dockPlacement}\n state={activeLabelTooltip}\n />\n ) : null}\n </div>\n </div>\n {popupEntry && activePopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activePopup.anchorRect}\n placement={dockPlacement}\n canEnterFullscreen={fullscreenNodeFromDockContextMenu !== null}\n canShowAllWindows={canShowAllWindowsFromDockContextMenu}\n debugDiagnostics={debugDiagnostics}\n dockRetention={\n popupEntry.entry.dockRetention\n ? {\n checked: popupEntry.entry.dockRetention.retained,\n disabled:\n popupEntry.entry.dockRetention.disabled === true ||\n pendingActionKeys.has(\n dockActionKey(\n popupEntry.entry.id,\n popupEntry.entry.dockRetention.actionId\n )\n ),\n label: i18n.t(\n popupEntry.entry.dockRetention.retained\n ? \"dockContextMenu.removeFromDock\"\n : \"dockContextMenu.keepInDock\"\n ),\n pendingLabel: pendingActionKeys.has(\n dockActionKey(\n popupEntry.entry.id,\n popupEntry.entry.dockRetention.actionId\n )\n )\n ? popupEntry.entry.dockRetention.pendingLabel\n : undefined\n }\n : null\n }\n capturePreview={\n popupEntry.entry.capturePopupItemPreview\n ? async (item) => {\n const previewImageUrl = await Promise.resolve(\n popupEntry.entry.capturePopupItemPreview?.(item) ?? null\n ).catch(() => null);\n return previewImageUrl\n ? {\n kind: \"image\",\n revision: item.previewRevision ?? undefined,\n src: previewImageUrl\n }\n : null;\n }\n : undefined\n }\n dockPreviewCache={dockPreviewCache}\n items={popupEntry.matchedNodes\n .map((node) => {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n const item = {\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: minimizedNodeIDs.has(node.id),\n node\n };\n const descriptor =\n popupEntry.entry.resolvePopupItem?.(item) ?? {};\n const descriptorPreviewImageUrl =\n descriptor.previewImageUrl ?? null;\n const descriptorPreview =\n descriptor.preview ??\n (descriptorPreviewImageUrl\n ? ({\n kind: \"image\",\n revision: descriptor.revision ?? null,\n src: descriptorPreviewImageUrl\n } as const)\n : (popupEntry.entry.providePopupItemPreview?.(item) ?? null));\n return {\n ...item,\n preview: descriptorPreview,\n previewRevision:\n previewRevision(descriptorPreview) ??\n descriptor.revision ??\n null,\n subtitle:\n descriptor.subtitle === undefined\n ? (node.data.instanceKey ?? node.data.instanceId)\n : descriptor.subtitle,\n title:\n descriptor.title === undefined\n ? node.title\n : descriptor.title?.trim() || null\n };\n })\n .sort((left, right) => {\n if (left.isFocused !== right.isFocused) {\n return left.isFocused ? -1 : 1;\n }\n return left.node.id.localeCompare(right.node.id);\n })}\n label={popupEntry.entry.label}\n labelMode={popupEntry.entry.popupCardLabelMode}\n newWindowLabel={i18n.t(\"newWindow\")}\n openLabel={i18n.t(\"dockContextMenu.open\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n fullscreenLabel={i18n.t(\"dockContextMenu.fullscreen\")}\n hideLabel={i18n.t(\"dockContextMenu.hide\")}\n onClose={() => {\n logWorkbenchDockDebug(\n \"dock.popup.close_requested\",\n debugDiagnostics,\n {\n entryId: popupEntry.entry.id,\n itemCount: popupEntry.matchedNodes.length,\n workspaceId\n }\n );\n closePopup();\n }}\n onCloseNode={(nodeId) => {\n host.requestNodeClose(nodeId);\n const hasRemainingItems = popupEntry.matchedNodes.some(\n (node) => node.id !== nodeId\n );\n if (!hasRemainingItems) {\n closePopup();\n }\n }}\n onCreateNew={() => {\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n popupEntry.entry.id,\n () =>\n host.launchNode({\n dockEntryId: popupEntry.entry.id,\n payload: popupEntry.entry.launchPayload,\n reason: \"dock\",\n typeId: popupEntry.entry.typeId\n })\n );\n }}\n onEnterFullscreen={() => {\n if (!fullscreenNodeFromDockContextMenu) {\n return;\n }\n context.controller.commands.enterFullscreen(\n fullscreenNodeFromDockContextMenu.id\n );\n closePopup();\n }}\n onHide={() => {\n for (const node of popupEntry.matchedNodes) {\n if (!minimizedNodeIDs.has(node.id)) {\n host.minimizeNode(node.id);\n }\n }\n closePopup();\n }}\n onRunDockRetentionAction={\n popupEntry.entry.dockRetention\n ? () => {\n const dockRetention = popupEntry.entry.dockRetention;\n if (!dockRetention || dockRetention.disabled === true) {\n return;\n }\n runDockEntryAction(\n popupEntry.entry.id,\n dockRetention.actionId\n );\n closePopup();\n }\n : undefined\n }\n onSelectNode={(nodeId) => {\n closePopup();\n void (async () => {\n try {\n await onDockEntryClick?.({\n entryId: popupEntry.entry.id,\n host,\n nodeId\n });\n } catch {\n // Keep dock click failures contained.\n }\n })();\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n nodeId,\n () => {\n host.focusNode(nodeId);\n }\n );\n }}\n onShowAllWindows={() => {\n closePopup();\n for (const node of popupEntry.matchedNodes) {\n if (minimizedNodeIDs.has(node.id)) {\n context.controller.commands.restoreNode(node.id);\n }\n }\n window.requestAnimationFrame(() => {\n onMissionControlRequestOpen?.(\"activate\", {\n nodeIds: openDockContextMenuNodeIds,\n trigger: \"dock-context-menu\"\n });\n });\n }}\n onQuit={() => {\n for (const node of popupEntry.matchedNodes) {\n host.requestNodeClose(node.id);\n }\n closePopup();\n }}\n quitLabel={i18n.t(\"dockContextMenu.quit\")}\n showCreateNew={canCreateNewWindow(\n popupEntry.entry,\n dockContextMenuInstanceMode\n )}\n showOpen={canOpenFromDockContextMenu}\n showAllWindowsLabel={i18n.t(\"dockContextMenu.showAllWindows\")}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n variant={\n activePopup.kind === \"context-menu\" ? \"context-menu\" : \"default\"\n }\n />\n ) : null}\n {activeMinimizedStackSlot && activeMinimizedStackPopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activeMinimizedStackPopup}\n placement={dockPlacement}\n debugDiagnostics={debugDiagnostics}\n capturePreview={async (item) => {\n const src = await captureMinimizedNodePreview(item.node);\n return src ? { kind: \"image\", src } : null;\n }}\n dockPreviewCache={dockPreviewCache}\n items={activeMinimizedStackSlot.nodes.map((node) => {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n });\n const minimizedDock = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock;\n return {\n externalNodeState: externalState.externalNodeState,\n externalWorkspaceState: externalState.externalWorkspaceState,\n host,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: true,\n node,\n preview:\n minimizedDock?.kind === \"component\"\n ? (provideMinimizedNodePreview(node) ?? null)\n : minimizedDock?.kind === \"snapshot\" &&\n minimizedDock.capturePreview\n ? null\n : (() => {\n const previewImageUrl =\n readCachedWorkbenchNodePreviewImage(node.id);\n return previewImageUrl\n ? ({ kind: \"image\", src: previewImageUrl } as const)\n : null;\n })(),\n previewRevision: null,\n subtitle: node.data.instanceKey ?? node.data.instanceId,\n title: node.title\n };\n })}\n label={i18n.t(\"minimizedWindows\")}\n newWindowLabel={i18n.t(\"newWindow\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n onClose={() => {\n logWorkbenchDockDebug(\n \"dock.popup.close_requested\",\n debugDiagnostics,\n {\n entryId: \"minimized-stack\",\n itemCount: activeMinimizedStackSlot.nodes.length,\n workspaceId\n }\n );\n closePopup();\n }}\n onCloseNode={(nodeId) => {\n host.requestNodeClose(nodeId);\n const hasRemainingItems = activeMinimizedStackSlot.nodes.some(\n (node) => node.id !== nodeId\n );\n if (!hasRemainingItems) {\n closePopup();\n }\n }}\n onCreateNew={() => undefined}\n onSelectNode={(nodeId) => {\n const restoreIntent = resolveWorkbenchMinimizedDockRestoreIntent({\n nodeId,\n slots: minimizedDockSlots,\n source: {\n kind: \"stack-popup-card\",\n stackAnchorKey: activeMinimizedStackSlot.anchorKey\n }\n });\n if (restoreIntent?.kind !== \"stack-popup-card\") {\n return;\n }\n closePopup();\n runDockMinimizedStackLaunch(restoreIntent, (intent) => {\n context.genie.launchNodeFromAnchor(\n intent.anchorKey,\n intent.nodeId,\n () => {\n host.focusNode(intent.nodeId);\n }\n );\n });\n }}\n showCreateNew={false}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n variant=\"minimized-stack\"\n />\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchHostDockMinimizedNodePreview({\n capturePreview,\n className,\n deferPreview = false,\n dockPreviewCache,\n node,\n providePreview,\n workspaceId\n}: {\n capturePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => Promise<string | null> | string | null;\n className?: string;\n deferPreview?: boolean;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n node: WorkbenchMinimizedDockNode;\n providePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => WorkbenchDockPreviewContent | null;\n workspaceId: string;\n}) {\n const [componentPreview, setComponentPreview] = useState<\n WorkbenchDockPreviewContent | null | undefined\n >(undefined);\n const [previewImageUrl, setPreviewImageUrl] = useState<string | null>(() =>\n deferPreview || providePreview\n ? null\n : readCachedWorkbenchNodePreviewImage(node.id)\n );\n\n useEffect(() => {\n if (deferPreview || !providePreview || componentPreview !== undefined) {\n return undefined;\n }\n\n let cancelled = false;\n let frameId: number | null = null;\n let idleId: number | null = null;\n let timeoutId: ReturnType<typeof globalThis.setTimeout> | null = null;\n const setDeferredComponentPreview = () => {\n if (cancelled) {\n return;\n }\n setComponentPreview(providePreview(node) ?? null);\n };\n const scheduler = globalThis as typeof globalThis & {\n cancelIdleCallback?: (id: number) => void;\n cancelAnimationFrame?: (id: number) => void;\n requestIdleCallback?: (\n callback: () => void,\n options?: { timeout?: number }\n ) => number;\n requestAnimationFrame?: (callback: () => void) => number;\n };\n\n if (typeof scheduler.requestIdleCallback === \"function\") {\n idleId = scheduler.requestIdleCallback(setDeferredComponentPreview, {\n timeout: 250\n });\n } else if (typeof scheduler.requestAnimationFrame === \"function\") {\n frameId = scheduler.requestAnimationFrame(() => {\n frameId = null;\n timeoutId = globalThis.setTimeout(setDeferredComponentPreview, 0);\n });\n } else {\n timeoutId = globalThis.setTimeout(setDeferredComponentPreview, 0);\n }\n\n return () => {\n cancelled = true;\n if (\n idleId !== null &&\n typeof scheduler.cancelIdleCallback === \"function\"\n ) {\n scheduler.cancelIdleCallback(idleId);\n }\n if (\n frameId !== null &&\n typeof scheduler.cancelAnimationFrame === \"function\"\n ) {\n scheduler.cancelAnimationFrame(frameId);\n }\n if (timeoutId !== null) {\n globalThis.clearTimeout(timeoutId);\n }\n };\n }, [\n componentPreview,\n deferPreview,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n providePreview\n ]);\n\n useEffect(() => {\n if (deferPreview || providePreview) {\n return undefined;\n }\n\n let cancelled = false;\n const cachedPreviewImageUrl = readCachedWorkbenchNodePreviewImage(node.id);\n setPreviewImageUrl(cachedPreviewImageUrl);\n const cacheKey = resolveDockPreviewCacheKey(workspaceId, node);\n if (!cachedPreviewImageUrl && dockPreviewCache) {\n void dockPreviewCache\n .read(cacheKey)\n .catch(() => null)\n .then((persistedPreview) => {\n if (cancelled || !persistedPreview) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, persistedPreview);\n setPreviewImageUrl(persistedPreview);\n });\n }\n if (capturePreview) {\n void Promise.resolve(capturePreview(node))\n .catch(() => null)\n .then((nextPreview) => {\n if (cancelled || !nextPreview) {\n return;\n }\n writeCachedWorkbenchNodePreviewImage(node.id, nextPreview);\n dockPreviewCache?.write({\n key: cacheKey,\n previewImageUrl: nextPreview\n });\n setPreviewImageUrl(nextPreview);\n });\n }\n if (cachedPreviewImageUrl || node.isMinimized || capturePreview) {\n return () => {\n cancelled = true;\n };\n }\n void captureWorkbenchNodePreviewImage(node.id).then((nextPreview) => {\n if (!cancelled) {\n setPreviewImageUrl(nextPreview);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [\n capturePreview,\n deferPreview,\n dockPreviewCache,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n providePreview,\n workspaceId\n ]);\n\n if (deferPreview) {\n return renderMinimizedDockPreviewPlaceholder(className);\n }\n\n if (componentPreview) {\n return renderMinimizedDockPreviewContent(componentPreview, className);\n }\n\n if (previewImageUrl) {\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--snapshot\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <img\n alt=\"\"\n className=\"desktop-dock__minimized-preview-image\"\n draggable={false}\n src={previewImageUrl}\n />\n </span>\n );\n }\n\n return renderMinimizedDockPreviewPlaceholder(className);\n}\n\nfunction renderMinimizedDockPreviewPlaceholder(className?: string) {\n return (\n <span\n className={[\"desktop-dock__minimized-preview\", className]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <span className=\"desktop-dock__minimized-preview-line\" />\n <span className=\"desktop-dock__minimized-preview-line desktop-dock__minimized-preview-line--short\" />\n <span className=\"desktop-dock__minimized-preview-line desktop-dock__minimized-preview-line--accent\" />\n </span>\n );\n}\n\nexport function renderMinimizedDockPreviewContent(\n preview: WorkbenchDockPreviewContent,\n className?: string\n) {\n if (preview.kind === \"image\") {\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--snapshot\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n <img\n alt=\"\"\n className=\"desktop-dock__minimized-preview-image\"\n draggable={false}\n src={preview.src}\n />\n </span>\n );\n }\n\n return (\n <WorkbenchHostDockFrozenComponentPreview\n className={className}\n preview={preview}\n />\n );\n}\n\nfunction WorkbenchHostDockFrozenComponentPreview({\n className,\n preview\n}: {\n className?: string;\n preview: Extract<WorkbenchDockPreviewContent, { kind: \"component\" }>;\n}) {\n const sourceRef = useRef<HTMLSpanElement | null>(null);\n const [frozenMarkup, setFrozenMarkup] = useState<string | null>(null);\n\n useLayoutEffect(() => {\n if (frozenMarkup !== null) {\n return;\n }\n setFrozenMarkup(sourceRef.current?.innerHTML ?? \"\");\n }, [frozenMarkup]);\n\n return (\n <span\n className={[\n \"desktop-dock__minimized-preview\",\n \"desktop-dock__minimized-preview--component\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-hidden=\"true\"\n >\n {frozenMarkup === null ? (\n <span\n ref={sourceRef}\n className=\"desktop-dock__minimized-preview-freeze-source\"\n >\n {preview.element}\n </span>\n ) : (\n <span\n className=\"desktop-dock__minimized-preview-frozen-content\"\n dangerouslySetInnerHTML={{ __html: frozenMarkup }}\n />\n )}\n </span>\n );\n}\n\nfunction minimizedDockPreviewFreezeKey(\n node: WorkbenchMinimizedDockNode\n): string {\n return `${node.id}:${node.minimizedAtUnixMs ?? \"pending\"}`;\n}\n\nfunction dockEntryHasHoverPanel(entry: WorkbenchHostDockEntry): boolean {\n return (\n Boolean(entry.state?.reason?.trim()) ||\n (entry.hoverActions?.length ?? 0) > 0\n );\n}\n\nfunction dockEntryHasContextMenu(\n entry: WorkbenchHostDockEntry,\n resolvedEntry: ResolvedWorkbenchHostDockEntry\n): boolean {\n if (resolvedEntry.matchedNodes.length > 0 || entry.dockRetention) {\n return true;\n }\n return entry.clickActionId === undefined;\n}\n\nfunction resolveDockContextMenuFullscreenNode({\n focusedNodeId,\n minimizedNodeIDs,\n nodeDefinitions,\n nodes\n}: {\n focusedNodeId: string | null;\n minimizedNodeIDs: ReadonlySet<string>;\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}) {\n const candidates = nodes.filter((node) => {\n if (node.displayMode === \"fullscreen\" || minimizedNodeIDs.has(node.id)) {\n return false;\n }\n return (\n nodeDefinitions.get(node.data.typeId)?.window?.fullscreenable !== false\n );\n });\n return (\n candidates.find((node) => node.id === focusedNodeId) ??\n candidates[0] ??\n null\n );\n}\n\nfunction dockLabelTooltipTarget(\n key: string,\n label: string\n): WorkbenchHostDockLabelTooltipTarget {\n return { key, label: label.trim() };\n}\n\nfunction resolveDockLabelTooltipAnchorRect({\n dockPlacement,\n slotElement\n}: {\n dockPlacement: WorkbenchHostProps[\"dockPlacement\"];\n slotElement: HTMLElement;\n}): {\n height: number;\n left: number;\n top: number;\n width: number;\n} {\n const slotRect = slotElement.getBoundingClientRect();\n if (dockPlacement === \"left\") {\n return {\n height: DOCK_ICON_BASE_SIZE,\n left: slotRect.left,\n top: slotRect.top + (slotRect.height - DOCK_ICON_BASE_SIZE) / 2,\n width: DOCK_ICON_BASE_SIZE\n };\n }\n\n return {\n height: DOCK_ICON_BASE_SIZE,\n left: slotRect.left + (slotRect.width - DOCK_ICON_BASE_SIZE) / 2,\n top: slotRect.bottom - DOCK_ICON_BASE_SIZE,\n width: DOCK_ICON_BASE_SIZE\n };\n}\n\nfunction renderDockBadge(\n entry: WorkbenchHostDockEntry,\n matchedNodeCount: number\n) {\n const badge =\n entry.badge ??\n (matchedNodeCount > 1\n ? ({\n kind: \"count\",\n value: matchedNodeCount\n } as const)\n : null);\n if (!badge) {\n return null;\n }\n if (badge.kind === \"count\") {\n return <span className=\"desktop-dock__count-badge\">{badge.value}</span>;\n }\n if (badge.kind === \"custom\") {\n return <span className=\"desktop-dock__custom-badge\">{badge.content}</span>;\n }\n return (\n <span className=\"desktop-dock__status-badge\" data-status={badge.status} />\n );\n}\n\nfunction WorkbenchHostDockLabelTooltip({\n placement,\n state\n}: {\n placement: WorkbenchHostProps[\"dockPlacement\"];\n state: WorkbenchHostDockLabelTooltipState;\n}) {\n return (\n <div\n className=\"desktop-dock__label-tooltip\"\n data-dock-placement={placement}\n role=\"tooltip\"\n style={\n {\n \"--desktop-dock-label-tooltip-anchor-height\": `${state.anchorRect.height}px`,\n \"--desktop-dock-label-tooltip-anchor-left\": `${state.anchorRect.left}px`,\n \"--desktop-dock-label-tooltip-anchor-top\": `${state.anchorRect.top}px`,\n \"--desktop-dock-label-tooltip-anchor-width\": `${state.anchorRect.width}px`\n } as WorkbenchHostDockLabelTooltipStyle\n }\n >\n {state.label}\n </div>\n );\n}\n\nfunction WorkbenchHostDockHoverPanel({\n entry,\n host,\n hoverPanelRef,\n onBlur,\n onDockEntryAction,\n onFocus,\n onPointerEnter,\n onPointerLeave,\n pendingActionKeys,\n placement,\n setPendingActionKeys,\n state\n}: {\n entry: WorkbenchHostDockEntry | null;\n host: WorkbenchHostHandle;\n hoverPanelRef: RefObject<HTMLDivElement | null>;\n onDockEntryAction?: (input: {\n actionId: string;\n entryId: string;\n host: WorkbenchHostHandle;\n }) => Promise<void> | void;\n onBlur?: (event: ReactFocusEvent<HTMLDivElement>) => void;\n onFocus?: () => void;\n onPointerEnter?: () => void;\n onPointerLeave?: (event: ReactPointerEvent<HTMLDivElement>) => void;\n pendingActionKeys: Set<string>;\n placement: WorkbenchHostProps[\"dockPlacement\"];\n setPendingActionKeys: Dispatch<SetStateAction<Set<string>>>;\n state: WorkbenchHostDockHoverPanelState;\n}) {\n if (!entry) {\n return null;\n }\n\n return (\n <div\n ref={hoverPanelRef}\n className=\"desktop-dock__hover-panel\"\n data-dock-placement={placement}\n role=\"group\"\n aria-label={entry.label}\n onBlur={onBlur}\n onFocus={onFocus}\n onPointerEnter={onPointerEnter}\n onPointerLeave={onPointerLeave}\n style={\n {\n \"--desktop-dock-hover-panel-anchor-height\": `${state.anchorRect.height}px`,\n \"--desktop-dock-hover-panel-anchor-left\": `${state.anchorRect.left}px`,\n \"--desktop-dock-hover-panel-anchor-top\": `${state.anchorRect.top}px`,\n \"--desktop-dock-hover-panel-anchor-width\": `${state.anchorRect.width}px`\n } as WorkbenchHostDockHoverPanelStyle\n }\n >\n <div className=\"desktop-dock__hover-panel-title\">{entry.label}</div>\n {entry.state?.reason ? (\n <div className=\"desktop-dock__hover-panel-description\">\n {stripDockDescriptionTerminalPunctuation(entry.state.reason)}\n </div>\n ) : null}\n {entry.hoverActions?.length ? (\n <div className=\"desktop-dock__hover-actions\">\n {entry.hoverActions.map((action) => {\n const actionKey = dockActionKey(entry.id, action.id);\n const isLocallyPending = pendingActionKeys.has(actionKey);\n const isPending =\n isLocallyPending ||\n (action.disabled === true && action.pendingLabel !== undefined);\n return (\n <Button\n key={action.id}\n aria-busy={isPending ? true : undefined}\n className=\"desktop-dock__hover-action\"\n disabled={action.disabled || isLocallyPending}\n type=\"button\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (\n action.disabled === true ||\n pendingActionKeys.has(actionKey)\n ) {\n return;\n }\n setPendingActionKeys((current) => {\n const next = new Set(current);\n next.add(actionKey);\n return next;\n });\n void (async () => {\n try {\n await onDockEntryAction?.({\n actionId: action.id,\n entryId: entry.id,\n host\n });\n } catch {\n // Keep dock action failures contained.\n } finally {\n setPendingActionKeys((current) => {\n if (!current.has(actionKey)) {\n return current;\n }\n const next = new Set(current);\n next.delete(actionKey);\n return next;\n });\n }\n })();\n }}\n >\n {isPending\n ? (action.pendingLabel ?? action.label)\n : action.label}\n </Button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction resolveDockEntryInstanceMode(\n entry: WorkbenchHostDockEntry,\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>\n): WorkbenchHostNodeInstanceStrategy[\"mode\"] | undefined {\n return (\n entry.instanceMode ?? nodeDefinitions.get(entry.typeId)?.instance?.mode\n );\n}\n\nfunction canCreateNewWindow(\n entry: WorkbenchHostDockEntry,\n instanceMode: WorkbenchHostNodeInstanceStrategy[\"mode\"] | undefined\n): boolean {\n const stateKind = entry.state?.kind ?? \"enabled\";\n return (\n instanceMode === \"multi\" &&\n (entry.launchBehavior ?? \"enabled\") === \"enabled\" &&\n stateKind !== \"disabled\" &&\n stateKind !== \"loading\" &&\n stateKind !== \"unavailable\"\n );\n}\n\nfunction anchorKeyFromPopupEntry(\n entry: ResolvedWorkbenchHostDockEntry\n): string {\n return entry.anchorKey;\n}\n\nfunction previewRevision(\n preview: WorkbenchDockPreviewContent | null | undefined\n): string | null {\n return preview?.revision ?? null;\n}\n\nfunction logWorkbenchDockDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n details: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level: \"info\",\n source: \"workbench-dock\",\n workspaceId:\n typeof details.workspaceId === \"string\" ? details.workspaceId : null\n })\n ).catch(() => undefined);\n}\n\nfunction minimizedDockSlotNodes(\n slot: WorkbenchMinimizedDockSlot\n): readonly WorkbenchMinimizedDockNode[] {\n return slot.kind === \"stack\" ? slot.nodes : [slot.node];\n}\n\nfunction resolveDockPreviewCacheKey(\n workspaceId: string,\n node: WorkbenchMinimizedDockNode\n): WorkbenchDockPreviewCacheKey {\n return {\n instanceId: node.data.instanceId,\n instanceKey: node.data.instanceKey ?? null,\n nodeId: node.id,\n typeId: node.data.typeId,\n workspaceId\n };\n}\n\nfunction dockActionKey(entryId: string, actionId: string): string {\n return `${entryId}:${actionId}`;\n}\n\nfunction createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n}: {\n minimizedDockSlots: readonly WorkbenchMinimizedDockSlot[];\n resolvedEntries: readonly ResolvedWorkbenchHostDockEntry[];\n}): WorkbenchHostDockItem[] {\n const items: WorkbenchHostDockItem[] = [];\n\n for (const resolvedEntry of resolvedEntries) {\n if (resolvedEntry.sectionBreakBefore) {\n items.push({\n key: `separator:before:${resolvedEntry.entry.id}`,\n kind: \"separator\"\n });\n }\n items.push({\n key: `entry:${resolvedEntry.entry.id}`,\n kind: \"entry\",\n resolvedEntry\n });\n if (resolvedEntry.entry.separatorAfter) {\n items.push({\n key: `separator:after:${resolvedEntry.entry.id}`,\n kind: \"separator\"\n });\n }\n }\n\n if (minimizedDockSlots.length > 0 && resolvedEntries.length > 0) {\n items.push({\n key: \"separator:minimized\",\n kind: \"separator\"\n });\n }\n\n for (const slot of minimizedDockSlots) {\n items.push({\n key: `minimized:${slot.anchorKey}`,\n kind: \"minimized\",\n slot\n });\n }\n\n return items;\n}\n\nfunction resolveMinimizedDockItemNodeId(\n item: WorkbenchHostDockItem\n): string | null {\n if (item.kind !== \"minimized\" || item.slot.kind !== \"node\") {\n return null;\n }\n return item.slot.node.id;\n}\n\nfunction resolveNextDockItemPresence(\n item: WorkbenchHostDockItem,\n initialized: boolean,\n previousPresence: WorkbenchHostDockPresence | undefined,\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean\n): WorkbenchHostDockPresence {\n if (!initialized) {\n return \"present\";\n }\n\n if (item.key === \"separator:minimized\") {\n return \"present\";\n }\n\n if (item.kind === \"minimized\") {\n const nodeId = resolveMinimizedDockItemNodeId(item);\n if (nodeId && shouldAnimateMinimizedDockEnter(nodeId)) {\n if (previousPresence === \"exiting\") {\n return \"entering\";\n }\n return previousPresence ?? \"entering\";\n }\n return \"present\";\n }\n\n if (previousPresence === \"exiting\") {\n return \"entering\";\n }\n\n return previousPresence ?? \"entering\";\n}\n\nfunction resolveDockPresenceItems(input: {\n current: readonly WorkbenchHostPresentDockItem[];\n initialized: boolean;\n nextSourceItems: readonly WorkbenchHostDockItem[];\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean;\n}): WorkbenchHostPresentDockItem[] {\n const currentByKey = new Map(input.current.map((item) => [item.key, item]));\n const currentIndexByKey = new Map(\n input.current.map((item, index) => [item.key, index])\n );\n const nextByKey = new Map(\n input.nextSourceItems.map((item) => [item.key, item])\n );\n const nextKeys = new Set(input.nextSourceItems.map((item) => item.key));\n const currentVisibleItemCount = input.current.filter(\n (item) => item.presence !== \"exiting\"\n ).length;\n const shouldRetainExitingItems =\n input.nextSourceItems.length < currentVisibleItemCount;\n const emittedKeys = new Set<string>();\n const nextItems: WorkbenchHostPresentDockItem[] = [];\n let currentIndex = 0;\n\n const emitExitingUntil = (nextCurrentIndex: number) => {\n while (currentIndex < nextCurrentIndex) {\n const currentItem = input.current[currentIndex];\n currentIndex += 1;\n if (\n shouldRetainExitingItems &&\n currentItem &&\n !nextKeys.has(currentItem.key) &&\n !emittedKeys.has(currentItem.key)\n ) {\n emittedKeys.add(currentItem.key);\n nextItems.push({\n ...currentItem,\n presence: \"exiting\"\n });\n }\n }\n };\n\n for (const item of input.nextSourceItems) {\n const previousIndex = currentIndexByKey.get(item.key);\n if (previousIndex !== undefined) {\n emitExitingUntil(previousIndex);\n currentIndex = Math.max(currentIndex, previousIndex + 1);\n }\n emittedKeys.add(item.key);\n nextItems.push({\n item,\n key: item.key,\n presence: resolveNextDockItemPresence(\n item,\n input.initialized,\n currentByKey.get(item.key)?.presence,\n input.shouldAnimateMinimizedDockEnter\n )\n });\n }\n\n for (const currentItem of input.current) {\n if (shouldRetainExitingItems && !nextKeys.has(currentItem.key)) {\n if (emittedKeys.has(currentItem.key)) {\n continue;\n }\n emittedKeys.add(currentItem.key);\n nextItems.push({\n ...currentItem,\n presence: \"exiting\"\n });\n }\n }\n\n return nextItems.filter(\n (item) => nextByKey.has(item.key) || item.presence === \"exiting\"\n );\n}\n\nfunction resolveDockPresenceSettleMs(\n items: readonly WorkbenchHostPresentDockItem[]\n): number {\n if (\n items.some(\n (item) =>\n item.item.kind === \"minimized\" &&\n (item.presence === \"entering\" || item.presence === \"exiting\")\n )\n ) {\n return minimizedDockSlotLayoutAnimationMs;\n }\n return dockPresenceAnimationMs;\n}\n\nfunction useDockPresenceItems(\n items: readonly WorkbenchHostDockItem[],\n shouldAnimateMinimizedDockEnter: (nodeId: string) => boolean\n): WorkbenchHostPresentDockItem[] {\n const latestItemsByKey = useRef(new Map<string, WorkbenchHostDockItem>());\n const shouldAnimateMinimizedDockEnterRef = useRef(\n shouldAnimateMinimizedDockEnter\n );\n latestItemsByKey.current = new Map(items.map((item) => [item.key, item]));\n shouldAnimateMinimizedDockEnterRef.current = shouldAnimateMinimizedDockEnter;\n const itemKeys = items.map((item) => item.key).join(\"\\u0000\");\n const [presentItems, setPresentItems] = useState<\n WorkbenchHostPresentDockItem[]\n >(() =>\n items.map((item) => ({\n item,\n key: item.key,\n presence: \"present\" as const\n }))\n );\n const initialized = useRef(false);\n\n useEffect(() => {\n let nextSettleMs = dockPresenceAnimationMs;\n\n setPresentItems((current) => {\n const filteredItems = resolveDockPresenceItems({\n current,\n initialized: initialized.current,\n nextSourceItems: [...latestItemsByKey.current.values()],\n shouldAnimateMinimizedDockEnter:\n shouldAnimateMinimizedDockEnterRef.current\n });\n nextSettleMs = resolveDockPresenceSettleMs(filteredItems);\n return filteredItems;\n });\n initialized.current = true;\n\n const timeout = globalThis.setTimeout(() => {\n setPresentItems((current) =>\n current\n .filter((item) => item.presence !== \"exiting\")\n .map((item) =>\n item.presence === \"entering\"\n ? { ...item, presence: \"present\" as const }\n : item\n )\n );\n }, nextSettleMs);\n\n return () => globalThis.clearTimeout(timeout);\n }, [itemKeys]);\n\n const renderedPresentItems = resolveDockPresenceItems({\n current: presentItems,\n initialized: initialized.current,\n nextSourceItems: [...latestItemsByKey.current.values()],\n shouldAnimateMinimizedDockEnter\n });\n\n return renderedPresentItems.map((presentItem) => {\n const latestItem = latestItemsByKey.current.get(presentItem.key);\n return latestItem ? { ...presentItem, item: latestItem } : presentItem;\n });\n}\n\nfunction useDockWallpaperTones({\n dockItemsRef,\n elementRefs,\n itemKeys\n}: {\n dockItemsRef: RefObject<HTMLElement | null>;\n elementRefs: RefObject<Map<string, HTMLElement>>;\n itemKeys: string;\n}): ReadonlyMap<string, WorkbenchDockWallpaperTone> {\n const [tones, setTones] = useState<Map<string, WorkbenchDockWallpaperTone>>(\n () => new Map()\n );\n\n useLayoutEffect(() => {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n let canceled = false;\n let frameId: number | null = null;\n\n const updateTones = () => {\n frameId = null;\n void resolveDockWallpaperTones({\n dockItemsElement: dockItemsRef.current,\n elements: elementRefs.current\n }).then((nextTones) => {\n if (canceled) {\n return;\n }\n setTones((current) =>\n dockWallpaperToneMapsEqual(current, nextTones) ? current : nextTones\n );\n });\n };\n\n const scheduleUpdate = () => {\n if (frameId !== null) {\n return;\n }\n frameId = window.requestAnimationFrame(updateTones);\n };\n\n scheduleUpdate();\n window.addEventListener(\"resize\", scheduleUpdate);\n\n const resizeObserver =\n typeof ResizeObserver === \"undefined\"\n ? null\n : new ResizeObserver(scheduleUpdate);\n if (dockItemsRef.current) {\n resizeObserver?.observe(dockItemsRef.current);\n }\n const wallpaperElement = dockItemsRef.current\n ?.closest(\".workbench-surface\")\n ?.querySelector(\".workbench-surface__wallpaper\");\n if (wallpaperElement instanceof HTMLElement) {\n resizeObserver?.observe(wallpaperElement);\n }\n\n return () => {\n canceled = true;\n if (frameId !== null) {\n window.cancelAnimationFrame(frameId);\n }\n resizeObserver?.disconnect();\n window.removeEventListener(\"resize\", scheduleUpdate);\n };\n }, [dockItemsRef, elementRefs, itemKeys]);\n\n return tones;\n}\n\nasync function resolveDockWallpaperTones({\n dockItemsElement,\n elements\n}: {\n dockItemsElement: HTMLElement | null;\n elements: ReadonlyMap<string, HTMLElement>;\n}): Promise<Map<string, WorkbenchDockWallpaperTone>> {\n const wallpaperElement = dockItemsElement\n ?.closest(\".workbench-surface\")\n ?.querySelector(\".workbench-surface__wallpaper\");\n if (!(wallpaperElement instanceof HTMLElement)) {\n return new Map();\n }\n\n const wallpaperStyle = window.getComputedStyle(wallpaperElement);\n const wallpaperUrl = parseDockWallpaperCssUrl(wallpaperStyle.backgroundImage);\n if (!wallpaperUrl) {\n return new Map();\n }\n\n const wallpaperImage = await loadDockWallpaperImage(wallpaperUrl);\n if (!wallpaperImage) {\n return new Map();\n }\n\n const sampleCanvas = createDockWallpaperSampleCanvas(wallpaperImage);\n if (!sampleCanvas) {\n return new Map();\n }\n\n const wallpaperRect = wallpaperElement.getBoundingClientRect();\n const renderedImageRect = resolveDockWallpaperRenderedImageRect({\n containerHeight: wallpaperRect.height,\n containerWidth: wallpaperRect.width,\n imageHeight: wallpaperImage.naturalHeight,\n imageWidth: wallpaperImage.naturalWidth,\n positionX: wallpaperStyle.backgroundPositionX,\n positionY: wallpaperStyle.backgroundPositionY,\n size: wallpaperStyle.backgroundSize\n });\n const nextTones = new Map<string, WorkbenchDockWallpaperTone>();\n\n for (const [key, element] of elements) {\n const luminance = sampleDockWallpaperLuminanceAtElement({\n elementRect: element.getBoundingClientRect(),\n renderedImageRect,\n sampleCanvas,\n wallpaperRect\n });\n if (luminance === null) {\n continue;\n }\n nextTones.set(\n key,\n luminance < dockWallpaperDarkLuminanceThreshold ? \"dark\" : \"light\"\n );\n }\n\n return nextTones;\n}\n\nfunction parseDockWallpaperCssUrl(backgroundImage: string): string | null {\n const match = /^url\\((['\"]?)(.*)\\1\\)$/u.exec(backgroundImage.trim());\n return match?.[2] ? match[2] : null;\n}\n\nconst dockWallpaperImageCache = new Map<\n string,\n Promise<HTMLImageElement | null>\n>();\n\nfunction loadDockWallpaperImage(url: string): Promise<HTMLImageElement | null> {\n const cached = dockWallpaperImageCache.get(url);\n if (cached) {\n return cached;\n }\n const promise = new Promise<HTMLImageElement | null>((resolve) => {\n const image = new Image();\n image.decoding = \"async\";\n image.onload = () => resolve(image);\n image.onerror = () => resolve(null);\n image.src = url;\n });\n dockWallpaperImageCache.set(url, promise);\n return promise;\n}\n\nfunction createDockWallpaperSampleCanvas(\n image: HTMLImageElement\n): HTMLCanvasElement | null {\n if (image.naturalWidth <= 0 || image.naturalHeight <= 0) {\n return null;\n }\n const canvas = document.createElement(\"canvas\");\n const scale =\n dockWallpaperSampleCanvasMaxSizePx /\n Math.max(image.naturalWidth, image.naturalHeight);\n canvas.width = Math.max(1, Math.round(image.naturalWidth * scale));\n canvas.height = Math.max(1, Math.round(image.naturalHeight * scale));\n const context = canvas.getContext(\"2d\", { willReadFrequently: true });\n if (!context) {\n return null;\n }\n try {\n context.drawImage(image, 0, 0, canvas.width, canvas.height);\n context.getImageData(0, 0, 1, 1);\n } catch {\n return null;\n }\n return canvas;\n}\n\nfunction resolveDockWallpaperRenderedImageRect({\n containerHeight,\n containerWidth,\n imageHeight,\n imageWidth,\n positionX,\n positionY,\n size\n}: {\n containerHeight: number;\n containerWidth: number;\n imageHeight: number;\n imageWidth: number;\n positionX: string;\n positionY: string;\n size: string;\n}): { height: number; left: number; top: number; width: number } {\n const imageAspect = imageWidth / imageHeight;\n const containerAspect = containerWidth / containerHeight;\n let width = containerWidth;\n let height = containerHeight;\n\n if (size === \"cover\") {\n if (containerAspect > imageAspect) {\n height = containerWidth / imageAspect;\n } else {\n width = containerHeight * imageAspect;\n }\n } else if (size === \"contain\") {\n if (containerAspect > imageAspect) {\n width = containerHeight * imageAspect;\n } else {\n height = containerWidth / imageAspect;\n }\n } else if (size !== \"100% 100%\") {\n width = imageWidth;\n height = imageHeight;\n }\n\n return {\n height,\n left: resolveDockWallpaperPositionOffset(positionX, containerWidth - width),\n top: resolveDockWallpaperPositionOffset(\n positionY,\n containerHeight - height\n ),\n width\n };\n}\n\nfunction resolveDockWallpaperPositionOffset(\n value: string,\n availableSpace: number\n): number {\n const trimmed = value.trim();\n if (trimmed.endsWith(\"%\")) {\n const percentage = Number.parseFloat(trimmed);\n return Number.isFinite(percentage)\n ? (availableSpace * percentage) / 100\n : availableSpace / 2;\n }\n if (trimmed.endsWith(\"px\")) {\n const px = Number.parseFloat(trimmed);\n return Number.isFinite(px) ? px : availableSpace / 2;\n }\n if (trimmed === \"left\" || trimmed === \"top\") {\n return 0;\n }\n if (trimmed === \"right\" || trimmed === \"bottom\") {\n return availableSpace;\n }\n return availableSpace / 2;\n}\n\nfunction sampleDockWallpaperLuminanceAtElement({\n elementRect,\n renderedImageRect,\n sampleCanvas,\n wallpaperRect\n}: {\n elementRect: DOMRect;\n renderedImageRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n sampleCanvas: HTMLCanvasElement;\n wallpaperRect: DOMRect;\n}): number | null {\n const context = sampleCanvas.getContext(\"2d\", { willReadFrequently: true });\n if (!context) {\n return null;\n }\n const isVerticalElement = elementRect.height >= elementRect.width;\n let luminanceSum = 0;\n let samples = 0;\n\n for (let index = 0; index < dockWallpaperToneSampleCount; index += 1) {\n const ratio = index / (dockWallpaperToneSampleCount - 1);\n const clientX = isVerticalElement\n ? elementRect.left + elementRect.width / 2\n : elementRect.left + elementRect.width * ratio;\n const clientY = isVerticalElement\n ? elementRect.top + elementRect.height * ratio\n : elementRect.top + elementRect.height / 2;\n const imageX =\n (clientX - wallpaperRect.left - renderedImageRect.left) /\n renderedImageRect.width;\n const imageY =\n (clientY - wallpaperRect.top - renderedImageRect.top) /\n renderedImageRect.height;\n if (imageX < 0 || imageX > 1 || imageY < 0 || imageY > 1) {\n continue;\n }\n const canvasX = Math.min(\n sampleCanvas.width - 1,\n Math.max(0, Math.round(imageX * (sampleCanvas.width - 1)))\n );\n const canvasY = Math.min(\n sampleCanvas.height - 1,\n Math.max(0, Math.round(imageY * (sampleCanvas.height - 1)))\n );\n const pixel = context.getImageData(canvasX, canvasY, 1, 1).data;\n const red = pixel[0] ?? 0;\n const green = pixel[1] ?? 0;\n const blue = pixel[2] ?? 0;\n luminanceSum += 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n samples += 1;\n }\n\n return samples > 0 ? luminanceSum / samples : null;\n}\n\nfunction dockWallpaperToneMapsEqual(\n left: ReadonlyMap<string, WorkbenchDockWallpaperTone>,\n right: ReadonlyMap<string, WorkbenchDockWallpaperTone>\n): boolean {\n if (left.size !== right.size) {\n return false;\n }\n for (const [key, value] of left) {\n if (right.get(key) !== value) {\n return false;\n }\n }\n return true;\n}\n\nconst DOCK_BOUNCE_MS = 600;\nconst DOCK_ENTRY_CLICK_THROTTLE_MS = DOCK_BOUNCE_MS;\n\nfunction useDockBounce(slotRefs: RefObject<Map<string, HTMLElement>>) {\n const timeoutsRef = useRef(new Map<string, ReturnType<typeof setTimeout>>());\n\n const clearDockBounce = useCallback(\n (anchorKey: string): boolean => {\n const timeout = timeoutsRef.current.get(anchorKey);\n const slotElement = slotRefs.current.get(anchorKey);\n const wasBouncing = slotElement?.hasAttribute(\"data-bouncing\") === true;\n if (timeout) {\n clearTimeout(timeout);\n timeoutsRef.current.delete(anchorKey);\n }\n slotElement?.removeAttribute(\"data-bouncing\");\n return wasBouncing;\n },\n [slotRefs]\n );\n\n useEffect(\n () => () => {\n for (const anchorKey of timeoutsRef.current.keys()) {\n clearDockBounce(anchorKey);\n }\n timeoutsRef.current.clear();\n },\n [clearDockBounce]\n );\n\n const triggerDockBounce = useCallback(\n (anchorKey: string) => {\n const shouldRestartAnimation = clearDockBounce(anchorKey);\n\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return;\n }\n\n if (shouldRestartAnimation) {\n // Restart the CSS keyframes without scheduling a React render.\n void slotElement.offsetWidth;\n }\n slotElement.setAttribute(\"data-bouncing\", \"true\");\n timeoutsRef.current.set(\n anchorKey,\n setTimeout(() => {\n clearDockBounce(anchorKey);\n }, DOCK_BOUNCE_MS)\n );\n },\n [clearDockBounce, slotRefs]\n );\n\n return { triggerDockBounce };\n}\n\nfunction resolveWorkbenchHostDockItemsWidth(\n items: readonly WorkbenchHostDockItem[]\n): number {\n if (items.length === 0) {\n return dockItemsHorizontalPaddingPx;\n }\n\n const itemWidth = items.reduce(\n (sum, item) =>\n sum +\n (item.kind === \"separator\" ? dockSeparatorOuterWidthPx : dockSlotWidthPx),\n 0\n );\n const gapWidth = Math.max(0, items.length - 1) * dockItemsGapPx;\n return itemWidth + gapWidth + dockItemsHorizontalPaddingPx;\n}\n\nconst dockHoverPanelOpenDelayMs = 120;\nconst dockHoverPanelCloseDelayMs = 160;\nconst dockHoverPanelHitSlopPx = 12;\nconst dockHoverPanelBridgeSlopPx = 6;\nconst dockHoverPanelPointerRestTolerancePx = 4;\nconst dockWallpaperSampleCanvasMaxSizePx = 192;\nconst dockWallpaperToneSampleCount = 7;\nconst dockWallpaperDarkLuminanceThreshold = 132;\n\nfunction rectContainsPoint(\n rect: DOMRect,\n clientX: number,\n clientY: number,\n slopPx = 0\n): boolean {\n return (\n clientX >= rect.left - slopPx &&\n clientX <= rect.right + slopPx &&\n clientY >= rect.top - slopPx &&\n clientY <= rect.bottom + slopPx\n );\n}\n\nfunction createHoverPanelBridgeRect(anchor: DOMRect, panel: DOMRect): DOMRect {\n if (anchor.right <= panel.left || panel.right <= anchor.left) {\n const left = Math.min(anchor.right, panel.right);\n const right = Math.max(anchor.left, panel.left);\n const top = Math.max(anchor.top, panel.top);\n const bottom = Math.min(anchor.bottom, panel.bottom);\n return new DOMRect(left, top, right - left, Math.max(0, bottom - top));\n }\n\n const left = Math.max(anchor.left, panel.left);\n const right = Math.min(anchor.right, panel.right);\n const top = Math.min(anchor.bottom, panel.bottom);\n const bottom = Math.max(anchor.top, panel.top);\n return new DOMRect(left, top, Math.max(0, right - left), bottom - top);\n}\nconst dockPresenceAnimationMs = 300;\nconst minimizedDockSlotLayoutAnimationMs = 720;\nconst dockItemsGapPx = 10.8;\nconst dockItemsHorizontalPaddingPx = 12.6;\nconst dockSeparatorOuterWidthPx = 8.1;\nconst dockSlotWidthPx = 43.2;\nconst desktopDockPlateChromeWidth = 15.3;\n\ninterface WorkbenchHostDockPlateStyle extends CSSProperties {\n \"--desktop-dock-frame-size\"?: string;\n}\n\ninterface WorkbenchHostDockHoverPanelStyle extends CSSProperties {\n \"--desktop-dock-hover-panel-anchor-height\"?: string;\n \"--desktop-dock-hover-panel-anchor-left\"?: string;\n \"--desktop-dock-hover-panel-anchor-top\"?: string;\n \"--desktop-dock-hover-panel-anchor-width\"?: string;\n}\n\ninterface WorkbenchHostDockLabelTooltipStyle extends CSSProperties {\n \"--desktop-dock-label-tooltip-anchor-height\"?: string;\n \"--desktop-dock-label-tooltip-anchor-left\"?: string;\n \"--desktop-dock-label-tooltip-anchor-top\"?: string;\n \"--desktop-dock-label-tooltip-anchor-width\"?: string;\n}\n\ntype WorkbenchHostDockPresence = \"entering\" | \"exiting\" | \"present\";\ntype WorkbenchHostDockScrollDirection = \"backward\" | \"forward\";\n\ninterface WorkbenchHostDockLabelTooltipTarget {\n key: string;\n label: string;\n}\n\ninterface WorkbenchHostDockLabelTooltipState extends WorkbenchHostDockLabelTooltipTarget {\n anchorKey: string;\n anchorRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n}\n\ninterface WorkbenchHostDockHoverPanelState {\n anchorKey: string;\n anchorRect: {\n height: number;\n left: number;\n top: number;\n width: number;\n };\n entryId: string;\n}\n\ntype WorkbenchHostDockItem =\n | {\n key: string;\n kind: \"entry\";\n resolvedEntry: ResolvedWorkbenchHostDockEntry;\n }\n | {\n key: string;\n kind: \"minimized\";\n slot: WorkbenchMinimizedDockSlot;\n }\n | {\n key: string;\n kind: \"separator\";\n };\n\ninterface WorkbenchHostPresentDockItem {\n item: WorkbenchHostDockItem;\n key: string;\n presence: WorkbenchHostDockPresence;\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostDockEntry,\n WorkbenchHostNodeData,\n WorkbenchHostNodeInstanceStrategy\n} from \"./types.ts\";\n\nexport type WorkbenchHostDockNodeState = \"closed\" | \"minimized\" | \"open\";\n\nexport interface ResolvedWorkbenchHostDockEntry {\n anchorKey: string;\n dockNodeState: WorkbenchHostDockNodeState;\n entry: WorkbenchHostDockEntry;\n hasMatchingNodes: boolean;\n matchedNodes: WorkbenchNode<WorkbenchHostNodeData>[];\n sectionBreakBefore: boolean;\n}\n\nexport type WorkbenchHostDockClickResolution =\n | { actionId: string; kind: \"action\" }\n | { kind: \"blocked\" }\n | { kind: \"focus-node\"; nodeId: string }\n | { kind: \"launch\" }\n | { kind: \"open-popup\" };\n\nexport function matchWorkbenchDockEntryNode(\n entry: WorkbenchHostDockEntry,\n node: WorkbenchNode<WorkbenchHostNodeData>\n): boolean {\n if (typeof node.data.dockEntryId === \"string\") {\n return node.data.dockEntryId === entry.id;\n }\n return entry.matchNode?.(node) ?? false;\n}\n\nexport function resolveWorkbenchDockEntryAnchorKey(\n entry: WorkbenchHostDockEntry\n): string {\n return entry.anchorKey ?? entry.id;\n}\n\nexport function resolveWorkbenchDockEntries(input: {\n dockEntries: readonly WorkbenchHostDockEntry[];\n minimizedNodeIds: ReadonlySet<string>;\n nodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n}): ResolvedWorkbenchHostDockEntry[] {\n const sectionOrder = new Map<string, number>();\n let nextSectionIndex = 0;\n const sortedEntries = [...input.dockEntries]\n .map((entry, index) => {\n const sectionId = entry.sectionId ?? \"\";\n if (!sectionOrder.has(sectionId)) {\n sectionOrder.set(sectionId, nextSectionIndex++);\n }\n return {\n entry,\n index,\n sectionId\n };\n })\n .sort((left, right) => {\n const sectionOrderDelta =\n (sectionOrder.get(left.sectionId) ?? 0) -\n (sectionOrder.get(right.sectionId) ?? 0);\n if (sectionOrderDelta !== 0) {\n return sectionOrderDelta;\n }\n const orderDelta = (left.entry.order ?? 0) - (right.entry.order ?? 0);\n if (orderDelta !== 0) {\n return orderDelta;\n }\n return left.index - right.index;\n });\n\n let previousSectionId: string | null = null;\n const resolvedEntries: ResolvedWorkbenchHostDockEntry[] = [];\n\n for (const { entry, sectionId } of sortedEntries) {\n const matchedNodes = input.nodes.filter((node) =>\n matchWorkbenchDockEntryNode(entry, node)\n );\n const hasMatchingNodes = matchedNodes.length > 0;\n const visibility = entry.visibility ?? \"always\";\n if (\n visibility === \"never\" ||\n (visibility === \"when-open\" && !hasMatchingNodes)\n ) {\n continue;\n }\n\n const hasOpenNode = matchedNodes.some(\n (node) => !input.minimizedNodeIds.has(node.id)\n );\n const hasMinimizedNode = matchedNodes.some((node) =>\n input.minimizedNodeIds.has(node.id)\n );\n\n resolvedEntries.push({\n anchorKey: resolveWorkbenchDockEntryAnchorKey(entry),\n dockNodeState: hasMinimizedNode\n ? \"minimized\"\n : hasOpenNode\n ? \"open\"\n : \"closed\",\n entry,\n hasMatchingNodes,\n matchedNodes,\n sectionBreakBefore:\n previousSectionId !== null && previousSectionId !== sectionId\n });\n previousSectionId = sectionId;\n }\n\n return resolvedEntries;\n}\n\nexport function resolveWorkbenchDockEntryClick(input: {\n entry: WorkbenchHostDockEntry;\n instanceMode?: WorkbenchHostNodeInstanceStrategy[\"mode\"];\n matchedNodes: readonly WorkbenchNode<WorkbenchHostNodeData>[];\n}): WorkbenchHostDockClickResolution {\n if (input.entry.clickActionId) {\n if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\n }\n return { actionId: input.entry.clickActionId, kind: \"action\" };\n }\n if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\n }\n if (input.entry.clickBehavior === \"launch\") {\n return { kind: \"launch\" };\n }\n if (input.instanceMode === \"multi\" && input.matchedNodes.length > 0) {\n return { kind: \"open-popup\" };\n }\n if (input.matchedNodes.length === 1) {\n return { kind: \"focus-node\", nodeId: input.matchedNodes[0]!.id };\n }\n if (input.matchedNodes.length > 1) {\n return { kind: \"open-popup\" };\n }\n return { kind: \"launch\" };\n}\n\nfunction isWorkbenchDockEntryBlocked(entry: WorkbenchHostDockEntry): boolean {\n const stateKind = entry.state?.kind ?? \"enabled\";\n return (\n stateKind === \"disabled\" ||\n stateKind === \"loading\" ||\n stateKind === \"unavailable\" ||\n (entry.launchBehavior ?? \"enabled\") !== \"enabled\"\n );\n}\n","import { useCallback, useEffect, useRef, type RefObject } from \"react\";\n\nexport const DOCK_ICON_BASE_SIZE = 43.2;\nexport const DOCK_ICON_PEAK_SIZE = DOCK_ICON_BASE_SIZE * 1.7;\nexport const DOCK_MAGNIFICATION_HALF_RANGE = DOCK_ICON_BASE_SIZE * 2.4;\n\nconst DOCK_MAGNIFICATION_SPRING_MASS = 0.1;\nconst DOCK_MAGNIFICATION_SPRING_STIFFNESS = 200;\nconst DOCK_MAGNIFICATION_SPRING_DAMPING = 14;\nconst MAGNIFICATION_SETTLE_EPSILON = 0.2;\nconst MAGNIFICATION_SIZE_EPSILON = 0.2;\nconst MAX_MAGNIFICATION_STEP_SECONDS = 1 / 30;\nconst MAGNIFICATION_INFLUENCE_PADDING = 8;\nconst DOCK_MAGNIFICATION_ENTRY_RAMP_MS = 90;\nconst DOCK_MAGNIFICATION_CROSS_AXIS_PADDING = 8;\n\ninterface DockMagnificationSpring {\n value: number;\n velocity: number;\n}\n\ninterface DockMagnificationAppliedStyle {\n size: number;\n}\n\nexport interface DockMagnificationSlotRect {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\ninterface DockMagnificationHitBounds {\n crossEnd: number;\n crossStart: number;\n mainEnd: number;\n mainStart: number;\n}\n\nconst dockMagnificationShellBySlot = new WeakMap<\n HTMLElement,\n HTMLElement | null\n>();\n\nexport function mapDistanceToTargetSize(\n distance: number,\n baseSize = DOCK_ICON_BASE_SIZE,\n peakSize = DOCK_ICON_PEAK_SIZE,\n halfRange = DOCK_MAGNIFICATION_HALF_RANGE\n): number {\n const absoluteDistance = Math.abs(distance);\n if (absoluteDistance >= halfRange) {\n return baseSize;\n }\n\n const influence = 1 - absoluteDistance / halfRange;\n return baseSize + (peakSize - baseSize) * influence;\n}\n\nexport function applyDockMagnificationEntryRamp(\n targetSize: number,\n baseSize: number,\n progress: number\n): number {\n const clampedProgress = Math.min(1, Math.max(0, progress));\n return baseSize + (targetSize - baseSize) * clampedProgress;\n}\n\nexport function resolveDockMagnificationHitBounds(\n slotRects: readonly DockMagnificationSlotRect[],\n dockPlacement: \"bottom\" | \"left\",\n crossAxisPadding = DOCK_MAGNIFICATION_CROSS_AXIS_PADDING\n): DockMagnificationHitBounds | null {\n if (slotRects.length === 0) {\n return null;\n }\n\n let mainStart = Number.POSITIVE_INFINITY;\n let mainEnd = Number.NEGATIVE_INFINITY;\n let crossStart = Number.POSITIVE_INFINITY;\n let crossEnd = Number.NEGATIVE_INFINITY;\n\n for (const rect of slotRects) {\n if (dockPlacement === \"left\") {\n mainStart = Math.min(mainStart, rect.top);\n mainEnd = Math.max(mainEnd, rect.bottom);\n crossStart = Math.min(crossStart, rect.left);\n crossEnd = Math.max(crossEnd, rect.right);\n } else {\n mainStart = Math.min(mainStart, rect.left);\n mainEnd = Math.max(mainEnd, rect.right);\n crossStart = Math.min(crossStart, rect.top);\n crossEnd = Math.max(crossEnd, rect.bottom);\n }\n }\n\n const effectiveCrossAxisEndPadding =\n dockPlacement === \"left\"\n ? crossAxisPadding + (DOCK_ICON_PEAK_SIZE - DOCK_ICON_BASE_SIZE)\n : crossAxisPadding;\n\n return {\n crossEnd: crossEnd + effectiveCrossAxisEndPadding,\n crossStart: crossStart - crossAxisPadding,\n mainEnd,\n mainStart\n };\n}\n\nfunction isDockMagnificationPointInsideHitBounds({\n clientX,\n clientY,\n dockPlacement,\n hitBounds\n}: {\n clientX: number;\n clientY: number;\n dockPlacement: \"bottom\" | \"left\";\n hitBounds: DockMagnificationHitBounds | null;\n}): boolean {\n if (!hitBounds) {\n return false;\n }\n\n const mainAxis = dockPlacement === \"left\" ? clientY : clientX;\n const crossAxis = dockPlacement === \"left\" ? clientX : clientY;\n return (\n mainAxis >= hitBounds.mainStart &&\n mainAxis <= hitBounds.mainEnd &&\n crossAxis >= hitBounds.crossStart &&\n crossAxis <= hitBounds.crossEnd\n );\n}\n\nexport function resolveDockMagnificationSlotCenter(\n rect: DockMagnificationSlotRect,\n dockPlacement: \"bottom\" | \"left\",\n baseSize = DOCK_ICON_BASE_SIZE\n): number {\n return dockPlacement === \"left\"\n ? rect.top + baseSize / 2\n : rect.left + baseSize / 2;\n}\n\nconst DOCK_MAGNIFICATION_SPRING_SUBSTEPS = 8;\n\nexport function advanceDockMagnificationSpring(\n current: DockMagnificationSpring,\n target: number,\n deltaSeconds: number\n): DockMagnificationSpring {\n const subDeltaSeconds = deltaSeconds / DOCK_MAGNIFICATION_SPRING_SUBSTEPS;\n let { value, velocity } = current;\n\n for (let step = 0; step < DOCK_MAGNIFICATION_SPRING_SUBSTEPS; step += 1) {\n const force =\n -DOCK_MAGNIFICATION_SPRING_STIFFNESS * (value - target) -\n DOCK_MAGNIFICATION_SPRING_DAMPING * velocity;\n const acceleration = force / DOCK_MAGNIFICATION_SPRING_MASS;\n velocity += acceleration * subDeltaSeconds;\n value += velocity * subDeltaSeconds;\n }\n\n return { value, velocity };\n}\n\nexport function isDockMagnificationSpringSettled(\n spring: DockMagnificationSpring,\n target: number\n): boolean {\n return (\n Math.abs(spring.value - target) <= MAGNIFICATION_SETTLE_EPSILON &&\n Math.abs(spring.velocity) <= MAGNIFICATION_SETTLE_EPSILON\n );\n}\n\nfunction roundDockMagnificationSize(size: number): number {\n return Math.round(size * 10) / 10;\n}\n\nfunction hasAppliedSizeChanged(\n previous: DockMagnificationAppliedStyle | undefined,\n next: DockMagnificationAppliedStyle\n): boolean {\n if (!previous) {\n return true;\n }\n\n return Math.abs(previous.size - next.size) > MAGNIFICATION_SIZE_EPSILON;\n}\n\nexport function resolveDockMagnificationSlotLayoutSize({\n size\n}: {\n size: number;\n}): { height: number; width: number } {\n return { height: size, width: size };\n}\n\nexport function isDockMagnificationSlotLayoutLocked(\n slotElement: HTMLElement\n): boolean {\n return (\n slotElement.dataset.collapsing === \"true\" ||\n slotElement.dataset.presence === \"entering\" ||\n slotElement.dataset.presence === \"exiting\"\n );\n}\n\nfunction resolveDockMagnificationShell(\n slotElement: HTMLElement\n): HTMLElement | null {\n const cachedShell = dockMagnificationShellBySlot.get(slotElement);\n if (\n cachedShell !== undefined &&\n (cachedShell === null || slotElement.contains(cachedShell))\n ) {\n return cachedShell;\n }\n\n const shell =\n slotElement.querySelector<HTMLElement>(\"[data-desktop-dock-icon-shell]\") ??\n slotElement.querySelector<HTMLElement>(\n \".desktop-dock__minimized-preview\"\n ) ??\n slotElement.querySelector<HTMLElement>(\n \".desktop-dock__minimized-stack-icon\"\n );\n dockMagnificationShellBySlot.set(slotElement, shell);\n return shell;\n}\n\nfunction applyDockSlotMagnification(\n slotElement: HTMLElement,\n size: number,\n baseSize: number,\n appliedStylesRef: Map<string, DockMagnificationAppliedStyle>\n): void {\n const anchorKey = slotElement.dataset.desktopDockAnchorKey;\n if (!anchorKey) {\n return;\n }\n\n const shell = resolveDockMagnificationShell(slotElement);\n if (!shell) {\n return;\n }\n\n const nextStyle = {\n size: roundDockMagnificationSize(size)\n };\n\n if (!hasAppliedSizeChanged(appliedStylesRef.get(anchorKey), nextStyle)) {\n return;\n }\n\n appliedStylesRef.set(anchorKey, nextStyle);\n\n if (Math.abs(nextStyle.size - baseSize) <= MAGNIFICATION_SIZE_EPSILON) {\n slotElement.style.removeProperty(\"width\");\n slotElement.style.removeProperty(\"height\");\n shell.style.removeProperty(\"transform\");\n return;\n }\n\n const scale = nextStyle.size / baseSize;\n const layoutSize = resolveDockMagnificationSlotLayoutSize({\n size: nextStyle.size\n });\n slotElement.style.width = `${layoutSize.width}px`;\n slotElement.style.height = `${layoutSize.height}px`;\n shell.style.transform = `scale(${scale})`;\n}\n\nfunction clearDockSlotMagnification(\n slotElement: HTMLElement,\n appliedStylesRef: Map<string, DockMagnificationAppliedStyle>\n): void {\n const anchorKey = slotElement.dataset.desktopDockAnchorKey;\n if (anchorKey) {\n appliedStylesRef.delete(anchorKey);\n }\n slotElement.style.removeProperty(\"width\");\n slotElement.style.removeProperty(\"height\");\n const shell = resolveDockMagnificationShell(slotElement);\n shell?.style.removeProperty(\"transform\");\n}\n\nexport function useDockMagnification({\n dockPlacement,\n dockRootRef,\n slotRefs\n}: {\n dockPlacement: \"bottom\" | \"left\";\n dockRootRef: RefObject<HTMLElement | null>;\n slotRefs: RefObject<Map<string, HTMLElement>>;\n}) {\n const pointerAxisRef = useRef<number | null>(null);\n const pendingPointerAxisRef = useRef<number | null>(null);\n const springsRef = useRef(new Map<string, DockMagnificationSpring>());\n const appliedStylesRef = useRef(\n new Map<string, DockMagnificationAppliedStyle>()\n );\n const animationFrameRef = useRef<number | null>(null);\n const lastFrameTimeRef = useRef<number | null>(null);\n const entryRampStartedAtRef = useRef<number | null>(null);\n const restCentersRef = useRef<Map<string, number> | null>(null);\n const hitBoundsRef = useRef<DockMagnificationHitBounds | null>(null);\n const slotOrderRef = useRef<string[]>([]);\n const magnifyActiveRef = useRef(false);\n\n const setMagnifyActive = useCallback(\n (active: boolean) => {\n if (magnifyActiveRef.current === active) {\n return;\n }\n magnifyActiveRef.current = active;\n if (active) {\n dockRootRef.current?.setAttribute(\"data-dock-pointer-active\", \"true\");\n } else {\n dockRootRef.current?.removeAttribute(\"data-dock-pointer-active\");\n }\n },\n [dockRootRef]\n );\n\n const stopAnimation = useCallback(() => {\n if (animationFrameRef.current !== null) {\n cancelAnimationFrame(animationFrameRef.current);\n animationFrameRef.current = null;\n }\n lastFrameTimeRef.current = null;\n }, []);\n\n const captureRestCenters = useCallback(() => {\n const slots = slotRefs.current;\n const centers = new Map<string, number>();\n const slotRects: DockMagnificationSlotRect[] = [];\n const order: string[] = [];\n for (const [anchorKey, slotElement] of slots) {\n order.push(anchorKey);\n const rect = slotElement.getBoundingClientRect();\n slotRects.push({\n bottom: rect.bottom,\n left: rect.left,\n right: rect.right,\n top: rect.top\n });\n const center = resolveDockMagnificationSlotCenter(rect, dockPlacement);\n centers.set(anchorKey, center);\n }\n slotOrderRef.current = order;\n hitBoundsRef.current = resolveDockMagnificationHitBounds(\n slotRects,\n dockPlacement\n );\n restCentersRef.current = centers;\n }, [dockPlacement, slotRefs]);\n\n const runAnimationFrame = useCallback(\n (frameTime: number) => {\n if (pendingPointerAxisRef.current !== null) {\n pointerAxisRef.current = pendingPointerAxisRef.current;\n }\n\n const pointerAxis = pointerAxisRef.current;\n if (pointerAxis !== null) {\n captureRestCenters();\n entryRampStartedAtRef.current ??= frameTime;\n }\n const slots = slotRefs.current;\n const order = slotOrderRef.current;\n const previousFrameTime = lastFrameTimeRef.current;\n lastFrameTimeRef.current = frameTime;\n const deltaSeconds =\n previousFrameTime === null\n ? 1 / 60\n : Math.min(\n (frameTime - previousFrameTime) / 1000,\n MAX_MAGNIFICATION_STEP_SECONDS\n );\n\n let shouldContinue = false;\n let allSettled = true;\n const influenceRadius =\n DOCK_MAGNIFICATION_HALF_RANGE + MAGNIFICATION_INFLUENCE_PADDING;\n const entryRampProgress =\n pointerAxis === null || entryRampStartedAtRef.current === null\n ? 1\n : (frameTime - entryRampStartedAtRef.current) /\n DOCK_MAGNIFICATION_ENTRY_RAMP_MS;\n\n for (let index = 0; index < order.length; index += 1) {\n const anchorKey = order[index];\n if (!anchorKey) {\n continue;\n }\n\n const center = restCentersRef.current?.get(anchorKey);\n if (center === undefined) {\n continue;\n }\n\n const distance =\n pointerAxis === null\n ? DOCK_MAGNIFICATION_HALF_RANGE\n : pointerAxis - center;\n const absoluteDistance = Math.abs(distance);\n const inRange = absoluteDistance < influenceRadius;\n const targetSize = inRange\n ? applyDockMagnificationEntryRamp(\n mapDistanceToTargetSize(distance),\n DOCK_ICON_BASE_SIZE,\n entryRampProgress\n )\n : DOCK_ICON_BASE_SIZE;\n\n const currentSpring = springsRef.current.get(anchorKey) ?? {\n value: DOCK_ICON_BASE_SIZE,\n velocity: 0\n };\n const nextSpring =\n inRange ||\n !isDockMagnificationSpringSettled(currentSpring, DOCK_ICON_BASE_SIZE)\n ? advanceDockMagnificationSpring(\n currentSpring,\n targetSize,\n deltaSeconds\n )\n : currentSpring;\n\n if (\n !inRange &&\n isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n springsRef.current.delete(anchorKey);\n const slotElement = slots.get(anchorKey);\n if (slotElement) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n continue;\n }\n\n springsRef.current.set(anchorKey, nextSpring);\n\n const settled = isDockMagnificationSpringSettled(\n nextSpring,\n targetSize\n );\n if (!settled) {\n shouldContinue = true;\n }\n if (\n !isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n allSettled = false;\n }\n\n const slotElement = slots.get(anchorKey);\n if (!slotElement) {\n continue;\n }\n\n if (isDockMagnificationSlotLayoutLocked(slotElement)) {\n springsRef.current.delete(anchorKey);\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n continue;\n }\n\n if (\n pointerAxis === null &&\n isDockMagnificationSpringSettled(nextSpring, DOCK_ICON_BASE_SIZE)\n ) {\n springsRef.current.delete(anchorKey);\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n continue;\n }\n\n applyDockSlotMagnification(\n slotElement,\n nextSpring.value,\n DOCK_ICON_BASE_SIZE,\n appliedStylesRef.current\n );\n }\n\n if (pointerAxis !== null) {\n shouldContinue = true;\n } else if (!allSettled) {\n shouldContinue = true;\n }\n\n if (pointerAxis === null && allSettled) {\n entryRampStartedAtRef.current = null;\n restCentersRef.current = null;\n hitBoundsRef.current = null;\n slotOrderRef.current = [];\n setMagnifyActive(false);\n }\n\n if (shouldContinue) {\n animationFrameRef.current = requestAnimationFrame(runAnimationFrame);\n return;\n }\n\n animationFrameRef.current = null;\n lastFrameTimeRef.current = null;\n },\n [captureRestCenters, setMagnifyActive, slotRefs]\n );\n\n const scheduleAnimation = useCallback(() => {\n if (animationFrameRef.current !== null) {\n return;\n }\n animationFrameRef.current = requestAnimationFrame(runAnimationFrame);\n }, [runAnimationFrame]);\n\n const handlePointerMove = useCallback(\n (clientX: number, clientY: number) => {\n if (restCentersRef.current === null) {\n captureRestCenters();\n }\n\n if (\n !isDockMagnificationPointInsideHitBounds({\n clientX,\n clientY,\n dockPlacement,\n hitBounds: hitBoundsRef.current\n })\n ) {\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n scheduleAnimation();\n return;\n }\n\n pendingPointerAxisRef.current =\n dockPlacement === \"left\" ? clientY : clientX;\n if (!magnifyActiveRef.current) {\n setMagnifyActive(true);\n }\n scheduleAnimation();\n },\n [captureRestCenters, dockPlacement, scheduleAnimation, setMagnifyActive]\n );\n\n const handlePointerLeave = useCallback(() => {\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n scheduleAnimation();\n }, [scheduleAnimation]);\n\n const clearSlotMagnification = useCallback(\n (anchorKey: string) => {\n springsRef.current.delete(anchorKey);\n restCentersRef.current?.delete(anchorKey);\n appliedStylesRef.current.delete(anchorKey);\n hitBoundsRef.current = null;\n slotOrderRef.current = slotOrderRef.current.filter(\n (key) => key !== anchorKey\n );\n const slotElement = slotRefs.current.get(anchorKey);\n if (slotElement) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n },\n [slotRefs]\n );\n\n const pauseMagnification = useCallback(() => {\n stopAnimation();\n pendingPointerAxisRef.current = null;\n pointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n lastFrameTimeRef.current = null;\n }, [stopAnimation]);\n\n const resetMagnification = useCallback(() => {\n stopAnimation();\n for (const slotElement of slotRefs.current.values()) {\n clearDockSlotMagnification(slotElement, appliedStylesRef.current);\n }\n springsRef.current.clear();\n appliedStylesRef.current.clear();\n restCentersRef.current = null;\n hitBoundsRef.current = null;\n slotOrderRef.current = [];\n pointerAxisRef.current = null;\n pendingPointerAxisRef.current = null;\n entryRampStartedAtRef.current = null;\n setMagnifyActive(false);\n }, [setMagnifyActive, slotRefs, stopAnimation]);\n\n useEffect(\n () => () => {\n resetMagnification();\n },\n [resetMagnification]\n );\n\n return {\n clearSlotMagnification,\n handlePointerLeave,\n handlePointerMove,\n pauseMagnification,\n resetMagnification\n };\n}\n","export interface WorkbenchHostDockScrollState {\n canScrollBackward: boolean;\n canScrollForward: boolean;\n hasOverflow: boolean;\n}\n\nexport interface ResolveWorkbenchHostDockScrollStateInput {\n contentSize: number;\n scrollOffset: number;\n scrollSize: number;\n viewportSize: number;\n}\n\nconst dockScrollOverflowEpsilonPx = 1;\n\nexport function resolveWorkbenchHostDockScrollState({\n contentSize,\n scrollOffset,\n scrollSize,\n viewportSize\n}: ResolveWorkbenchHostDockScrollStateInput): WorkbenchHostDockScrollState {\n const hasOverflow = contentSize > viewportSize + dockScrollOverflowEpsilonPx;\n if (!hasOverflow) {\n return {\n canScrollBackward: false,\n canScrollForward: false,\n hasOverflow: false\n };\n }\n\n const maxScrollOffset = Math.max(\n 0,\n Math.max(scrollSize, contentSize) - viewportSize\n );\n\n return {\n canScrollBackward: scrollOffset > dockScrollOverflowEpsilonPx,\n canScrollForward:\n scrollOffset < maxScrollOffset - dockScrollOverflowEpsilonPx,\n hasOverflow\n };\n}\n","import type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition\n} from \"./types.ts\";\n\nexport const workbenchMinimizedDockVisibleSlotLimit = 5;\nexport const workbenchMinimizedDockStackedVisibleNodeCount = 4;\nexport const workbenchMinimizedDockStackAnchorKey = \"minimized-stack\";\n\nexport type WorkbenchMinimizedDockNode = WorkbenchNode<WorkbenchHostNodeData>;\n\nexport type WorkbenchMinimizedDockSlot =\n | {\n anchorKey: string;\n kind: \"node\";\n node: WorkbenchMinimizedDockNode;\n }\n | {\n anchorKey: string;\n kind: \"stack\";\n nodes: WorkbenchMinimizedDockNode[];\n };\n\nexport function resolveWorkbenchMinimizedDockNodeAnchorKey(\n nodeId: string\n): string {\n return `minimized:${nodeId}`;\n}\n\nexport function resolveWorkbenchMinimizedDockSlots(input: {\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}): WorkbenchMinimizedDockSlot[] {\n const minimizedNodes = orderWorkbenchMinimizedDockNodes(input);\n if (minimizedNodes.length === 0) {\n return [];\n }\n if (minimizedNodes.length <= workbenchMinimizedDockVisibleSlotLimit) {\n return minimizedNodes.map((node) => ({\n anchorKey: resolveWorkbenchMinimizedDockNodeAnchorKey(node.id),\n kind: \"node\",\n node\n }));\n }\n\n return [\n ...minimizedNodes\n .slice(0, workbenchMinimizedDockStackedVisibleNodeCount)\n .map((node) => ({\n anchorKey: resolveWorkbenchMinimizedDockNodeAnchorKey(node.id),\n kind: \"node\" as const,\n node\n })),\n {\n anchorKey: workbenchMinimizedDockStackAnchorKey,\n kind: \"stack\",\n nodes: minimizedNodes.slice(workbenchMinimizedDockStackedVisibleNodeCount)\n }\n ];\n}\n\nexport function resolveWorkbenchMinimizedDockAnchorKeyForNode(input: {\n nodeId: string;\n slots: readonly WorkbenchMinimizedDockSlot[];\n}): string | null {\n for (const slot of input.slots) {\n if (slot.kind === \"node\" && slot.node.id === input.nodeId) {\n return slot.anchorKey;\n }\n if (\n slot.kind === \"stack\" &&\n slot.nodes.some((node) => node.id === input.nodeId)\n ) {\n return slot.anchorKey;\n }\n }\n return null;\n}\n\nexport function isWorkbenchMinimizedDockEligibleNode(input: {\n node: WorkbenchMinimizedDockNode;\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n}): boolean {\n const definition = input.nodeDefinitions.get(input.node.data.typeId);\n return definition?.window?.minimizedDock !== undefined;\n}\n\nfunction orderWorkbenchMinimizedDockNodes(input: {\n nodeDefinitions: ReadonlyMap<string, WorkbenchHostNodeDefinition>;\n nodes: readonly WorkbenchMinimizedDockNode[];\n}): WorkbenchMinimizedDockNode[] {\n return input.nodes\n .map((node, index) => ({ index, node }))\n .filter(\n ({ node }) =>\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitions\n })\n )\n .sort((left, right) => {\n const leftTime = left.node.minimizedAtUnixMs ?? 0;\n const rightTime = right.node.minimizedAtUnixMs ?? 0;\n if (leftTime !== rightTime) {\n return rightTime - leftTime;\n }\n return right.index - left.index;\n })\n .map(({ node }) => node);\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { WorkbenchMinimizedDockSlot } from \"./minimizedDockSlots.ts\";\n\nexport const minimizedDockStackPromotionDurationMs = 520;\n\nexport function detectMinimizedDockStackPromotion(\n previous: readonly WorkbenchMinimizedDockSlot[],\n next: readonly WorkbenchMinimizedDockSlot[]\n): string | null {\n const previousVisibleNodeIds = new Set(\n previous\n .filter(\n (slot): slot is Extract<WorkbenchMinimizedDockSlot, { kind: \"node\" }> =>\n slot.kind === \"node\"\n )\n .map((slot) => slot.node.id)\n );\n const previousStackNodeIds =\n previous\n .find((slot) => slot.kind === \"stack\")\n ?.nodes.map((node) => node.id) ?? [];\n\n for (const slot of next) {\n if (slot.kind !== \"node\") {\n continue;\n }\n if (\n !previousVisibleNodeIds.has(slot.node.id) &&\n previousStackNodeIds.includes(slot.node.id)\n ) {\n return slot.node.id;\n }\n }\n\n return null;\n}\n\nexport function useMinimizedDockStackPromotion(\n slots: readonly WorkbenchMinimizedDockSlot[]\n) {\n const previousSlotsRef = useRef(slots);\n const promotionTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [promotedNodeId, setPromotedNodeId] = useState<string | null>(null);\n const [stackDispatching, setStackDispatching] = useState(false);\n\n useEffect(() => {\n const promotedNodeId = detectMinimizedDockStackPromotion(\n previousSlotsRef.current,\n slots\n );\n previousSlotsRef.current = slots;\n\n if (!promotedNodeId) {\n return undefined;\n }\n\n setPromotedNodeId(promotedNodeId);\n setStackDispatching(true);\n if (promotionTimerRef.current !== null) {\n clearTimeout(promotionTimerRef.current);\n }\n promotionTimerRef.current = setTimeout(() => {\n promotionTimerRef.current = null;\n setPromotedNodeId(null);\n setStackDispatching(false);\n }, minimizedDockStackPromotionDurationMs);\n\n return () => {\n if (promotionTimerRef.current !== null) {\n clearTimeout(promotionTimerRef.current);\n promotionTimerRef.current = null;\n }\n };\n }, [slots]);\n\n return { promotedNodeId, stackDispatching };\n}\n","import type { WorkbenchMinimizedDockSlot } from \"./minimizedDockSlots.ts\";\n\nexport type WorkbenchMinimizedDockRestoreIntent =\n | {\n anchorKey: string;\n kind: \"node-slot\";\n nodeId: string;\n }\n | {\n anchorKey: string;\n kind: \"stack-popup-card\";\n nodeId: string;\n stackAnchorKey: string;\n };\n\nexport type WorkbenchMinimizedDockRestoreSource =\n | {\n anchorKey: string;\n kind: \"node-slot\";\n }\n | {\n kind: \"stack-popup-card\";\n stackAnchorKey: string;\n };\n\nexport function resolveWorkbenchMinimizedDockRestoreIntent(input: {\n nodeId: string;\n slots: readonly WorkbenchMinimizedDockSlot[];\n source: WorkbenchMinimizedDockRestoreSource;\n}): WorkbenchMinimizedDockRestoreIntent | null {\n const { source } = input;\n switch (source.kind) {\n case \"node-slot\": {\n const slot = input.slots.find(\n (slot) => slot.anchorKey === source.anchorKey\n );\n if (slot?.kind !== \"node\" || slot.node.id !== input.nodeId) {\n return null;\n }\n return {\n anchorKey: slot.anchorKey,\n kind: \"node-slot\",\n nodeId: input.nodeId\n };\n }\n\n case \"stack-popup-card\": {\n const slot = input.slots.find(\n (slot) => slot.anchorKey === source.stackAnchorKey\n );\n if (\n slot?.kind !== \"stack\" ||\n !slot.nodes.some((node) => node.id === input.nodeId)\n ) {\n return null;\n }\n return {\n anchorKey: slot.anchorKey,\n kind: \"stack-popup-card\",\n nodeId: input.nodeId,\n stackAnchorKey: slot.anchorKey\n };\n }\n }\n}\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Button,\n CheckIcon,\n CloseIcon,\n FileCreateIcon,\n MaximizeIcon,\n MinimizeIcon,\n OverviewLayoutIcon,\n PinFilledIcon,\n PinIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport {\n captureWorkbenchNodePreviewImage,\n writeCachedWorkbenchNodePreviewImage\n} from \"../react/useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockPreviewContent,\n WorkbenchHostDockPopupCardLabelMode,\n WorkbenchHostHandle,\n WorkbenchHostNodeData,\n WorkbenchHostProps\n} from \"./types.ts\";\nimport type { WorkbenchDockPlacement } from \"../react/types.ts\";\nimport {\n resolveInitialMinimizedStackScrollOffset,\n resolveMinimizedStackLeftGutterPx,\n resolveMinimizedStackPanelWidthPx,\n resolveMinimizedStackPopupLeftPx,\n resolveMinimizedStackPopupTopPx,\n resolveMinimizedStackTrackHeightPx,\n resolveMinimizedStackTrackTranslateXPx,\n resolveMinimizedStackViewportHeightPx\n} from \"./minimizedStackScroll.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"../react/dockPreviewCache.ts\";\n\nconst dockPopupCardWidthPx = 165;\nconst dockPopupGridGapPx = 8;\nconst dockPopupPanelPaddingInlinePx = 12;\nconst dockPopupPanelBorderInlinePx = 2;\nconst dockPopupPlacementGapPx = 14;\nconst dockPopupMinimizedStackLaunchDisappearMs = 0;\nconst dockPopupMinimizedStackPopupZIndex = 100300;\nconst dockPopupPreviewCacheMaxEntries = 64;\nconst dockPopupPreviewByMemoryKey = new Map<\n string,\n WorkbenchHostDockPopupCapturedPreview\n>();\nconst pendingDockPopupPreviewMemoryKeys = new Set<string>();\n\ntype WorkbenchHostDockPopupCapturedPreview = {\n preview: WorkbenchDockPreviewContent | null;\n revision: string | null;\n};\n\ntype WorkbenchHostDockPopupPreviewState =\n | {\n preview: WorkbenchDockPreviewContent;\n status: \"ready\";\n }\n | {\n status: \"loading\" | \"fallback\";\n };\n\nexport interface WorkbenchHostDockPopupAnchorRect {\n dockRight?: number;\n height: number;\n left: number;\n top: number;\n width: number;\n}\n\nexport interface WorkbenchHostDockPopupState {\n anchorRect: WorkbenchHostDockPopupAnchorRect;\n entryId: string;\n kind: \"context-menu\" | \"preview\";\n}\n\nexport interface WorkbenchHostDockPopupItem {\n externalNodeState?: unknown;\n externalWorkspaceState?: unknown;\n host: WorkbenchHostHandle;\n isFocused: boolean;\n isMinimized: boolean;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n preview: WorkbenchDockPreviewContent | null;\n previewRevision: string | null;\n subtitle: string | null;\n title: string | null;\n}\n\nexport type WorkbenchHostDockPopupVariant =\n | \"context-menu\"\n | \"default\"\n | \"minimized-stack\";\n\nexport interface WorkbenchHostDockPopupRetentionAction {\n checked: boolean;\n disabled?: boolean;\n label: string;\n pendingLabel?: string;\n}\n\ninterface WorkbenchHostDockPopupCardStyle extends CSSProperties {\n \"--desktop-dock-popup-card-lift\"?: string;\n \"--desktop-dock-popup-card-scale\"?: string;\n \"--desktop-dock-popup-card-z-index\"?: string;\n \"--desktop-dock-popup-fan-delay\"?: string;\n \"--desktop-dock-popup-fan-rotate\"?: string;\n \"--desktop-dock-popup-fan-x\"?: string;\n \"--desktop-dock-popup-fan-y\"?: string;\n}\n\ninterface WorkbenchHostDockPopupRootStyle extends CSSProperties {\n \"--desktop-dock-minimized-stack-width\"?: string;\n \"--desktop-dock-popup-columns\": string;\n \"--desktop-dock-popup-width\": string;\n}\n\nconst popupCardMagnificationRange = 160;\nconst popupCardMaxScale = 1.16;\nconst popupCardMaxLiftPx = 10;\n\nfunction resolvePopupCardMagnificationStyle(\n pointer: { x: number; y: number } | null,\n element: HTMLElement | null\n): WorkbenchHostDockPopupCardStyle | undefined {\n if (!pointer || !element) {\n return undefined;\n }\n\n const rect = element.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n const distance = Math.hypot(pointer.x - centerX, pointer.y - centerY);\n const influence = Math.max(0, 1 - distance / popupCardMagnificationRange);\n if (influence <= 0) {\n return undefined;\n }\n\n const eased = influence * influence * (3 - 2 * influence);\n const scale = 1 + (popupCardMaxScale - 1) * eased;\n const lift = -popupCardMaxLiftPx * eased;\n return {\n \"--desktop-dock-popup-card-lift\": `${Math.round(lift * 10) / 10}px`,\n \"--desktop-dock-popup-card-scale\": `${Math.round(scale * 1000) / 1000}`,\n \"--desktop-dock-popup-card-z-index\": `${Math.round(1 + influence * 20)}`\n };\n}\n\nfunction resolvePopupFanCardStyle(\n index: number,\n count: number,\n placement: WorkbenchDockPlacement\n): WorkbenchHostDockPopupCardStyle {\n const safeCount = Math.max(1, count);\n const cappedIndex = Math.min(index, safeCount - 1);\n const arcDirection = placement === \"left\" ? -1 : 1;\n const arcX = cappedIndex * 6 * arcDirection;\n const arcY = -18 - cappedIndex * 78;\n const rotateDeg = (-2 + cappedIndex * 0.8) * arcDirection;\n\n return {\n \"--desktop-dock-popup-fan-delay\": `${index * 22}ms`,\n \"--desktop-dock-popup-fan-rotate\": `${Math.round(rotateDeg * 10) / 10}deg`,\n \"--desktop-dock-popup-fan-x\": `${Math.round(arcX)}px`,\n \"--desktop-dock-popup-fan-y\": `${Math.round(arcY)}px`\n };\n}\n\nfunction readDockPopupPreviewImage(\n memoryKey: string\n): WorkbenchHostDockPopupCapturedPreview | undefined {\n return dockPopupPreviewByMemoryKey.get(memoryKey);\n}\n\nfunction writeDockPopupPreviewImage(\n memoryKey: string,\n preview: WorkbenchDockPreviewContent | null,\n revision: string | null\n): void {\n dockPopupPreviewByMemoryKey.delete(memoryKey);\n dockPopupPreviewByMemoryKey.set(memoryKey, { preview, revision });\n while (dockPopupPreviewByMemoryKey.size > dockPopupPreviewCacheMaxEntries) {\n const oldestMemoryKey = dockPopupPreviewByMemoryKey.keys().next().value;\n if (typeof oldestMemoryKey !== \"string\") {\n break;\n }\n dockPopupPreviewByMemoryKey.delete(oldestMemoryKey);\n }\n}\n\nexport function WorkbenchHostDockPopup({\n anchorRect,\n canEnterFullscreen,\n canShowAllWindows,\n capturePreview,\n debugDiagnostics,\n dockRetention,\n dockPreviewCache,\n fullscreenLabel,\n hideLabel,\n items,\n label,\n labelMode,\n newWindowLabel,\n closeWindowLabel,\n onClose,\n onCloseNode,\n onCreateNew,\n onEnterFullscreen,\n onHide,\n onRunDockRetentionAction,\n onSelectNode,\n onShowAllWindows,\n openLabel,\n onQuit,\n placement = \"bottom\",\n quitLabel,\n resolveDockPreviewCacheKey,\n showAllWindowsLabel,\n showCreateNew,\n showOpen,\n variant\n}: {\n anchorRect: WorkbenchHostDockPopupState[\"anchorRect\"];\n canEnterFullscreen?: boolean;\n canShowAllWindows?: boolean;\n capturePreview?: (\n item: WorkbenchHostDockPopupItem\n ) =>\n | Promise<WorkbenchDockPreviewContent | string | null>\n | WorkbenchDockPreviewContent\n | string\n | null;\n debugDiagnostics?: WorkbenchHostProps[\"debugDiagnostics\"];\n dockRetention?: WorkbenchHostDockPopupRetentionAction | null;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n fullscreenLabel?: string;\n hideLabel?: string;\n items: WorkbenchHostDockPopupItem[];\n label: string;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n newWindowLabel: string;\n closeWindowLabel: (title: string) => string;\n onClose: () => void;\n onCloseNode: (nodeId: string) => void;\n onCreateNew: () => void;\n onEnterFullscreen?: () => void;\n onHide?: () => void;\n onRunDockRetentionAction?: () => void;\n onSelectNode: (nodeId: string) => void;\n onShowAllWindows?: () => void;\n openLabel?: string;\n onQuit?: () => void;\n placement?: WorkbenchDockPlacement;\n quitLabel?: string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<WorkbenchHostNodeData>;\n showAllWindowsLabel?: string;\n showCreateNew?: boolean;\n showOpen?: boolean;\n variant?: WorkbenchHostDockPopupVariant;\n}) {\n const resolvedLabelMode = labelMode ?? \"hover-overlay\";\n const resolvedVariant = variant ?? \"default\";\n const isMinimizedStack = resolvedVariant === \"minimized-stack\";\n const isContextMenu = resolvedVariant === \"context-menu\";\n const createCardCount = showCreateNew === false ? 0 : 1;\n const cardElementsRef = useRef(new Map<string, HTMLElement>());\n const cardRefCallbacksRef = useRef(\n new Map<string, (element: HTMLElement | null) => void>()\n );\n const popupRootRef = useRef<HTMLDivElement | null>(null);\n const minimizedStackViewportRef = useRef<HTMLDivElement | null>(null);\n const [pointer, setPointer] = useState<{ x: number; y: number } | null>(null);\n const [minimizedStackScrollOffset, setMinimizedStackScrollOffset] =\n useState(0);\n const [capturedPreviewByMemoryKey, setCapturedPreviewByMemoryKey] = useState<\n Record<string, WorkbenchHostDockPopupCapturedPreview | undefined>\n >({});\n const columnCount = isContextMenu\n ? 1\n : Math.min(Math.max(items.length + createCardCount, 1), 3);\n const popupWidthPx = isContextMenu\n ? 268\n : columnCount * dockPopupCardWidthPx +\n Math.max(0, columnCount - 1) * dockPopupGridGapPx +\n dockPopupPanelPaddingInlinePx * 2 +\n dockPopupPanelBorderInlinePx;\n const popupCenterY = anchorRect.top + anchorRect.height / 2;\n const isLeftMinimizedStack = placement === \"left\" && isMinimizedStack;\n const minimizedStackTrackHeightPx = resolveMinimizedStackTrackHeightPx(\n items.length\n );\n const minimizedStackViewportHeightPx = isMinimizedStack\n ? resolveMinimizedStackViewportHeightPx({\n anchorCenterY: popupCenterY,\n placement,\n trackHeightPx: minimizedStackTrackHeightPx\n })\n : minimizedStackTrackHeightPx;\n const minimizedStackTrackTranslateXPx = isMinimizedStack\n ? resolveMinimizedStackTrackTranslateXPx({\n itemCount: items.length,\n placement,\n scrollOffset: minimizedStackScrollOffset,\n trackHeightPx: minimizedStackTrackHeightPx,\n viewportHeightPx: minimizedStackViewportHeightPx\n })\n : 0;\n const minimizedStackLeftGutterPx = isLeftMinimizedStack\n ? resolveMinimizedStackLeftGutterPx({\n itemCount: items.length,\n placement,\n scrollOffset: minimizedStackScrollOffset,\n trackHeightPx: minimizedStackTrackHeightPx,\n viewportHeightPx: minimizedStackViewportHeightPx,\n trackTranslateXPx: minimizedStackTrackTranslateXPx\n })\n : 0;\n const minimizedStackPanelWidthPx = isLeftMinimizedStack\n ? resolveMinimizedStackPanelWidthPx(items.length, placement, {\n leftGutterPx: minimizedStackLeftGutterPx\n })\n : null;\n const popupStyle: WorkbenchHostDockPopupRootStyle = {\n \"--desktop-dock-popup-columns\": String(columnCount),\n \"--desktop-dock-popup-width\":\n minimizedStackPanelWidthPx != null\n ? `${minimizedStackPanelWidthPx}px`\n : `${popupWidthPx}px`,\n ...(minimizedStackPanelWidthPx != null\n ? {\n \"--desktop-dock-minimized-stack-width\": `${minimizedStackPanelWidthPx}px`,\n minWidth: minimizedStackPanelWidthPx,\n width: minimizedStackPanelWidthPx\n }\n : {}),\n left: isLeftMinimizedStack\n ? resolveMinimizedStackPopupLeftPx({\n anchorLeft: anchorRect.left,\n anchorWidth: anchorRect.width,\n dockRightPx: anchorRect.dockRight,\n leftGutterPx: minimizedStackLeftGutterPx\n })\n : placement === \"left\"\n ? anchorRect.left + anchorRect.width + dockPopupPlacementGapPx\n : anchorRect.left + anchorRect.width / 2,\n top: isLeftMinimizedStack\n ? resolveMinimizedStackPopupTopPx({ anchorTop: anchorRect.top })\n : placement === \"left\"\n ? popupCenterY\n : anchorRect.top - dockPopupPlacementGapPx,\n ...(isLeftMinimizedStack\n ? { zIndex: dockPopupMinimizedStackPopupZIndex }\n : {})\n };\n const minimizedStackMaxScrollOffset = Math.max(\n 0,\n minimizedStackTrackHeightPx - minimizedStackViewportHeightPx\n );\n const initialMinimizedStackScrollOffset =\n resolveInitialMinimizedStackScrollOffset({\n maxScrollOffset: minimizedStackMaxScrollOffset\n });\n const panelStyle: CSSProperties = {\n \"--desktop-dock-popup-columns\": String(columnCount),\n \"--desktop-dock-popup-item-count\": String(Math.max(1, items.length)),\n ...(isMinimizedStack\n ? {\n height: minimizedStackViewportHeightPx,\n minHeight: minimizedStackViewportHeightPx,\n ...(isLeftMinimizedStack && minimizedStackPanelWidthPx != null\n ? {\n width: minimizedStackPanelWidthPx,\n minWidth: minimizedStackPanelWidthPx,\n \"--desktop-dock-minimized-stack-left-gutter\": `${minimizedStackLeftGutterPx}px`\n }\n : {})\n }\n : {})\n } as CSSProperties;\n const popupDiagnosticKey = items.map((item) => item.node.id).join(\"|\");\n\n useEffect(() => {\n logWorkbenchDockPopupDebug(\"dock.popup.rendered\", debugDiagnostics, {\n hasCapturePreview: Boolean(capturePreview),\n itemCount: popupDiagnosticKey ? popupDiagnosticKey.split(\"|\").length : 0,\n nodeIds: popupDiagnosticKey ? popupDiagnosticKey.split(\"|\") : [],\n placement,\n variant: resolvedVariant\n });\n }, [\n capturePreview,\n debugDiagnostics,\n placement,\n popupDiagnosticKey,\n resolvedVariant\n ]);\n\n useLayoutEffect(() => {\n const rootElement = popupRootRef.current;\n const panelElement =\n rootElement?.querySelector<HTMLElement>(\n \"[data-desktop-dock-popup-panel]\"\n ) ?? null;\n logWorkbenchDockPopupDebug(\"dock.popup.layout\", debugDiagnostics, {\n panelRect: panelElement ? rectToDiagnostic(panelElement) : null,\n rootRect: rootElement ? rectToDiagnostic(rootElement) : null,\n rootStyle: rootElement ? styleToDiagnostic(rootElement) : null,\n viewportHeight: window.innerHeight,\n viewportWidth: window.innerWidth\n });\n }, [debugDiagnostics, popupDiagnosticKey]);\n\n const registerCard = useCallback((nodeId: string) => {\n const existing = cardRefCallbacksRef.current.get(nodeId);\n if (existing) {\n return existing;\n }\n\n const callback = (element: HTMLElement | null) => {\n if (element) {\n cardElementsRef.current.set(nodeId, element);\n } else {\n cardElementsRef.current.delete(nodeId);\n }\n };\n cardRefCallbacksRef.current.set(nodeId, callback);\n return callback;\n }, []);\n\n useEffect(() => {\n if (!isLeftMinimizedStack) {\n return;\n }\n document.body.setAttribute(\n \"data-desktop-dock-minimized-stack-open\",\n \"true\"\n );\n return () => {\n document.body.removeAttribute(\"data-desktop-dock-minimized-stack-open\");\n };\n }, [isLeftMinimizedStack]);\n\n useEffect(() => {\n const handlePointerDown = (event: PointerEvent) => {\n if (!(event.target instanceof Element)) {\n onClose();\n return;\n }\n if (\n event.target.closest(\"[data-desktop-dock-slot]\") ||\n event.target.closest(\"[data-desktop-dock-popup-card]\") ||\n event.target.closest(\n '.desktop-dock-popup-root:not([data-popup-variant=\"minimized-stack\"])'\n )\n ) {\n return;\n }\n onClose();\n };\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n window.addEventListener(\"pointerdown\", handlePointerDown, true);\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"pointerdown\", handlePointerDown, true);\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [onClose]);\n\n const previewCaptureKey = items\n .map(\n (item) =>\n `${item.node.id}:${previewCacheToken(item.preview)}:${item.previewRevision ?? \"\"}`\n )\n .join(\"|\");\n\n useEffect(() => {\n if (!isMinimizedStack) {\n return;\n }\n setMinimizedStackScrollOffset(initialMinimizedStackScrollOffset);\n }, [initialMinimizedStackScrollOffset, isMinimizedStack, items.length]);\n\n useEffect(() => {\n if (!isMinimizedStack) {\n return;\n }\n const viewport = minimizedStackViewportRef.current;\n if (!viewport) {\n return;\n }\n const handleWheel = (event: WheelEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setMinimizedStackScrollOffset((current) =>\n Math.min(\n minimizedStackMaxScrollOffset,\n Math.max(0, current + event.deltaY)\n )\n );\n };\n viewport.addEventListener(\"wheel\", handleWheel, { passive: false });\n return () => viewport.removeEventListener(\"wheel\", handleWheel);\n }, [isMinimizedStack, minimizedStackMaxScrollOffset]);\n\n useEffect(() => {\n if (!capturePreview || isContextMenu) {\n return;\n }\n let cancelled = false;\n const missingItems = items.filter((item) => {\n const revision = item.previewRevision;\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] ??\n readDockPopupPreviewImage(previewMemoryKey);\n const hasCapturedPreview =\n capturedPreview !== undefined && capturedPreview.revision === revision;\n const shouldCaptureMissingPreview = !item.preview && !hasCapturedPreview;\n return (\n shouldCaptureMissingPreview &&\n !pendingDockPopupPreviewMemoryKeys.has(previewMemoryKey)\n );\n });\n if (missingItems.length === 0) {\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.batch\",\n debugDiagnostics,\n {\n itemCount: items.length,\n missingNodeIds: []\n }\n );\n return () => {\n cancelled = true;\n };\n }\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.batch\",\n debugDiagnostics,\n {\n itemCount: items.length,\n missingNodeIds: missingItems.map((item) => item.node.id)\n }\n );\n\n for (const item of missingItems) {\n pendingDockPopupPreviewMemoryKeys.add(\n resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n )\n );\n }\n\n void (async () => {\n for (const item of missingItems) {\n if (cancelled) {\n break;\n }\n\n const revision = item.previewRevision;\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.started\",\n debugDiagnostics,\n {\n isMinimized: item.isMinimized,\n nodeId: item.node.id,\n revision\n }\n );\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const cacheKey = resolveDockPopupPreviewCacheKey(\n resolveDockPreviewCacheKey?.(item.node) ?? null,\n revision\n );\n if (item.isMinimized && cacheKey) {\n const minimizedPersistedPreview = await readPersistedDockPreview(\n dockPreviewCache,\n cacheKey\n );\n if (cancelled) {\n break;\n }\n if (minimizedPersistedPreview) {\n const persistedPreview: WorkbenchDockPreviewContent = {\n kind: \"image\",\n src: minimizedPersistedPreview\n };\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n minimizedPersistedPreview\n );\n writeDockPopupPreviewImage(\n previewMemoryKey,\n persistedPreview,\n revision\n );\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: {\n preview: persistedPreview,\n revision\n }\n }));\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n continue;\n }\n }\n\n const preview = normalizeDockPopupPreviewContentResult(\n item.isMinimized\n ? ((await capturePreview?.(item)) ??\n (await captureWorkbenchNodePreviewImage(item.node.id, {\n bypassCache: false\n })))\n : await Promise.resolve(capturePreview?.(item) ?? null).catch(\n () => null\n ),\n revision\n );\n if (cancelled) {\n break;\n }\n logWorkbenchDockPopupDebug(\n \"dock.popup.preview_capture.resolved\",\n debugDiagnostics,\n {\n hasPreview: Boolean(preview),\n nodeId: item.node.id,\n providerRevision: preview?.revision ?? null,\n revision\n }\n );\n if (preview) {\n if (preview.kind === \"image\") {\n writeCachedWorkbenchNodePreviewImage(item.node.id, preview.src);\n }\n writeDockPopupPreviewImage(previewMemoryKey, preview, revision);\n if (cacheKey && preview.kind === \"image\") {\n dockPreviewCache?.write({\n key: cacheKey,\n previewImageUrl: preview.src\n });\n }\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: { preview, revision }\n }));\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n continue;\n }\n\n const fallbackPersistedPreview =\n !item.isMinimized && cacheKey\n ? await readPersistedDockPreview(dockPreviewCache, cacheKey)\n : null;\n if (cancelled) {\n break;\n }\n if (fallbackPersistedPreview) {\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n fallbackPersistedPreview\n );\n }\n if (fallbackPersistedPreview || item.isMinimized) {\n const fallbackPreview: WorkbenchDockPreviewContent | null =\n fallbackPersistedPreview\n ? { kind: \"image\", src: fallbackPersistedPreview }\n : null;\n writeDockPopupPreviewImage(\n previewMemoryKey,\n fallbackPreview,\n revision\n );\n }\n if (!cancelled) {\n const fallbackPreview: WorkbenchDockPreviewContent | null =\n fallbackPersistedPreview\n ? { kind: \"image\", src: fallbackPersistedPreview }\n : null;\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n [previewMemoryKey]: { preview: fallbackPreview, revision }\n }));\n }\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n }\n })().catch(() => {\n for (const item of missingItems) {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n writeDockPopupPreviewImage(\n previewMemoryKey,\n null,\n item.previewRevision\n );\n pendingDockPopupPreviewMemoryKeys.delete(previewMemoryKey);\n }\n if (!cancelled) {\n setCapturedPreviewByMemoryKey((current) => ({\n ...current,\n ...Object.fromEntries(\n missingItems.map((item) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n return [\n previewMemoryKey,\n { preview: null, revision: item.previewRevision }\n ];\n })\n )\n }));\n }\n });\n\n return () => {\n cancelled = true;\n for (const item of missingItems) {\n pendingDockPopupPreviewMemoryKeys.delete(\n resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n )\n );\n }\n };\n }, [\n capturePreview,\n dockPreviewCache,\n isContextMenu,\n items,\n previewCaptureKey,\n resolveDockPreviewCacheKey\n ]);\n\n const content = (\n <div\n ref={popupRootRef}\n className=\"desktop-dock-popup-root\"\n data-dock-placement={placement}\n data-desktop-dock-popup-root=\"true\"\n data-popup-variant={resolvedVariant}\n style={popupStyle}\n >\n <div\n aria-label={label}\n className={cn(\n \"desktop-dock-popup relative origin-bottom rounded-lg border border-[var(--border-1)] bg-background-fronted text-[var(--text-primary)] shadow-panel motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-95 motion-safe:slide-in-from-bottom-2 motion-safe:duration-[175ms] motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:animate-none\",\n isContextMenu ? \"p-1\" : \"p-3\",\n isLeftMinimizedStack\n ? \"w-full min-w-0 max-w-none\"\n : \"w-[min(var(--desktop-dock-popup-width,366px),calc(100vw-32px))]\"\n )}\n data-desktop-dock-popup-panel=\"true\"\n data-popup-variant={resolvedVariant}\n onPointerDown={(event) => event.stopPropagation()}\n onPointerMove={\n isMinimizedStack\n ? (event) => setPointer({ x: event.clientX, y: event.clientY })\n : undefined\n }\n onPointerLeave={isMinimizedStack ? () => setPointer(null) : undefined}\n role=\"dialog\"\n style={panelStyle}\n >\n {isContextMenu ? (\n <WorkbenchHostDockContextMenu\n canCreateNew={showCreateNew !== false}\n canEnterFullscreen={canEnterFullscreen === true}\n canShowAllWindows={canShowAllWindows === true}\n dockRetention={dockRetention}\n fullscreenLabel={fullscreenLabel}\n hideLabel={hideLabel}\n items={items}\n newWindowLabel={newWindowLabel}\n onCreateNew={onCreateNew}\n onEnterFullscreen={onEnterFullscreen}\n onHide={onHide}\n onQuit={onQuit}\n onRunDockRetentionAction={onRunDockRetentionAction}\n onSelectNode={onSelectNode}\n onShowAllWindows={onShowAllWindows}\n openLabel={openLabel}\n quitLabel={quitLabel}\n showAllWindowsLabel={showAllWindowsLabel}\n showOpen={showOpen === true}\n />\n ) : (\n <>\n <div className=\"mb-2.5 flex items-center justify-between\">\n <span className=\"min-w-0 truncate text-sm font-semibold\">\n {label}\n </span>\n </div>\n {isMinimizedStack ? (\n <div\n ref={minimizedStackViewportRef}\n className=\"desktop-dock-popup__minimized-stack-viewport\"\n style={{\n height: minimizedStackViewportHeightPx,\n ...(isLeftMinimizedStack\n ? { paddingLeft: minimizedStackLeftGutterPx }\n : {})\n }}\n >\n <div\n className=\"desktop-dock-popup__minimized-stack-track\"\n style={{\n minHeight: minimizedStackTrackHeightPx,\n transform: `translate(${minimizedStackTrackTranslateXPx}px, ${-minimizedStackScrollOffset}px)`\n }}\n >\n {items.map((item, index) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] !== undefined\n ? capturedPreviewByMemoryKey[previewMemoryKey]\n : readDockPopupPreviewImage(previewMemoryKey);\n const previewState = resolveDockPopupItemPreviewState(\n item,\n capturedPreview,\n Boolean(capturePreview)\n );\n return (\n <WorkbenchHostDockPopupCard\n key={item.node.id}\n ref={registerCard(item.node.id)}\n closeWindowLabel={closeWindowLabel}\n item={item}\n labelMode={resolvedLabelMode}\n onCloseNode={onCloseNode}\n onSelectNode={onSelectNode}\n previewState={previewState}\n style={{\n ...resolvePopupFanCardStyle(\n index,\n items.length,\n placement\n ),\n ...resolvePopupCardMagnificationStyle(\n pointer,\n cardElementsRef.current.get(item.node.id) ?? null\n )\n }}\n variant={resolvedVariant}\n />\n );\n })}\n </div>\n </div>\n ) : (\n <div className=\"grid max-h-[min(52vh,420px)] grid-cols-[repeat(var(--desktop-dock-popup-columns,2),165px)] gap-2 overflow-auto overscroll-contain\">\n {items.map((item) => {\n const previewMemoryKey = resolveDockPopupPreviewMemoryKey(\n item.node,\n resolveDockPreviewCacheKey?.(item.node) ?? null\n );\n const capturedPreview =\n capturedPreviewByMemoryKey[previewMemoryKey] !== undefined\n ? capturedPreviewByMemoryKey[previewMemoryKey]\n : readDockPopupPreviewImage(previewMemoryKey);\n const previewState = resolveDockPopupItemPreviewState(\n item,\n capturedPreview,\n Boolean(capturePreview)\n );\n return (\n <WorkbenchHostDockPopupCard\n key={item.node.id}\n ref={registerCard(item.node.id)}\n closeWindowLabel={closeWindowLabel}\n item={item}\n labelMode={resolvedLabelMode}\n onCloseNode={onCloseNode}\n onSelectNode={onSelectNode}\n previewState={previewState}\n variant={resolvedVariant}\n />\n );\n })}\n {showCreateNew !== false ? (\n <button\n className=\"flex h-[103px] w-[165px] min-w-0 flex-col items-center justify-center gap-2 rounded-[8px] border border-dashed border-[var(--border-1)] bg-transparency-block text-center text-[var(--text-secondary)] transition-colors hover:bg-transparency-hover hover:text-[var(--text-primary)]\"\n type=\"button\"\n onClick={onCreateNew}\n >\n <FileCreateIcon\n aria-hidden=\"true\"\n className=\"text-[var(--text-primary)]\"\n size={28}\n />\n <span className=\"text-xs font-semibold text-[var(--text-primary)]\">\n {newWindowLabel}\n </span>\n </button>\n ) : null}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n\n if (typeof document === \"undefined\" || !document.body) {\n return content;\n }\n return createPortal(content, document.body);\n}\n\nfunction WorkbenchHostDockContextMenu({\n canCreateNew,\n canEnterFullscreen,\n canShowAllWindows,\n dockRetention,\n fullscreenLabel,\n hideLabel,\n items,\n newWindowLabel,\n onCreateNew,\n onEnterFullscreen,\n onHide,\n onQuit,\n onRunDockRetentionAction,\n onSelectNode,\n onShowAllWindows,\n openLabel,\n quitLabel,\n showAllWindowsLabel,\n showOpen\n}: {\n canCreateNew: boolean;\n canEnterFullscreen: boolean;\n canShowAllWindows: boolean;\n dockRetention?: WorkbenchHostDockPopupRetentionAction | null;\n fullscreenLabel?: string;\n hideLabel?: string;\n items: WorkbenchHostDockPopupItem[];\n newWindowLabel: string;\n onCreateNew: () => void;\n onEnterFullscreen?: () => void;\n onHide?: () => void;\n onQuit?: () => void;\n onRunDockRetentionAction?: () => void;\n onSelectNode: (nodeId: string) => void;\n onShowAllWindows?: () => void;\n openLabel?: string;\n quitLabel?: string;\n showAllWindowsLabel?: string;\n showOpen: boolean;\n}) {\n const hasOpenWindows = items.length > 0;\n const hasNewWindowCommand = hasOpenWindows && canCreateNew;\n const hasOpenCommand = !hasOpenWindows;\n const hasDockActionGroup =\n Boolean(dockRetention) || hasNewWindowCommand || hasOpenCommand;\n const hasWindowActionGroup = hasOpenWindows;\n\n return (\n <div\n className=\"flex min-w-0 flex-col gap-1\"\n data-desktop-dock-context-menu=\"true\"\n role=\"menu\"\n >\n {hasOpenWindows ? (\n <>\n <div className=\"max-h-48 min-w-0 overflow-auto overscroll-contain\">\n {items.map((item) => (\n <WorkbenchHostDockContextMenuItem\n key={item.node.id}\n checked={!item.isMinimized}\n label={item.title?.trim() || item.node.title}\n onSelect={() => onSelectNode(item.node.id)}\n />\n ))}\n </div>\n </>\n ) : null}\n {hasOpenWindows && (hasDockActionGroup || hasWindowActionGroup) ? (\n <WorkbenchHostDockContextMenuSeparator />\n ) : null}\n {dockRetention ? (\n <WorkbenchHostDockContextMenuItem\n checked={dockRetention.checked}\n checkedIcon={\n <PinFilledIcon\n aria-hidden=\"true\"\n className=\"size-4 text-[var(--tutti-purple)]\"\n />\n }\n disabled={dockRetention.disabled}\n icon={<PinIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={dockRetention.pendingLabel ?? dockRetention.label}\n onSelect={onRunDockRetentionAction}\n />\n ) : null}\n {hasNewWindowCommand ? (\n <WorkbenchHostDockContextMenuItem\n icon={<FileCreateIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={newWindowLabel}\n onSelect={onCreateNew}\n />\n ) : null}\n {hasOpenCommand ? (\n <WorkbenchHostDockContextMenuItem\n disabled={!showOpen}\n icon={<FileCreateIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={openLabel}\n onSelect={onCreateNew}\n />\n ) : null}\n {hasOpenWindows ? (\n <>\n {hasDockActionGroup ? (\n <WorkbenchHostDockContextMenuSeparator />\n ) : null}\n {canShowAllWindows && onShowAllWindows ? (\n <WorkbenchHostDockContextMenuItem\n icon={\n <OverviewLayoutIcon aria-hidden=\"true\" className=\"size-4\" />\n }\n label={showAllWindowsLabel}\n onSelect={onShowAllWindows}\n />\n ) : null}\n <WorkbenchHostDockContextMenuItem\n disabled={!canEnterFullscreen || !onEnterFullscreen}\n icon={<MaximizeIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={fullscreenLabel}\n onSelect={onEnterFullscreen}\n />\n <WorkbenchHostDockContextMenuItem\n disabled={!onHide}\n icon={<MinimizeIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={hideLabel}\n onSelect={onHide}\n />\n <WorkbenchHostDockContextMenuItem\n disabled={!onQuit}\n icon={<CloseIcon aria-hidden=\"true\" className=\"size-4\" />}\n label={quitLabel}\n onSelect={onQuit}\n />\n </>\n ) : null}\n </div>\n );\n}\n\nfunction WorkbenchHostDockContextMenuItem({\n checked,\n checkedIcon,\n disabled,\n icon,\n label,\n onSelect\n}: {\n checked?: boolean;\n checkedIcon?: ReactNode;\n disabled?: boolean;\n icon?: ReactNode;\n label?: string;\n onSelect?: () => void;\n}) {\n return (\n <button\n className={cn(\n \"flex h-8 w-full min-w-0 items-center gap-2 rounded-md px-2 text-left text-sm text-[var(--text-primary)] transition-colors\",\n disabled\n ? \"cursor-default opacity-45\"\n : \"hover:bg-transparency-hover focus-visible:bg-transparency-hover focus-visible:outline-none\"\n )}\n disabled={disabled}\n role=\"menuitem\"\n type=\"button\"\n onClick={() => {\n if (disabled || !onSelect) {\n return;\n }\n onSelect();\n }}\n >\n <span className=\"flex size-4 shrink-0 items-center justify-center text-[var(--text-secondary)]\">\n {checked && checkedIcon ? (\n checkedIcon\n ) : checked ? (\n <CheckIcon\n aria-hidden=\"true\"\n className=\"size-4 text-[var(--tutti-purple)]\"\n />\n ) : (\n (icon ?? null)\n )}\n </span>\n <span className=\"min-w-0 truncate\">{label}</span>\n </button>\n );\n}\n\nfunction WorkbenchHostDockContextMenuSeparator() {\n return (\n <div\n aria-hidden=\"true\"\n className=\"mx-2 my-1 h-px bg-[var(--border-1)]\"\n role=\"separator\"\n />\n );\n}\n\nfunction readPersistedDockPreview(\n dockPreviewCache: WorkbenchDockPreviewCache | undefined,\n cacheKey: WorkbenchDockPreviewCacheKey | null\n): Promise<string | null> {\n if (!cacheKey) {\n return Promise.resolve(null);\n }\n return (\n dockPreviewCache?.read(cacheKey).catch(() => null) ?? Promise.resolve(null)\n );\n}\n\nfunction resolveDockPopupPreviewCacheKey(\n cacheKey: WorkbenchDockPreviewCacheKey | null,\n revision: string | null\n): WorkbenchDockPreviewCacheKey | null {\n return cacheKey ? { ...cacheKey, revision } : null;\n}\n\nfunction resolveDockPopupPreviewMemoryKey(\n node: WorkbenchNode<WorkbenchHostNodeData>,\n cacheKey: WorkbenchDockPreviewCacheKey | null\n): string {\n if (!cacheKey) {\n return `node:${node.id}`;\n }\n return `cache:${JSON.stringify({\n instanceId: cacheKey.instanceId,\n instanceKey: cacheKey.instanceKey ?? null,\n nodeId: cacheKey.nodeId,\n typeId: cacheKey.typeId,\n workspaceId: cacheKey.workspaceId\n })}`;\n}\n\nfunction normalizeDockPopupPreviewContentResult(\n preview: WorkbenchDockPreviewContent | string | null | undefined,\n revision: string | null\n): WorkbenchDockPreviewContent | null {\n if (!preview) {\n return null;\n }\n if (typeof preview === \"string\") {\n return { kind: \"image\", revision: revision ?? undefined, src: preview };\n }\n return {\n ...preview,\n revision: preview.revision ?? revision ?? undefined\n };\n}\n\nfunction resolveDockPopupItemPreviewState(\n item: WorkbenchHostDockPopupItem,\n capturedPreview: WorkbenchHostDockPopupCapturedPreview | undefined,\n hasPreviewProvider: boolean\n): WorkbenchHostDockPopupPreviewState {\n const revision = item.previewRevision;\n if (item.preview) {\n return { preview: item.preview, status: \"ready\" };\n }\n if (\n capturedPreview &&\n capturedPreview.revision === revision &&\n capturedPreview.preview\n ) {\n return { preview: capturedPreview.preview, status: \"ready\" };\n }\n if (\n (capturedPreview !== undefined && capturedPreview.revision === revision) ||\n !hasPreviewProvider\n ) {\n return { status: \"fallback\" };\n }\n return { status: \"loading\" };\n}\n\nfunction previewCacheToken(\n preview: WorkbenchDockPreviewContent | null | undefined\n): string {\n if (!preview) {\n return \"\";\n }\n switch (preview.kind) {\n case \"component\":\n return `component:${preview.revision ?? \"\"}`;\n case \"image\":\n return `image:${preview.revision ?? \"\"}:${preview.src}`;\n }\n}\n\nfunction logWorkbenchDockPopupDebug(\n event: string,\n debugDiagnostics: WorkbenchHostProps[\"debugDiagnostics\"],\n details: Record<string, unknown>\n): void {\n if (!debugDiagnostics?.log) {\n return;\n }\n void Promise.resolve(\n debugDiagnostics.log({\n details,\n event,\n level: \"info\",\n source: \"workbench-dock\"\n })\n ).catch(() => undefined);\n}\n\nfunction rectToDiagnostic(element: HTMLElement): Record<string, number> {\n const rect = element.getBoundingClientRect();\n return {\n bottom: Math.round(rect.bottom),\n height: Math.round(rect.height),\n left: Math.round(rect.left),\n right: Math.round(rect.right),\n top: Math.round(rect.top),\n width: Math.round(rect.width)\n };\n}\n\nfunction styleToDiagnostic(element: HTMLElement): Record<string, string> {\n const style = window.getComputedStyle(element);\n return {\n display: style.display,\n opacity: style.opacity,\n pointerEvents: style.pointerEvents,\n position: style.position,\n transform: style.transform,\n visibility: style.visibility,\n zIndex: style.zIndex\n };\n}\n\ninterface WorkbenchHostDockPopupCardProps {\n closeWindowLabel: (title: string) => string;\n item: WorkbenchHostDockPopupItem;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n onCloseNode: (nodeId: string) => void;\n onSelectNode: (nodeId: string) => void;\n previewState: WorkbenchHostDockPopupPreviewState;\n style?: CSSProperties;\n variant?: WorkbenchHostDockPopupVariant;\n}\n\nconst WorkbenchHostDockPopupCard = forwardRef<\n HTMLDivElement,\n WorkbenchHostDockPopupCardProps\n>(function WorkbenchHostDockPopupCard(\n {\n closeWindowLabel,\n item,\n labelMode,\n onCloseNode,\n onSelectNode,\n previewState,\n style,\n variant\n },\n ref\n) {\n const title = item.title?.trim() || item.node.title;\n const isMinimizedStack = variant === \"minimized-stack\";\n const [isLaunching, setIsLaunching] = useState(false);\n const launchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (launchTimerRef.current !== null) {\n clearTimeout(launchTimerRef.current);\n }\n },\n []\n );\n\n const handleSelect = useCallback(() => {\n if (!isMinimizedStack) {\n onSelectNode(item.node.id);\n return;\n }\n if (launchTimerRef.current !== null) {\n return;\n }\n setIsLaunching(true);\n launchTimerRef.current = setTimeout(() => {\n launchTimerRef.current = null;\n onSelectNode(item.node.id);\n }, dockPopupMinimizedStackLaunchDisappearMs);\n }, [isMinimizedStack, item.node.id, onSelectNode]);\n const handleSelectKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"Enter\" && event.key !== \" \") {\n return;\n }\n event.preventDefault();\n handleSelect();\n },\n [handleSelect]\n );\n const hasReadyPreview = previewState.status === \"ready\";\n\n return (\n <div\n ref={ref}\n className={cn(\n \"group/dock-popup-card relative flex h-[103px] w-[165px] min-w-0 flex-col overflow-hidden rounded-[8px] border border-[var(--border-1)] bg-background-fronted text-left text-[var(--text-primary)] transition-[border-color,color] duration-150\",\n item.isMinimized && \"text-[var(--text-secondary)]\"\n )}\n data-active={item.isFocused ? \"true\" : undefined}\n data-desktop-dock-popup-card=\"true\"\n data-fan-card={isMinimizedStack ? \"true\" : undefined}\n data-launching={isLaunching ? \"true\" : undefined}\n data-minimized={item.isMinimized ? \"true\" : undefined}\n style={style}\n >\n <div\n aria-label={title}\n data-active={item.isFocused ? \"true\" : undefined}\n className={cn(\n \"relative flex min-h-0 min-w-0 flex-1 cursor-pointer flex-col overflow-hidden rounded-md bg-transparent text-inherit\",\n hasReadyPreview ? \"p-0\" : \"p-1\"\n )}\n role=\"button\"\n tabIndex={0}\n onClick={handleSelect}\n onKeyDown={handleSelectKeyDown}\n >\n <WorkbenchHostDockPopupCardPreview previewState={previewState} />\n {labelMode === \"hover-overlay\" && item.title?.trim() ? (\n <WorkbenchHostDockPopupCardLabel title={item.title} />\n ) : null}\n </div>\n <Button\n aria-label={closeWindowLabel(title)}\n className=\"absolute top-1.5 right-1.5 z-[2] rounded-full bg-[var(--background-fronted)] opacity-0 transition-[background-color,opacity] duration-150 hover:bg-[var(--background-fronted)] focus-visible:bg-[var(--background-fronted)] group-hover/dock-popup-card:opacity-100 group-focus-within/dock-popup-card:opacity-100 focus-visible:opacity-100\"\n size=\"icon-sm\"\n title={closeWindowLabel(title)}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onCloseNode(item.node.id);\n }}\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n {item.isFocused ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-[3] rounded-md shadow-[inset_0_0_0_2px_var(--border-focus)]\"\n data-desktop-dock-popup-card-active-overlay=\"true\"\n />\n ) : null}\n {isMinimizedStack ? (\n <span className=\"desktop-dock-popup__fan-title-tip\" title={title}>\n {title}\n </span>\n ) : null}\n </div>\n );\n});\n\nfunction WorkbenchHostDockPopupCardPreview({\n previewState\n}: {\n previewState: WorkbenchHostDockPopupPreviewState;\n}) {\n if (previewState.status !== \"ready\") {\n return (\n <span\n className=\"flex min-h-0 min-w-0 flex-1 flex-col justify-center gap-[7px] rounded-md border border-[var(--border-1)] bg-transparency-block px-3 py-[11px]\"\n aria-hidden=\"true\"\n data-preview-state={previewState.status}\n >\n <span className=\"block h-[7px] w-[72%] rounded-full bg-transparency-hover\" />\n <span className=\"block h-[7px] w-[58%] rounded-full bg-transparency-hover\" />\n <span className=\"block h-[7px] w-[34%] rounded-full bg-transparency-hover\" />\n </span>\n );\n }\n\n const preview = previewState.preview;\n if (preview.kind === \"component\") {\n return (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md\"\n aria-hidden=\"true\"\n data-preview-kind={preview.kind}\n data-preview-state={previewState.status}\n >\n {preview.element}\n </span>\n );\n }\n\n return (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md\"\n aria-hidden=\"true\"\n data-preview-kind={preview.kind}\n data-preview-state={previewState.status}\n >\n <img\n alt=\"\"\n className=\"block h-full max-h-full w-full max-w-full object-contain object-center\"\n draggable={false}\n src={preview.src}\n />\n </span>\n );\n}\n\nfunction WorkbenchHostDockPopupCardLabel({ title }: { title: string }) {\n return (\n <span\n className=\"pointer-events-none absolute inset-x-0 bottom-0 z-[1] flex h-[30px] items-end px-[10px] pb-0.5 text-[var(--white-stationary)] opacity-0 transition-opacity duration-150 [text-shadow:0_1px_2px_rgb(0_0_0_/_20%)] group-hover/dock-popup-card:opacity-100 group-focus-within/dock-popup-card:opacity-100\"\n style={{\n background:\n \"linear-gradient(180deg, transparent 0%, color-mix(in srgb, hsl(var(--card)) 28%, transparent) 18%, color-mix(in srgb, hsl(var(--card)) 82%, transparent) 56%, color-mix(in srgb, hsl(var(--card)) 98%, transparent) 100%)\"\n }}\n title={title}\n >\n <span className=\"desktop-dock-popup__title-viewport block min-w-0 flex-1 overflow-hidden whitespace-nowrap\">\n <span className=\"desktop-dock-popup__title-marquee inline-block max-w-full overflow-hidden text-[12px] font-semibold leading-5 text-ellipsis whitespace-nowrap\">\n {title}\n </span>\n </span>\n </span>\n );\n}\n","import type { WorkbenchDockPlacement } from \"../react/types.ts\";\n\nconst minimizedStackViewportMarginPx = 56;\nconst minimizedStackViewportCapPx = 112;\nexport const minimizedStackCardWidthPx = 118;\nexport const minimizedStackLeftPlacementGapPx = 4;\nexport const minimizedStackLeftDockClearancePx = 2;\nexport const workbenchLeftDockLeftInsetPx = 4;\nexport const workbenchLeftDockViewportWidthPx = 124;\nexport const minimizedStackLeftGutterMinPx = 4;\nexport const minimizedStackLeftPopupNudgeLeftPx = 60;\nexport const minimizedStackLeftPopupNudgeDownPx = 32;\nconst minimizedStackLeftGutterBufferPx = 8;\nexport const minimizedStackTitleTipGapPx = 12;\nexport const minimizedStackTitleTipMaxWidthPx = 220;\nexport const minimizedStackFanStepXPx = 6;\nexport const minimizedStackFanStepYPx = 78;\nexport const minimizedStackFanBaseOffsetYPx = 18;\nexport const minimizedStackStackPaddingPx = 96;\n\nexport function resolveMinimizedStackCardHeightPx(): number {\n return Math.round((minimizedStackCardWidthPx * 10) / 16);\n}\n\nexport function resolveMinimizedStackTrackHeightPx(itemCount: number): number {\n const safeCount = Math.max(1, itemCount);\n return (\n minimizedStackFanBaseOffsetYPx +\n Math.max(0, safeCount - 1) * minimizedStackFanStepYPx +\n resolveMinimizedStackCardHeightPx() +\n minimizedStackStackPaddingPx\n );\n}\n\nexport function resolveMaxMinimizedStackTrackTranslateXPx(\n itemCount: number,\n placement: WorkbenchDockPlacement\n): number {\n if (placement !== \"left\" || itemCount <= 1) {\n return 0;\n }\n return (itemCount - 1) * minimizedStackFanStepXPx;\n}\n\nexport function resolveMinimizedStackLeftGutterPx(input: {\n itemCount: number;\n placement: WorkbenchDockPlacement;\n scrollOffset?: number;\n trackHeightPx?: number;\n viewportHeightPx?: number;\n trackTranslateXPx?: number;\n}): number {\n if (input.placement !== \"left\" || input.itemCount <= 0) {\n return 0;\n }\n\n if (\n input.scrollOffset === undefined ||\n input.trackHeightPx === undefined ||\n input.viewportHeightPx === undefined ||\n input.trackTranslateXPx === undefined\n ) {\n return (\n minimizedStackLeftGutterMinPx +\n resolveMaxMinimizedStackTrackTranslateXPx(\n input.itemCount,\n input.placement\n ) +\n minimizedStackLeftGutterBufferPx\n );\n }\n\n const cardHeightPx = resolveMinimizedStackCardHeightPx();\n const visibleTop = input.scrollOffset;\n const visibleBottom = input.scrollOffset + input.viewportHeightPx;\n let minCardLeftPx = 0;\n\n for (let index = 0; index < input.itemCount; index += 1) {\n const cappedIndex = Math.min(index, Math.max(0, input.itemCount - 1));\n const fanYPx =\n -minimizedStackFanBaseOffsetYPx - index * minimizedStackFanStepYPx;\n const cardTop = input.trackHeightPx + fanYPx - cardHeightPx;\n const cardBottom = input.trackHeightPx + fanYPx;\n if (cardBottom < visibleTop || cardTop > visibleBottom) {\n continue;\n }\n\n const fanXPx = -cappedIndex * minimizedStackFanStepXPx;\n const cardLeftPx = input.trackTranslateXPx + fanXPx;\n minCardLeftPx = Math.min(minCardLeftPx, cardLeftPx);\n }\n\n return Math.max(\n minimizedStackLeftGutterMinPx,\n -minCardLeftPx + minimizedStackLeftGutterBufferPx\n );\n}\n\nexport function resolveMinimizedStackPanelWidthPx(\n itemCount: number,\n placement: WorkbenchDockPlacement,\n options?: { leftGutterPx?: number }\n): number {\n const leftGutterPx =\n options?.leftGutterPx ??\n resolveMinimizedStackLeftGutterPx({ itemCount, placement });\n return (\n leftGutterPx +\n minimizedStackCardWidthPx +\n minimizedStackTitleTipGapPx +\n minimizedStackTitleTipMaxWidthPx\n );\n}\n\nexport function resolveMinimizedStackPopupLeftPx(input: {\n anchorLeft: number;\n anchorWidth: number;\n dockRightPx?: number;\n leftGutterPx?: number;\n}): number {\n const fromAnchor =\n input.anchorLeft + input.anchorWidth + minimizedStackLeftPlacementGapPx;\n const dockRight =\n input.dockRightPx ??\n workbenchLeftDockLeftInsetPx + workbenchLeftDockViewportWidthPx;\n const fromDock = dockRight + minimizedStackLeftDockClearancePx;\n const baseLeft = Math.max(fromAnchor, fromDock);\n const leftGutterPx = input.leftGutterPx ?? minimizedStackLeftGutterMinPx;\n return (\n baseLeft -\n Math.max(0, leftGutterPx - minimizedStackLeftGutterMinPx) -\n minimizedStackLeftPopupNudgeLeftPx\n );\n}\n\nexport function resolveMinimizedStackPopupTopPx(input: {\n anchorTop: number;\n}): number {\n return input.anchorTop + minimizedStackLeftPopupNudgeDownPx;\n}\n\nexport function resolveMinimizedStackViewportHeightPx(input: {\n anchorCenterY: number;\n placement: WorkbenchDockPlacement;\n trackHeightPx: number;\n viewportHeightPx?: number;\n}): number {\n const viewportCap =\n input.viewportHeightPx ??\n (typeof window === \"undefined\"\n ? input.trackHeightPx\n : window.innerHeight - minimizedStackViewportCapPx);\n\n if (input.placement === \"left\") {\n const availableAbove = Math.max(\n 160,\n input.anchorCenterY - minimizedStackViewportMarginPx\n );\n return Math.min(input.trackHeightPx, availableAbove, viewportCap);\n }\n\n return Math.min(input.trackHeightPx, viewportCap);\n}\n\nexport function resolveInitialMinimizedStackScrollOffset(input: {\n maxScrollOffset: number;\n}): number {\n return input.maxScrollOffset;\n}\n\nexport function resolveMinimizedStackFocalCardIndex(input: {\n itemCount: number;\n scrollOffset: number;\n trackHeightPx: number;\n viewportHeightPx: number;\n}): number {\n if (input.itemCount <= 1) {\n return 0;\n }\n\n const cardHeightPx = resolveMinimizedStackCardHeightPx();\n const viewportCenterY = input.scrollOffset + input.viewportHeightPx / 2;\n const rawIndex =\n (input.trackHeightPx -\n minimizedStackFanBaseOffsetYPx -\n cardHeightPx / 2 -\n viewportCenterY) /\n minimizedStackFanStepYPx;\n\n return Math.min(input.itemCount - 1, Math.max(0, rawIndex));\n}\n\nexport function resolveMinimizedStackFanXPx(input: {\n focalIndex: number;\n itemCount: number;\n placement: WorkbenchDockPlacement;\n}): number {\n if (input.itemCount <= 0) {\n return 0;\n }\n\n const cappedIndex = Math.min(\n input.focalIndex,\n Math.max(0, input.itemCount - 1)\n );\n const fanDirection = input.placement === \"left\" ? -1 : 1;\n return cappedIndex * minimizedStackFanStepXPx * fanDirection;\n}\n\nexport function resolveMinimizedStackTrackTranslateXPx(input: {\n itemCount: number;\n placement: WorkbenchDockPlacement;\n scrollOffset: number;\n trackHeightPx: number;\n viewportHeightPx: number;\n}): number {\n if (input.itemCount <= 0) {\n return 0;\n }\n\n const focalIndex = resolveMinimizedStackFocalCardIndex({\n itemCount: input.itemCount,\n scrollOffset: input.scrollOffset,\n trackHeightPx: input.trackHeightPx,\n viewportHeightPx: input.viewportHeightPx\n });\n const fanXPx = resolveMinimizedStackFanXPx({\n focalIndex,\n itemCount: input.itemCount,\n placement: input.placement\n });\n\n return -fanXPx;\n}\n","import type { WorkbenchRenderWindowHeader } from \"../react/types.ts\";\nimport type {\n WorkbenchHostNodeData,\n WorkbenchHostNodeHeaderContext\n} from \"./types.ts\";\n\nexport function createWorkbenchHostNodeHeaderWindowActions(\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0],\n input: {\n requestNodeClose?: (nodeId: string) => void;\n } = {}\n): WorkbenchHostNodeHeaderContext[\"windowActions\"] {\n return {\n applyQuickLayout(target) {\n context.controller.commands.applyQuickLayout(context.node.id, target);\n },\n close() {\n if (input.requestNodeClose) {\n input.requestNodeClose(context.node.id);\n return;\n }\n context.controller.commands.closeNode(context.node.id);\n },\n focus() {\n context.controller.commands.focusNode(context.node.id);\n },\n minimize() {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n },\n resize(frame) {\n context.controller.commands.resizeNode(context.node.id, frame);\n },\n toggleDisplayMode() {\n if (context.node.displayMode === \"fullscreen\") {\n context.controller.commands.exitFullscreen(context.node.id);\n return;\n }\n context.controller.commands.enterFullscreen(context.node.id);\n }\n };\n}\n","import { selectFocusedWorkbenchNode } from \"../core/selectors.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader\n} from \"../react/types.ts\";\nimport { readWorkbenchHostExternalState } from \"./externalState.ts\";\nimport { createWorkbenchHostNodeHeaderWindowActions } from \"./windowActions.ts\";\nimport type {\n WorkbenchHostExternalStateSource,\n WorkbenchHostHandle,\n WorkbenchHostNodeBodyContext,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostNodeHeaderContext\n} from \"./types.ts\";\n\nexport function createWorkbenchHostNodeBodyContext<\n TExternalNodeState,\n TExternalWorkspaceState\n>({\n context,\n externalStateSource,\n host,\n workspaceId\n}: {\n context: WorkbenchRenderNodeContext<WorkbenchHostNodeData>;\n definition: WorkbenchHostNodeDefinition<\n TExternalNodeState,\n TExternalWorkspaceState\n >;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n workspaceId: string;\n}): WorkbenchHostNodeBodyContext<TExternalNodeState, TExternalWorkspaceState> {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node: context.node,\n workspaceId\n });\n\n return {\n activation: context.node.data.activation ?? null,\n displayMode: context.node.displayMode,\n externalNodeState: externalState.externalNodeState as TExternalNodeState,\n externalWorkspaceState:\n externalState.externalWorkspaceState as TExternalWorkspaceState,\n focus() {\n host.focusNode(context.node.id);\n },\n host,\n instanceId: context.node.data.instanceId,\n instanceKey: context.node.data.instanceKey ?? null,\n isFocused:\n selectFocusedWorkbenchNode(host.getSnapshot())?.id === context.node.id,\n node: context.node,\n setNodeRuntimeState(state) {\n host.setNodeRuntimeState(context.node.id, state);\n },\n setSnapshotNodeState(state) {\n host.setSnapshotNodeState(context.node.id, state);\n }\n };\n}\n\nexport function createWorkbenchHostNodeHeaderContext<\n TExternalNodeState,\n TExternalWorkspaceState\n>({\n context,\n externalStateSource,\n host,\n workspaceId\n}: {\n context: Parameters<WorkbenchRenderWindowHeader<WorkbenchHostNodeData>>[0];\n definition: WorkbenchHostNodeDefinition<\n TExternalNodeState,\n TExternalWorkspaceState\n >;\n externalStateSource?: WorkbenchHostExternalStateSource;\n host: WorkbenchHostHandle;\n workspaceId: string;\n}): WorkbenchHostNodeHeaderContext<\n TExternalNodeState,\n TExternalWorkspaceState\n> {\n const externalState = readWorkbenchHostExternalState({\n externalStateSource,\n node: context.node,\n workspaceId\n });\n\n return {\n activation: context.node.data.activation ?? null,\n defaultActions: context.defaultActions,\n displayMode: context.node.displayMode,\n dragHandleProps: context.dragHandleProps,\n externalNodeState: externalState.externalNodeState as TExternalNodeState,\n externalWorkspaceState:\n externalState.externalWorkspaceState as TExternalWorkspaceState,\n instanceId: context.node.data.instanceId,\n instanceKey: context.node.data.instanceKey ?? null,\n isFocused:\n selectFocusedWorkbenchNode(host.getSnapshot())?.id === context.node.id,\n node: context.node,\n surfaceSize: context.surfaceSize,\n windowActions: createWorkbenchHostNodeHeaderWindowActions(context, {\n requestNodeClose: (nodeId) => host.requestNodeClose(nodeId)\n })\n };\n}\n","import type { WorkbenchWindowActionContext } from \"../react/types.ts\";\nimport { WorkbenchWindowTrafficLights } from \"../react/WorkbenchWindowTrafficLights.tsx\";\nimport type {\n WorkbenchHostHandle,\n WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function WorkbenchHostWindowActions({\n context,\n host,\n i18n,\n nodeDefinitions\n}: {\n context: WorkbenchWindowActionContext<WorkbenchHostNodeData>;\n host: WorkbenchHostHandle;\n i18n: WorkbenchHostI18nRuntime;\n nodeDefinitions: Map<string, WorkbenchHostNodeDefinition>;\n}) {\n const definition = nodeDefinitions.get(context.node.data.typeId);\n if (!definition) {\n return null;\n }\n\n const minimizable = definition.window?.minimizable !== false;\n const closable = definition.window?.closable !== false;\n\n return (\n <WorkbenchWindowTrafficLights\n close={\n closable\n ? {\n label: i18n.t(\"actions.close\"),\n onClick: () => {\n host.requestNodeClose(context.node.id);\n }\n }\n : null\n }\n minimize={\n minimizable\n ? {\n label: i18n.t(\"actions.minimize\"),\n onClick: () => {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n }\n }\n : null\n }\n />\n );\n}\n"],"mappings":"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","names":["useMemo","useLayoutEffect","useRef","useState","useCallback","useState","useState","useCallback","nodeIds","useCallback","useEffect","useMemo","jsx","jsx","useMemo","Fragment","useMemo","jsx","jsxs","jsx","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","Fragment","jsx","jsxs","jsx","jsxs","useMemo","Fragment","useEffect","useEffect","useLayoutEffect","useRef","useCallback","useEffect","useRef","useState","createPortal","Fragment","jsx","jsxs","resolveDockPreviewCacheKey","useRef","useState","useCallback","useEffect","minimizeCommitted","commitMinimize","generation","nodeElement","wasFocusedForCapture","pendingMinimizedNode","anchorKey","dockRect","createPortal","jsx","jsxs","resolveDockPreviewCacheKey","useCallback","useEffect","useEffect","useMemo","useState","normalizeWorkbenchSnapshot","normalizeWorkbenchSnapshot","resolvedFrame","entry","useState","useMemo","useEffect","noop","useCallback","useMemo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","useCallback","useEffect","useRef","slotElement","useEffect","useRef","useState","promotedNodeId","slot","useCallback","useEffect","useLayoutEffect","useRef","useState","createPortal","Button","Fragment","jsx","jsxs","resolveDockPreviewCacheKey","useRef","useState","useEffect","useLayoutEffect","useCallback","createPortal","WorkbenchHostDockPopupCard","Button","jsx","jsxs","useMemo","useRef","useState","useCallback","useEffect","useLayoutEffect","activeHoverPanel","activeLabelTooltip","labelTooltipTarget","dockButton","node","relatedTarget","Button","left","right","top","bottom","jsx","jsx","jsxs","useMemo","useCallback","resolveDockPreviewCacheKey","jsx","noop","useMemo"]}
|