@tutti-os/workbench-surface 0.0.1
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/LICENSE +202 -0
- package/README.md +162 -0
- package/dist/chunk-HKGIYOGM.js +190 -0
- package/dist/chunk-HKGIYOGM.js.map +1 -0
- package/dist/i18n/index.d.ts +11 -0
- package/dist/i18n/index.js +23 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +717 -0
- package/dist/index.js +8654 -0
- package/dist/index.js.map +1 -0
- package/dist/styles/workbench.css +2698 -0
- package/dist/styles/workbenchStyle.test.ts +307 -0
- package/dist/workbenchHostI18n-5xMPPBkf.d.ts +27 -0
- package/package.json +54 -0
|
@@ -0,0 +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/WorkbenchWindowFullscreenToggle.tsx","../src/react/hooks/useWorkbenchDrag.ts","../src/react/hooks/useWorkbenchSnap.ts","../src/react/hooks/useWorkbenchResize.ts","../src/react/windowHeader.ts","../src/react/renderedNodeIds.ts","../src/react/hooks/useWorkbenchShortcuts.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/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 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 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 = \"left\" | \"right\" | \"top\" | null;\nexport type WorkbenchQuickLayoutTarget = \"left\" | \"right\" | \"top\" | \"bottom\";\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;\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 clampSnapRect = (rect: WorkbenchFrame): WorkbenchFrame =>\n clampWorkbenchRect(rect, surfaceSize, normalized);\n if (snapTarget === \"left\") {\n return clampSnapRect({ ...full, width: Math.round(full.width / 2) });\n }\n if (snapTarget === \"right\") {\n const width = Math.round(full.width / 2);\n return clampSnapRect({ ...full, x: full.x + full.width - width, width });\n }\n if (snapTarget === \"top\") {\n return clampSnapRect(full);\n }\n return null;\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 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 const height = Math.round(full.height / 2);\n return clampQuickLayoutRect({\n ...full,\n y: full.y + full.height - height,\n height\n });\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, \"y\">,\n surfaceSize: WorkbenchSize,\n threshold = 0,\n constraints: WorkbenchLayoutConstraints = defaultWorkbenchLayoutConstraints\n): WorkbenchSnapTarget {\n const frame = getWorkbenchLayoutFrame(surfaceSize, constraints);\n const topSnapBoundary = frame.y - threshold;\n if (\n dragPoint.y < topSnapBoundary ||\n (topSnapBoundary === 0 && dragPoint.y <= 0)\n ) {\n return \"top\";\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 getGridLayoutFrames(itemCount, 2, 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 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 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 const nodeIDs = uniqueKnownNodeIDs(state.nodes, action.nodeIDs);\n if (nodeIDs.length === 0) {\n return state;\n }\n\n const frames = getWorkbenchLayoutPresetFrames(\n nodeIDs.length,\n action.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\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 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 \"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 className,\n contributions,\n debugDiagnostics,\n dockPreviewCache,\n dockPlacement,\n dockEntries,\n dockStateSource,\n externalStateSource,\n i18n,\n layoutConstraints,\n missionControl,\n nodes,\n onDockEntryAction,\n onDockEntryClick,\n onHandleReady,\n onLaunchRequest,\n onMissionControlAdapterReady,\n onNodeCloseRequest,\n projectedNodes,\n renderBottomChrome,\n renderTopChrome,\n snapshotRepository,\n shortcutsEnabled,\n wallpaper,\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 missionControlClose = missionControl?.onRequestClose ?? noop;\n const missionControlEnabled =\n missionControlMode !== null || onMissionControlAdapterReady !== undefined;\n const {\n chromeContext,\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 chromeContext,\n dockPreviewCache,\n dockPlacement,\n dockStateSource,\n dockEntries: hostDockEntries,\n externalStateSource: hostRuntimeConfig.externalStateSource,\n hostI18n,\n hostSession,\n nodeDefinitionByType,\n onDockEntryAction,\n onDockEntryClick,\n renderBottomChrome,\n renderTopChrome,\n workspaceId\n });\n const missionControlState = useWorkbenchMissionControlState({\n adapter: missionControlAdapter,\n mode: missionControlMode,\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 dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={!isHydrating}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPresence.phase}\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 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 resolveDockAnchorKey={surfaceRenderers.resolveDockAnchorKey}\n shortcutsEnabled={shortcutsEnabled}\n wallpaper={wallpaper}\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} 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\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 }, [i18n, layoutPresets.length, state.selectedCount]);\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 {shouldShowWorkbenchMissionControlLayoutHint(\n state.selectedCount\n ) ? (\n <span className=\"workbench-mission-control__layout-hint\">\n {i18n.t(\"layoutSelectionHint\")}\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 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 onRequestClose\n}: {\n adapter: WorkbenchMissionControlAdapter<TData> | null;\n mode: WorkbenchMissionControlMode | null;\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 visibleNodes = 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 },\n [mode, onPreviewPress, onRequestClose, previewItems, selectedNodeIdSet]\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 { useWorkbenchShortcuts } from \"./hooks/useWorkbenchShortcuts.ts\";\nimport { useWorkbenchSurfaceSize } from \"./hooks/useWorkbenchSurfaceSize.ts\";\nimport { useWorkbenchGenieAnimation } from \"./useWorkbenchGenieAnimation.tsx\";\nimport type {\n WorkbenchDockContext,\n WorkbenchDockPlacement,\n WorkbenchKeepMinimizedNodeMounted,\n WorkbenchRenderNode,\n WorkbenchSurfacePresentation,\n WorkbenchRenderWindowActions,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveFullscreenHeaderMode,\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 dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchDockPlacement;\n interactive?: boolean;\n layoutConstraints?: WorkbenchLayoutConstraintsInput;\n missionControlPhase?: \"closed\" | \"entering\" | \"open\" | \"closing\";\n presentation?: WorkbenchSurfacePresentation | null;\n renderBackdrop?: () => ReactNode;\n renderBottomChrome?: () => ReactNode;\n renderDock?: (context: WorkbenchDockContext<TData>) => ReactNode;\n renderNode: WorkbenchRenderNode<TData>;\n renderOverlay?: () => ReactNode;\n renderTopChrome?: () => ReactNode;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n shouldKeepMinimizedNodeMounted?: WorkbenchKeepMinimizedNodeMounted<TData>;\n resolveFullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n shortcutsEnabled?: boolean;\n wallpaper?: WorkbenchSurfaceWallpaper;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\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 dockPreviewCache,\n dockPlacement,\n interactive,\n layoutConstraints,\n missionControlPhase,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n wallpaper,\n windowChromeMode,\n windowChromeI18n\n}: WorkbenchSurfaceProps<TData>) {\n return (\n <WorkbenchProvider controller={controller}>\n <WorkbenchSurfaceInner\n captureNodePreviewImage={captureNodePreviewImage}\n className={className}\n dockPreviewCache={dockPreviewCache}\n dockPlacement={dockPlacement}\n interactive={interactive}\n layoutConstraints={layoutConstraints}\n missionControlPhase={missionControlPhase}\n presentation={presentation}\n renderBackdrop={renderBackdrop}\n renderBottomChrome={renderBottomChrome}\n renderDock={renderDock}\n renderNode={renderNode}\n renderOverlay={renderOverlay}\n renderTopChrome={renderTopChrome}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\n resolveDockAnchorKey={resolveDockAnchorKey}\n resolveDockPreviewCacheKey={resolveDockPreviewCacheKey}\n shortcutsEnabled={shortcutsEnabled}\n wallpaper={wallpaper}\n windowChromeMode={windowChromeMode}\n windowChromeI18n={windowChromeI18n}\n />\n </WorkbenchProvider>\n );\n}\n\nfunction WorkbenchSurfaceInner<TData>({\n captureNodePreviewImage,\n className,\n dockPreviewCache,\n dockPlacement,\n interactive = true,\n layoutConstraints,\n missionControlPhase,\n presentation,\n renderBackdrop,\n renderBottomChrome,\n renderDock,\n renderNode,\n renderOverlay,\n renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveFullscreenHeaderMode,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n shortcutsEnabled,\n wallpaper,\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 dockPreviewCache,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey\n });\n useWorkbenchShortcuts<TData>((shortcutsEnabled ?? true) && interactive);\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 renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n shouldKeepMinimizedNodeMounted={shouldKeepMinimizedNodeMounted}\n resolveFullscreenHeaderMode={resolveFullscreenHeaderMode}\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;\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 minimizedNodes = useMemo(\n () => nodes.filter((node) => node.isMinimized),\n [nodes]\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 },\n minimizedNodes,\n nodes\n })\n : null}\n </div>\n </>\n );\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 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.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 { memo, useMemo } from \"react\";\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 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;\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 windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nexport function WorkbenchNodeLayer<TData>({\n genie,\n interactive = true,\n presentation,\n renderNode,\n shouldKeepMinimizedNodeMounted,\n renderWindowActions,\n renderWindowHeader,\n resolveFullscreenHeaderMode,\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 snapPreviewRect = useWorkbenchSelector(selectWorkbenchSnapPreviewRect);\n const presentationInteraction =\n interactive && presentation?.mode === \"mission-control\"\n ? (presentation.interaction ?? null)\n : null;\n\n return (\n <div\n className=\"workbench-node-layer\"\n onClick={\n presentationInteraction\n ? (event) => {\n if (event.target !== event.currentTarget) {\n return;\n }\n presentationInteraction.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={resolveFullscreenHeaderMode}\n genie={genie}\n interactive={interactive}\n nodeID={nodeID}\n presentation={presentation}\n renderNode={renderNode}\n renderWindowActions={renderWindowActions}\n renderWindowHeader={renderWindowHeader}\n windowChromeI18n={windowChromeI18n}\n windowChromeMode={windowChromeMode}\n />\n ))}\n </div>\n );\n}\n\ninterface WorkbenchNodeLayerItemProps<TData = unknown> {\n fullscreenHeaderMode?: WorkbenchResolveFullscreenHeaderMode<TData>;\n genie: WorkbenchGenieController;\n interactive: boolean;\n nodeID: string;\n presentation?: WorkbenchSurfacePresentation | null;\n renderNode: WorkbenchRenderNode<TData>;\n renderWindowActions?: WorkbenchRenderWindowActions<TData>;\n renderWindowHeader?: WorkbenchRenderWindowHeader<TData>;\n windowChromeMode?:\n | WorkbenchWindowChromeMode\n | WorkbenchResolveWindowChromeMode<TData>;\n windowChromeI18n?: WorkbenchWindowChromeI18nRuntime;\n}\n\nfunction WorkbenchNodeLayerItem<TData>({\n fullscreenHeaderMode,\n genie,\n interactive,\n nodeID,\n presentation,\n renderNode,\n renderWindowActions,\n renderWindowHeader,\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 hiddenMounted={node.isMinimized}\n interactive={interactive}\n presentation={presentation}\n node={node}\n genie={genie}\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 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 hiddenMounted?: boolean;\n interactive?: boolean;\n node: WorkbenchNode<TData>;\n presentation?: WorkbenchSurfacePresentation | null;\n renderActions?: WorkbenchRenderWindowActions<TData>;\n renderHeader?: WorkbenchRenderWindowHeader<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 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 fullscreenHeaderMode,\n genie,\n hiddenMounted = false,\n interactive = true,\n node,\n presentation = null,\n renderActions,\n renderHeader,\n windowChromeMode = \"system\",\n windowChromeI18n\n}: WorkbenchWindowFrameProps<TData>) {\n const controller = useWorkbenchController<TData>();\n const zIndex = useWorkbenchSelector((state) =>\n selectWorkbenchNodeZIndex(state, node.id)\n );\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);\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=\"flex flex-none items-center gap-1\"\n onDoubleClick={(event) => {\n event.stopPropagation();\n }}\n onPointerDown={(event) => {\n event.stopPropagation();\n }}\n >\n <WorkbenchWindowFullscreenToggle\n controller={controller}\n i18n={windowChromeI18n ?? defaultWindowChromeI18n}\n node={node}\n />\n {renderActions\n ? renderActions({\n controller,\n genie: genieControls,\n node\n })\n : null}\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 = fullscreenHeaderMode ?? \"reveal\";\n const presentationMode = presentation?.mode ?? null;\n const presentationFrame = presentation?.frameByNodeId.get(node.id) ?? null;\n const presentationInteraction =\n interactive && presentationMode === \"mission-control\"\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\"\n ? `matrix(${presentationScale}, 0, 0, ${presentationScale}, ${presentationOffsetX}, ${presentationOffsetY})`\n : undefined;\n\n return (\n <section\n aria-hidden={hiddenMounted ? 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-minimized-mount={hiddenMounted ? \"hidden\" : \"visible\"}\n data-presentation-mode={presentationMode ?? \"default\"}\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 || !interactive || 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 {node.displayMode === \"fullscreen\" &&\n resolvedFullscreenHeaderMode === \"reveal\" ? (\n <div className=\"workbench-window__header-reveal-zone\" aria-hidden />\n ) : null}\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 <div className=\"min-w-0 truncate text-[13px] font-semibold\">\n {node.title}\n </div>\n {defaultActions}\n </>\n )}\n </div>\n <div className=\"workbench-window__body\">{children}</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 </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(--accent)] 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(--accent)] data-[state=checked]:bg-[var(--accent)] [&_[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 { WorkbenchNode } from \"../core/types.ts\";\nimport type { WorkbenchController } from \"../store/types.ts\";\nimport { Button, MaximizeIcon, RestoreIcon } from \"@tutti-os/ui-system\";\nimport type { WorkbenchWindowChromeI18nRuntime } from \"./workbenchWindowI18n.ts\";\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 const Icon = isFullscreen ? RestoreIcon : MaximizeIcon;\n\n return (\n <Button\n aria-label={label}\n aria-pressed={isFullscreen}\n className=\"order-2 rounded-md\"\n data-workbench-action=\"fullscreen\"\n disabled={disabled}\n size=\"icon-sm\"\n title={label}\n type=\"button\"\n variant=\"chrome\"\n onClick={() => {\n if (disabled) {\n return;\n }\n\n controller.commands.focusNode(node.id);\n\n if (isFullscreen) {\n controller.commands.exitFullscreen(node.id);\n return;\n }\n\n controller.commands.enterFullscreen(node.id);\n }}\n >\n <Icon aria-hidden className=\"size-[15px]\" />\n </Button>\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>(node: WorkbenchNode<TData>) {\n const controller = useWorkbenchController<TData>();\n const updateSnap = useWorkbenchSnap<TData>();\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(moveEvent.clientY);\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 (updateSnap(upEvent.clientY) !== null) {\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, node.frame, node.id, updateSnap]\n );\n}\n","import { useCallback } from \"react\";\nimport { inferWorkbenchSnapTarget } from \"../../core/geometry.ts\";\nimport type { WorkbenchSnapTarget } from \"../../core/types.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchSnap<TData = unknown>() {\n const controller = useWorkbenchController<TData>();\n\n return useCallback(\n (pointerClientY: number): WorkbenchSnapTarget => {\n const target = inferWorkbenchSnapTarget(\n { y: pointerClientY },\n controller.getSnapshot().surfaceSize,\n undefined,\n controller.getSnapshot().layoutConstraints\n );\n controller.commands.setActiveSnapTarget(target);\n return target;\n },\n [controller]\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 { selectFocusedWorkbenchNode } from \"../../core/selectors.ts\";\nimport { useWorkbenchController } from \"../WorkbenchProvider.tsx\";\n\nexport function useWorkbenchShortcuts<TData = unknown>(enabled = true): void {\n const controller = useWorkbenchController<TData>();\n\n useEffect(() => {\n if (!enabled) {\n return undefined;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") {\n return;\n }\n\n const focusedNode = selectFocusedWorkbenchNode(controller.getSnapshot());\n if (focusedNode?.displayMode === \"fullscreen\") {\n controller.commands.exitFullscreen(focusedNode.id);\n }\n };\n\n window.addEventListener(\"keydown\", onKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [controller, enabled]);\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 { WorkbenchController } from \"../store/types.ts\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKeyResolver\n} from \"./dockPreviewCache.ts\";\nimport {\n centerPointFromRect,\n copyGenieComputedStyleTree,\n easeInQuadratic,\n isUsableGenieRect,\n renderGenieScanlines,\n viewportRectFromElement,\n type WorkbenchGenieDirection,\n type WorkbenchGenieViewportRect\n} from \"./genieAnimation.ts\";\n\nconst genieDurationMs = 400;\nconst genieMaxDevicePixelRatio = 2;\nconst genieSnapshotScale = 1;\nconst dockPreviewMaxWidth = 260;\nconst dockPreviewMaxHeight = 170;\nconst dockPreviewImageCacheMaxEntries = 96;\nconst inlineImageResourceCacheMaxEntries = 160;\nconst dockAnchorFallbackSizePx = 43.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 imageUrls: Array<string | null>;\n rect: WorkbenchGenieViewportRect;\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\nexport interface WorkbenchGenieController {\n genieLayer: ReactNode;\n isNodeGenieHidden: (nodeID: string) => boolean;\n launchNodeFromAnchor: (\n anchorKey: string,\n nodeID: string,\n launch: () => void\n ) => void;\n minimizeNodeToAnchor: (nodeID: string, minimize?: () => void) => void;\n registerDockAnchor: (anchorKey: string, element: HTMLElement | null) => void;\n}\n\nexport type WorkbenchNodePreviewImageCapture<TData = unknown> = (\n node: WorkbenchNode<TData>\n) => Promise<string | null> | string | null;\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\nfunction resolveImageResourceUrl(image: HTMLImageElement): string | null {\n return image.currentSrc || image.src || image.getAttribute(\"src\") || null;\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 imageUrls\n}: {\n cloneRoot: HTMLElement;\n imageUrls: Array<string | null>;\n}): Promise<void> {\n const cloneImages = Array.from(cloneRoot.querySelectorAll(\"img\"));\n\n await Promise.all(\n imageUrls.map(async (imageUrl, index) => {\n const cloneImage = cloneImages[index];\n if (!cloneImage) {\n return;\n }\n\n cloneImage.removeAttribute(\"srcset\");\n cloneImage.removeAttribute(\"sizes\");\n if (!imageUrl) {\n return;\n }\n cloneImage.src = (await readInlineImageResource(imageUrl)) ?? imageUrl;\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 prepareElementTextureCapture(\n element: HTMLElement\n): PreparedGenieTextureCapture | null {\n const windowRect = viewportRectFromElement(element);\n if (!isUsableGenieRect(windowRect)) {\n return null;\n }\n\n const imageUrls = Array.from(element.querySelectorAll(\"img\")).map(\n resolveImageResourceUrl\n );\n const clone = element.cloneNode(true) as HTMLElement;\n copyGenieComputedStyleTree(element, clone);\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 { clone, imageUrls, rect: windowRect };\n}\n\nasync function renderPreparedElementTexture({\n clone,\n imageUrls,\n rect\n}: PreparedGenieTextureCapture): Promise<CapturedGenieTexture | null> {\n await inlineCloneImageResources({ cloneRoot: clone, imageUrls });\n\n const image = await loadImageFromSvg(createGenieSvgTexture(clone, rect));\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.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\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 captureWorkbenchNodePreviewImageForNode<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 writeCachedWorkbenchNodePreviewImage(node.id, previewImageUrl);\n persistWorkbenchNodePreviewImage(node, previewImageUrl, input);\n return previewImageUrl;\n }\n const capturedPreviewImageUrl = await captureWorkbenchNodePreviewImage(\n node.id\n );\n persistWorkbenchNodePreviewImage(node, capturedPreviewImageUrl, input);\n return capturedPreviewImageUrl;\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 dockPreviewCache,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey\n}: {\n captureNodePreviewImage?: WorkbenchNodePreviewImageCapture<TData>;\n controller: WorkbenchController<TData>;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n resolveDockAnchorKey?: (node: WorkbenchNode<TData>) => string;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<TData>;\n}): WorkbenchGenieController {\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 [isCanvasActive, setIsCanvasActive] = useState(false);\n const [genieHiddenNodeIDs, setGenieHiddenNodeIDs] = useState(\n () => new Set<string>()\n );\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 return element ? resolveDockAnchorViewportRect(element) : null;\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 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 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 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 ) => {\n if (shouldReduceMotion()) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n return;\n }\n\n await new Promise<void>((resolve) => {\n window.requestAnimationFrame(() => resolve());\n });\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 const captureTarget = nodeElement\n ? resolveWorkbenchCaptureElement(nodeElement)\n : null;\n if (\n !dockRect ||\n !nodeElement ||\n !captureTarget ||\n !isUsableGenieRect(dockRect)\n ) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n return;\n }\n\n const texture = await captureElementTexture(captureTarget).catch(\n () => null\n );\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\n animationCleanupRef.current = null;\n showNodeForGenie(nodeID);\n return;\n }\n\n runGenieAnimation({\n direction: \"open\",\n dockRect,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n },\n [\n clearCanvas,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n showNodeForGenie\n ]\n );\n\n const launchNodeFromAnchor = useCallback(\n (anchorKey: string, nodeID: string, launch: () => void) => {\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n const shouldAnimate = target?.isMinimized === true || !target;\n if (!shouldAnimate) {\n launch();\n return;\n }\n\n stopAnimation();\n const dockRectFallback = resolveDockAnchorRect(anchorKey);\n hideNodeForGenie(nodeID);\n animationCleanupRef.current = () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n };\n const generation = animationGenerationRef.current;\n flushSync(() => {\n launch();\n });\n void startOpenOrRestoreAnimation(\n nodeID,\n anchorKey,\n generation,\n dockRectFallback\n );\n },\n [\n clearCanvas,\n controller,\n hideNodeForGenie,\n resolveDockAnchorRect,\n showNodeForGenie,\n startOpenOrRestoreAnimation,\n stopAnimation\n ]\n );\n\n const minimizeNodeToAnchor = useCallback(\n (nodeID: string, minimize?: () => void) => {\n void (async () => {\n const target = controller\n .getSnapshot()\n .nodes.find((node) => node.id === nodeID);\n if (!target) {\n return;\n }\n const runMinimize =\n minimize ?? (() => controller.commands.minimizeNode(nodeID));\n if (shouldReduceMotion()) {\n await captureWorkbenchNodePreviewImageForNode(target, {\n captureNodePreviewImage,\n dockPreviewCache,\n resolveDockPreviewCacheKey\n });\n runMinimize();\n return;\n }\n\n stopAnimation();\n const generation = animationGenerationRef.current;\n const nodeElement = resolveNodeElement(nodeID);\n const captureTarget = nodeElement\n ? resolveWorkbenchCaptureElement(nodeElement)\n : null;\n if (!nodeElement || !captureTarget) {\n runMinimize();\n return;\n }\n\n const preparedTexture = prepareElementTextureCapture(captureTarget);\n if (!preparedTexture) {\n runMinimize();\n return;\n }\n const previewImageUrlPromise = Promise.resolve(\n captureNodePreviewImage?.(target) ?? null\n ).catch(() => null);\n const texture = await renderPreparedElementTexture(\n preparedTexture\n ).catch(() => null);\n const previewImageUrl = await previewImageUrlPromise;\n if (generation !== animationGenerationRef.current) {\n return;\n }\n if (!texture) {\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\n const cleanupHiddenNode = () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n };\n animationCleanupRef.current = cleanupHiddenNode;\n\n flushSync(() => {\n hideNodeForGenie(nodeID);\n runMinimize();\n });\n\n await new Promise<void>((resolve) => {\n window.requestAnimationFrame(() => resolve());\n });\n if (generation !== animationGenerationRef.current) {\n return;\n }\n\n const minimizedTarget =\n controller.getSnapshot().nodes.find((node) => node.id === nodeID) ??\n target;\n const anchorKey = resolveAnchorKeyForNode(minimizedTarget);\n const dockRect = resolveDockAnchorRect(anchorKey);\n if (!dockRect || !isUsableGenieRect(dockRect)) {\n animationCleanupRef.current = null;\n cleanupHiddenNode();\n return;\n }\n\n runGenieAnimation({\n direction: \"minimize\",\n dockRect,\n onCancel: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n },\n onComplete: () => {\n flushSync(() => {\n showNodeForGenie(nodeID);\n });\n clearCanvas();\n },\n skipStop: true,\n texture\n });\n })();\n },\n [\n clearCanvas,\n controller,\n captureNodePreviewImage,\n dockPreviewCache,\n hideNodeForGenie,\n resolveAnchorKeyForNode,\n resolveDockPreviewCacheKey,\n resolveDockAnchorRect,\n resolveNodeElement,\n runGenieAnimation,\n setupCanvas,\n showNodeForGenie,\n stopAnimation\n ]\n );\n\n return {\n genieLayer:\n typeof document === \"undefined\"\n ? null\n : createPortal(\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 document.body\n ),\n isNodeGenieHidden: useCallback(\n (nodeID: string) => genieHiddenNodeIDs.has(nodeID),\n [genieHiddenNodeIDs]\n ),\n launchNodeFromAnchor,\n minimizeNodeToAnchor,\n registerDockAnchor\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\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 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\nexport function copyGenieComputedStyleTree(\n source: Element,\n clone: Element\n): void {\n if (canInlineComputedStyle(source) && canInlineComputedStyle(clone)) {\n const computed = window.getComputedStyle(source);\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\n const sourceChildren = Array.from(source.children);\n const cloneChildren = Array.from(clone.children);\n for (let index = 0; index < sourceChildren.length; index += 1) {\n const sourceChild = sourceChildren[index];\n const cloneChild = cloneChildren[index];\n if (sourceChild && cloneChild) {\n copyGenieComputedStyleTree(sourceChild, cloneChild);\n }\n }\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 textureWidth = Math.max(1, Math.round(textureRect.width));\n const textureHeight = Math.max(1, Math.round(textureRect.height));\n const scanlineStride = resolveGenieScanlineStride(textureHeight);\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 < textureHeight; y += scanlineStride) {\n const sourceHeight = Math.min(scanlineStride, textureHeight - y);\n const sourceMidY = y + sourceHeight / 2;\n const rowProgress = sourceMidY / textureHeight;\n const horizontalStart =\n direction === \"minimize\"\n ? (1 - rowProgress) * genieHorizontalRowStagger\n : rowProgress * genieHorizontalRowStagger;\n const horizontalProgress = clampGenieProgress(\n (progress - horizontalStart) / (1 - horizontalStart)\n );\n const horizontalEase = easeInOutCubic(horizontalProgress);\n\n const verticalStart =\n direction === \"minimize\"\n ? (1 - rowProgress) * genieVerticalRowStagger\n : rowProgress * genieVerticalRowStagger;\n const verticalProgress = clampGenieProgress(\n (progress - verticalStart) / (1 - verticalStart)\n );\n const verticalEase = easeInQuadratic(verticalProgress);\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 + textureWidth,\n dockPoint.x,\n horizontalEase\n )\n : lerpGenieValue(\n dockPoint.x,\n textureRect.left + textureWidth,\n horizontalEase\n );\n const targetY =\n (direction === \"minimize\"\n ? lerpGenieValue(\n textureRect.top + sourceMidY,\n dockPoint.y,\n verticalEase\n )\n : lerpGenieValue(\n dockPoint.y,\n textureRect.top + sourceMidY,\n verticalEase\n )) -\n sourceHeight / 2;\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 textureWidth,\n sourceHeight,\n left,\n targetY,\n rowWidth,\n Math.max(1, sourceHeight)\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 [, 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 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 \"nextopWorkbenchInitialized\",\n \"workbenchHostInitialized\"\n] as const;\nexport const COMPACT_LAUNCH_WIDTH_THRESHOLD = 1440;\nexport const COMPACT_LAUNCH_FRAME_SCALE = 0.85;\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\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\";\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 \"nextopWorkbenchInitialized\",\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 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 compactRestoredWorkbenchHostNodes,\n createDefaultLaunchResult,\n createProjectedNodeID,\n createWorkbenchLaunchedHostNode,\n createWorkbenchProjectedHostNode,\n persistedWorkbenchState,\n projectedWorkbenchNodeStack,\n resolveWorkbenchLaunchedHostNodeFrame,\n restoredSnapshotNodesByID,\n shallowArrayEqual,\n stateFromSnapshotOrDefinitions,\n stringArrayEqual,\n updateProjectedNodeFromInput\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;\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 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.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.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 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 request: WorkbenchHostLaunchRequest = {\n ...input,\n workspaceId: this.input.workspaceId\n };\n if (launchSource !== null) {\n request.launchSource = launchSource;\n }\n\n const result = this.input.onLaunchRequest\n ? await this.input.onLaunchRequest(request)\n : createDefaultLaunchResult(definition, {\n dockEntryId: input.dockEntryId,\n launchSource\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 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.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.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.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\n const exactExisting = this.findExistingNodeByTarget({\n instanceId: result.instanceId,\n typeId: result.typeId\n });\n const dockEntryExisting = exactExisting\n ? null\n : this.findExistingNodeByDockEntry(result);\n const existing = exactExisting ?? dockEntryExisting;\n if (existing) {\n this.controller.commands.setNodeSizeConstraints(\n existing.id,\n result.sizeConstraints ?? definition.sizeConstraints ?? null\n );\n if (\n exactExisting &&\n result.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\n });\n this.controller.commands.resizeNode(existing.id, resolvedFrame);\n }\n this.restoreAndFocusNode(existing.id);\n if (result.activation) {\n this.activateNodeNow({ nodeId: existing.id }, result.activation);\n }\n return existing.id;\n }\n\n const resolvedFrame = resolveWorkbenchLaunchedHostNodeFrame({\n currentState: this.controller.getSnapshot(),\n definition,\n result\n });\n const nextNode = createWorkbenchLaunchedHostNode({\n activation: this.createActivationEnvelope(result.activation),\n definition,\n resolvedFrame,\n result\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: {\n ...(this.loadedSnapshot?.metadata ?? {}),\n [initializedMetadataKey]: true\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 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 noop(): void {}\n","import { useCallback, useMemo } from \"react\";\nimport type { WorkbenchNode } from \"../core/types.ts\";\nimport type {\n WorkbenchRenderNodeContext,\n WorkbenchRenderWindowHeader,\n WorkbenchResolveWindowChromeMode,\n WorkbenchWindowActionContext\n} from \"../react/types.ts\";\nimport type {\n WorkbenchDockPreviewCache,\n WorkbenchDockPreviewCacheKey\n} from \"../react/dockPreviewCache.ts\";\nimport { WorkbenchHostDock } 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 WorkbenchHostNodeData,\n WorkbenchHostNodeDefinition,\n WorkbenchHostProps,\n WorkbenchHostRuntimeHandle\n} from \"./types.ts\";\nimport type { WorkbenchHostI18nRuntime } from \"./workbenchHostI18n.ts\";\n\nexport function useWorkbenchHostSurfaceRenderers(input: {\n chromeContext: WorkbenchHostChromeRenderContext;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n dockPlacement?: WorkbenchHostProps[\"dockPlacement\"];\n dockEntries: readonly WorkbenchHostDockEntry[];\n dockStateSource?: WorkbenchHostProps[\"dockStateSource\"];\n externalStateSource?: WorkbenchHostExternalStateSource;\n hostI18n: WorkbenchHostI18nRuntime;\n hostSession: WorkbenchHostRuntimeHandle;\n nodeDefinitionByType: Map<string, WorkbenchHostNodeDefinition>;\n onDockEntryAction?: WorkbenchHostProps[\"onDockEntryAction\"];\n onDockEntryClick?: WorkbenchHostProps[\"onDockEntryClick\"];\n renderBottomChrome?: WorkbenchHostProps[\"renderBottomChrome\"];\n renderTopChrome?: WorkbenchHostProps[\"renderTopChrome\"];\n workspaceId: string;\n}) {\n const renderBottomChrome = useMemo(\n () =>\n input.renderBottomChrome\n ? () => input.renderBottomChrome?.(input.chromeContext)\n : undefined,\n [input.chromeContext, input.renderBottomChrome]\n );\n const renderTopChrome = useMemo(\n () =>\n input.renderTopChrome\n ? () => input.renderTopChrome?.(input.chromeContext)\n : undefined,\n [input.chromeContext, input.renderTopChrome]\n );\n\n const renderDock = useCallback(\n (context: Parameters<typeof WorkbenchHostDock>[0][\"context\"]) => (\n <WorkbenchHostDock\n context={context}\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 workspaceId={input.workspaceId}\n />\n ),\n [\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.workspaceId\n ]\n );\n\n const captureNodePreviewImage = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n const definition = input.nodeDefinitionByType.get(node.data.typeId);\n const capturePreview = definition?.window?.minimizedDock?.capturePreview;\n if (!capturePreview) {\n return null;\n }\n\n const snapshot = input.hostSession.getSnapshot();\n return capturePreview({\n externalNodeState: readWorkbenchHostExternalState({\n externalStateSource: input.externalStateSource,\n node,\n workspaceId: input.workspaceId\n }).externalNodeState,\n isFocused: snapshot.nodeStack.at(-1) === node.id,\n isMinimized: node.isMinimized,\n node\n });\n },\n [\n input.externalStateSource,\n input.hostSession,\n input.nodeDefinitionByType,\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 return definition.renderBody(\n createWorkbenchHostNodeBodyContext({\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.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.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 resolveDockAnchorKey = useCallback(\n (node: WorkbenchNode<WorkbenchHostNodeData>) => {\n if (\n node.isMinimized &&\n isWorkbenchMinimizedDockEligibleNode({\n node,\n nodeDefinitions: input.nodeDefinitionByType\n })\n ) {\n const minimizedAnchorKey =\n resolveWorkbenchMinimizedDockAnchorKeyForNode({\n nodeId: node.id,\n slots: resolveWorkbenchMinimizedDockSlots({\n nodeDefinitions: input.nodeDefinitionByType,\n nodes: input.hostSession.getSnapshot().nodes\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 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 renderTopChrome,\n renderWindowActions,\n renderWindowHeader,\n shouldKeepMinimizedNodeMounted,\n resolveDockAnchorKey,\n resolveDockPreviewCacheKey,\n resolveFullscreenHeaderMode,\n windowChromeMode\n };\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 PointerEvent as ReactPointerEvent,\n type RefObject,\n type SetStateAction\n} from \"react\";\nimport {\n ArrowLeftIcon,\n ArrowRightIcon,\n Button,\n ChevronDownIcon,\n ChevronUpIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger\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_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 {\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 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\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 isDockVisualMutationActive(element: HTMLElement | null): boolean {\n return (\n element?.hasAttribute(\"data-dock-pointer-active\") === true ||\n element?.hasAttribute(\"data-dock-hover-panel-open\") === true\n );\n}\n\nexport function WorkbenchHostDock({\n context,\n dockEntries,\n dockPlacement = \"bottom\",\n dockPreviewCache,\n dockStateSource,\n externalStateSource,\n host,\n i18n,\n nodeDefinitions,\n onDockEntryAction,\n onDockEntryClick,\n workspaceId\n}: {\n context: WorkbenchDockContext<WorkbenchHostNodeData>;\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 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 hoverPanelScheduledPointRef = useRef<{\n clientX: number;\n clientY: number;\n } | null>(null);\n const minimizedLaunchTimersRef = useRef(\n new Map<string, ReturnType<typeof setTimeout>>()\n );\n const hoverPanelRestTargetRef = useRef<{\n anchorKey: string;\n entryId: string;\n } | null>(null);\n const activeHoverPanelRef = useRef<WorkbenchHostDockHoverPanelState | null>(\n null\n );\n const pendingDockStateRefreshRef = useRef(false);\n const slotRefs = useRef(new Map<string, HTMLElement>());\n const previousAttentionTokenByEntryId = useRef(new Map<string, unknown>());\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 [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\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 useEffect(\n () => () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n for (const timer of minimizedLaunchTimersRef.current.values()) {\n clearTimeout(timer);\n }\n minimizedLaunchTimersRef.current.clear();\n },\n [clearHoverPanelCloseTimer, clearHoverPanelOpenTimer]\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.nodes\n }),\n [context.nodes, nodeDefinitions]\n );\n const dockItems = useMemo(\n () =>\n createWorkbenchHostDockItems({\n minimizedDockSlots,\n resolvedEntries\n }),\n [minimizedDockSlots, resolvedEntries]\n );\n const presentDockItems = useDockPresenceItems(dockItems);\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\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 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 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 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 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 beginDockIconInteraction = useCallback(\n (anchorKey: string) => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n closeHoverPanelImmediate();\n triggerDockBounce(anchorKey);\n },\n [clearHoverPanelOpenTimer, closeHoverPanelImmediate, triggerDockBounce]\n );\n\n const beginDockMinimizedInteraction = useCallback(\n (anchorKey?: string): boolean => {\n hoverPanelRestTargetRef.current = null;\n clearHoverPanelOpenTimer();\n closeHoverPanelImmediate();\n\n if (!anchorKey) {\n return false;\n }\n const slotElement = slotRefs.current.get(anchorKey);\n if (!slotElement) {\n return false;\n }\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 [clearHoverPanelOpenTimer, closeHoverPanelImmediate]\n );\n\n const runDockMinimizedLaunchAfterCollapse = useCallback(\n (anchorKey: string, launch: () => void) => {\n const shouldDelayLaunch = beginDockMinimizedInteraction(anchorKey);\n if (!shouldDelayLaunch) {\n launch();\n return;\n }\n if (minimizedLaunchTimersRef.current.has(anchorKey)) {\n return;\n }\n const timer = setTimeout(() => {\n minimizedLaunchTimersRef.current.delete(anchorKey);\n launch();\n }, dockMinimizedSlotCollapseLaunchDelayMs);\n minimizedLaunchTimersRef.current.set(anchorKey, timer);\n },\n [beginDockMinimizedInteraction]\n );\n\n const handleDockPointerTravel = useCallback(\n (clientX: number, clientY: number) => {\n if (activeHoverPanelRef.current !== null) {\n closeHoverPanelImmediate();\n handleDockPointerLeave();\n return;\n }\n\n handleDockPointerMove(clientX, clientY);\n scheduleHoverPanelAtPointAfterRest(clientX, clientY);\n },\n [\n closeHoverPanelImmediate,\n handleDockPointerMove,\n handleDockPointerLeave,\n scheduleHoverPanelAtPointAfterRest\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 Boolean(\n nodeDefinitions.get(node.data.typeId)?.window?.minimizedDock\n ?.capturePreview\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 (node: WorkbenchMinimizedDockNode) => {\n const capturePreview = nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock?.capturePreview;\n if (!capturePreview) {\n return null;\n }\n\n return capturePreview({\n externalNodeState: readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n }).externalNodeState,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: node.isMinimized,\n node\n });\n },\n [\n context.focusedNodeId,\n externalStateRevision,\n externalStateSource,\n nodeDefinitions,\n workspaceId\n ]\n );\n\n if (dockItems.length === 0 && presentDockItems.length === 0) {\n return null;\n }\n\n const closePopup = () => {\n clearHoverPanelCloseTimer();\n clearHoverPanelOpenTimer();\n hoverPanelRestTargetRef.current = null;\n setDockHoverPanelOpen(false);\n setActivePopup(null);\n setActiveHoverPanel(null);\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 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 =\n (anchorKey: string) => (element: HTMLElement | null) => {\n if (element) {\n slotRefs.current.set(anchorKey, element);\n } else {\n slotRefs.current.delete(anchorKey);\n if (!dockMeasureRef.current?.hasAttribute(\"data-dock-pointer-active\")) {\n clearSlotMagnification(anchorKey);\n }\n }\n context.genie.registerDockAnchor(anchorKey, element);\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\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 <TooltipProvider delayDuration={500}>\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 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 className=\"desktop-dock__separator\"\n aria-hidden=\"true\"\n data-presence={dockItem.presence}\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 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\" &&\n !resolvedEntry.hasMatchingNodes\n }\n className=\"desktop-dock__btn\"\n data-interactive={\n clickResolution.kind === \"blocked\" &&\n !resolvedEntry.hasMatchingNodes\n ? \"false\"\n : \"true\"\n }\n type=\"button\"\n onPointerDown={() => {\n if (\n clickResolution.kind === \"blocked\" &&\n !resolvedEntry.hasMatchingNodes\n ) {\n return;\n }\n beginDockIconInteraction(anchorKey);\n }}\n onClick={(event) => {\n switch (clickResolution.kind) {\n case \"focus-node\":\n closePopup();\n void Promise.resolve(\n onDockEntryClick?.({\n entryId: entry.id,\n host,\n nodeId: clickResolution.nodeId\n })\n ).catch(() => {});\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 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 entryId: entry.id\n }\n );\n return;\n }\n case \"action\":\n closePopup();\n void Promise.resolve(\n onDockEntryAction?.({\n actionId: clickResolution.actionId,\n entryId: entry.id,\n host\n })\n ).catch(() => {});\n return;\n case \"launch\":\n closePopup();\n context.genie.launchNodeFromAnchor(\n anchorKey,\n entry.id,\n () => {\n void host.launchNode({\n dockEntryId: entry.id,\n payload: entry.launchPayload,\n reason: \"dock\",\n typeId: entry.typeId\n });\n }\n );\n return;\n case \"blocked\":\n return;\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)\n ? \"true\"\n : 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-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 onBlur={(event) => {\n if (\n hasHoverPanel &&\n !event.currentTarget.contains(event.relatedTarget)\n ) {\n closeHoverPanelImmediate(entry.id);\n }\n }}\n onFocus={(event) => {\n if (hasHoverPanel) {\n showHoverPanel(\n entry.id,\n anchorKey,\n event.currentTarget\n );\n }\n }}\n onPointerEnter={() => {\n if (hasHoverPanel) {\n scheduleHoverPanelAfterRest(entry.id, anchorKey);\n }\n }}\n onPointerLeave={(event) => {\n if (!hasHoverPanel) {\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 ===\n anchorKey\n ) {\n hoverPanelRestTargetRef.current = null;\n }\n clearHoverPanelOpenTimer();\n closeHoverPanelImmediate(entry.id);\n handleDockPointerLeave();\n }}\n >\n {hasHoverPanel ? (\n dockButton\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>{dockButton}</TooltipTrigger>\n <TooltipContent\n side={dockPlacement === \"left\" ? \"right\" : \"top\"}\n sideOffset={26}\n >\n {entry.label}\n </TooltipContent>\n </Tooltip>\n )}\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 stackButton = (\n <button\n aria-expanded={stackPopupActive}\n aria-haspopup=\"dialog\"\n aria-label={i18n.t(\"minimizedWindows\")}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive=\"true\"\n type=\"button\"\n onPointerDown={() => {\n beginDockMinimizedInteraction();\n }}\n onClick={(event) => {\n setActivePopup(null);\n const rect =\n 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={node.id}\n capturePreview={captureMinimizedNodePreview}\n className={`desktop-dock__minimized-stack-layer desktop-dock__minimized-stack-layer--${index}`}\n dockPreviewCache={dockPreviewCache}\n node={node}\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 </button>\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-node-state=\"minimized\"\n data-popup-active={stackPopupActive}\n data-presence={dockItem.presence}\n data-section-id=\"minimized\"\n >\n <Tooltip>\n <TooltipTrigger asChild>{stackButton}</TooltipTrigger>\n <TooltipContent\n side={dockPlacement === \"left\" ? \"right\" : \"top\"}\n sideOffset={26}\n >\n {i18n.t(\"minimizedWindows\")}\n </TooltipContent>\n </Tooltip>\n </span>\n );\n }\n\n const node = slot.node;\n const dockButton = (\n <button\n aria-label={i18n.t(\"launch\", { title: node.title })}\n className=\"desktop-dock__btn desktop-dock__minimized-btn\"\n data-interactive=\"true\"\n type=\"button\"\n onPointerDown={() => {\n beginDockMinimizedInteraction(slot.anchorKey);\n }}\n onClick={() => {\n closePopup();\n runDockMinimizedLaunchAfterCollapse(\n slot.anchorKey,\n () => {\n context.genie.launchNodeFromAnchor(\n slot.anchorKey,\n node.id,\n () => {\n host.focusNode(node.id);\n }\n );\n }\n );\n }}\n >\n <WorkbenchHostDockMinimizedNodePreview\n capturePreview={captureMinimizedNodePreview}\n dockPreviewCache={dockPreviewCache}\n node={node}\n workspaceId={workspaceId}\n />\n </button>\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-node-state=\"minimized\"\n data-presence={dockItem.presence}\n data-section-id=\"minimized\"\n >\n <Tooltip>\n <TooltipTrigger asChild>{dockButton}</TooltipTrigger>\n <TooltipContent\n side={dockPlacement === \"left\" ? \"right\" : \"top\"}\n sideOffset={26}\n >\n {node.title}\n </TooltipContent>\n </Tooltip>\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 closeHoverPanelImmediate(activeHoverPanel.entryId);\n handleDockPointerLeave();\n }}\n />\n ) : null}\n </div>\n </TooltipProvider>\n </div>\n {popupEntry && activePopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activePopup.anchorRect}\n placement={dockPlacement}\n capturePreview={popupEntry.entry.capturePopupItemPreview}\n dockPreviewCache={dockPreviewCache}\n items={popupEntry.matchedNodes\n .map((node) => {\n const item = {\n externalNodeState: readWorkbenchHostExternalState({\n externalStateSource,\n node,\n workspaceId\n }).externalNodeState,\n isFocused: context.focusedNodeId === node.id,\n isMinimized: minimizedNodeIDs.has(node.id),\n node\n };\n const descriptor =\n popupEntry.entry.resolvePopupItem?.(item) ?? {};\n return {\n ...item,\n previewImageUrl: descriptor.previewImageUrl ?? 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 closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n onClose={closePopup}\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 void host.launchNode({\n dockEntryId: popupEntry.entry.id,\n payload: popupEntry.entry.launchPayload,\n reason: \"dock\",\n typeId: popupEntry.entry.typeId\n });\n }\n );\n }}\n onSelectNode={(nodeId) => {\n closePopup();\n void Promise.resolve(\n onDockEntryClick?.({\n entryId: popupEntry.entry.id,\n host,\n nodeId\n })\n ).catch(() => {});\n context.genie.launchNodeFromAnchor(\n anchorKeyFromPopupEntry(popupEntry),\n nodeId,\n () => {\n host.focusNode(nodeId);\n }\n );\n }}\n showCreateNew={canCreateNewWindow(\n popupEntry.entry,\n resolveDockEntryInstanceMode(popupEntry.entry, nodeDefinitions)\n )}\n resolveDockPreviewCacheKey={(node) =>\n resolveDockPreviewCacheKey(workspaceId, node)\n }\n />\n ) : null}\n {activeMinimizedStackSlot && activeMinimizedStackPopup ? (\n <WorkbenchHostDockPopup\n anchorRect={activeMinimizedStackPopup}\n placement={dockPlacement}\n capturePreview={(item) => captureMinimizedNodePreview(item.node)}\n dockPreviewCache={dockPreviewCache}\n items={activeMinimizedStackSlot.nodes.map((node) => ({\n isFocused: context.focusedNodeId === node.id,\n isMinimized: true,\n node,\n previewImageUrl: nodeDefinitions.get(node.data.typeId)?.window\n ?.minimizedDock?.capturePreview\n ? null\n : readCachedWorkbenchNodePreviewImage(node.id),\n subtitle: node.data.instanceKey ?? node.data.instanceId,\n title: node.title\n }))}\n label={i18n.t(\"minimizedWindows\")}\n newWindowLabel={i18n.t(\"newWindow\")}\n closeWindowLabel={(title) => i18n.t(\"closeWindow\", { title })}\n onClose={closePopup}\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 closePopup();\n context.genie.launchNodeFromAnchor(\n activeMinimizedStackSlot.anchorKey,\n nodeId,\n () => {\n host.focusNode(nodeId);\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 dockPreviewCache,\n node,\n workspaceId\n}: {\n capturePreview?: (\n node: WorkbenchMinimizedDockNode\n ) => Promise<string | null> | string | null;\n className?: string;\n dockPreviewCache?: WorkbenchDockPreviewCache;\n node: WorkbenchMinimizedDockNode;\n workspaceId: string;\n}) {\n const [previewImageUrl, setPreviewImageUrl] = useState<string | null>(() =>\n readCachedWorkbenchNodePreviewImage(node.id)\n );\n\n useEffect(() => {\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 dockPreviewCache,\n node.data.instanceId,\n node.data.instanceKey,\n node.data.typeId,\n node.id,\n node.minimizedAtUnixMs,\n workspaceId\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 (\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\nfunction dockEntryHasHoverPanel(entry: WorkbenchHostDockEntry): boolean {\n return (\n Boolean(entry.state?.reason?.trim()) ||\n (entry.hoverActions?.length ?? 0) > 0\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 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 Promise.resolve(\n onDockEntryAction?.({\n actionId: action.id,\n entryId: entry.id,\n host\n })\n )\n .catch(() => {})\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 {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 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 useDockPresenceItems(\n items: readonly WorkbenchHostDockItem[]\n): WorkbenchHostPresentDockItem[] {\n const latestItemsByKey = useRef(new Map<string, WorkbenchHostDockItem>());\n latestItemsByKey.current = new Map(items.map((item) => [item.key, item]));\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 setPresentItems((current) => {\n const nextSourceItems = [...latestItemsByKey.current.values()];\n const currentByKey = new Map(current.map((item) => [item.key, item]));\n const currentIndexByKey = new Map(\n current.map((item, index) => [item.key, index])\n );\n const nextByKey = new Map(\n nextSourceItems.map((item) => [item.key, item])\n );\n const nextKeys = new Set(nextSourceItems.map((item) => item.key));\n const currentVisibleItemCount = current.filter(\n (item) => item.presence !== \"exiting\"\n ).length;\n const shouldRetainExitingItems =\n 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 = 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 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: initialized.current\n ? currentByKey.get(item.key)?.presence === \"exiting\"\n ? \"entering\"\n : (currentByKey.get(item.key)?.presence ?? \"entering\")\n : \"present\"\n });\n }\n\n for (const currentItem of 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 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 }, dockPresenceAnimationMs);\n\n return () => globalThis.clearTimeout(timeout);\n }, [itemKeys]);\n\n return presentItems.map((presentItem) => {\n const latestItem = latestItemsByKey.current.get(presentItem.key);\n return latestItem ? { ...presentItem, item: latestItem } : presentItem;\n });\n}\n\nconst DOCK_BOUNCE_MS = 600;\nconst dockMinimizedSlotCollapseLaunchDelayMs = 260;\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 = 450;\nconst dockHoverPanelHitSlopPx = 12;\nconst dockHoverPanelPointerRestTolerancePx = 4;\nconst dockPresenceAnimationMs = 300;\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\ntype WorkbenchHostDockPresence = \"entering\" | \"exiting\" | \"present\";\ntype WorkbenchHostDockScrollDirection = \"backward\" | \"forward\";\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 (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 if (isWorkbenchDockEntryBlocked(input.entry)) {\n return { kind: \"blocked\" };\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;\n\ninterface DockMagnificationSpring {\n value: number;\n velocity: number;\n}\n\ninterface DockMagnificationAppliedStyle {\n size: 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\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\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 slotElement.style.width = `${nextStyle.size}px`;\n slotElement.style.height = `${nextStyle.size}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 restCentersRef = useRef<Map<string, number> | 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 order: string[] = [];\n for (const [anchorKey, slotElement] of slots) {\n order.push(anchorKey);\n const rect = slotElement.getBoundingClientRect();\n const center =\n dockPlacement === \"left\"\n ? rect.top + rect.height / 2\n : rect.left + rect.width / 2;\n centers.set(anchorKey, center);\n }\n slotOrderRef.current = order;\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 }\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\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 ? mapDistanceToTargetSize(distance)\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 (\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 restCentersRef.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 pendingPointerAxisRef.current =\n dockPlacement === \"left\" ? clientY : clientX;\n if (restCentersRef.current === null) {\n captureRestCenters();\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 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 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 slotOrderRef.current = [];\n pointerAxisRef.current = null;\n pendingPointerAxisRef.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?.kind === \"snapshot\";\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 {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Button, CloseIcon, FileCreateIcon, cn } 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 WorkbenchHostDockPopupCardLabelMode,\n WorkbenchHostNodeData\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 = 120;\nconst dockPopupMinimizedStackPopupZIndex = 100300;\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}\n\nexport interface WorkbenchHostDockPopupItem {\n isFocused: boolean;\n isMinimized: boolean;\n node: WorkbenchNode<WorkbenchHostNodeData>;\n previewImageUrl: string | null;\n subtitle: string | null;\n title: string | null;\n}\n\nexport type WorkbenchHostDockPopupVariant = \"default\" | \"minimized-stack\";\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\nexport function WorkbenchHostDockPopup({\n anchorRect,\n capturePreview,\n dockPreviewCache,\n items,\n label,\n labelMode,\n newWindowLabel,\n closeWindowLabel,\n onClose,\n onCloseNode,\n onCreateNew,\n onSelectNode,\n placement = \"bottom\",\n resolveDockPreviewCacheKey,\n showCreateNew,\n variant\n}: {\n anchorRect: WorkbenchHostDockPopupState[\"anchorRect\"];\n capturePreview?: (\n item: WorkbenchHostDockPopupItem\n ) => Promise<string | null> | string | null;\n dockPreviewCache?: WorkbenchDockPreviewCache;\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 onSelectNode: (nodeId: string) => void;\n placement?: WorkbenchDockPlacement;\n resolveDockPreviewCacheKey?: WorkbenchDockPreviewCacheKeyResolver<WorkbenchHostNodeData>;\n showCreateNew?: boolean;\n variant?: WorkbenchHostDockPopupVariant;\n}) {\n const resolvedLabelMode = labelMode ?? \"hover-overlay\";\n const resolvedVariant = variant ?? \"default\";\n const isMinimizedStack = resolvedVariant === \"minimized-stack\";\n const createCardCount = showCreateNew === false ? 0 : 1;\n const cardElementsRef = useRef(new Map<string, HTMLElement>());\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 [capturedPreviewByNodeId, setCapturedPreviewByNodeId] = useState<\n Record<string, string | undefined>\n >({});\n const columnCount = Math.min(Math.max(items.length + createCardCount, 1), 3);\n const popupWidthPx =\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\n const registerCard = useCallback(\n (nodeId: string) => (element: HTMLElement | null) => {\n if (element) {\n cardElementsRef.current.set(nodeId, element);\n } else {\n cardElementsRef.current.delete(nodeId);\n }\n },\n []\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((item) => `${item.node.id}:${item.previewImageUrl ?? \"\"}`)\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 let cancelled = false;\n const missingItems = items.filter(\n (item) => !item.previewImageUrl && !capturedPreviewByNodeId[item.node.id]\n );\n if (missingItems.length === 0) {\n return () => {\n cancelled = true;\n };\n }\n\n void Promise.all(\n missingItems.map(async (item) => {\n const cacheKey = resolveDockPreviewCacheKey?.(item.node) ?? null;\n if (item.isMinimized && cacheKey) {\n const minimizedPersistedPreview = await readPersistedDockPreview(\n dockPreviewCache,\n cacheKey\n );\n if (minimizedPersistedPreview) {\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n minimizedPersistedPreview\n );\n return {\n nodeId: item.node.id,\n previewImageUrl: minimizedPersistedPreview\n };\n }\n }\n\n const previewImageUrl =\n (await capturePreview?.(item)) ??\n (await captureWorkbenchNodePreviewImage(item.node.id, {\n bypassCache: !item.isMinimized\n }));\n if (previewImageUrl) {\n writeCachedWorkbenchNodePreviewImage(item.node.id, previewImageUrl);\n if (cacheKey) {\n dockPreviewCache?.write({ key: cacheKey, previewImageUrl });\n }\n return {\n nodeId: item.node.id,\n previewImageUrl\n };\n }\n\n const fallbackPersistedPreview =\n !item.isMinimized && cacheKey\n ? await readPersistedDockPreview(dockPreviewCache, cacheKey)\n : null;\n if (fallbackPersistedPreview) {\n writeCachedWorkbenchNodePreviewImage(\n item.node.id,\n fallbackPersistedPreview\n );\n }\n return {\n nodeId: item.node.id,\n previewImageUrl: fallbackPersistedPreview\n };\n })\n ).then((results) => {\n if (cancelled) {\n return;\n }\n const nextEntries = results.filter(\n (result): result is { nodeId: string; previewImageUrl: string } =>\n Boolean(result.previewImageUrl)\n );\n if (nextEntries.length === 0) {\n return;\n }\n setCapturedPreviewByNodeId((current) => ({\n ...current,\n ...Object.fromEntries(\n nextEntries.map((entry) => [entry.nodeId, entry.previewImageUrl])\n )\n }));\n });\n\n return () => {\n cancelled = true;\n };\n }, [\n capturePreview,\n capturedPreviewByNodeId,\n dockPreviewCache,\n items,\n previewCaptureKey,\n resolveDockPreviewCacheKey\n ]);\n\n const content = (\n <div\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 p-3 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 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 <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 previewImageUrl =\n item.previewImageUrl ?? capturedPreviewByNodeId[item.node.id];\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 previewImageUrl={previewImageUrl}\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 previewImageUrl =\n item.previewImageUrl ?? capturedPreviewByNodeId[item.node.id];\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 previewImageUrl={previewImageUrl}\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 </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 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\ninterface WorkbenchHostDockPopupCardProps {\n closeWindowLabel: (title: string) => string;\n item: WorkbenchHostDockPopupItem;\n labelMode?: WorkbenchHostDockPopupCardLabelMode;\n onCloseNode: (nodeId: string) => void;\n onSelectNode: (nodeId: string) => void;\n previewImageUrl?: string;\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 previewImageUrl,\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\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.isFocused &&\n \"border-transparent shadow-[inset_0_0_0_2px_var(--border-focus)]\",\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 <button\n aria-label={title}\n data-active={item.isFocused ? \"true\" : undefined}\n className=\"relative flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden rounded-md bg-transparent p-1 text-inherit\"\n type=\"button\"\n onClick={handleSelect}\n >\n {previewImageUrl ? (\n <span\n className=\"block min-h-0 min-w-0 flex-1 overflow-hidden rounded-md bg-transparency-block\"\n aria-hidden=\"true\"\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={previewImageUrl}\n />\n </span>\n ) : (\n <span\n className=\"flex size-full 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 >\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 {labelMode === \"hover-overlay\" && item.title?.trim() ? (\n <WorkbenchHostDockPopupCardLabel title={item.title} />\n ) : null}\n </button>\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 {isMinimizedStack ? (\n <span className=\"desktop-dock-popup__fan-title-tip\" title={title}>\n {title}\n </span>\n ) : null}\n </div>\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 = 104;\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 { Button, CloseIcon, MinimizeIcon } from \"@tutti-os/ui-system\";\nimport type { WorkbenchWindowActionContext } from \"../react/types.ts\";\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 <>\n {minimizable ? (\n <Button\n aria-label={i18n.t(\"actions.minimize\")}\n className=\"order-1 rounded-md\"\n data-workbench-action=\"minimize\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => {\n context.genie.minimizeNodeToAnchor(context.node.id, () =>\n context.controller.commands.minimizeNode(context.node.id)\n );\n }}\n >\n <MinimizeIcon className=\"size-3.5\" />\n </Button>\n ) : null}\n {closable ? (\n <Button\n aria-label={i18n.t(\"actions.close\")}\n className=\"order-3 rounded-md\"\n data-workbench-action=\"close\"\n size=\"icon-sm\"\n type=\"button\"\n variant=\"chrome\"\n onClick={() => {\n host.requestNodeClose(context.node.id);\n }}\n >\n <CloseIcon className=\"size-3.5\" />\n </Button>\n ) : null}\n </>\n );\n}\n"],"mappings":"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","names":["useMemo","useLayoutEffect","useRef","useState","useCallback","useState","useState","useCallback","useCallback","useEffect","useMemo","jsx","jsx","useMemo","useMemo","Button","jsx","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","Fragment","jsx","jsxs","jsx","jsxs","useMemo","useEffect","useEffect","useLayoutEffect","useRef","useCallback","useEffect","useRef","useState","jsx","resolveDockPreviewCacheKey","useRef","useState","useCallback","useEffect","jsx","jsxs","resolveDockPreviewCacheKey","useCallback","useEffect","useEffect","useMemo","useState","normalizeWorkbenchSnapshot","resolvedFrame","useState","useMemo","useEffect","noop","useCallback","useMemo","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","Button","useCallback","useEffect","useRef","slotElement","useCallback","useEffect","useRef","useState","createPortal","Button","jsx","jsxs","resolveDockPreviewCacheKey","useRef","useState","useCallback","useEffect","createPortal","WorkbenchHostDockPopupCard","Button","jsx","jsxs","useMemo","useRef","useState","useCallback","useEffect","useLayoutEffect","dockButton","node","Button","Button","CloseIcon","Fragment","jsx","jsxs","jsx","useMemo","useCallback","resolveDockPreviewCacheKey","jsx","noop","useMemo"]}
|